Modify roles cog to use app commands for adding and removing language and framework roles
This commit is contained in:
parent
67c1e340c2
commit
d308ea0c06
164
cogs/roles.py
164
cogs/roles.py
|
|
@ -1,32 +1,174 @@
|
||||||
from discord.ext import commands
|
import discord
|
||||||
|
from discord import app_commands
|
||||||
from embeds.MatrixRolesEmbed import MatrixRolesEmbed
|
from embeds.MatrixRolesEmbed import MatrixRolesEmbed
|
||||||
from embeds.LanguageRolesEmbed import LanguageRolesEmbed
|
from embeds.LanguageRolesEmbed import LanguageRolesEmbed
|
||||||
from embeds.FrameworkRolesEmbed import FrameworkRolesEmbed
|
from embeds.FrameworkRolesEmbed import FrameworkRolesEmbed
|
||||||
from libs.Channels import Channels
|
from libs.Channels import Channels
|
||||||
from libs.Guilds import Guilds
|
|
||||||
from libs.Cog import Cog
|
from libs.Cog import Cog
|
||||||
|
from libs.Roles import Roles
|
||||||
|
from data.models.Language import Language
|
||||||
|
from data.models.Framework import Framework
|
||||||
from views.MatrixButtons import MatrixButtons
|
from views.MatrixButtons import MatrixButtons
|
||||||
from views.LanguageButtons import LanguageButtons
|
from views.LanguageButtons import LanguageButtons
|
||||||
from views.FrameworkButtons import FrameworkButtons
|
from views.FrameworkButtons import FrameworkButtons
|
||||||
|
from __main__ import guild_id
|
||||||
|
|
||||||
|
guild = discord.Object(id=guild_id)
|
||||||
|
|
||||||
class RolesCog(Cog):
|
class RolesCog(Cog):
|
||||||
|
|
||||||
def __init__(self, bot):
|
def __init__(self, bot):
|
||||||
super().__init__(bot)
|
super().__init__(bot)
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
self.roles = Roles()
|
||||||
|
self.channel = None
|
||||||
self.messages_deletable = True
|
self.messages_deletable = True
|
||||||
|
self.role_messages = {}
|
||||||
|
|
||||||
@commands.Cog.listener()
|
@Cog.listener()
|
||||||
async def on_ready(self):
|
async def on_ready(self):
|
||||||
guild = await Guilds().get_guild(self.bot)
|
self.channel = await Channels().get_channel(self.bot.guild, "add-roles")
|
||||||
channel = await Channels().get_channel(guild, "add-roles")
|
|
||||||
|
|
||||||
if channel is not None:
|
if self.channel is not None:
|
||||||
await channel.purge()
|
await self.channel.purge()
|
||||||
await channel.send(embed=MatrixRolesEmbed(), view=MatrixButtons())
|
self.role_messages["matrix"] = await self.channel.send(embed=MatrixRolesEmbed(), view=MatrixButtons())
|
||||||
await channel.send(embed=LanguageRolesEmbed(), view=LanguageButtons(self.bot))
|
self.role_messages["languages"] = await self.channel.send(embed=LanguageRolesEmbed(), view=LanguageButtons(self.bot))
|
||||||
await channel.send(embed=FrameworkRolesEmbed(), view=FrameworkButtons(self.bot))
|
self.role_messages["frameworks"] = await self.channel.send(embed=FrameworkRolesEmbed(), view=FrameworkButtons(self.bot))
|
||||||
|
|
||||||
|
async def role_exists_in_db(self, model, role):
|
||||||
|
return self.bot.db.role_exists(model, role)
|
||||||
|
|
||||||
|
async def edit_message(self, message_id, view):
|
||||||
|
message = await self.channel.fetch_message(message_id)
|
||||||
|
await message.edit(view=view)
|
||||||
|
|
||||||
|
async def get_role(self, role):
|
||||||
|
return await self.roles.get_guild_role(self.bot.guild, role)
|
||||||
|
|
||||||
|
async def add_guild_role(self, role):
|
||||||
|
message = f"Role `{role}` already exists."
|
||||||
|
if await self.roles.add_guild_role(role):
|
||||||
|
message = f"Role `{role}` created on server"
|
||||||
|
return message
|
||||||
|
|
||||||
|
async def remove_guild_role(self, role):
|
||||||
|
message = f"Role `{role}` doesn't exist."
|
||||||
|
if await self.roles.remove_guild_role(role):
|
||||||
|
message = f"Role `{role}` removed from server"
|
||||||
|
return message
|
||||||
|
|
||||||
|
async def add_to_db(self, model):
|
||||||
|
self.bot.db.add_record(model)
|
||||||
|
return f"Role `{model.label}` added to {model.__tablename__}"
|
||||||
|
|
||||||
|
async def remove_from_db(self, model, label):
|
||||||
|
self.bot.db.session.query(model).filter(model.label == label).delete()
|
||||||
|
self.bot.db.session.commit()
|
||||||
|
return f"Role `{label}` removed from {model.__tablename__}"
|
||||||
|
|
||||||
|
@app_commands.command(
|
||||||
|
name="add_language",
|
||||||
|
description="Add a language to the available language roles"
|
||||||
|
)
|
||||||
|
@app_commands.describe(language="Case-sensitive string of the language you wish to add")
|
||||||
|
@app_commands.guilds(guild)
|
||||||
|
@app_commands.checks.has_any_role("Royal Penguins", "Emperor Penguin")
|
||||||
|
async def add_language(self, interaction: discord.Interaction, language: str):
|
||||||
|
messages = [await self.add_guild_role(language)]
|
||||||
|
|
||||||
|
if not await self.role_exists_in_db(Language, language):
|
||||||
|
messages.append(await self.add_to_db(Language(label=language)))
|
||||||
|
await self.edit_message(self.role_messages["languages"].id, view=LanguageButtons(self.bot))
|
||||||
|
else:
|
||||||
|
messages.append(f"Role `{language}` already exists")
|
||||||
|
|
||||||
|
await interaction.response.send_message(f"\n".join(messages), ephemeral=True, delete_after=5)
|
||||||
|
|
||||||
|
@add_language.error
|
||||||
|
async def add_language_error(self, interaction: discord.Interaction, error):
|
||||||
|
await interaction.response.send_message(f"An error occurred while adding the language.\n{error}", ephemeral=True)
|
||||||
|
|
||||||
|
@app_commands.command(
|
||||||
|
name="remove_language",
|
||||||
|
description="Remove a language and associated frameworks from the available language roles."
|
||||||
|
)
|
||||||
|
@app_commands.describe(language="Case-sensitive string of the language you wish to remove.")
|
||||||
|
@app_commands.guilds(guild)
|
||||||
|
@app_commands.checks.has_any_role("Royal Penguins", "Emperor Penguin")
|
||||||
|
async def remove_language(self, interaction: discord.Interaction, language: str):
|
||||||
|
messages = []
|
||||||
|
|
||||||
|
fetched_language = self.bot.db.session.query(Language).filter(Language.label == language).first()
|
||||||
|
for framework in fetched_language.frameworks:
|
||||||
|
messages.append(await self.remove_guild_role(framework.label))
|
||||||
|
messages.append(await self.remove_from_db(Framework, framework.label))
|
||||||
|
|
||||||
|
messages.append(await self.remove_guild_role(language))
|
||||||
|
|
||||||
|
if await self.role_exists_in_db(Language, language):
|
||||||
|
messages.append(await self.remove_from_db(Language, language))
|
||||||
|
else:
|
||||||
|
messages.append(f"Role `{language}` doesn't exist in the db")
|
||||||
|
|
||||||
|
await self.edit_message(self.role_messages["frameworks"].id, view=FrameworkButtons(self.bot))
|
||||||
|
await self.edit_message(self.role_messages["languages"].id, view=LanguageButtons(self.bot))
|
||||||
|
await interaction.response.send_message(f"\n".join(messages), ephemeral=True)
|
||||||
|
|
||||||
|
@remove_language.error
|
||||||
|
async def remove_language_error(self, interaction: discord.Interaction, error):
|
||||||
|
await interaction.response.send_message(f"An error occurred while removing the language.\n{error}", ephemeral=True)
|
||||||
|
|
||||||
|
@app_commands.command(
|
||||||
|
name="add_framework",
|
||||||
|
description="Add a framework to the available framework roles"
|
||||||
|
)
|
||||||
|
@app_commands.describe(framework="Case-sensitive string of the framework you wish to add")
|
||||||
|
@app_commands.describe(language="Case-sensitive string of the language of the framework. Must already exist.")
|
||||||
|
@app_commands.guilds(guild)
|
||||||
|
@app_commands.checks.has_any_role("Royal Penguins", "Emperor Penguin")
|
||||||
|
async def add_framework(self, interaction: discord.Interaction, framework: str, language: str):
|
||||||
|
messages = []
|
||||||
|
|
||||||
|
lng = self.bot.db.session.query(Language).filter(Language.label == language).first()
|
||||||
|
if not lng:
|
||||||
|
await interaction.response.send_message(f"Language `{language}` doesn't exist", ephemeral=True, delete_after=10)
|
||||||
|
else:
|
||||||
|
messages.append(await self.add_guild_role(framework))
|
||||||
|
|
||||||
|
if not await self.role_exists_in_db(Framework, framework):
|
||||||
|
messages.append(await self.add_to_db(Framework(label=framework, language=lng)))
|
||||||
|
await self.edit_message(self.role_messages["frameworks"].id, view=FrameworkButtons(self.bot))
|
||||||
|
else:
|
||||||
|
messages.append(f"Role `{framework}` already exists")
|
||||||
|
|
||||||
|
await interaction.response.send_message(f"\n".join(messages), ephemeral=True, delete_after=5)
|
||||||
|
|
||||||
|
@add_framework.error
|
||||||
|
async def add_framework_error(self, interaction: discord.Interaction, error):
|
||||||
|
await interaction.response.send_message(f"An error occurred while adding the framework.\n{error}", ephemeral=True)
|
||||||
|
|
||||||
|
@app_commands.command(
|
||||||
|
name="remove_framework",
|
||||||
|
description="Remove a framework from the available framework roles"
|
||||||
|
)
|
||||||
|
@app_commands.describe(framework="Case-sensitive string of the framework to remove.")
|
||||||
|
@app_commands.guilds(guild)
|
||||||
|
@app_commands.checks.has_any_role("Royal Penguins", "Emperor Penguin")
|
||||||
|
async def remove_framework(self, interaction: discord.Interaction, framework: str):
|
||||||
|
messages = [await self.remove_guild_role(framework)]
|
||||||
|
|
||||||
|
if await self.role_exists_in_db(Framework, framework):
|
||||||
|
messages.append(await self.remove_from_db(Framework, framework))
|
||||||
|
await self.edit_message(self.role_messages["frameworks"].id, view=FrameworkButtons(self.bot))
|
||||||
|
else:
|
||||||
|
messages.append(f"Role `{framework}` doesn't exist")
|
||||||
|
|
||||||
|
await interaction.response.send_message(f"\n".join(messages), ephemeral=True, delete_after=5)
|
||||||
|
|
||||||
|
@remove_framework.error
|
||||||
|
async def remove_framework_error(self, interaction: discord.Interaction, error):
|
||||||
|
await interaction.response.send_message(f"An error occurred while removing the framework.\n{error}", ephemeral=True)
|
||||||
|
|
||||||
|
|
||||||
async def setup(bot):
|
async def setup(bot):
|
||||||
await bot.add_cog(RolesCog(bot))
|
await bot.add_cog(RolesCog(bot), guilds=[discord.Object(id=bot.guild_id)])
|
||||||
Loading…
Reference in a new issue