diff --git a/examples/reaction_roles.py b/examples/reaction_roles.py index b462ed77a..b58e7f744 100644 --- a/examples/reaction_roles.py +++ b/examples/reaction_roles.py @@ -1,83 +1,85 @@ -"""Uses a messages to add and remove roles through reactions.""" +# This example requires the 'members' privileged intents import discord -class RoleReactClient(discord.Client): +class MyClient(discord.Client): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.role_message_id = 0 # ID of message that can be reacted to to add role + self.role_message_id = 0 # ID of the message that can be reacted to to add/remove a role. self.emoji_to_role = { - partial_emoji_1: 0, # ID of role associated with partial emoji object 'partial_emoji_1' - partial_emoji_2: 0 # ID of role associated with partial emoji object 'partial_emoji_2' + discord.PartialEmoji(name='🔴'): 0, # ID of the role associated with unicode emoji '🔴'. + discord.PartialEmoji(name='🟡'): 0, # ID of the role associated with unicode emoji '🟡'. + discord.PartialEmoji(name='green', id=0): 0, # ID of the role associated with a partial emoji's ID. } - async def on_raw_reaction_add(self, payload): + async def on_raw_reaction_add(self, payload: discord.RawReactionActionEvent): """Gives a role based on a reaction emoji.""" - # Make sure that the message the user is reacting to is the one we care about + # Make sure that the message the user is reacting to is the one we care about. if payload.message_id != self.role_message_id: return + guild = self.get_guild(payload.guild_id) + if guild is None: + # Check if we're still in the guild and it's cached. + return + try: role_id = self.emoji_to_role[payload.emoji] except KeyError: # If the emoji isn't the one we care about then exit as well. return - guild = self.get_guild(payload.guild_id) - if guild is None: - # Check if we're still in the guild and it's cached. - return - role = guild.get_role(role_id) if role is None: # Make sure the role still exists and is valid. return try: - # Finally add the role + # Finally, add the role. await payload.member.add_roles(role) except discord.HTTPException: # If we want to do something in case of errors we'd do it here. pass - async def on_raw_reaction_remove(self, payload): + async def on_raw_reaction_remove(self, payload: discord.RawReactionActionEvent): """Removes a role based on a reaction emoji.""" - # Make sure that the message the user is reacting to is the one we care about + # Make sure that the message the user is reacting to is the one we care about. if payload.message_id != self.role_message_id: return + guild = self.get_guild(payload.guild_id) + if guild is None: + # Check if we're still in the guild and it's cached. + return + try: role_id = self.emoji_to_role[payload.emoji] except KeyError: # If the emoji isn't the one we care about then exit as well. return - guild = self.get_guild(payload.guild_id) - if guild is None: - # Check if we're still in the guild and it's cached. - return - role = guild.get_role(role_id) if role is None: # Make sure the role still exists and is valid. return + # The payload for `on_raw_reaction_remove` does not provide `.member` + # so we must get the member ourselves from the payload's `.user_id`. member = guild.get_member(payload.user_id) if member is None: - # Makes sure the member still exists and is valid + # Make sure the member still exists and is valid. return try: - # Finally, remove the role + # Finally, remove the role. await member.remove_roles(role) except discord.HTTPException: # If we want to do something in case of errors we'd do it here. pass -# This bot requires the members and reactions intents. intents = discord.Intents.default() intents.members = True -client = RoleReactClient(intents=intents) -client.run("token") +client = MyClient(intents=intents) +client.run('token')