@@ -32,6 +32,13 @@ def __init__(self, id: int = None, display_name: str = None):
3232 self .id = id
3333 self .display_name = display_name
3434
35+ def __eq__ (self , other : Union ['User' , discord .abc .User ]):
36+ # This makes it so that User objects can be compared to
37+ # discord.abc.User by doing `user == discord.abc.User`. The comparison
38+ # will not work in the other direction because discord.abc.User checks
39+ # for the object type.
40+ return self .id == other .id
41+
3542
3643class Event :
3744
@@ -49,6 +56,8 @@ def __init__(self, date: datetime.datetime, guildEmojis: Tuple[Emoji, ...],
4956 self .messageID = 0
5057 self .id = eventID
5158 self .sideop = sideop
59+ self .attendees : list [User ] = []
60+
5261 if platoon_size is None :
5362 if sideop :
5463 self .platoon_size = "sideop"
@@ -254,7 +263,11 @@ def createEmbed(self) -> Embed:
254263 value = "\N{ZERO WIDTH SPACE} " ,
255264 inline = group .isInline )
256265
257- eventEmbed .set_footer (text = "Event ID: " + str (self .id ))
266+ if self .sideop or cfg .ALWAYS_DISPLAY_ATTENDANCE :
267+ attendees = f"Attendees: { len (self .attendees )} \n \n "
268+ else :
269+ attendees = ""
270+ eventEmbed .set_footer (text = f"{ attendees } Event ID: { str (self .id )} " )
258271
259272 return eventEmbed
260273
@@ -470,6 +483,21 @@ def findSignupRole(self, userID) -> Optional[Role]:
470483 # TODO: raise RoleNotFound instead of returning None?
471484 return None
472485
486+ def has_attendee (self , user : discord .abc .User ) -> bool :
487+ """Check if the given user has been marked as attending."""
488+ return user in self .attendees
489+
490+ def add_attendee (self , user : discord .abc .User ) -> None :
491+ """Add user to the attendance list"""
492+ if not self .has_attendee (user ):
493+ self .attendees .append (
494+ User (id = user .id , display_name = user .display_name ))
495+
496+ def remove_attendee (self , user : discord .abc .User ) -> None :
497+ """Remove user from the attendance list"""
498+ if self .has_attendee (user ):
499+ self .attendees .remove (user )
500+
473501 def __str__ (self ):
474502 return f"{ self .title } (ID { self .id } ) at { self .date } "
475503
@@ -481,6 +509,10 @@ def toJson(self, brief_output=False) -> Dict[str, Any]:
481509 for groupName , roleGroup in self .roleGroups .items ():
482510 roleGroupsData [groupName ] = roleGroup .toJson (brief_output )
483511
512+ attendees_data = {}
513+ for user in self .attendees :
514+ attendees_data [user .id ] = user .display_name
515+
484516 data : Dict [str , Any ] = {}
485517 data ["title" ] = self .title
486518 data ["date" ] = self .date .strftime ("%Y-%m-%d" )
@@ -495,6 +527,7 @@ def toJson(self, brief_output=False) -> Dict[str, Any]:
495527 data ["messageID" ] = self .messageID
496528 data ["platoon_size" ] = self .platoon_size
497529 data ["sideop" ] = self .sideop
530+ data ["attendees" ] = attendees_data
498531 data ["roleGroups" ] = roleGroupsData
499532 return data
500533
@@ -513,6 +546,10 @@ def fromJson(self, eventID, data: dict, emojis, manual_load=False):
513546 self .messageID = int (data .get ("messageID" , 0 ))
514547 self .platoon_size = str (data .get ("platoon_size" , PLATOON_SIZE ))
515548 self .sideop = bool (data .get ("sideop" , False ))
549+ attendees_data = data .get ("attendees" , {})
550+ for userID , name in attendees_data .items ():
551+ self .attendees .append (User (int (userID ), name ))
552+
516553 # TODO: Handle missing roleGroups
517554 groups : List [str ] = []
518555 for groupName , roleGroupData in data ["roleGroups" ].items ():
0 commit comments