1
1
from datetime import datetime , timezone
2
+ from slack_sdk import WebClient
2
3
3
4
from utils .env import env
4
5
from utils .utils import user_in_safehouse , md_to_mrkdwn
5
6
6
7
7
- def get_home (user_id : str ):
8
+ def get_home (user_id : str , client : WebClient ):
8
9
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
10
13
events = env .airtable .get_all_events (
11
- unapproved = True if admin or sad_member else False
14
+ unapproved = True
12
15
)
13
16
upcoming_events = [
14
17
event
15
18
for event in events
16
19
if datetime .fromisoformat (event ["fields" ]["Start Time" ])
17
20
> datetime .now (timezone .utc )
18
21
]
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
+
19
91
upcoming_events_blocks = []
20
92
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
21
95
upcoming_events_blocks .append ({"type" : "divider" })
22
96
fallback_time = datetime .fromisoformat (event ["fields" ]["Start Time" ]).strftime (
23
97
"%A, %B %d at %I:%M %p"
@@ -90,18 +164,7 @@ def get_home(user_id: str):
90
164
)
91
165
upcoming_events_blocks .append ({"type" : "actions" , "elements" : [* buttons ]})
92
166
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 = [ {
105
168
"type" : "actions" ,
106
169
"elements" : [
107
170
{
@@ -115,6 +178,41 @@ def get_home(user_id: str):
115
178
"action_id" : "create-event" if sad_member else "propose-event" ,
116
179
}
117
180
],
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
+ },
118
216
},
119
217
* upcoming_events_blocks ,
120
218
{"type" : "divider" },
0 commit comments