52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
|
|
# utils/no_link.py
|
||
|
|
import re
|
||
|
|
import discord
|
||
|
|
from discord.ext import commands
|
||
|
|
import json
|
||
|
|
import os
|
||
|
|
|
||
|
|
# Fichier JSON de configuration security
|
||
|
|
SECURITY_FILE = "security.json"
|
||
|
|
|
||
|
|
def load_guild_security(guild_id: int) -> dict:
|
||
|
|
"""Retourne la configuration d'un serveur."""
|
||
|
|
if not os.path.isfile(SECURITY_FILE):
|
||
|
|
return {}
|
||
|
|
with open(SECURITY_FILE, "r") as f:
|
||
|
|
data = json.load(f)
|
||
|
|
return data.get(str(guild_id), {})
|
||
|
|
|
||
|
|
# Regex pour détecter les liens
|
||
|
|
URL_REGEX = re.compile(r"(?i)\b((?:https?://|www\.)[^\s<>]+)\b")
|
||
|
|
|
||
|
|
class NoLink(commands.Cog):
|
||
|
|
"""Supprime les messages contenant un lien si l'option anti_link est activée pour le serveur."""
|
||
|
|
|
||
|
|
def __init__(self, bot: commands.Bot) -> None:
|
||
|
|
self.bot = bot
|
||
|
|
|
||
|
|
@commands.Cog.listener()
|
||
|
|
async def on_message(self, message: discord.Message) -> None:
|
||
|
|
if message.author.bot or not message.guild:
|
||
|
|
return
|
||
|
|
|
||
|
|
guild_settings = load_guild_security(message.guild.id)
|
||
|
|
if not guild_settings.get("anti_link", False):
|
||
|
|
return # Option désactivée → ne rien faire
|
||
|
|
|
||
|
|
if URL_REGEX.search(message.content):
|
||
|
|
try:
|
||
|
|
await message.delete()
|
||
|
|
await message.channel.send(
|
||
|
|
f"{message.author.mention} ⚠️ Les liens sont interdits sur ce serveur.",
|
||
|
|
delete_after=5
|
||
|
|
)
|
||
|
|
except discord.Forbidden:
|
||
|
|
print(f"Impossible de supprimer le message de {message.author} (permissions manquantes).")
|
||
|
|
except Exception as exc:
|
||
|
|
print(f"Erreur lors de la suppression du message : {exc}")
|
||
|
|
|
||
|
|
|
||
|
|
async def setup(bot: commands.Bot) -> None:
|
||
|
|
await bot.add_cog(NoLink(bot))
|