FunkyBot/cogs/roles.py

174 lines
8 KiB
Python
Raw Normal View History

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
from embeds.FrameworkRolesEmbed import FrameworkRolesEmbed
from libs.Channels import Channels
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.LanguageButtons import LanguageButtons
from views.FrameworkButtons import FrameworkButtons
from __main__ import guild_id
guild = discord.Object(id=guild_id)
class RolesCog(Cog):
def __init__(self, bot):
super().__init__(bot)
self.bot = bot
self.roles = Roles()
self.channel = None
self.messages_deletable = True
self.role_messages = {}
@Cog.listener()
async def on_ready(self):
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)
@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):
await bot.add_cog(RolesCog(bot), guilds=[discord.Object(id=bot.guild_id)])