- 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
76 lines
2.8 KiB
Python
76 lines
2.8 KiB
Python
import discord
|
|
from discord import app_commands
|
|
from discord.ext import commands, tasks
|
|
import json
|
|
from datetime import datetime, timedelta
|
|
import os
|
|
from utils.guild_config import has_role, get_guild_role
|
|
|
|
FICHIER_ROLES = "visite_médicale.json"
|
|
|
|
class AttribuerRole(commands.Cog):
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
self.roles_temporaire = self.charger_roles()
|
|
self.verification_roles.start()
|
|
|
|
def charger_roles(self):
|
|
if os.path.exists(FICHIER_ROLES):
|
|
with open(FICHIER_ROLES, "r", encoding="utf-8") as f:
|
|
return json.load(f)
|
|
return {}
|
|
|
|
def sauvegarder_roles(self):
|
|
with open(FICHIER_ROLES, "w", encoding="utf-8") as f:
|
|
json.dump(self.roles_temporaire, f, indent=4, ensure_ascii=False)
|
|
|
|
@app_commands.command(name="valider_visite_médicale", description="Attribue un rôle temporaire suite à une visite médicale (EMS uniquement).")
|
|
async def valider_visite(self, interaction: discord.Interaction, membre: discord.Member):
|
|
if not has_role(interaction.user, "ems"):
|
|
await interaction.response.send_message("❌ Seuls les EMS peuvent utiliser cette commande.", ephemeral=True)
|
|
return
|
|
|
|
role = get_guild_role(interaction.guild, "visite_medicale")
|
|
if not role:
|
|
await interaction.response.send_message("❌ Rôle à attribuer introuvable.", ephemeral=True)
|
|
return
|
|
|
|
await membre.add_roles(role)
|
|
expiration = (datetime.now() + timedelta(days=30)).strftime("%Y-%m-%d %H:%M:%S")
|
|
self.roles_temporaire[str(membre.id)] = {
|
|
"role_id": role.id,
|
|
"expiration": expiration
|
|
}
|
|
self.sauvegarder_roles()
|
|
|
|
await interaction.response.send_message(f"✅ Rôle temporaire attribué à {membre.mention} jusqu'au {expiration}.", ephemeral=True)
|
|
|
|
@tasks.loop(hours=1)
|
|
async def verification_roles(self):
|
|
now = datetime.now()
|
|
to_remove = []
|
|
|
|
for user_id, data in self.roles_temporaire.items():
|
|
expiration = datetime.strptime(data["expiration"], "%Y-%m-%d %H:%M:%S")
|
|
if now >= expiration:
|
|
to_remove.append(user_id)
|
|
|
|
for user_id in to_remove:
|
|
member = self.bot.get_user(int(user_id)) or await self.bot.fetch_user(int(user_id))
|
|
guild = discord.utils.get(self.bot.guilds)
|
|
member = guild.get_member(int(user_id))
|
|
role = get_guild_role(guild, "visite_medicale")
|
|
|
|
if member and role:
|
|
await member.remove_roles(role)
|
|
del self.roles_temporaire[user_id]
|
|
|
|
if to_remove:
|
|
self.sauvegarder_roles()
|
|
|
|
@verification_roles.before_loop
|
|
async def before_verification(self):
|
|
await self.bot.wait_until_ready()
|
|
|
|
async def setup(bot):
|
|
await bot.add_cog(AttribuerRole(bot))
|