Skip to content

Commit 2ad992f

Browse files
committed
Merge branch 'master' into add-daily-reminders
2 parents d551e64 + 7de4d66 commit 2ad992f

File tree

4 files changed

+79
-65
lines changed

4 files changed

+79
-65
lines changed

Gemfile.lock

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ PLATFORMS
66
x86_64-linux
77
arm64-darwin-21
88
arm64-darwin-22
9+
arm64-darwin-23
910
x86_64-linux
1011

1112
DEPENDENCIES

event.rb

+11-42
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
# frozen_string_literal: true
22

33
require "date"
4-
require "time"
54

65
class MeetupEvent
76
# Can be used like so:
8-
# \n:clock1: #{parse_duration(group['eventSearch']['edges'][0]['node']['duration'])
7+
# \n:clock1: #{parse_duration(group['unifiedEvents']['edges'][0]['node']['duration'])
98
def self.parse_duration(iso8601_duration)
109
match = iso8601_duration.match(/PT((?<hours>\d+(?:\.\d+)?)H)?((?<minutes>\d+(?:\.\d+)?)M)?((?<seconds>\d+(?:\.\d+)?)S)?/)
1110

@@ -21,49 +20,19 @@ def self.parse_duration(iso8601_duration)
2120
parts.join(", ") + " long"
2221
end
2322

24-
def self.within_next_week?(date_string)
25-
date = Date.parse(date_string)
26-
today = Date.today
27-
date >= today && date <= (today + 7)
28-
end
29-
30-
def self.within_next_day?(date_string)
31-
date = Date.parse(date_string)
32-
today = Date.today
33-
# today = Date.parse('2024-07-29T10:00-04:00')
34-
date == today
35-
end
36-
37-
def self.within_next_hour?(date_string)
38-
datetime = Time.parse(date_string)
39-
now = Time.now
40-
# now = Time.parse('2024-07-29T18:00-04:00')
41-
one_hour_from_now = now + 3600
42-
datetime >= now && datetime <= one_hour_from_now
43-
end
44-
45-
def self.format_slack(group, announcement_type)
46-
return if group["eventSearch"]["count"] == 0
47-
48-
date_string = group["eventSearch"]["edges"][0]["node"]["dateTime"]
49-
if announcement_type == "weekly"
50-
return unless within_next_week?(date_string)
51-
elsif announcement_type == "daily"
52-
return unless within_next_day?(date_string)
53-
else
54-
return unless within_next_hour?(date_string)
55-
end
23+
def self.format_slack(group)
24+
return if group["unifiedEvents"]["count"] == 0
5625

5726
event_blocks = [{
5827
type: "section",
5928
text: {
6029
type: "mrkdwn",
61-
text: "*#{group["name"]}* - *#{group["eventSearch"]["edges"][0]["node"]["title"]}*\n:calendar: #{DateTime.parse(group["eventSearch"]["edges"][0]["node"]["dateTime"]).strftime("%A, %d %B %Y, %I:%M %p")}\n:busts_in_silhouette: #{group["eventSearch"]["edges"][0]["node"]["going"]} going"
30+
text: "*#{group["name"]}* - *#{group["unifiedEvents"]["edges"][0]["node"]["title"]}*\n:calendar: #{DateTime.parse(group["unifiedEvents"]["edges"][0]["node"]["dateTime"]).strftime("%A, %d %B %Y, %I:%M %p")}\n:busts_in_silhouette: #{group["unifiedEvents"]["edges"][0]["node"]["going"]} going"
6231
},
6332
accessory: {
6433
type: "image",
65-
image_url: group["eventSearch"]["edges"][0]["node"]["imageUrl"],
66-
alt_text: "#{group["name"]} - #{group["eventSearch"]["edges"][0]["node"]["title"]}"
34+
image_url: group["unifiedEvents"]["edges"][0]["node"]["imageUrl"],
35+
alt_text: "#{group["name"]} - #{group["unifiedEvents"]["edges"][0]["node"]["title"]}"
6736
}
6837
},
6938
{
@@ -76,19 +45,19 @@ def self.format_slack(group, announcement_type)
7645
text: ":dart: RSVP",
7746
emoji: true
7847
},
79-
url: group["eventSearch"]["edges"][0]["node"]["eventUrl"]
48+
url: group["unifiedEvents"]["edges"][0]["node"]["eventUrl"]
8049
}
8150
]
8251
},
8352
]
8453

