From 4a749bd6832385d624950651654feb63286de8cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Math=C3=A9o=20=27Nebulo9=27=20DESSAUVAGES?= Date: Wed, 9 Sep 2026 19:40:37 +0200 Subject: [PATCH] feat: Add Cog to perform role addition and deletion to a user from predefined config file --- cogs/roles.py | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 cogs/roles.py diff --git a/cogs/roles.py b/cogs/roles.py new file mode 100644 index 0000000..7a5ab13 --- /dev/null +++ b/cogs/roles.py @@ -0,0 +1,95 @@ +import discord, os, json +from discord import option +from discord.ext import commands, bridge +from setup.config import Config +from setup.logger import LOGGER + +CONFIG_FILE = os.path.join(Config.CONFIG_PATH,"roles.json") + +class RolesCog(commands.Cog): + def __init__(self,bot:discord.Bot): + self.bot = bot + self.load_config() + + def load_config(self): + with open(CONFIG_FILE) as file: + self.config = json.load(file) + + def save_config(self): + with open(CONFIG_FILE,"w") as file: + json.dump(self.config,file) + + @bridge.bridge_command() + async def roles(self,ctx: discord.ApplicationContext, category:bridge.BridgeOption(name="category",description="The category to manipulate", input_type=str,required=True)): + filtered = [config_category for config_category in self.config if config_category["category_id"] == category] + if len(filtered): + await ctx.defer() + config_category = filtered.pop() + embed = discord.Embed( + title=config_category["category_name"], + description=config_category["message_header"], + color=discord.Color.blue() + ) + roles = [ + self.bot.get_guild(897157935006900254).get_role(role_config["role_id"]) + for role_config in config_category["roles"] + ] + for role_instance,role_config in zip(roles,config_category["roles"]): + embed.add_field(name=role_config["reaction"],value=role_instance.mention) + message = await ctx.send(embed=embed) + if message: + config_category["message_id"] = message.id + for config_role in config_category["roles"]: + await message.add_reaction(config_role["reaction"]) + self.save_config() + await ctx.followup.send("Role message generated",ephemeral=True) + + @commands.Cog.listener() + async def on_raw_reaction_add(self, payload:discord.RawReactionActionEvent): + if payload.user_id == self.bot.user.id: + return + + message_id = payload.message_id + filtered = [config_category for config_category in self.config if config_category["message_id"] == message_id] + if len(filtered): + config_category = filtered.pop() + role_ids = [config_role["role_id"] for config_role in config_category["roles"] if config_role["reaction"] == payload.emoji.name] + if len(role_ids): + role_id = role_ids.pop() + + guild = self.bot.get_guild(payload.guild_id) + if guild: + role = guild.get_role(role_id) + if role: + user = guild.get_member(payload.user_id) + if user: + if "parent_role_id" in config_category.keys(): + parent_role = guild.get_role(config_category["parent_role_id"]) + await user.add_roles(parent_role,role) + else: + await user.add_roles(role) + + @commands.Cog.listener() + async def on_raw_reaction_remove(self, payload:discord.RawReactionActionEvent): + if payload.user_id == self.bot.user.id: + return + + message_id = payload.message_id + filtered = [config_category for config_category in self.config if config_category["message_id"] == message_id] + if len(filtered): + config_category = filtered.pop() + role_ids = [config_role["role_id"] for config_role in config_category["roles"] if config_role["reaction"] == payload.emoji.name] + if len(role_ids): + role_id = role_ids.pop() + + guild = self.bot.get_guild(payload.guild_id) + if guild: + role = guild.get_role(role_id) + if role: + user = guild.get_member(payload.user_id) + if user: + if "parent_role_id" in config_category.keys(): + parent_role = guild.get_role(config_category["parent_role_id"]) + await user.remove_roles(parent_role,role) + else: + await user.remove_roles(role) \ No newline at end of file