salzarbeiter/src/roles.py

113 lines
3.7 KiB
Python

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
)