summaryrefslogtreecommitdiff
path: root/bot.py
diff options
context:
space:
mode:
Diffstat (limited to 'bot.py')
-rw-r--r--bot.py45
1 files changed, 41 insertions, 4 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)