from discord import Interaction, SelectOption, Embed, Colour from discord.ui import Button, Select, View from emoji import emojize class AddRoleSelect(Select): async def callback(self, interaction: Interaction): added_roles = [ role for role in [ interaction.guild.get_role(int(role_id)) for role_id in interaction.data['values'] ] if role not in interaction.user.roles ] for role in added_roles: await interaction.user.add_roles(role) await interaction.response.send_message( ephemeral=True, delete_after=30, embed=Embed( title=f"{emojize(":check_mark_button:")} Added:", colour=Colour.green(), description=", ".join([ role.mention for role in added_roles ]) ) ) class RemoveRoleSelect(Select): async def callback(self, interaction: Interaction): removed_roles = [ role for role in [ interaction.guild.get_role(int(role_id)) for role_id in interaction.data['values'] ] if role in interaction.user.roles ] for role in removed_roles: await interaction.user.remove_roles(role) await interaction.response.send_message( ephemeral=True, delete_after=30, embed=Embed( title=f"{emojize(":cross_mark:")} Removed:", colour=Colour.red(), description=", ".join([ role.mention for role in removed_roles ]) ) ) class AddRoleButton(Button): async def callback(self, interaction: Interaction): view=View() options = [ SelectOption( label=f"@{interaction.guild.get_role(role['id']).name}", value=role['id'], description=role['description'], emoji=interaction.client.get_emoji(role['emoji']) ) for role in interaction.client.config['roles'] if role['id'] not in [ role.id for role in list(interaction.user.roles) ] ] if options == []: await interaction.response.send_message( content="You already own all available roles." ) return view.add_item( AddRoleSelect( min_values=0, max_values=len(options) if len(options) <= 25 else 25, placeholder="Select roles to add:", options = options ) ) await interaction.response.send_message( ephemeral=True, delete_after=30, view=view ) class RemoveRoleButton(Button): async def callback(self, interaction: Interaction): view=View() options = [ SelectOption( label=f"@{interaction.guild.get_role(role['id']).name}", value=role['id'], description=role['description'], emoji=interaction.client.get_emoji(role['emoji']) ) for role in interaction.client.config['roles'] if role['id'] in [ role.id for role in list(interaction.user.roles) ] ] if options == []: await interaction.response.send_message( content="You own none of the available roles." ) return view.add_item( RemoveRoleSelect( min_values=0, max_values=len(options) if len(options) <= 25 else 25, placeholder="Select roles to remove:", options = options ) ) await interaction.response.send_message( ephemeral=True, delete_after=30, view=view )