0% found this document useful (0 votes)
9 views11 pages

Discord Bot Anti-Raid Logging Setup

The document outlines the implementation of an Anti-Raid Bot using Discord's API, featuring functionalities such as tracking user joins and messages, managing whitelists and blacklists, and logging actions in a SQLite database. It includes commands for configuring anti-spam settings, quarantine durations, and enabling raid mode, along with automated responses to suspicious activities. The bot is designed to enhance server security by monitoring user behavior and taking actions against potential raids.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
9 views11 pages

Discord Bot Anti-Raid Logging Setup

The document outlines the implementation of an Anti-Raid Bot using Discord's API, featuring functionalities such as tracking user joins and messages, managing whitelists and blacklists, and logging actions in a SQLite database. It includes commands for configuring anti-spam settings, quarantine durations, and enabling raid mode, along with automated responses to suspicious activities. The bot is designed to enhance server security by monitoring user behavior and taking actions against potential raids.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd

import discord

from [Link] import commands, tasks


from discord import app_commands
import asyncio
import json
import time
from datetime import datetime, timedelta
from collections import defaultdict, deque
import re
import logging
import sqlite3
from typing import Dict, List, Optional
import hashlib

# Setup logging

[Link](level=[Link])
logger = [Link](*name*)

class AntiRaidBot([Link]):
def *init*(self):
intents = [Link]()
super().*init*(command_prefix=’!’, intents=intents)

# Configurazioni anti-raid
[Link] = {
'max_joins_per_minute': 5,
'max_messages_per_minute': 10,
'quarantine_duration': 600, # 10 minuti
'raid_mode': False,
'auto_quarantine': True,
'log_channel_id': None,
'admin_role_id': None,
'timeout_duration': 600 # 10 minuti timeout
}

# Tracciamento attività
self.join_tracker = defaultdict(deque)
self.message_tracker = defaultdict(deque)
self.nickname_changes = defaultdict(list)
self.user_flags = defaultdict(int)

# Database setup
self.init_database()

# Whitelist/Blacklist
[Link] = set()
[Link] = set()

# Pattern sospetti
self.suspicious_patterns = [
r'discord\.gg\/\w+', # Inviti Discord
r'@everyone',
r'@here',
r'(.)\1{10,}', # Caratteri ripetuti
r'[^\w\s]{5,}', # Troppi simboli
]
def init_database(self):
"""Inizializza il database SQLite"""
[Link] = [Link]('[Link]')
cursor = [Link]()

[Link]('''
CREATE TABLE IF NOT EXISTS logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT,
user_id TEXT,
action TEXT,
reason TEXT,
guild_id TEXT
)
''')

[Link]('''
CREATE TABLE IF NOT EXISTS warnings (
user_id TEXT,
guild_id TEXT,
warnings INTEGER DEFAULT 0,
PRIMARY KEY (user_id, guild_id)
)
''')

[Link]()

async def setup_hook(self):


"""Setup iniziale del bot"""
await [Link]()
print(f"✅ Bot sincronizzato! Comandi slash disponibili.")
self.cleanup_tracker.start()

async def on_ready(self):


"""Bot pronto"""
print(f'🚀 {[Link]} è online!')
print(f'📊 Connesso a {len([Link])} server')

async def log_action(self, guild_id: int, user_id: int, action: str, reason: str):
"""Log delle azioni nel database"""
cursor = [Link]()
[Link](
'INSERT INTO logs (timestamp, user_id, action, reason, guild_id) VALUES (?,
?, ?, ?, ?)',
([Link]().isoformat(), str(user_id), action, reason, str(guild_id))
)
[Link]()

# Log nel canale se configurato


if [Link]['log_channel_id']:
channel = self.get_channel([Link]['log_channel_id'])
if channel:
embed = [Link](
title="🛡 Azione Anti-Raid",
color=[Link](),
timestamp=[Link]()
)
embed.add_field(name="Utente", value=f"<@{user_id}>", inline=True)
embed.add_field(name="Azione", value=action, inline=True)
embed.add_field(name="Motivo", value=reason, inline=False)
await [Link](embed=embed)

