From 1b895a76105c1a5cfd70e54a8e9aadf873ea9add Mon Sep 17 00:00:00 2001
From: dnns01 <mail@dnns01.de>
Date: Tue, 21 Jul 2020 21:56:41 +0200
Subject: [PATCH] Role commands and Stats use embeds now as well.

---
 fernuni-bot.py | 114 ++++++++++++++++++++++++++-----------------------
 1 file changed, 60 insertions(+), 54 deletions(-)

diff --git a/fernuni-bot.py b/fernuni-bot.py
index d676832..550e37f 100644
--- a/fernuni-bot.py
+++ b/fernuni-bot.py
@@ -38,20 +38,6 @@ def get_key(role):
             return key
 
 
-def get_guild_roles():
-    """ Get all roles that are available at the guild. """
-
-    guild = get_guild()
-    if guild is not None:
-        roles = {}
-        for role in guild.roles:
-            role_key = get_key(role)
-            if role_key is not None:
-                roles[role_key] = role
-        return roles
-    return None
-
-
 def get_member(user):
     if type(user) is discord.Member:
         return user
@@ -62,13 +48,26 @@ def get_member(user):
     return None
 
 
-def get_members_roles(user):
-    """ Get all roles assigned to a member. """
+def get_roles(user=None):
+    """ Get all roles assigned to a member, or all roles available on the discord server
+    (in both cases only roles are returned, that are defined in roles.json). """
+    roles_list = []
+    roles_dict = {}
 
-    member = get_member(user)
-    if member is not None:
-        return member.roles
-    return None
+    if user is not None:
+        member = get_member(user)
+        if member is not None:
+            roles_list = member.roles
+    else:
+        guild = get_guild()
+        if guild is not None:
+            roles_list = guild.roles
+
+    for role in roles_list:
+        role_key = get_key(role)
+        if role_key is not None:
+            roles_dict[role_key] = role
+    return roles_dict
 
 
 def get_reaction(reactions):
@@ -92,7 +91,7 @@ async def send_dm(user, message, embed=None):
 
 
 @bot.command(name="help")
-async def fu_help(ctx):
+async def cmd_help(ctx):
     """ Send help message as DM """
 
     help_file = open(HELP_FILE, mode='r')
@@ -101,49 +100,54 @@ async def fu_help(ctx):
     await send_dm(ctx.author, "", embed=embed)
 
 
-@bot.command(name="all-roles")
-async def fu_all_roles(message):
-    """ Send all available roles that can be assigned to a member by this bot as DM """
+def get_role_embed(title, roles):
+    """ Returns an embed that represents all the roles that are passed to this function """
+
+    embed = discord.Embed(title=title,
+                          description="Bei jeder Rolle siehst du oben in Fett den Key der Rolle und "
+                                      "darunter den Namen der Rolle",
+                          color=19607)
+    embed.add_field(name="\u200B", value="\u200B", inline=False)
 
-    roles = get_guild_roles()
-    answer = "Verfügbare Rollen: \n"
     for key, role in roles.items():
-        answer += f'[{key}] {role.name}\n'
+        embed.add_field(name=key, value=role.name, inline=False)
 
-    await send_dm(message.author, answer)
+    return embed
 
 
-@bot.command(name="my-roles")
-async def fu_my_roles(message):
-    """ Send the roles assigned to a member as DM. """
+@bot.command(name="all-roles")
+async def cmd_all_roles(message):
+    """ Send all available roles that can be assigned to a member by this bot as DM """
 
-    my_roles = get_members_roles(message.author)
-    answer = "Dir zugewiesene Rollen:\n"
+    roles = get_roles()
+    embed = get_role_embed("Alle verfügbaren Rollen", roles)
+    await send_dm(message.author, "", embed=embed)
 
-    if my_roles is not None:
-        for role in my_roles:
-            key = get_key(role)
-            if key is not None:
-                answer += f'[{key}] {role.name} \n'
 
