diff options
author | NatrixAeria <upezu@student.kit.edu> | 2020-10-19 17:09:33 +0200 |
---|---|---|
committer | NatrixAeria <upezu@student.kit.edu> | 2020-10-19 17:09:33 +0200 |
commit | 1cd2075a42d422c81f31a4341f208b542bb9139f (patch) | |
tree | fbd7adcec5b12c8329649ca68db0b92d45b46a1b /bot.py | |
parent | 867d9fe61528de345e6b0ce38b49771002d8fe3a (diff) |
Add scoring system
Diffstat (limited to 'bot.py')
-rw-r--r-- | bot.py | 45 |
1 files changed, 41 insertions, 4 deletions
@@ -8,6 +8,7 @@ import config import discord from discord.ext import commands from random import sample +from collections import defaultdict as dd class Cupido(commands.Bot): @@ -20,6 +21,7 @@ class Cupido(commands.Bot): self.reaction_map = {} self.vote_map = {} self.read_file() + self.score_map = dd(lambda: 0) def read_file(self): try: @@ -94,25 +96,34 @@ class Cupido(commands.Bot): return False @staticmethod - def generate_panel_text(user, members, emojis, reaction_map=None, selected=None): + def get_username(user): + return discord.utils.escape_markdown(user.nick or user.display_name, ignore_links=False) + + @classmethod + def generate_panel_text(cls, user, members, emojis, reaction_map=None, selected=None): text = config.PANEL_TEXT emojis_chosen = [] for member, emoji in zip(members, emojis): if member.id == user.id: continue - name = discord.utils.escape_markdown(member.nick or member.display_name, ignore_links=False) + name = cls.get_username(member) text += f'\n {"☑️" if member.id == selected else "*"} {emoji} {name}' if reaction_map is not None: reaction_map[emoji] = member emojis_chosen.append(emoji) return text, emojis_chosen - async def send_panel(self, ctx, user, members): + async def get_dm_channel(self, user): try: - channel = user.dm_channel or await user.create_dm() + return user.dm_channel or await user.create_dm() except discord.errors.HTTPException: print(f'warning: could not send pm to {user}') return + + async def send_panel(self, ctx, user, members): + channel = await self.get_dm_channel(user) + if channel is None: + return reaction_map = {} emojis = sample(config.EMOJI_POOL, k=len(members)) text, emojis = self.generate_panel_text(user, members, emojis, reaction_map) @@ -180,6 +191,32 @@ class Cupido(commands.Bot): self.tutors.remove(tutor) self.write_file() + async def update_scores(self, guild): + futures = [] + for member in (guild.get_member(i) for i in self.vote_map.keys()): + futures.append(self.update_score(member)) + await await_n(futures) + self.vote_map = {} + + async def update_score(self, member): + if member.id in self.tutors or member.id not in self.vote_map or self.vote_map[member.id] is None: + return + vote = self.vote_map[member.id] + channel = self.get_dm_channel(member) + name = self.get_username(vote) + if vote.id in self.tutors: + self.score_map[member.id] += config.SUCCESS_POINTS + text = config.SUCCESS_TEXT.format(tutor=name, points=self.score_map[member.id]) + color = discord.Colour.green() + title = config.SUCCESS_TITLE + else: + self.score_map[member.id] += config.FAILIURE_POINTS + text = config.FAILIURE_TEXT.format(user=name, points=self.score_map[member.id]) + color = discord.Colour.red() + title = config.FAILIURE_TITLE + embed = discord.Embed(title=title, type="rich", description=text, colour=color) + await (await channel).send(embed=embed) + def main(): token = getenv(config.TOKEN_ENV_VAR) |