2025-06-29 07:17:32 +00:00
|
|
|
import discord
|
|
|
|
|
from discord import app_commands
|
2025-06-23 14:02:53 +00:00
|
|
|
from embeds.MatrixRolesEmbed import MatrixRolesEmbed
|
|
|
|
|
from embeds.LanguageRolesEmbed import LanguageRolesEmbed
|
2025-06-24 06:34:26 +00:00
|
|
|
from embeds.FrameworkRolesEmbed import FrameworkRolesEmbed
|
2025-06-23 12:56:09 +00:00
|
|
|
from libs.Channels import Channels
|
2025-06-20 14:28:44 +00:00
|
|
|
from libs.Cog import Cog
|
2025-06-29 07:17:32 +00:00
|
|
|
from libs.Roles import Roles
|
|
|
|
|
from data.models.Language import Language
|
|
|
|
|
from data.models.Framework import Framework
|
2025-06-20 14:28:44 +00:00
|
|
|
from views.MatrixButtons import MatrixButtons
|
|
|
|
|
from views.LanguageButtons import LanguageButtons
|
2025-06-24 06:34:26 +00:00
|
|
|
from views.FrameworkButtons import FrameworkButtons
|
2025-06-29 07:17:32 +00:00
|
|
|
from __main__ import guild_id
|
|
|
|
|
|
|
|
|
|
guild = discord.Object(id=guild_id)
|
2025-06-20 14:28:44 +00:00
|
|
|
|
|
|
|
|
class RolesCog(Cog):
|
|
|
|
|
|
|
|
|
|
def __init__(self, bot):
|
|
|
|
|
super().__init__(bot)
|
|
|
|
|
self.bot = bot
|
2025-06-29 07:17:32 +00:00
|
|
|
self.roles = Roles()
|
|
|
|
|
self.channel = None
|
2025-06-20 14:28:44 +00:00
|
|
|
self.messages_deletable = True
|
2025-06-29 07:17:32 +00:00
|
|
|
self.role_messages = {}
|
2025-06-20 14:28:44 +00:00
|
|
|
|
2025-06-29 07:17:32 +00:00
|
|
|
@Cog.listener()
|
2025-06-20 14:28:44 +00:00
|
|
|
async def on_ready(self):
|
2025-06-29 07:17:32 +00:00
|
|
|
self.channel = await Channels().get_channel(self.bot.guild, "add-roles")
|
|
|
|
|
|
|
|
|
|
if self.channel is not None:
|
|
|
|
|
await self.channel.purge()
|
|
|
|
|
self.role_messages["matrix"] = await self.channel.send(embed=MatrixRolesEmbed(), view=MatrixButtons())
|
|
|
|
|
self.role_messages["languages"] = await self.channel.send(embed=LanguageRolesEmbed(), view=LanguageButtons(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)
|
2025-06-20 14:28:44 +00:00
|
|
|
|
2025-06-29 07:17:32 +00:00
|
|
|
@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)
|
2025-06-20 14:28:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
async def setup(bot):
|
2025-06-29 07:17:32 +00:00
|
|
|
await bot.add_cog(RolesCog(bot), guilds=[discord.Object(id=bot.guild_id)])
|