-    await send_dm(message.author, answer)
+@bot.command(name="my-roles")
+async def cmd_my_roles(message):
+    """ Send the roles assigned to a member as DM. """
+
+    roles = get_roles(message.author)
+    embed = get_role_embed("Dir zugewiesene Rollen", roles)
+    await send_dm(message.author, "", embed=embed)
 
 
 @bot.command(name="add-roles")
-async def fu_add_roles(ctx, *args):
+async def cmd_add_roles(ctx, *args):
     if len(args) > 0:
         await modify_roles(ctx, True, args)
 
 
 @bot.command(name="remove-roles")
-async def fu_remove_roles(ctx, *args):
+async def cmd_remove_roles(ctx, *args):
     if len(args):
         await modify_roles(ctx, False, args)
 
 
 @bot.command(name="add-role")
 @commands.is_owner()
-async def fu_add_role(ctx, key, role):
+async def cmd_add_role(ctx, key, role):
     assignable_roles[key] = role
     roles_file = open(ROLES_FILE, mode='w')
     json.dump(assignable_roles, roles_file)
@@ -154,7 +158,7 @@ async def fu_add_role(ctx, key, role):
         await send_dm(ctx.author, f"Fehler beim Hinzufügen der Rolle {role}")
 
 
-def fu_load_roles():
+def load_roles():
     global assignable_roles
     roles_file = open(ROLES_FILE, mode='r')
     assignable_roles = json.load(roles_file)
@@ -168,7 +172,7 @@ async def modify_roles(ctx, add, args):
     if guild is not None:
         member = get_member(ctx.author)
 
-        roles = get_guild_roles()
+        roles = get_roles()
         for key in args:
             if key in roles:
                 role = roles[key]
@@ -187,7 +191,7 @@ async def modify_roles(ctx, add, args):
 
 
 @bot.command(name="link")
-async def fu_link(message):
+async def cmd_link(message):
     """ Sends link to invite others to Discord server in Chat. """
 
     await message.channel.send('Benutze bitte folgenden Link, um andere Studierende auf unseren Discord einzuladen: '
@@ -195,28 +199,30 @@ async def fu_link(message):
 
 
 @bot.command(name="stats")
-async def fu_stats(message):
+async def cmd_stats(message):
     """ Sends stats in Chat. """
 
     guild = get_guild()
     members = await guild.fetch_members().flatten()
-    roles = get_guild_roles()
-    answer = f'Wir haben aktuell {len(members)} Mitglieder auf diesem Server.'
-    answer += f'\n\nVerteilt auf Rollen: '
-
+    roles = get_roles()
+    answer = f''
+    embed = discord.Embed(title="Statistiken",
+                          description=f'Wir haben aktuell {len(members)} Mitglieder auf diesem Server, verteilt auf folgende Rollen:')
     for key, role in roles.items():
         role_members = role.members
         if len(role_members) > 0 and not role.name.startswith("Farbe"):
-            answer += f'\n{role.name}: {len(role_members)} Mitglieder'
+            embed.add_field(name=role.name, value=f'{len(role_members)} Mitglieder', inline=False)
 
     no_role = 0
     for member in members:
+        # ToDo Search for study roles only!
         if len(member.roles) == 1:
             no_role += 1
 
-    answer += f'\n\n{no_role} Mitglieder ohne Rolle'
+    embed.add_field(name="\u200B", value="\u200b", inline=False)
+    embed.add_field(name="Mitglieder ohne Rolle", value=str(no_role), inline=False)
 
-    await message.channel.send(answer)
+    await message.channel.send(answer, embed=embed)
 
 
 async def pin_message(message):
@@ -240,7 +246,7 @@ async def unpin_message(message):
 @bot.event
 async def on_ready():
     print("Client started!")
-    fu_load_roles()
+    load_roles()
 
 
 @bot.event
-- 
GitLab