From 1cd2075a42d422c81f31a4341f208b542bb9139f Mon Sep 17 00:00:00 2001 From: NatrixAeria Date: Mon, 19 Oct 2020 17:09:33 +0200 Subject: Add scoring system --- bot.py | 45 +++++++++++++++++++++++++++++++++++++++++---- commands.py | 12 +++++++----- config.py | 38 ++++++++++++++++++++++++++++---------- 3 files changed, 76 insertions(+), 19 deletions(-) diff --git a/bot.py b/bot.py index 61c7aeb..1e48e48 100644 --- a/bot.py +++ b/bot.py @@ -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) diff --git a/commands.py b/commands.py index e9982aa..feb6c74 100644 --- a/commands.py +++ b/commands.py @@ -76,6 +76,7 @@ async def shuffle(ctx: commands.Context, channel_size=2): normals.append(member) futures = [] ctx.bot.pair_channels = await ctx.bot.create_pair_channels(ctx, meta_channel, channel_count) + random.shuffle(ctx.bot.pair_channels) groups = [[] for _ in range(channel_count)] for i, member in enumerate(tutors + normals): n = i % channel_count @@ -109,6 +110,7 @@ async def loop_cycle(ctx, t): if not await shuffle(ctx): return False await asyncio.sleep(t) + await ctx.bot.update_scores(ctx.guild) await stop(ctx, cancel_loop=False) return True @@ -123,7 +125,7 @@ async def loop(ctx: commands.Context, n=config.DEFAULT_LOOP_COUNT, t=config.DEFA except ValueError: await answer(ctx, 'error: expecting positive integer arguments for and (e.g. "loop 5 60" to repeat 5 times)') return - await answer(ctx, f'error: repeat shuffling {n} times and each {t} seconds') + await answer(ctx, f'repeat shuffling {n} times and each {t} seconds') for _ in range(n): result = await ctx.bot.await_coroutine(loop_cycle(ctx, t)) message = { @@ -170,14 +172,14 @@ async def remove(ctx: commands.Context, id=None): ) async def list(ctx: commands.Context): if ctx.bot.tutors: - futures = [] + users = [] for tutor in ctx.bot.tutors: try: user = ctx.bot.get_user(tutor) or await ctx.bot.fetch_user(tutor) - futures.append(answer(ctx, f' • {user} ({tutor})')) + users.append((str(user), tutor)) except Exception as e: - futures.append(await answer(ctx, f' • *unknown* ({tutor})')) - await await_n(futures) + users.append(('*unknown*', tutor)) + await answer(ctx, '```\n' + '\n'.join(f' • {name} ({id})' for name, id in users) + '\n```') else: await answer(ctx, 'there is no tutor :/') diff --git a/config.py b/config.py index 240e602..c1843d8 100644 --- a/config.py +++ b/config.py @@ -1,27 +1,45 @@ -NAME = 'cupido' +NAME = 'shuffle bot' TOKEN_ENV_VAR = 'DISCORD_TOKEN' TUTOR_FILE_PATH = 'tutors' -COMMAND_PREFIX = '!<3 ' +COMMAND_PREFIX = 's!' -GAME_STATUS = 'with love' +GAME_STATUS = 'dich aus' HELP_TEXT = f'''{NAME.title()} - your partner for getting shuffled. {NAME.title()} is a discord bot to get to know your people. This software is open-source ! ''' -CATEGORY_CHANNEL_NAME = NAME.title() -LOBBY_CHANNEL_NAME = 'lobby' -LOBBY_CHANNEL_TOPIC = "You wanna get shuffled? You're at the right place!" +CATEGORY_CHANNEL_NAME = 'KENNENLERNEN' +LOBBY_CHANNEL_NAME = 'Lobby' +LOBBY_CHANNEL_TOPIC = "Wer auch schon immer so richtig durchgeshuffelt werden wollte ist hier genau richtig!" # time that one loop cycle needs (in seconds) -DEFAULT_LOOP_TIME = 120 +DEFAULT_LOOP_TIME = 3 * 60 # time that cycles, that "loop" passes DEFAULT_LOOP_COUNT = 3 EMOJI_POOL = ['👾', '🤖', '👻', '🦧', '🍴', '🎮', '🎷', '😈', '🦄', '🐮', '🌻', '🐘', '🍕', '🦉'] -PANEL_TITLE = f'{NAME.title()} control panel' +PANEL_TITLE = f'Wer ist Tutor?' PANEL_TEXT = ''' -You have the choice! -If you think, there are imposters among us, add a reaction with the corresponding emoji:''' +Wenn **du** der Meinung bist, dass du gerade mit einem **Tutor** sprichst, +dann stimme jetzt mit einem der entsprechenden Emojis unten ab: +''' + +SUCCESS_POINTS = 1 +SUCCESS_TITLE = 'Du bist ein Sieger!' +SUCCESS_TEXT = f''' +Du hast einen Tutor entlarvt ({{tutor}})!! 🥳👍 +** -> +{SUCCESS_POINTS} points <- ** +🪙 Du hast nun **{{points}}** Punkte 🪙 +''' + +FAILIURE_POINTS = 0 +FAILIURE_TITLE = 'Schade' +FAILIURE_TEXT = f''' +Schade. {{user}} war kein Tutor 😔 +Vielleicht ja beim nächsten Mal 😎 +** -> +{FAILIURE_POINTS} points <- ** +🪙 Du hast nun **{{points}}** Punkte 🪙 +''' -- cgit v1.2.3-54-g00ecf