11from datetime import datetime , timezone
2+ from slack_sdk import WebClient
23
34from utils .env import env
45from utils .utils import user_in_safehouse , md_to_mrkdwn
56
67
7- def get_home (user_id : str ):
8+ def get_home (user_id : str , client : WebClient ):
89 sad_member = user_in_safehouse (user_id )
9- admin = True if user_id in env .authorised_users else False
10+ user_info = client .users_info (user = user_id )
11+ ws_admin = True if user_info ["user" ]["is_admin" ] or user_info ["user" ]["is_owner" ] or user_info ["user" ]["is_primary_owner" ] else False
12+ admin = True if user_id in env .authorised_users or ws_admin else False
1013 events = env .airtable .get_all_events (
11- unapproved = True if admin or sad_member else False
14+ unapproved = True
1215 )
1316 upcoming_events = [
1417 event
1518 for event in events
1619 if datetime .fromisoformat (event ["fields" ]["Start Time" ])
1720 > datetime .now (timezone .utc )
1821 ]
22+ current_events = [
23+ event for event in events if datetime .now (timezone .utc ) < datetime .fromisoformat (event ["fields" ]["End Time" ]) and datetime .now (timezone .utc ) > datetime .fromisoformat (event ["fields" ]["Start Time" ])
24+ ]
25+
26+ current_events_blocks = []
27+ for event in current_events :
28+ if not event ["fields" ].get ("Approved" , False ) or not event ["fields" ].get ("Leader Slack ID" , "" ) == user_id or not sad_member or not admin :
29+ continue
30+ current_events_blocks .append ({"type" : "divider" })
31+ fallback_time = datetime .fromisoformat (event ["fields" ]["End Time" ]).strftime (
32+ "Ends at %I:%M %p"
33+ )
34+ formatted_time = f"<!date^{ int (datetime .fromisoformat (event ['fields' ]['End Time' ]).timestamp ())} ^Ends at {{time}}|{ fallback_time } >"
35+ mrkdwn = md_to_mrkdwn (event ["fields" ]["Description" ])
36+ current_events_blocks .append (
37+ {
38+ "type" : "section" ,
39+ "text" : {
40+ "type" : "mrkdwn" ,
41+ "text" : f"{ '*[UNAPPROVED]:* ' if not event ['fields' ].get ('Approved' , False ) else '' } *{ event ['fields' ]['Title' ]} * - <@{ event ['fields' ]['Leader Slack ID' ]} >\n { mrkdwn } \n *{ formatted_time } *" ,
42+ },
43+ "accessory" : {
44+ "type" : "image" ,
45+ "image_url" : event ["fields" ]["Avatar" ][0 ]["url" ],
46+ "alt_text" : f"{ event ['fields' ]['Leader' ]} profile picture" ,
47+ },
48+ }
49+ )
50+ buttons = []
51+ if admin and not event ["fields" ].get ("Approved" , False ):
52+ buttons .append (
53+ {
54+ "type" : "button" ,
55+ "text" : {"type" : "plain_text" , "text" : "Approve" , "emoji" : True },
56+ "style" : "primary" ,
57+ "value" : event ["id" ],
58+ "action_id" : "approve-event" ,
59+ }
60+ )
61+ buttons .append (
62+ {
63+ "type" : "button" ,
64+ "text" : {"type" : "plain_text" , "text" : "Join!" , "emoji" : True },
65+ "value" : "join" ,
66+ "style" : "primary" ,
67+ "url" : event ["fields" ].get ("Event Link" , "https://hackclub.slack.com/archives/C07TNAZGMHS" ), # Default to #high-seas-bulletin
68+ }
69+ )
70+ if user_id == event ["fields" ]["Leader Slack ID" ] or admin :
71+ buttons .append (
72+ {
73+ "type" : "button" ,
74+ "text" : {"type" : "plain_text" , "text" : "Edit" , "emoji" : True },
75+ "value" : "edit-event" ,
76+ "action_id" : "edit-event" ,
77+ }
78+ )
79+ if event ["fields" ].get ("Approved" , False ):
80+ buttons .append (
81+ {
82+ "type" : "button" ,
83+ "text" : {"type" : "plain_text" , "text" : "More Info" , "emoji" : True },
84+ "value" : "more-info" ,
85+ "action_id" : "more-info" ,
86+ }
87+ )
88+ current_events_blocks .append ({"type" : "actions" , "elements" : [* buttons ]})
89+
90+
1991 upcoming_events_blocks = []
2092 for event in upcoming_events :
93+ if not event ["fields" ].get ("Approved" , False ) or not event ["fields" ].get ("Leader Slack ID" , "" ) == user_id or not sad_member or not admin :
94+ continue
2195 upcoming_events_blocks .append ({"type" : "divider" })
2296 fallback_time = datetime .fromisoformat (event ["fields" ]["Start Time" ]).strftime (
2397 "%A, %B %d at %I:%M %p"
@@ -90,18 +164,7 @@ def get_home(user_id: str):
90164 )
91165 upcoming_events_blocks .append ({"type" : "actions" , "elements" : [* buttons ]})
92166
93- return {
94- "type" : "home" ,
95- "blocks" : [
96- {
97- "type" : "header" ,
98- "text" : {
99- "type" : "plain_text" ,
100- "text" : "Upcoming Events" ,
101- "emoji" : True ,
102- },
103- },
104- {
167+ create_event_btn = [ {
105168 "type" : "actions" ,
106169 "elements" : [
107170 {
@@ -115,6 +178,41 @@ def get_home(user_id: str):
115178 "action_id" : "create-event" if sad_member else "propose-event" ,
116179 }
117180 ],
181+ }]
182+
183+ current_events_combined = [
184+ {
185+ "type" : "header" ,
186+ "text" : {
187+ "type" : "plain_text" ,
188+ "text" : "Current Events" if len (current_events_blocks ) > 1 else "Current Event" ,
189+ "emoji" : True ,
190+ },
191+ },
192+ * current_events_blocks ,
193+ ] if len (current_events_blocks ) > 0 else []
194+
195+ return {
196+ "type" : "home" ,
197+ "blocks" : [
198+ {
199+ "type" : "header" ,
200+ "text" : {
201+ "type" : "plain_text" ,
202+ "text" : f":ac-isabelle-cheer: Hi { user_info ['user' ]['profile' ]['display_name' ] or user_info ['user' ]['profile' ]['real_name' ]} !" ,
203+ "emoji" : True ,
204+ },
205+ },
206+ * current_events_combined ,
207+ {"type" : "divider" },
208+ * create_event_btn ,
209+ {
210+ "type" : "header" ,
211+ "text" : {
212+ "type" : "plain_text" ,
213+ "text" : "Upcoming Events" if len (upcoming_events_blocks ) > 1 else "Upcoming Event" if len (upcoming_events_blocks ) == 1 else "No Upcoming Events" ,
214+ "emoji" : True ,
215+ },
118216 },
119217 * upcoming_events_blocks ,
120218 {"type" : "divider" },
0 commit comments