summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNatrixAeria <upezu@student.kit.edu>2020-10-19 17:09:33 +0200
committerNatrixAeria <upezu@student.kit.edu>2020-10-19 17:09:33 +0200
commit1cd2075a42d422c81f31a4341f208b542bb9139f (patch)
treefbd7adcec5b12c8329649ca68db0b92d45b46a1b
parent867d9fe61528de345e6b0ce38b49771002d8fe3a (diff)
Add scoring system
-rw-r--r--bot.py45
-rw-r--r--commands.py12
-rw-r--r--config.py38
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 <n> and <t> (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 <https://git.kobert.dev/lovefinderrz.git/>!
'''
-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 🪙
+'''