8554
if group["name"] == "Tampa Devs"
86-
event_blocks[0][:text][:text].prepend(":tampadevs: ")
55+
event_blocks[0][:text][:text] = ":tampadevs:" + " " + event_blocks[0][:text][:text]
8756
end
8857

89-
if group["eventSearch"]["edges"][0]["node"]["venue"]
90-
event_blocks[0][:text][:text] += if group["eventSearch"]["edges"][0]["node"]["venue"]["name"] != "Online event"
91-
"\n\n:round_pushpin: <https://www.google.com/maps/dir/?api=1&destination=#{group["eventSearch"]["edges"][0]["node"]["venue"].map { |k, v| "#{k}=#{URI.encode_www_form_component(v)}" }.join("&")}|#{group["eventSearch"]["edges"][0]["node"]["venue"].values.join(", ")}>"
58+
if group["unifiedEvents"]["edges"][0]["node"]["venue"]
59+
event_blocks[0][:text][:text] += if group["unifiedEvents"]["edges"][0]["node"]["venue"]["name"] != "Online event"
60+
"\n\n:round_pushpin: <https://www.google.com/maps/dir/?api=1&destination=#{group["unifiedEvents"]["edges"][0]["node"]["venue"].map { |k, v| "#{k}=#{URI.encode_www_form_component(v)}" }.join("&")}|#{group["unifiedEvents"]["edges"][0]["node"]["venue"].values.join(", ")}>"
9261
else
9362
"\n\n:computer: Online event"
9463
end

main.rb

+47-15
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
require "json"
44
require "net/http"
5+
require 'optparse'
56
require_relative "event"
67
require_relative "slack"
78

@@ -12,29 +13,32 @@ def initialize
1213
@dry_run = ENV["SYN_ENV"] != "production"
1314
end
1415

15-
def fetch
16-
argument = ARGV[0]
17-
if argument == '--weekly'
18-
announcement_type = 'weekly'
19-
elsif argument == '--daily'
20-
announcement_type = 'daily'
21-
else
22-
announcement_type = 'hourly'
16+
def fetch(announcement_type, destinations)
17+
18+
events_url = case announcement_type
19+
when :daily
20+
'https://events.api.tampa.dev?within_hours=24'
21+
when :hourly
22+
'https://events.api.tampa.dev?within_hours=1'
23+
else
24+
'https://events.api.tampa.dev?within_days=7'
2325
end
2426

25-
groups = JSON.parse(Net::HTTP.get(URI("https://events.api.tampa.dev/")))
27+
groups = JSON.parse(Net::HTTP.get(URI(events_url)))
2628

2729
sorted_events = []
2830
formatted_events = []
2931

3032
groups.each do |group|
31-
sorted_events << group[1] unless group[1]["eventSearch"]["count"] == 0
33+
sorted_events << group[1] unless group[1]["unifiedEvents"]["count"] == 0 || group[1]["unifiedEvents"]["edges"].empty?
3234
end
3335

34-
sorted_events.sort! { |a, b| DateTime.parse(a["eventSearch"]["edges"][0]["node"]["dateTime"]) <=> DateTime.parse(b["eventSearch"]["edges"][0]["node"]["dateTime"]) }
36+
sorted_events.sort! do |a, b|
37+
DateTime.parse(a["unifiedEvents"]["edges"][0]["node"]["dateTime"]) <=> DateTime.parse(b["unifiedEvents"]["edges"][0]["node"]["dateTime"])
38+
end
3539

3640
sorted_events.each do |group|
37-
event = MeetupEvent.format_slack(group, announcement_type)
41+
event = MeetupEvent.format_slack(group)
3842
formatted_events << event unless event.nil?
3943
end
4044

