From 3081719fff1673f80f1e9ddcd5fb4c5a6bb5a4fc Mon Sep 17 00:00:00 2001 From: Dnns <invisiblee@arcor.de> Date: Mon, 13 Apr 2020 19:04:31 +0200 Subject: [PATCH] Added pin-bot functionality. Bot will now pin messages, when a pin reaction is set, or unpin a message, when all pin reactions are removed from this message. --- fernuni-bot.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/fernuni-bot.py b/fernuni-bot.py index e9a01b7..bbaf48b 100644 --- a/fernuni-bot.py +++ b/fernuni-bot.py @@ -7,7 +7,8 @@ from dotenv import load_dotenv load_dotenv() TOKEN = os.getenv('DISCORD_TOKEN') GUILD = int(os.getenv('DISCORD_GUILD')) -activity = discord.Game("ein Rollenspiel") +PIN_EMOJI = "📌" +activity = discord.Game("ein Test-Rollenspiel") client = discord.Client(activity=activity) @@ -63,6 +64,16 @@ def get_members_roles(user): return None +# Returns the reaction, that is equal to the specified PIN_EMOJI, +# or if that reaction does not exist in list of reactions, None will be returned +def get_reaction(reactions): + for reaction in reactions: + if reaction.emoji == PIN_EMOJI: + return reaction + + return None + + # Send DM to a user/member async def send_dm(user, message): if type(user) is discord.User or type(user) is discord.Member: @@ -79,10 +90,13 @@ async def fu_help(message): answer += f'`=fu-help` - Zeigt diesen Hilfetext an\n' answer += f'`=fu-all-roles` - Zeigt alle verfügbaren Rollen an, die ich dir zuweisen/entfernen kann.\n' answer += f'`=fu-my-roles` - Zeigt alle Rollen an, die dir momentan zugewiesen sind.\n' - answer += f'`=fu-add-roles` - Mit diesem Kommando, gefolgt von einer Liste von Rollen, weise ich dir diese Rollen zu.\n' - answer += f'`=fu-remove roles` - Mit diesem Kommendo, gefolgt von einer Liste von Rollen, entferne ich dir diese Rollen.\n\n' + answer += f'`=fu-add-roles` - Mit diesem Kommando, gefolgt von einer Liste von Rollen, ' \ + f'weise ich dir diese Rollen zu.\n' + answer += f'`=fu-remove roles` - Mit diesem Kommendo, gefolgt von einer Liste von Rollen, ' \ + f'entferne ich dir diese Rollen.\n\n' answer += f'Hinweise für die Nutzung der Kommandos zum Zuweisen/Entfernen von Rollen:\n' - answer += f'In der Liste der verfügbaren Rollen siehst du in eckigen Klammern einen Schlüssel für die jeweilige Rolle, die für diese Kommandos zu verwenden ist. \n' + answer += f'In der Liste der verfügbaren Rollen siehst du in eckigen Klammern einen Schlüssel für die jeweilige ' \ + f'Rolle, die für diese Kommandos zu verwenden ist. \n' answer += f'Beispiel: \n[BI] B.Sc. Informatik \n[MM] M.Sc. Mathematik \n' answer += f'`=fu-add-roles BI` fügt die Rolle B.Sc. Informatik hinzu. \n' answer += f'`=fu-remove-roles BI MM` entfernt die Rollen B.Sc. Informatik und M.Sc Mathematik. \n' @@ -142,6 +156,20 @@ async def fu_modify_roles(message, add): await send_dm(message.author, f'Fehler bei der Entfernung der Rolle {role.name}') +# Pin the given message, if it is not already pinned +async def pin_message(message): + if not message.pinned: + await message.pin() + + +# Unpin the given message, if it is pinned, and it has no pin reaction remaining. +async def unpin_message(message): + if message.pinned: + reaction = get_reaction(message.reactions) + if reaction is None: + await message.unpin() + + @client.event async def on_ready(): print("Client started!") @@ -169,4 +197,20 @@ async def on_message(message): "Um andere auf diesen Discord einzuladen, nutze bitte folgenden Link: http://fernuni-discord.dnns01.de") +@client.event +async def on_raw_reaction_add(payload): + if payload.emoji.name == PIN_EMOJI: + channel = await client.fetch_channel(payload.channel_id) + message = await channel.fetch_message(payload.message_id) + await pin_message(message) + + +@client.event +async def on_raw_reaction_remove(payload): + if payload.emoji.name == PIN_EMOJI: + channel = await client.fetch_channel(payload.channel_id) + message = await channel.fetch_message(payload.message_id) + await unpin_message(message) + + client.run(TOKEN) -- GitLab