async def on_member_join(self, member):


"""Controllo nuovi membri"""
guild_id = [Link]
user_id = [Link]
now = [Link]()

# Traccia i join
self.join_tracker[guild_id].append(now)

# Rimuovi join vecchi (più di 1 minuto)


while (self.join_tracker[guild_id] and
now - self.join_tracker[guild_id][0] > 60):
self.join_tracker[guild_id].popleft()

# Controllo blacklist
if user_id in [Link]:
await [Link](reason="Utente in blacklist")
await self.log_action(guild_id, user_id, "BAN", "Utente in blacklist")
return

# Controllo raid (troppi join)


if len(self.join_tracker[guild_id]) > [Link]['max_joins_per_minute']:
await self.enable_raid_mode([Link])
await self.log_action(guild_id, user_id, "RAID_DETECTED",
f"{len(self.join_tracker[guild_id])} join in 1 minuto")

# Auto-quarantena se abilitata
if [Link]['auto_quarantine'] and user_id not in [Link]:
await self.quarantine_user(member)

async def on_message(self, message):


"""Controllo messaggi per spam/raid"""
if [Link]:
return

guild_id = [Link] if [Link] else None


user_id = [Link]
now = [Link]()

if not guild_id:
return

# Traccia messaggi
self.message_tracker[user_id].append(now)

# Rimuovi messaggi vecchi


while (self.message_tracker[user_id] and
now - self.message_tracker[user_id][0] > 60):
self.message_tracker[user_id].popleft()

