commit 28c74ba78edea04d152cc27e3bfc6c66d0204bd4 Author: mrmoi Date: Mon Jun 16 13:56:28 2025 +0200 init diff --git a/avatar.png b/avatar.png new file mode 100644 index 0000000..2273de7 Binary files /dev/null and b/avatar.png differ diff --git a/config.json b/config.json new file mode 100644 index 0000000..4ba12b8 --- /dev/null +++ b/config.json @@ -0,0 +1 @@ +{"slowmode_duration": 90, "affected_roles": [], "bot_name": "Chess.Debate", "bot_avatar": "avatar.png"} \ No newline at end of file diff --git a/slowbot.py b/slowbot.py new file mode 100644 index 0000000..8ba508d --- /dev/null +++ b/slowbot.py @@ -0,0 +1,169 @@ +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 ` : Définit la durée du slowmode dans les threads. +- `/setroles <@role1 @role2>` : Définit les rôles affectés par le slowmode. +- `/setbotname ` : 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") \ No newline at end of file