Modularize bot: per-guild config system for roles/channels/categories
- Add utils/guild_config.py: centralized config loader per guild (data/guilds/{id}.json)
- Add commandes/config.py: /config set_role, /config set_channel, /config set_category, /config voir, /config reset
- Replace ALL hardcoded role IDs (banquier, gouvernement, citoyen, staff, ems, permis, fbm, ursaff, etc.) with guild_config lookups
- Replace ALL hardcoded channel IDs (welcome, candidature, questions, mp_reception) with guild_config lookups
- Replace ALL hardcoded category IDs (ticket) with guild_config lookups
- Remove duplicate commandes/welcome_message.py (kept utils/ version)
- Remove 20+ hardcoded snowflake IDs across 22 files
- Guilds configure via /config on Discord, no code changes needed
This commit is contained in:
parent
bc3cb3f3d5
commit
2e38d05152
25 changed files with 368 additions and 125 deletions
129
commandes/config.py
Normal file
129
commandes/config.py
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
import discord
|
||||
from discord import app_commands
|
||||
from discord.ext import commands
|
||||
from utils.guild_config import (
|
||||
load_guild_config, save_guild_config, set_config_value,
|
||||
DEFAULT_CONFIG, ROLE_LABELS, CHANNEL_LABELS, CATEGORY_LABELS,
|
||||
is_configured, get_role_id, get_channel_id, get_category_id
|
||||
)
|
||||
|
||||
|
||||
class GuildConfig(commands.Cog):
|
||||
def __init__(self, bot):
|
||||
self.bot = bot
|
||||
|
||||
config_group = app_commands.Group(name="config", description="Configuration du bot pour ce serveur")
|
||||
|
||||
@config_group.command(name="set_role", description="Associer un rôle du serveur à une fonction du bot")
|
||||
@app_commands.describe(
|
||||
cle="Nom de la fonction",
|
||||
role="Le rôle Discord à associer"
|
||||
)
|
||||
@app_commands.choices(cle=[app_commands.Choice(name=f"{ROLE_LABELS[k]} ({k})", value=k) for k in ROLE_LABELS])
|
||||
async def set_role(self, interaction: discord.Interaction, cle: app_commands.Choice[str], role: discord.Role):
|
||||
if not interaction.user.guild_permissions.manage_guild:
|
||||
await interaction.response.send_message("❌ Il faut la permission **Gérer le serveur**.", ephemeral=True)
|
||||
return
|
||||
set_config_value(interaction.guild.id, "roles", cle.value, role.id)
|
||||
await interaction.response.send_message(
|
||||
f"✅ Rôle **{ROLE_LABELS.get(cle.value, cle.value)}** associé à {role.mention}",
|
||||
ephemeral=True
|
||||
)
|
||||
|
||||
@config_group.command(name="set_channel", description="Associer un salon du serveur à une fonction du bot")
|
||||
@app_commands.describe(
|
||||
cle="Nom de la fonction",
|
||||
channel="Le salon Discord à associer"
|
||||
)
|
||||
@app_commands.choices(cle=[app_commands.Choice(name=f"{CHANNEL_LABELS[k]} ({k})", value=k) for k in CHANNEL_LABELS])
|
||||
async def set_channel(self, interaction: discord.Interaction, cle: app_commands.Choice[str], channel: discord.TextChannel):
|
||||
if not interaction.user.guild_permissions.manage_guild:
|
||||
await interaction.response.send_message("❌ Il faut la permission **Gérer le serveur**.", ephemeral=True)
|
||||
return
|
||||
set_config_value(interaction.guild.id, "channels", cle.value, channel.id)
|
||||
await interaction.response.send_message(
|
||||
f"✅ Salon **{CHANNEL_LABELS.get(cle.value, cle.value)}** associé à {channel.mention}",
|
||||
ephemeral=True
|
||||
)
|
||||
|
||||
@config_group.command(name="set_category", description="Associer une catégorie du serveur à une fonction du bot")
|
||||
@app_commands.describe(
|
||||
cle="Nom de la fonction",
|
||||
category="La catégorie Discord à associer"
|
||||
)
|
||||
@app_commands.choices(cle=[app_commands.Choice(name=f"{CATEGORY_LABELS[k]} ({k})", value=k) for k in CATEGORY_LABELS])
|
||||
async def set_category(self, interaction: discord.Interaction, cle: app_commands.Choice[str], category: discord.CategoryChannel):
|
||||
if not interaction.user.guild_permissions.manage_guild:
|
||||
await interaction.response.send_message("❌ Il faut la permission **Gérer le serveur**.", ephemeral=True)
|
||||
return
|
||||
set_config_value(interaction.guild.id, "categories", cle.value, category.id)
|
||||
await interaction.response.send_message(
|
||||
f"✅ Catégorie **{CATEGORY_LABELS.get(cle.value, cle.value)}** associée à **{category.name}**",
|
||||
ephemeral=True
|
||||
)
|
||||
|
||||
@config_group.command(name="voir", description="Voir la configuration actuelle du bot sur ce serveur")
|
||||
async def voir_config(self, interaction: discord.Interaction):
|
||||
if not interaction.user.guild_permissions.manage_guild:
|
||||
await interaction.response.send_message("❌ Il faut la permission **Gérer le serveur**.", ephemeral=True)
|
||||
return
|
||||
|
||||
config = load_guild_config(interaction.guild.id)
|
||||
guild = interaction.guild
|
||||
|
||||
embed = discord.Embed(
|
||||
title="⚙️ Configuration du bot",
|
||||
color=discord.Color.blue()
|
||||
)
|
||||
|
||||
# Roles
|
||||
roles_text = ""
|
||||
for key, label in ROLE_LABELS.items():
|
||||
rid = config.get("roles", {}).get(key)
|
||||
if rid:
|
||||
role = guild.get_role(int(rid))
|
||||
roles_text += f"> {label} : {role.mention if role else f'❌ ID {rid} introuvable'}\n"
|
||||
else:
|
||||
roles_text += f"> {label} : ⚠️ Non configuré\n"
|
||||
embed.add_field(name="🎭 Rôles", value=roles_text, inline=False)
|
||||
|
||||
# Channels
|
||||
channels_text = ""
|
||||
for key, label in CHANNEL_LABELS.items():
|
||||
cid = config.get("channels", {}).get(key)
|
||||
if cid:
|
||||
ch = guild.get_channel(int(cid))
|
||||
channels_text += f"> {label} : {ch.mention if ch else f'❌ ID {cid} introuvable'}\n"
|
||||
else:
|
||||
channels_text += f"> {label} : ⚠️ Non configuré\n"
|
||||
embed.add_field(name="📢 Salons", value=channels_text, inline=False)
|
||||
|
||||
# Categories
|
||||
cats_text = ""
|
||||
for key, label in CATEGORY_LABELS.items():
|
||||
catid = config.get("categories", {}).get(key)
|
||||
if catid:
|
||||
cat = guild.get_channel(int(catid))
|
||||
cats_text += f"> {label} : **{cat.name if cat else f'❌ ID {catid} introuvable'}**\n"
|
||||
else:
|
||||
cats_text += f"> {label} : ⚠️ Non configuré\n"
|
||||
embed.add_field(name="📁 Catégories", value=cats_text, inline=False)
|
||||
|
||||
missing = is_configured(interaction.guild.id)
|
||||
total = len(DEFAULT_CONFIG["roles"]) + len(DEFAULT_CONFIG["channels"]) + len(DEFAULT_CONFIG["categories"])
|
||||
configured = total - sum(len(v) for v in missing.values())
|
||||
embed.set_footer(text=f"{configured}/{total} paramètres configurés")
|
||||
|
||||
await interaction.response.send_message(embed=embed, ephemeral=True)
|
||||
|
||||
@config_group.command(name="reset", description="Réinitialiser la configuration du bot pour ce serveur")
|
||||
async def reset_config(self, interaction: discord.Interaction):
|
||||
if not interaction.user.guild_permissions.administrator:
|
||||
await interaction.response.send_message("❌ Il faut les permissions **Administrateur**.", ephemeral=True)
|
||||
return
|
||||
save_guild_config(interaction.guild.id, {"roles": {}, "channels": {}, "categories": {}})
|
||||
await interaction.response.send_message("✅ Configuration réinitialisée.", ephemeral=True)
|
||||
|
||||
|
||||
async def setup(bot):
|
||||
await bot.add_cog(GuildConfig(bot))
|
||||
Loading…
Add table
Add a link
Reference in a new issue