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
|
|
@ -1,13 +1,7 @@
|
|||
import discord
|
||||
from discord.ext import commands
|
||||
from discord import app_commands
|
||||
|
||||
TICKET_CATEGORY_ID = 1301142883876737085 # ID de la catégorie des tickets # ID de la catégorie des tickets
|
||||
STAFF_ROLE_ID = 1277638784095092816 # ID du rôle staff # ID du rôle staff
|
||||
TEAM_STAFF_ROLE_ID = 1277638784095092816 # ID du rôle équipe staff # ID du rôle équipe staff
|
||||
ATTENTE_ORAL_ROLE_ID = 1278343007996870699 # ID du rôle "attente oral" # ID du rôle "attente oral"
|
||||
CANDIDATURE_A_FAIRE_ROLE_ID = 1278343541936099412 # ID du rôle "candidature à faire" # ID du rôle "candidature à faire"
|
||||
CITOYEN_ROLE_ID = 1278319901651632138 # ID du rôle "citoyen" # ID du rôle "citoyen"
|
||||
from utils.guild_config import get_guild_role, get_guild_category, has_role
|
||||
|
||||
class ContinueFormView(discord.ui.View):
|
||||
"""Vue avec un bouton pour continuer à l'étape suivante"""
|
||||
|
|
@ -108,7 +102,7 @@ class TicketStep3(discord.ui.Modal, title="📋 Développement du Personnage"):
|
|||
"""Création du ticket après validation"""
|
||||
guild = interaction.guild
|
||||
user = interaction.user
|
||||
category = discord.utils.get(guild.categories, id=TICKET_CATEGORY_ID)
|
||||
category = get_guild_category(guild, "ticket")
|
||||
|
||||
# Vérifier si la catégorie existe
|
||||
if category is None:
|
||||
|
|
@ -116,7 +110,7 @@ class TicketStep3(discord.ui.Modal, title="📋 Développement du Personnage"):
|
|||
return
|
||||
|
||||
# Vérifier si le rôle staff existe
|
||||
staff_role = discord.utils.get(guild.roles, id=STAFF_ROLE_ID)
|
||||
staff_role = get_guild_role(guild, "staff")
|
||||
if staff_role is None:
|
||||
await interaction.response.send_message("❌ Erreur : Le rôle staff n'existe pas !", ephemeral=True)
|
||||
return
|
||||
|
|
@ -132,7 +126,7 @@ class TicketStep3(discord.ui.Modal, title="📋 Développement du Personnage"):
|
|||
guild.default_role: discord.PermissionOverwrite(read_messages=False),
|
||||
user: discord.PermissionOverwrite(read_messages=True, send_messages=True),
|
||||
staff_role: discord.PermissionOverwrite(read_messages=True, send_messages=True),
|
||||
discord.utils.get(guild.roles, id=TEAM_STAFF_ROLE_ID): discord.PermissionOverwrite(read_messages=True, send_messages=False)
|
||||
get_guild_role(guild, "team_staff"): discord.PermissionOverwrite(read_messages=True, send_messages=False)
|
||||
}
|
||||
|
||||
# Créer un salon de ticket avec le nom [pseudo_du_membre]-écrit
|
||||
|
|
@ -143,7 +137,7 @@ class TicketStep3(discord.ui.Modal, title="📋 Développement du Personnage"):
|
|||
)
|
||||
|
||||
# Récupérer le rôle "équipe staff"
|
||||
team_staff_role = discord.utils.get(guild.roles, id=TEAM_STAFF_ROLE_ID)
|
||||
team_staff_role = get_guild_role(guild, "team_staff")
|
||||
|
||||
# Création de l'embed avec les infos du formulaire
|
||||
embed = discord.Embed(title="📩 Ticket Whitelist", color=0x00ff00)
|
||||
|
|
@ -202,7 +196,7 @@ class TicketManagementView(discord.ui.View):
|
|||
@discord.ui.button(label="🔒 Fermer le Ticket", style=discord.ButtonStyle.red, custom_id="close_ticket")
|
||||
async def close_ticket(self, interaction: discord.Interaction, button: discord.ui.Button):
|
||||
"""Ferme le ticket en désactivant l'envoi de messages pour le membre"""
|
||||
if not discord.utils.get(interaction.user.roles, id=STAFF_ROLE_ID):
|
||||
if not has_role(interaction.user, "staff"):
|
||||
await interaction.response.send_message("❌ Seuls les staffs peuvent fermer un ticket.", ephemeral=True)
|
||||
return
|
||||
|
||||
|
|
@ -217,11 +211,11 @@ class TicketManagementView(discord.ui.View):
|
|||
@discord.ui.button(label="👤 Prendre en charge le Ticket", style=discord.ButtonStyle.blurple, custom_id="claim_ticket")
|
||||
async def claim_ticket(self, interaction: discord.Interaction, button: discord.ui.Button):
|
||||
"""Un staff prend en charge le ticket"""
|
||||
if not discord.utils.get(interaction.user.roles, id=STAFF_ROLE_ID):
|
||||
if not has_role(interaction.user, "staff"):
|
||||
await interaction.response.send_message("❌ Seuls les staffs peuvent claim un ticket.", ephemeral=True)
|
||||
return
|
||||
self.claimed_by = interaction.user
|
||||
await interaction.channel.set_permissions(discord.utils.get(interaction.guild.roles, id=STAFF_ROLE_ID), send_messages=False, read_messages=True)
|
||||
await interaction.channel.set_permissions(get_guild_role(interaction.guild, "staff"), send_messages=False, read_messages=True)
|
||||
await interaction.channel.set_permissions(self.claimed_by, read_messages=True, send_messages=True)
|
||||
await interaction.response.send_message(f"👤 {self.claimed_by.mention} a claim ce ticket.", ephemeral=False)
|
||||
|
||||
|
|
@ -235,7 +229,7 @@ class ClosedTicketView(discord.ui.View):
|
|||
@discord.ui.button(label="♻ Réouvrir le Ticket", style=discord.ButtonStyle.green, custom_id="reopen_ticket")
|
||||
async def reopen_ticket(self, interaction: discord.Interaction, button: discord.ui.Button):
|
||||
"""Réouvre le ticket pour le membre"""
|
||||
if not discord.utils.get(interaction.user.roles, id=STAFF_ROLE_ID):
|
||||
if not has_role(interaction.user, "staff"):
|
||||
await interaction.response.send_message("❌ Seuls les staffs peuvent réouvrir un ticket.", ephemeral=True)
|
||||
return
|
||||
await interaction.channel.set_permissions(self.ticket_owner, read_messages=True, send_messages=True)
|
||||
|
|
@ -248,7 +242,7 @@ class ClosedTicketView(discord.ui.View):
|
|||
@discord.ui.button(label="❌ Supprimer le Ticket", style=discord.ButtonStyle.danger, custom_id="delete_ticket")
|
||||
async def delete_ticket(self, interaction: discord.Interaction, button: discord.ui.Button):
|
||||
"""Supprime le salon du ticket"""
|
||||
if not discord.utils.get(interaction.user.roles, id=STAFF_ROLE_ID):
|
||||
if not has_role(interaction.user, "staff"):
|
||||
await interaction.response.send_message("❌ Seuls les staffs peuvent supprimer un ticket.", ephemeral=True)
|
||||
return
|
||||
await interaction.response.send_message("❌ Suppression du ticket...", ephemeral=True)
|
||||
|
|
@ -291,16 +285,16 @@ class Ticket(commands.Cog):
|
|||
if not message.channel.topic or not message.channel.topic.startswith("Ticket de"):
|
||||
return
|
||||
|
||||
staff_role = discord.utils.get(message.guild.roles, id=STAFF_ROLE_ID)
|
||||
staff_role = get_guild_role(message.guild, "staff")
|
||||
if staff_role in message.author.roles and "validé" in message.content.lower():
|
||||
try:
|
||||
user_id = message.channel.topic.split("Ticket de ")[1]
|
||||
user = await message.guild.fetch_member(user_id)
|
||||
|
||||
# Vérifier si le rôle "attente oral" est déjà attribué
|
||||
attente_oral_role = discord.utils.get(message.guild.roles, id=ATTENTE_ORAL_ROLE_ID)
|
||||
candidature_a_faire_role = discord.utils.get(message.guild.roles, id=CANDIDATURE_A_FAIRE_ROLE_ID)
|
||||
citoyen_role = discord.utils.get(message.guild.roles, id=CITOYEN_ROLE_ID)
|
||||
attente_oral_role = get_guild_role(message.guild, "attente_oral")
|
||||
candidature_a_faire_role = get_guild_role(message.guild, "candidature_a_faire")
|
||||
citoyen_role = get_guild_role(message.guild, "citoyen")
|
||||
|
||||
if attente_oral_role in user.roles:
|
||||
# Deuxième "validé" détecté
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue