77import config as cfg
88from additional_role_group import AdditionalRoleGroup
99from errors import RoleError , RoleGroupNotFound , RoleNotFound , RoleTaken
10- from role import Role
10+ from role import ReactionEmoji , Role
1111from roleGroup import RoleGroup
1212from secret import PLATOON_SIZE
1313
@@ -243,47 +243,54 @@ def _create_embed(self, title: str) -> Embed:
243243 f"{ server_port } "
244244 f"{ event_description } "
245245 f"{ mods } " )
246- return Embed (title = title , description = description , colour = self .color )
246+ embed = Embed (title = title , description = description , colour = self .color )
247+ embed .set_footer (text = "Event ID: " + str (self .id ))
248+ return embed
247249
248- def createEmbed (self ) -> Embed :
250+ def create_dummy_embed (self ) -> Embed :
249251 """Return the first embed for the event"""
250- return self .createEmbeds ()[ 0 ]
252+ return self ._create_embed ( self . title )
251253
252- def createEmbeds (self ) -> List [Embed ]:
253- """Return a list of embeds for the event"""
254+ def createEmbeds (self ) -> Tuple [List [Embed ], List [List [ReactionEmoji ]]]:
255+ """Return a list of embeds and their corresponding reactions for the
256+ event"""
254257 eventEmbed = self ._create_embed (self .title )
258+ reactions = []
255259
256260 # Add field to embed for every rolegroup
257261 for group in self .roleGroups .values ():
258262 if len (group ) > 0 and group .name != "Additional" :
259263 # The Additional group is handled separately
260264 eventEmbed .add_field (name = group .name , value = str (group ),
261265 inline = group .isInline )
266+ reactions += group .get_reactions ()
262267 elif group .name == "Dummy" :
263268 eventEmbed .add_field (name = "\N{ZERO WIDTH SPACE} " ,
264269 value = "\N{ZERO WIDTH SPACE} " ,
265270 inline = group .isInline )
266- eventEmbed .set_footer (text = "Event ID: " + str (self .id ))
267271
268272 if len (self .roleGroups ["Additional" ]) == 0 :
269273 # There are no additional roles, the embed is ready
270- return [eventEmbed ]
274+ return ( [eventEmbed ], [ reactions ])
271275
272276 # Handle additional roles
273277 if len (self .getReactions ()) <= REACTIONS_PER_MESSAGE :
274278 # All roles fit in a single message
275- group = self .roleGroups ["Additional" ]
276- eventEmbed .add_field (name = group .name , value = str (group ),
277- inline = group .isInline )
278- return [eventEmbed ]
279+ additional = self .roleGroups ["Additional" ]
280+ eventEmbed .add_field (name = additional .name , value = str (additional ),
281+ inline = additional .isInline )
282+ return ( [eventEmbed ], [ reactions + additional . get_reactions ()])
279283
280- return [eventEmbed ] + self .createAdditionalEmbeds ()
284+ embeds , additional_reactions = self .createAdditionalEmbeds ()
285+ return ([eventEmbed ] + embeds , [reactions ] + additional_reactions )
281286
282- def createAdditionalEmbeds (self ) -> List [Embed ]:
287+ def createAdditionalEmbeds (self ) -> Tuple [List [Embed ],
288+ List [List [ReactionEmoji ]]]:
283289 """Creates additional embeds.
284290
285291 The number of embeds depend on the Additional roles group"""
286- embeds = []
292+ embeds : List [Embed ] = []
293+ all_reactions : List [List [ReactionEmoji ]] = []
287294 group = self .roleGroups ["Additional" ]
288295
289296 # Substract 1 because REACTIONS_PER_MESSAGE roles still fit in a single
@@ -292,10 +299,12 @@ def createAdditionalEmbeds(self) -> List[Embed]:
292299
293300 for embed_number in range (embed_count ):
294301 role_list = ""
302+ reactions = []
295303 first = embed_number * REACTIONS_PER_MESSAGE
296304 last = (embed_number + 1 ) * REACTIONS_PER_MESSAGE
297305 for role in group .roles [first :last ]:
298306 role_list += f'{ str (role )} \n '
307+ reactions .append (role .emoji )
299308 if role_list == "" :
300309 # Didn't add any roles -> skipping this embed. Discord doesn't
301310 # like embeds with empty fields. This should only happen if
@@ -310,8 +319,9 @@ def createAdditionalEmbeds(self) -> List[Embed]:
310319 value = role_list , inline = False )
311320 eventEmbed .set_footer (text = "Event ID: " + str (self .id ))
312321 embeds .append (eventEmbed )
322+ all_reactions .append (reactions )
313323
314- return embeds
324+ return ( embeds , all_reactions )
315325
316326 # Add default role groups
317327 def _add_default_role_groups (self ):
@@ -332,15 +342,16 @@ def _add_default_roles(self):
332342 def addAdditionalRole (self , name : str ) -> str :
333343
334344 # check if this role already exists
335- for roleGroup in self .roleGroups .values ():
336- role : Role
337- for role in roleGroup .roles :
338- if role .name == name :
339- raise RoleError (f"Role with name { name } already exists, "
340- "not adding new role" )
345+ try :
346+ self .findRoleWithName (name )
347+ except RoleNotFound :
348+ pass
349+ else :
350+ raise RoleError (f"Role with name { name } already exists, "
351+ "not adding new role" )
341352
342353 # Find next emoji for additional role
343- if self .countReactions () >= MAX_REACTIONS :
354+ if self .reaction_count >= MAX_REACTIONS :
344355 raise RoleError (f"Too many roles, not adding role { name } " )
345356 emoji = cfg .ADDITIONAL_ROLE_EMOJIS [self .additional_role_count ]
346357
@@ -411,31 +422,25 @@ def _getNormalEmojis(self, guildEmojis) -> Dict[str, Emoji]:
411422
412423 return normalEmojis
413424
414- def getReactions (self ) -> List [Union [ str , Emoji ] ]:
425+ def getReactions (self ) -> List [ReactionEmoji ]:
415426 """Return reactions of all roles and extra reactions"""
416427 reactions = []
417428
418- for roleGroup in self .roleGroups .values ():
419- role : Role
420- for role in roleGroup .roles :
421- emoji = role .emoji
422- # Skip the ZEUS reaction. Zeuses can only be signed up using
423- # the signup command
424- if not (isinstance (emoji , Emoji )
425- and emoji .name == cfg .EMOJI_ZEUS ):
426- reactions .append (role .emoji )
429+ for role_group in self .roleGroups .values ():
430+ reactions += role_group .get_reactions ()
427431
428432 if self .sideop :
429433 if cfg .ATTENDANCE_EMOJI :
430434 reactions .append (cfg .ATTENDANCE_EMOJI )
431435
432436 return reactions
433437
434- def countReactions (self ) -> int :
438+ @property
439+ def reaction_count (self ) -> int :
435440 """Count how many reactions a message should have."""
436441 return len (self .getReactions ())
437442
438- def getReactionsOfGroup (self , groupName : str ) -> List [Union [ str , Emoji ] ]:
443+ def getReactionsOfGroup (self , groupName : str ) -> List [ReactionEmoji ]:
439444 """Find reactions of a given role group."""
440445 reactions = []
441446
0 commit comments