169 lines
6.4 KiB
Python
169 lines
6.4 KiB
Python
import discord
|
||
from discord import app_commands
|
||
from discord.ext import commands
|
||
import asyncio
|
||
import json
|
||
|
||
intents = discord.Intents.default()
|
||
intents.message_content = True
|
||
intents.guilds = True
|
||
intents.members = True
|
||
|
||
bot = commands.Bot(command_prefix="!", intents=intents)
|
||
|
||
# Configuration par défaut
|
||
config = {
|
||
"slowmode_duration": 20,
|
||
"affected_roles": [],
|
||
"bot_name": "SlowBot",
|
||
"bot_avatar": None
|
||
}
|
||
|
||
def save_config():
|
||
with open("config.json", "w") as f:
|
||
json.dump(config, f)
|
||
|
||
def load_config():
|
||
global config
|
||
try:
|
||
with open("config.json", "r") as f:
|
||
config = json.load(f)
|
||
except FileNotFoundError:
|
||
save_config()
|
||
|
||
@bot.event
|
||
async def on_ready():
|
||
print(f"{bot.user} est en ligne.")
|
||
load_config()
|
||
# Change le nom et avatar si nécessaire
|
||
if bot.user.name != config["bot_name"]:
|
||
await bot.user.edit(username=config["bot_name"])
|
||
if config["bot_avatar"]:
|
||
with open(config["bot_avatar"], "rb") as f:
|
||
await bot.user.edit(avatar=f.read())
|
||
try:
|
||
synced = await bot.tree.sync()
|
||
print(f"Commands synced: {len(synced)}")
|
||
except Exception as e:
|
||
print(f"Erreur lors de la sync des commandes : {e}")
|
||
|
||
# Slash command : définir le slowmode
|
||
@bot.tree.command(name="setslowmode", description="Définit la durée du slowmode dans les threads (en secondes)")
|
||
@app_commands.checks.has_permissions(manage_threads=True)
|
||
@app_commands.describe(seconds="Durée du slowmode en secondes")
|
||
async def setslowmode(interaction: discord.Interaction, seconds: int):
|
||
config["slowmode_duration"] = seconds
|
||
save_config()
|
||
|
||
updated_threads = 0
|
||
failed_threads = []
|
||
|
||
for thread in interaction.guild.threads:
|
||
if not thread.archived:
|
||
try:
|
||
await thread.edit(slowmode_delay=seconds)
|
||
updated_threads += 1
|
||
except Exception as e:
|
||
failed_threads.append(thread.name)
|
||
|
||
message = f"✅ Slowmode par défaut défini à {seconds} secondes.\n"
|
||
message += f"🧵 Slowmode mis à jour dans {updated_threads} thread(s)."
|
||
|
||
if failed_threads:
|
||
message += f"\n⚠️ Impossible de modifier : {', '.join(failed_threads)}"
|
||
|
||
await interaction.response.send_message(message, ephemeral=True)
|
||
|
||
# Slash command : définir les rôles affectés par le slowmode
|
||
@bot.tree.command(name="setroles", description="Définit les rôles affectés par le slowmode")
|
||
@app_commands.checks.has_permissions(manage_roles=True)
|
||
@app_commands.describe(roles="Mentionnez les rôles (ex: @modérateur @admin)")
|
||
async def setroles(interaction: discord.Interaction, roles: str):
|
||
guild = interaction.guild
|
||
role_ids = []
|
||
for part in roles.split():
|
||
if part.startswith("<@&") and part.endswith(">"):
|
||
try:
|
||
role_id = int(part[3:-1])
|
||
role = guild.get_role(role_id)
|
||
if role:
|
||
role_ids.append(role.id)
|
||
except ValueError:
|
||
continue
|
||
if not role_ids:
|
||
await interaction.response.send_message("❌ Aucun rôle valide détecté. Veuillez mentionner les rôles.", ephemeral=True)
|
||
return
|
||
config["affected_roles"] = role_ids
|
||
save_config()
|
||
names = [guild.get_role(rid).name for rid in role_ids]
|
||
await interaction.response.send_message(f"✅ Rôles affectés mis à jour : {', '.join(names)}", ephemeral=True)
|
||
|
||
|
||
#A enlever ?
|
||
# Slash command : changer le nom du bot
|
||
@bot.tree.command(name="setbotname", description="Change le nom du bot")
|
||
@app_commands.checks.has_permissions(administrator=True)
|
||
@app_commands.describe(name="Nouveau nom du bot")
|
||
async def setbotname(interaction: discord.Interaction, name: str):
|
||
config["bot_name"] = name
|
||
save_config()
|
||
await bot.user.edit(username=name)
|
||
await interaction.response.send_message(f"✅ Nom du bot changé en {name}.", ephemeral=True)
|
||
|
||
|
||
|
||
# Slash command : aide
|
||
@bot.tree.command(name="help", description="Affiche la liste des commandes disponibles")
|
||
async def help_command(interaction: discord.Interaction):
|
||
help_text = """
|
||
**📋 Commandes Slash :**
|
||
- `/setslowmode <seconds>` : Définit la durée du slowmode dans les threads.
|
||
- `/setroles <@role1 @role2>` : Définit les rôles affectés par le slowmode.
|
||
- `/setbotname <nom>` : Change le nom du bot.
|
||
- `/setbotavatar` : Change l’avatar du bot (envoyez une image avant).
|
||
- `/help` : Affiche cette aide.
|
||
"""
|
||
await interaction.response.send_message(help_text, ephemeral=True)
|
||
|
||
@bot.event
|
||
async def on_thread_create(thread):
|
||
try:
|
||
await thread.edit(slowmode_delay=config["slowmode_duration"])
|
||
print(f"✅ Slowmode de {config['slowmode_duration']}s appliqué à {thread.name}")
|
||
except Exception as e:
|
||
print(f"❌ Impossible de définir le slowmode sur {thread.name} : {e}")
|
||
|
||
@bot.event
|
||
async def on_message(message):
|
||
await bot.process_commands(message)
|
||
if message.author.bot:
|
||
return
|
||
|
||
if isinstance(message.channel, discord.Thread):
|
||
if any(role.id in config["affected_roles"] for role in message.author.roles):
|
||
now = discord.utils.utcnow()
|
||
if hasattr(message.author, "last_message_time"):
|
||
delta = (now - message.author.last_message_time).total_seconds()
|
||
if delta < config["slowmode_duration"]:
|
||
await message.delete()
|
||
remaining = int(config["slowmode_duration"] - delta)
|
||
await message.channel.send(
|
||
f"{message.author.mention}, slowmode actif. Réessaie dans {remaining} secondes.",
|
||
delete_after=5
|
||
)
|
||
return
|
||
message.author.last_message_time = now
|
||
|
||
# Gestion d’erreurs pour slash commands
|
||
@bot.tree.error
|
||
async def on_app_command_error(interaction: discord.Interaction, error):
|
||
if isinstance(error, app_commands.MissingPermissions):
|
||
await interaction.response.send_message("❌ Permissions insuffisantes pour cette commande.", ephemeral=True)
|
||
elif isinstance(error, app_commands.CommandOnCooldown):
|
||
await interaction.response.send_message("⏳ Cette commande est en cooldown, merci de patienter.", ephemeral=True)
|
||
else:
|
||
await interaction.response.send_message(f"❌ Une erreur est survenue : {error}", ephemeral=True)
|
||
print(f"Erreur commande slash : {error}")
|
||
|
||
# Lancer le bot (⚠️ remplace la clé par une vraie token sécurisée)
|
||
bot.run("MTM4MTk4ODA2NjUwMzQzMDI0Nw.G_7FMX.DMZ32kmoTHRnGHaQ1TEc_o1EwHAt-Tvkkb-ADQ") |