feat: Refactored all cogs implementation
Some checks failed
CI / Run tests (pull_request) Has been cancelled

This commit is contained in:
2026-09-12 23:16:43 +02:00
parent 505621e0cd
commit c86ea54e86
10 changed files with 451 additions and 123 deletions

View File

@@ -1,95 +1,146 @@
import discord, os, json
import discord
from cogs import FeatureCog
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)
class RolesCog(FeatureCog):
def __init__(self, bot: discord.Bot):
super().__init__(bot, feature_name="roles")
@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)
async def roles(self, ctx: discord.ApplicationContext, category: bridge.BridgeOption(name="category", description="The category to manipulate", input_type=str, required=True)):
if not ctx.guild:
await ctx.respond("This command must be used in a guild.", ephemeral=True)
return
guild_id = ctx.guild.id
if not self.is_enabled(guild_id):
await ctx.respond("Roles feature is disabled for this guild.", ephemeral=True)
return
guild_cfg = Config.GUILD_CONFIGS.get(guild_id)
if not guild_cfg:
await ctx.respond("No configuration for this guild.", ephemeral=True)
return
categories = guild_cfg.get("configs", {}).get("roles", {}).get("categories", [])
filtered = [c for c in categories if c.get("category_id") == category]
if not filtered:
await ctx.respond("Category not found.", ephemeral=True)
return
await ctx.defer()
config_category = filtered.pop()
embed = discord.Embed(
title=config_category.get("category_name", ""),
description=config_category.get("message_header", ""),
color=discord.Color.blue()
)
roles_list = [
ctx.guild.get_role(role_config.get("role_id"))
for role_config in config_category.get("roles", [])
]
for role_instance, role_config in zip(roles_list, config_category.get("roles", [])):
mention = role_instance.mention if role_instance else "(role missing)"
embed.add_field(name=role_config.get("reaction", ""), value=mention)
message = await ctx.send(embed=embed)
if message:
config_category["message_id"] = message.id
# persist the updated guild config
Config.save_guild_config(guild_id)
for config_role in config_category.get("roles", []):
reaction = config_role.get("reaction")
if reaction:
await message.add_reaction(reaction)
await ctx.followup.send("Role message generated", ephemeral=True)
@commands.Cog.listener()
async def on_raw_reaction_add(self, payload:discord.RawReactionActionEvent):
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_id = payload.guild_id
guild_cfg = Config.GUILD_CONFIGS.get(guild_id)
if not guild_cfg:
return
if not self.is_enabled(guild_id):
return
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)
categories = guild_cfg.get("configs", {}).get("roles", {}).get("categories", [])
filtered = [c for c in categories if c.get("message_id") == payload.message_id]
if not filtered:
return
config_category = filtered.pop()
role_ids = [config_role.get("role_id") for config_role in config_category.get("roles", []) if config_role.get("reaction") == payload.emoji.name]
if not role_ids:
return
role_id = role_ids.pop()
guild = self.bot.get_guild(guild_id)
if not guild:
return
role = guild.get_role(role_id)
if not role:
return
user = guild.get_member(payload.user_id)
if not user:
return
if "parent_role_id" in config_category:
parent_role = guild.get_role(config_category.get("parent_role_id"))
if parent_role:
await user.add_roles(parent_role, role)
return
await user.add_roles(role)
@commands.Cog.listener()
async def on_raw_reaction_remove(self, payload:discord.RawReactionActionEvent):
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_id = payload.guild_id
guild_cfg = Config.GUILD_CONFIGS.get(guild_id)
if not guild_cfg:
return
if not self.is_enabled(guild_id):
return
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)
categories = guild_cfg.get("configs", {}).get("roles", {}).get("categories", [])
filtered = [c for c in categories if c.get("message_id") == payload.message_id]
if not filtered:
return
config_category = filtered.pop()
role_ids = [config_role.get("role_id") for config_role in config_category.get("roles", []) if config_role.get("reaction") == payload.emoji.name]
if not role_ids:
return
role_id = role_ids.pop()
guild = self.bot.get_guild(guild_id)
if not guild:
return
role = guild.get_role(role_id)
if not role:
return
user = guild.get_member(payload.user_id)
if not user:
return
if "parent_role_id" in config_category:
parent_role = guild.get_role(config_category.get("parent_role_id"))
if parent_role:
await user.remove_roles(parent_role, role)
return
await user.remove_roles(role)