@@ -48,10 +52,38 @@ def fetch
4852
exit
4953
end
5054

51-
Slack.syndicate(formatted_events, announcement_type, @dry_run)
55+
Slack.syndicate(formatted_events, announcement_type, destinations, @dry_run)
5256
end
5357
end
5458

55-
syn = EventSyndicator.new
56-
syn.fetch
59+
def main
60+
options = {}
61+
OptionParser.new do |opts|
62+
opts.banner = "Usage: main.rb [options]"
63+
64+
# Boolean argument for --daily, --hourly, or --weekly
65+
announcement_types = [:daily, :hourly, :weekly]
66+
opts.on("--daily", "Set announcement type to daily") do
67+
options[:announcement_type] = :daily
68+
end
69+
opts.on("--hourly", "Set announcement type to hourly") do
70+
options[:announcement_type] = :hourly
71+
end
72+
opts.on("--weekly", "Set announcement type to weekly") do
73+
options[:announcement_type] = :weekly
74+
end
75+
76+
# Argument for --destinations=<destinations>
77+
opts.on("--destinations=DESTINATIONS", "Comma-separated list of destinations") do |destinations|
78+
options[:destinations] = destinations.split(',')
79+
end
80+
end.parse!
81+
82+
announcement_type = options[:announcement_type] || :weekly
83+
destinations = options[:destinations] || ['TD', 'TBT', 'TBUX']
84+
85+
syn = EventSyndicator.new
86+
syn.fetch(announcement_type, destinations)
87+
end
5788

89+
main

slack.rb

+20-8
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def initialize
1717
@message = []
1818
end
1919

20-
def self.syndicate(events, announcement_type, dry_run)
20+
def self.syndicate(events, announcement_type, destinations, dry_run)
2121
return if events.empty?
2222

2323
@announcement_type = announcement_type
@@ -26,7 +26,7 @@ def self.syndicate(events, announcement_type, dry_run)
2626
if dry_run
2727
puts message_json
2828
else
29-
post
29+
post destinations
3030
end
3131
end
3232

@@ -66,6 +66,16 @@ def self.payload(events)
6666
value: "see_all_meetups",
6767
url: "https://tampa.dev?utm_source=td_slack_syndication&utm_campaign=organic"
6868
},
69+
{
70+
type: "button",
71+
text: {
72+
type: "plain_text",
73+
text: ":calendar: Event Calendar",
74+
emoji: true
75+
},
76+
value: "newsletter_tampa_dev",
77+
url: "https://go.tampa.dev/calendar?utm_source=td_slack_syndication&utm_campaign=organic"
78+
},
6979
{
7080
type: "button",
7181
text: {
@@ -80,7 +90,7 @@ def self.payload(events)
8090
type: "button",
8191
text: {
8292
type: "plain_text",
83-
text: ":briefcase: Hire a Developer",
93+
text: ":briefcase: Local Tech Jobs",
8494
emoji: true
8595
},
8696
value: "events_api",
@@ -90,11 +100,11 @@ def self.payload(events)
90100
type: "button",
91101
text: {
92102
type: "plain_text",
93-
text: ":newspaper: Tampa Tech News",
103+
text: ":newspaper: Newsletter",
94104
emoji: true
95105
},
96-
value: "news_tampa_dev",
97-
url: "https://news.tampa.dev?utm_source=td_slack_syndication&utm_campaign=organic"
106+
value: "newsletter_tampa_dev",
107+
url: "https://newsletter.tampa.dev?utm_source=td_slack_syndication&utm_campaign=organic"
98108
}
99109
]
100110
}
@@ -114,10 +124,12 @@ def self.message_json
114124
}.to_json
115125
end
116126

117-
def self.post
127+
def self.post(destinations)
118128
return if @payload.length == 0
119129

120-
targets = [ENV["TD_SLACK_WEBHOOK"]]
130+
targets = destinations.map do |channel|
131+
ENV["#{channel}_SLACK_WEBHOOK"]
132+
end
121133

122134
targets.each do |t|
123135
uri = URI.parse(t)

0 commit comments

Comments
 (0)