Skip to content

Commit 5feee2f

Browse files
committed
tmp: Reorder reactions
1 parent c4e23dd commit 5feee2f

File tree

7 files changed

+156
-117
lines changed

7 files changed

+156
-117
lines changed

commandListener.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,16 @@
1010
from discord import Member
1111
from discord.channel import TextChannel
1212
from discord.emoji import Emoji
13-
from discord.ext.commands import (BadArgument, Cog, Context,
14-
MissingRequiredArgument, command)
15-
from discord.ext.commands.errors import CommandError, CommandInvokeError
13+
from discord.ext.commands import BadArgument, Cog, Context, command
14+
from discord.ext.commands.errors import (CommandError, CommandInvokeError,
15+
MissingRequiredArgument)
1616

1717
import config as cfg
1818
import messageFunctions as msgFnc
1919
from converters import (ArgArchivedEvent, ArgDate, ArgDateTime, ArgEvent,
2020
ArgMessages, ArgRole, ArgTime, UnquotedStr)
21-
from errors import MessageNotFound, RoleError, UnexpectedRole
21+
from errors import (ExtraMessagesFound, MessageNotFound, RoleError,
22+
UnexpectedRole)
2223
from event import Event
2324
from eventDatabase import EventDatabase
2425
from operationbot import OperationBot
@@ -153,7 +154,7 @@ async def _create_event(self, ctx: Context, _date: datetime,
153154
# Create event and sort events, export
154155
event: Event = EventDatabase.createEvent(_date, sideop=sideop,
155156
platoon_size=platoon_size)
156-
await msgFnc.createEventMessages(event, self.bot.eventchannel)
157+
await msgFnc.get_or_create_messages(event, self.bot.eventchannel)
157158
if not batch:
158159
await msgFnc.sortEventMessages(self.bot)
159160
EventDatabase.toJson() # Update JSON file
@@ -165,8 +166,8 @@ async def _create_event(self, ctx: Context, _date: datetime,
165166
async def show(self, ctx: Context, event: ArgEvent):
166167
message = await msgFnc.getEventMessage(event, self.bot)
167168
await ctx.send(message.jump_url)
168-
await msgFnc.createEventMessages(event, cast(TextChannel, ctx.channel),
169-
update_id=False)
169+
await msgFnc.get_or_create_messages(event, cast(TextChannel,
170+
ctx.channel), update_id=False)
170171

171172
# Create event command
172173
@command(aliases=['c'])
@@ -448,7 +449,7 @@ async def _add_role(self, event: Event, rolename: str, batch=False):
448449
await self._update_event(event, reorder=False)
449450
raise e
450451
if not batch:
451-
await self._update_event(event, reorder=False, export=(not batch))
452+
await self._update_event(event, reorder=False)
452453

453454
@command(aliases=['ar'])
454455
async def addrole(self, ctx: Context, event: ArgEvent, *,
@@ -833,7 +834,8 @@ async def archive(self, ctx: Context, event: ArgEvent):
833834
await eventMessage.delete()
834835

835836
# Create messages
836-
await msgFnc.createEventMessages(event, self.bot.eventarchivechannel)
837+
await msgFnc.get_or_create_messages(
838+
event, self.bot.eventarchivechannel)
837839

838840
await ctx.send(f"Event {event} archived")
839841

@@ -970,7 +972,7 @@ async def _load(self, _: Context, event: Event, data: str,
970972
raise ValueError("Malformed data")
971973
if target:
972974
# Display the loaded event in the command channel
973-
await msgFnc.createEventMessages(event, target, update_id=False)
975+
await msgFnc.get_or_create_messages(event, target, update_id=False)
974976
await self._update_event(event)
975977

976978
# @command()
@@ -992,13 +994,16 @@ async def _update_event(self, event: Event, import_db=False,
992994
try:
993995
messages = await msgFnc.getEventMessages(event, self.bot,
994996
exact_number=exact_number)
995-
except MessageNotFound:
996-
messages = await msgFnc.createEventMessages(event,
997-
self.bot.eventchannel)
998-
999-
await msgFnc.updateMessageEmbeds(messages, event,
1000-
self.bot.eventchannel)
1001-
await msgFnc.updateReactions(event, bot=self.bot, reorder=reorder)
997+
except (MessageNotFound, ExtraMessagesFound) as e:
998+
messages = await msgFnc.get_or_create_messages(
999+
event, self.bot.eventchannel)
1000+
if isinstance(e, MessageNotFound):
1001+
# New messages were created, we need to reorder the messages
1002+
await msgFnc.sortEventMessages(self.bot)
1003+
else:
1004+
await msgFnc.updateMessageEmbeds(messages, event,
1005+
self.bot.eventchannel)
1006+
await msgFnc.updateReactions(event, bot=self.bot, reorder=reorder)
10021007

10031008
if export:
10041009
EventDatabase.toJson()

errors.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ class MessageNotFound(Exception):
1010
pass
1111

1212

13+
class ExtraMessagesFound(Exception):
14+
pass
15+
16+
1317
class UnexpectedRole(Exception):
1418
pass
1519

event.py

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import config as cfg
88
from additional_role_group import AdditionalRoleGroup
99
from errors import RoleError, RoleGroupNotFound, RoleNotFound, RoleTaken
10-
from role import Role
10+
from role import ReactionEmoji, Role
1111
from roleGroup import RoleGroup
1212
from 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

eventDatabase.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,14 @@ def sortEvents(cls):
145145
# event = sortedEvents[index]
146146

147147
event.messageIDList = []
148-
for _ in event.createEmbeds():
148+
embeds, _ = event.createEmbeds()
149+
for _ in embeds:
149150
# Each event requires one message per embed
150151
try:
151152
message_id = messageIDLists.pop()
152153
except IndexError:
153154
# No more messages left, rest will be created later
154-
message_id = 0
155+
continue
155156
event.messageIDList.append(message_id)
156157
cls.events[event.id] = event
157158

0 commit comments

Comments
 (0)