# Controllo spam
if len(self.message_tracker[user_id]) > [Link]['max_messages_per_minute']:
await self.timeout_user([Link], "Spam rilevato")
await [Link]()
return
# Controllo pattern sospetti
for pattern in self.suspicious_patterns:
if [Link](pattern, [Link], [Link]):
self.user_flags[user_id] += 1
if self.user_flags[user_id] >= 3:
await self.timeout_user([Link], "Pattern sospetti
rilevati")
await [Link]()
return

await self.process_commands(message)

async def on_member_update(self, before, after):


"""Controllo cambi nickname sospetti"""
if before.display_name == after.display_name:
return

user_id = [Link]
guild_id = [Link]

# Traccia cambi nickname


self.nickname_changes[user_id].append({
'timestamp': [Link](),
'old_name': before.display_name,
'new_name': after.display_name
})

# Rimuovi cambi vecchi (più di 1 ora)


cutoff = [Link]() - 3600
self.nickname_changes[user_id] = [
change for change in self.nickname_changes[user_id]
if change['timestamp'] > cutoff
]

# Troppi cambi nickname = sospetto


if len(self.nickname_changes[user_id]) > 5:
await self.timeout_user(after, "Troppi cambi nickname")
await self.log_action(guild_id, user_id, "TIMEOUT", "Cambi nickname
sospetti")

async def quarantine_user(self, member):


"""Mette un utente in quarantena"""
try:
# Timeout per il periodo di quarantena
timeout_until = [Link]() +
timedelta(seconds=[Link]['quarantine_duration'])
await [Link](timeout_until, reason="Quarantena automatica")

await self.log_action([Link], [Link], "QUARANTINE",


"Auto-quarantena nuovo utente")
except [Link]:
[Link](f"Non posso mettere {member} in quarantena - permessi
insufficienti")

async def timeout_user(self, member, reason):


"""Timeout utente"""
try:
timeout_until = [Link]() +
timedelta(seconds=[Link]['timeout_duration'])
await [Link](timeout_until, reason=reason)

await self.log_action([Link], [Link], "TIMEOUT", reason)


except [Link]:
[Link](f"Non posso dare timeout a {member} - permessi
insufficienti")

async def enable_raid_mode(self, guild):


"""Attiva modalità raid"""
[Link]['raid_mode'] = True

# Cerca di modificare le impostazioni del server


try:
await [Link](verification_level=[Link])
except [Link]:
pass

# Notifica
if [Link]['log_channel_id']:
channel = self.get_channel([Link]['log_channel_id'])
if channel:
embed = [Link](
title="🚨 MODALITÀ RAID ATTIVATA",
description="Rilevata attività sospetta! Modalità protezione
massima attiva.",
color=[Link]()
)
await [Link](embed=embed)

@[Link](minutes=5)
async def cleanup_tracker(self):
"""Pulizia periodica dei tracker"""
now = [Link]()
cutoff = now - 3600 # 1 ora

# Pulisci tracker join


for guild_id in list(self.join_tracker.keys()):
while (self.join_tracker[guild_id] and
self.join_tracker[guild_id][0] < cutoff):
self.join_tracker[guild_id].popleft()

# Pulisci tracker messaggi


for user_id in list(self.message_tracker.keys()):
while (self.message_tracker[user_id] and
self.message_tracker[user_id][0] < cutoff):
self.message_tracker[user_id].popleft()

# ==================== COMANDI SLASH ====================

@app_commands.command(name="antispam", description="Configura il sistema anti-


spam")
@app_commands.describe(
action="Abilita o disabilita l'anti-spam",
limit="Limite messaggi per minuto (default: 10)"
)
@app_commands.choices(action=[
app_commands.Choice(name="enable", value="enable"),
app_commands.Choice(name="disable", value="disable")
])
async def antispam(self, interaction: [Link], action: str, limit: int
= 10):
"""Sistema anti-spam"""
if not [Link].guild_permissions.administrator:
await [Link].send_message("❌ Non hai i permessi necessari!",
ephemeral=True)
return

if action == "enable":
[Link]['max_messages_per_minute'] = limit
await [Link].send_message(f"✅ Anti-spam attivato! Limite:
{limit} messaggi/minuto")
else:
[Link]['max_messages_per_minute'] = 999999
await [Link].send_message("✅ Anti-spam disattivato!")

@app_commands.command(name="quarantine", description="Configura la quarantena


automatica")
@app_commands.describe(
action="Abilita o disabilita la quarantena",
duration="Durata in minuti (default: 10)"
)
@app_commands.choices(action=[
app_commands.Choice(name="enable", value="enable"),
app_commands.Choice(name="disable", value="disable")
])
async def quarantine(self, interaction: [Link], action: str, duration:
int = 10):
"""Quarantena automatica"""
if not [Link].guild_permissions.administrator:
await [Link].send_message("❌ Non hai i permessi necessari!",
ephemeral=True)
return

if action == "enable":
[Link]['auto_quarantine'] = True
[Link]['quarantine_duration'] = duration * 60
await [Link].send_message(f"✅ Quarantena attivata! Durata:
{duration} minuti")
else:
[Link]['auto_quarantine'] = False
await [Link].send_message("✅ Quarantena disattivata!")

@app_commands.command(name="whitelist", description="Gestisci la whitelist")


@app_commands.describe(
action="Aggiungi o rimuovi dalla whitelist",
user="Utente da gestire"
)
@app_commands.choices(action=[
app_commands.Choice(name="add", value="add"),
app_commands.Choice(name="remove", value="remove"),
app_commands.Choice(name="list", value="list")
])
async def whitelist(self, interaction: [Link], action: str, user:
[Link] = None):
"""Gestione whitelist"""
if not [Link].guild_permissions.administrator:
await [Link].send_message("❌ Non hai i permessi necessari!",
ephemeral=True)
return

if action == "add" and user:


[Link]([Link])
await [Link].send_message(f"✅ {[Link]} aggiunto alla
whitelist!")
elif action == "remove" and user:
[Link]([Link])
await [Link].send_message(f"✅ {[Link]} rimosso dalla
whitelist!")
elif action == "list":
if [Link]:
users = [f"<@{uid}>" for uid in list([Link])[:10]]
await [Link].send_message(f"📝 Whitelist: {',
'.join(users)}")
else:
await [Link].send_message("📝 Whitelist vuota!")

@app_commands.command(name="blacklist", description="Gestisci la blacklist")


@app_commands.describe(
action="Aggiungi o rimuovi dalla blacklist",
user="Utente da gestire"
)
@app_commands.choices(action=[
app_commands.Choice(name="add", value="add"),
app_commands.Choice(name="remove", value="remove"),
app_commands.Choice(name="list", value="list")
])
async def blacklist(self, interaction: [Link], action: str, user:
[Link] = None):
"""Gestione blacklist"""
if not [Link].guild_permissions.administrator:
await [Link].send_message("❌ Non hai i permessi necessari!",
ephemeral=True)
return

if action == "add" and user:


[Link]([Link])
await [Link].send_message(f"✅ {[Link]} aggiunto alla
blacklist!")
# Banna se presente nel server
try:
member = [Link].get_member([Link])
if member:
await [Link](reason="Aggiunto alla blacklist")
except:
pass
elif action == "remove" and user:
[Link]([Link])
await [Link].send_message(f"✅ {[Link]} rimosso dalla
blacklist!")
elif action == "list":
if [Link]:
users = [f"<@{uid}>" for uid in list([Link])[:10]]
await [Link].send_message(f"📝 Blacklist: {',
'.join(users)}")
else:
await [Link].send_message("📝 Blacklist vuota!")
@app_commands.command(name="raidmode", description="Modalità emergenza raid")
@app_commands.describe(action="Abilita o disabilita la modalità raid")
@app_commands.choices(action=[
app_commands.Choice(name="enable", value="enable"),
app_commands.Choice(name="disable", value="disable")
])
async def raidmode(self, interaction: [Link], action: str):
"""Modalità raid"""
if not [Link].guild_permissions.administrator:
await [Link].send_message("❌ Non hai i permessi necessari!",
ephemeral=True)
return

if action == "enable":
await self.enable_raid_mode([Link])
await [Link].send_message("🚨 **MODALITÀ RAID ATTIVATA**\
nProtezione massima abilitata!")
else:
[Link]['raid_mode'] = False
try:
await
[Link](verification_level=[Link])
except:
pass
await [Link].send_message("✅ Modalità raid disattivata!")

@app_commands.command(name="logs", description="Visualizza i log di sicurezza")


@app_commands.describe(limit="Numero di log da mostrare (max 20)")
async def logs(self, interaction: [Link], limit: int = 10):
"""Visualizza log"""
if not [Link].guild_permissions.administrator:
await [Link].send_message("❌ Non hai i permessi necessari!",
ephemeral=True)
return

cursor = [Link]()
[Link](
'SELECT timestamp, user_id, action, reason FROM logs WHERE guild_id = ?
ORDER BY id DESC LIMIT ?',
(str([Link]), min(limit, 20))
)

logs = [Link]()
if not logs:
await [Link].send_message("📝 Nessun log disponibile!")
return

embed = [Link](title="📋 Log di Sicurezza", color=[Link]())

for timestamp, user_id, action, reason in logs:


dt = [Link](timestamp)
embed.add_field(
name=f"{action} - <@{user_id}>",
value=f"**Motivo:** {reason}\n**Data:** {[Link]('%d/%m/%Y %H:
%M')}",
inline=False
)

await [Link].send_message(embed=embed, ephemeral=True)


@app_commands.command(name="settings", description="Visualizza le impostazioni
correnti")
async def settings(self, interaction: [Link]):
"""Impostazioni attuali"""
if not [Link].guild_permissions.administrator:
await [Link].send_message("❌ Non hai i permessi necessari!",
ephemeral=True)
return

embed = [Link](title="⚙ Impostazioni Anti-Raid",


color=[Link]())

embed.add_field(name="🔄 Max Join/minuto",


value=[Link]['max_joins_per_minute'], inline=True)
embed.add_field(name="💬 Max Messaggi/minuto",
value=[Link]['max_messages_per_minute'], inline=True)
embed.add_field(name="⏱ Durata Quarantena",
value=f"{[Link]['quarantine_duration']//60}min", inline=True)
embed.add_field(name="🛡 Auto-Quarantena", value="✅" if
[Link]['auto_quarantine'] else "❌", inline=True)
embed.add_field(name="🚨 Modalità Raid", value="✅" if [Link]['raid_mode']
else "❌", inline=True)
embed.add_field(name="⏰ Durata Timeout",
value=f"{[Link]['timeout_duration']//60}min", inline=True)

embed.add_field(name="📊 Statistiche", value=f"Whitelist: {len([Link])}\


nBlacklist: {len([Link])}", inline=False)

await [Link].send_message(embed=embed, ephemeral=True)

@app_commands.command(name="logchannel", description="Imposta il canale per i log")


@app_commands.describe(channel="Canale dove inviare i log")
async def logchannel(self, interaction: [Link], channel:
[Link]):
"""Imposta canale log"""
if not [Link].guild_permissions.administrator:
await [Link].send_message("❌ Non hai i permessi necessari!",
ephemeral=True)
return

[Link]['log_channel_id'] = [Link]
await [Link].send_message(f"✅ Canale log impostato su
{[Link]}!")

@app_commands.command(name="mass_timeout", description="Timeout di massa per utenti


recenti")
@app_commands.describe(minutes="Minuti di timeout", recent_joins="Timeout solo per
utenti entrati negli ultimi X minuti")
async def mass_timeout(self, interaction: [Link], minutes: int = 10,
recent_joins: int = 60):
"""Timeout di massa"""
if not [Link].guild_permissions.administrator:
await [Link].send_message("❌ Non hai i permessi necessari!",
ephemeral=True)
return

await [Link]()
cutoff = [Link]() - timedelta(minutes=recent_joins)
timeout_until = [Link]() + timedelta(minutes=minutes)
count = 0

for member in [Link]:


if (member.joined_at and member.joined_at > cutoff and
not [Link] and [Link] not in [Link]):
try:
await [Link](timeout_until, reason="Timeout di massa -
protezione raid")
count += 1
if count % 5 == 0: # Pausa ogni 5 per evitare rate limit
await [Link](1)
except:
continue

await [Link](f"✅ Timeout applicato a {count} utenti


recenti!")

@app_commands.command(name="status", description="Stato del sistema anti-raid")


async def status(self, interaction: [Link]):
"""Stato sistema"""
embed = [Link](title="📊 Stato Sistema Anti-Raid",
color=[Link]())

# Calcola statistiche recenti


now = [Link]()
recent_joins = sum(1 for deq in self.join_tracker.values() for t in deq if now
- t < 3600)
active_users = sum(1 for deq in self.message_tracker.values() if deq and now -
deq[-1] < 300)

embed.add_field(name="🔄 Join ultima ora", value=recent_joins, inline=True)


embed.add_field(name="👤 Utenti attivi (5min)", value=active_users, inline=True)
embed.add_field(name="🚩 Utenti flaggati", value=len(self.user_flags),
inline=True)

embed.add_field(name="📈 Cambi nickname", value=sum(len(changes) for changes in


self.nickname_changes.values()), inline=True)
embed.add_field(name="✅ Whitelist", value=len([Link]), inline=True)
embed.add_field(name="❌ Blacklist", value=len([Link]), inline=True)

# Stato modalità
status_text = "🚨 **RAID MODE**" if [Link]['raid_mode'] else "✅
**NORMALE**"
embed.add_field(name="🛡 Stato", value=status_text, inline=False)

await [Link].send_message(embed=embed)

# Avvia il bot

if *name* == “*main*”:
bot = AntiRaidBot()

# IMPORTANTE: Sostituisci con il tuo token


TOKEN = "IL_TUO_TOKEN_QUI"
print("🤖 Avvio bot anti-raid...")
print("📋 Comandi disponibili:")
print(" /antispam - Configura anti-spam")
print(" /quarantine - Quarantena automatica")
print(" /whitelist - Gestisci whitelist")
print(" /blacklist - Gestisci blacklist")
print(" /raidmode - Modalità emergenza")
print(" /logs - Visualizza log sicurezza")
print(" /settings - Mostra impostazioni")
print(" /logchannel - Imposta canale log")
print(" /mass_timeout - Timeout di massa")
print(" /status - Stato del sistema")
print("\n🚀 Avvio in corso...")

try:
[Link](TOKEN)
except Exception as e:
print(f"❌ Errore: {e}")
print("🔑 Assicurati di aver inserito il token corretto!")

You might also like