diff options
Diffstat (limited to 'bot.py')
-rw-r--r-- | bot.py | 50 |
1 files changed, 44 insertions, 6 deletions
@@ -7,6 +7,7 @@ import config import discord from discord.ext import commands +from random import randint class Cupido(commands.Bot): @@ -16,6 +17,8 @@ class Cupido(commands.Bot): self.lobby_channel = None self.pair_channels = [] self.task = None + self.reaction_map = {} + self.vote_map = {} async def await_coroutine(self, co): if self.task is not None: @@ -79,17 +82,28 @@ class Cupido(commands.Bot): return False async def send_panel(self, ctx, user, members): - channel = user.dm_channel or await user.create_dm() + try: + channel = user.dm_channel or await user.create_dm() + except discord.errors.HTTPException: + print(f'warning: could not send pm to {user}') + return text = config.PANEL_TEXT - n = 0 + reactions = [] + emojis = config.EMOJI_POOL[:] + reaction_map = {} for member in members: if member == user: continue - name = discord.utils.escape_markdown(discord.utils.escape_mentions(member.nick), ignore_links=False) - text += f'\n * {config.EMOJI_POOL[n]} {name}' - n += 1 + name = discord.utils.escape_markdown(member.nick or member.display_name, ignore_links=False) + emoji = emojis.pop(randint(0, len(emojis) - 1)) + text += f'\n * {emoji} {name}' + reactions.append(emoji) + reaction_map[emoji] = member + self.reaction_map[user.id] = reaction_map embed = discord.Embed(title=config.PANEL_TITLE, type="rich", description=text, colour=discord.Colour.purple()) - await channel.send(embed=embed) + msg = await channel.send(embed=embed) + await await_n(map(msg.add_reaction, reactions)) + return msg async def destroy_pair_channels(self, ctx, meta_channel): await await_n(map(self.try_delete_channel, self.get_pair_channels_no_cache(ctx, meta_channel))) @@ -110,6 +124,30 @@ class Cupido(commands.Bot): return None return meta_channel, lobby_channel + async def on_reaction_add(self, reaction, user): + return await self.toggle_vote(reaction, user) + + async def on_reaction_remove(self, reaction, user): + return await self.toggle_vote(reaction, user) + + async def toggle_vote(self, reaction, user): + if self.vote_map.get(user.id) is None: + if user.id in self.reaction_map: + self.vote_map[user.id] = self.reaction_map[user.id][str(reaction.emoji)] + else: + self.vote_map[user.id] = None + await self.update_message_panel(reaction.message, self.vote_map.get(user.id), reaction.emoji) + + async def update_message_panel(self, message, vote, emoji): + embeds = message.embeds + if not embeds: return None + embed = embeds[0] + current, after = '*', '☑️' + if vote is None: + current, after = after, current + embed.description = embed.description.replace(f'\n {current} {emoji} ', f'\n {after} {emoji} ') + return await message.edit(embed=embed) + def main(): token = getenv(config.TOKEN_ENV_VAR) |