From 28c74ba78edea04d152cc27e3bfc6c66d0204bd4 Mon Sep 17 00:00:00 2001 From: mrmoi Date: Mon, 16 Jun 2025 13:56:28 +0200 Subject: [PATCH] init --- avatar.png | Bin 0 -> 3791 bytes config.json | 1 + slowbot.py | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 avatar.png create mode 100644 config.json create mode 100644 slowbot.py diff --git a/avatar.png b/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..2273de7d010cb8b836c24e5433eff7d1b08e8a6d GIT binary patch literal 3791 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"): + 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