11import os
2+ import io
23import requests
34import json
45import db
78from nacl .exceptions import BadSignatureError
89import secrets
910from enum import Enum
11+ from parameter import get_ssm_parameter , set_ssm_parameter
12+ from report import generate_report
1013
1114DISCORD_PUBLIC_KEY = os .environ .get ("DISCORD_PUBLIC_KEY" )
1215DISCORD_TOKEN = os .environ .get ("DISCORD_TOKEN" )
@@ -62,6 +65,9 @@ def interact(raw_request):
6265 # The ID of the Guild in which the bot resides in
6366 guildID = raw_request ["guild_id" ]
6467
68+ # The ID of the channel in which the interaction happened
69+ channelID = raw_request ["channel_id" ]
70+
6571 # A boolean variable that determines if the user who executed the command is an administrator or not
6672 admin = (int (raw_request ["member" ]["permissions" ]) & 0x8 ) == 0x8
6773
@@ -120,6 +126,18 @@ def interact(raw_request):
120126 user = raw_request ["member" ]["user" ]
121127 embeds = build_stats_embed (user )
122128 send_embed (embeds , id , token )
129+ case "set_semester" :
130+ if admin :
131+ semester = str (data ["options" ][0 ]["value" ])
132+ set_ssm_parameter (semester )
133+ send (f"The semester has been set to { semester } successfully." , id , token )
134+ else : send ("Only administrators can set the semester!" , id , token )
135+ case "generate_report" :
136+ if admin :
137+ semester = str (data ["options" ][0 ]["value" ])
138+ filename = generate_report (semester )
139+ send_file (filename , id , token )
140+ else : send ("Only administrators can generate reports!" , id , token )
123141 case "reset" :
124142 if admin :
125143 # send(f"Deleting specified user...", id, token)
@@ -214,7 +232,7 @@ def validate_attendance(userid: str, code: str, type: str) -> AttendanceStatus:
214232 if active :
215233 user = db .get_user (userid )
216234 serialized_code = code + '|' + code_response ['expiration' ]
217- serialized_event = code_response ['event_name' ] + '|' + type
235+ serialized_event = code_response ['event_name' ] + '|' + type + '|' + get_ssm_parameter ()
218236 if user != None :
219237 if serialized_code not in user ['codes_used' ]:
220238 status = AttendanceStatus .VALID
@@ -248,9 +266,14 @@ def build_stats_embed(user):
248266 i = len (user_stats ["events_attended" ]) - 1
249267 while len (embeds ['fields' ]) < 25 and i >= 0 :
250268 event_deserialized = user_stats ['events_attended' ][i ].split ('|' )
269+ try :
270+ semester = event_deserialized [2 ]
271+ except :
272+ semester = "Fall 2024"
273+
251274 embeds ['fields' ].append ({
252275 'name' : event_deserialized [0 ],
253- 'value' : event_deserialized [1 ],
276+ 'value' : event_deserialized [1 ] + f" ( { semester } )" ,
254277 'inline' : True
255278 })
256279
@@ -266,4 +289,26 @@ def get_mentioned_user(userid):
266289 }
267290 response = requests .get (f"https://discord.com/api/users/{ userid } " , headers = headers )
268291
269- return response .json ()
292+ return response .json ()
293+
294+ def send_file (filename : str , id , token ):
295+ url = f"https://discord.com/api/interactions/{ id } /{ token } /callback"
296+
297+ with open (filename , 'rb' ) as fp :
298+ callback_data = {
299+ "type" : 4 ,
300+ "data" : {
301+ "content" : "Here is the requested report." ,
302+ }
303+ }
304+
305+ response = requests .post (
306+ url ,
307+ data = {"payload_json" : json .dumps (callback_data )},
308+ files = {
309+ "file" : (filename , fp , 'text/csv' )
310+ }
311+ )
312+
313+ print ("Response status: code: " )
314+ print (response .status_code )
0 commit comments