Unter der Haube
Dieses Dokument bietet eine detaillierte, technische Aufschlüsselung darüber, wie der CrossBan Discord-Bot funktioniert, mit Fokus auf seine Code-Struktur, Ausführungsabläufe und zentrale Komponenten. Es richtet sich an Entwickler oder Personen mit Programmierkenntnissen. Der Bot ist in TypeScript unter Verwendung von Discord.js und PostgreSQL geschrieben.
Übersicht
CrossBan synchronisiert Banns über mehrere Discord-Server hinweg. Er hört auf Bann-/Entbann-Ereignisse über Discords Audit-Logs, speichert Daten in einer PostgreSQL-Datenbank und propagiert Aktionen an verbundene Gilden basierend auf Konfigurationen. Er verwendet Docker für das Deployment und handhabt Logging über Webhooks und Nachrichten in Kanälen.
Wesentliche Technologien:
Discord.js: Für die Interaktion mit der Discord-API.
PostgreSQL: Für persistente Speicherung.
Node.js/TypeScript: Laufzeit und Sprache.
Docker: Containerisierung.
Der Kern des Bots ist ereignisgesteuert, mit Modulen, die beim Start dynamisch geladen werden.
Architektur
Der Bot ist modular:
Haupteinstieg (index.ts): Initialisiert den Client, lädt Befehle/Komponenten/Ereignisse und startet den Bot.
Module:
Befehle: Slash-Befehle (z. B. config).
Komponenten: Interaktive Elemente (z. B. Buttons für Entbann-Überprüfungen).
Ereignisse: Handler für Discord-Ereignisse (z. B. Audit-Log-Einträge).
Hilfsfunktionen: Logger, Bann-Sync-Manager, Entbann-Logger.
Datenbank: Manager für Abfragen und Schema-Initialisierung.
Konfiguration: Umgebungsbasierte Einstellungen.
Dateien werden dynamisch geladen mithilfe von require() basierend auf Dateiendungen (.ts in der Entwicklung, .js in der Produktion).
Startprozess
Der Bot startet in index.ts via einer async IIFE (Immediately Invoked Function Expression).
Client-Initialisierung
Erstellt einen Discord-Client mit Intents für Gilden, Mitglieder, Nachrichten und Moderation.
Begrenzt den Cache für Performance (z. B. 128 Nachrichten pro Manager).
Modul-Laden
Funktionen wie loadCommands(), loadComponents(), und loadEvents() scannen Verzeichnisse und laden Dateien:
loadCommands(): Liestcommands/Ordner, filtert nach Endung, require()t jede Datei und prüft aufdataundrunEigenschaften. Speichert in einer Collection.loadComponents(): Ähnlich fürcomponents/, prüft aufprefixundrun.loadEvents(): Durchsuchtevents/Unterordner (passend zum Discord Events-Enum), lädt Handler.
Beispiel für Befehle:
Einrichtungs des Interaction-Handlers
Hängt einen Handler für Interaktionen an (Befehle, Buttons, Selects).
Client Ready Event
Stellt Slash-Befehle bereit mithilfe von
deployCommands().Initialisiert den Entbann-Logger und den Bann-Sync-Manager.
Setzt die Bot-Aktivität, um die Anzahl der Server anzuzeigen.
Lädt Wahrheitsquellen aus der DB in die Konfiguration.
Datenbank-Initialisierung
Ruft auf
dbManager.initialize()um SQL-Schemata ausschemas/Ordner auszuführen.Bereinigt veraltete Gilden/Wahrheitsquellen.
Lädt Wahrheitsquellen in den Arbeitsspeicher.
Einloggen und Funktionen aktivieren
client.login(config.botToken)verbindet mit Discord.Aktiviert den Bann-Sync-Manager.
Im Dev-Modus aktiviert es Logging.
Ereignisbehandlung
Ereignisse werden über guildAuditLogEntryCreate in banEventHandler.ts.
Bann/Entbann-Erkennung
Ignoriert Nicht-Bann-Ereignisse, nicht konfigurierte Gilden, Bot-Aktionen oder Executor(en), die keine Wahrheitsquellen sind.
Verarbeitung von Banns
Für MemberBanAdd:
Ruft auf
banSyncManager.handleBan()mit Benutzer-ID, Quell-Gilde, Executor und Grund.Erstellt ein
BanEventin der DB.Synchronisiert zu Gilden mit aktiviertem Auto-Bann.
Für MemberBanRemove:
Ruft auf
banSyncManager.removeBan()um in Gilden zu entbannen.
Bann-Synchronisation
Behandelt von banSyncManager.ts.
Behandlung von Banns
Fügt das Bann-Ereignis in
ban_eventsTabelle ein.Erstellt einen Gilden-Bann-Datensatz für die Quelle.
Synchronisiert zu Zielgilden.
Synchronisation zu Gilden
Holt Gilden mit aktiviertem Auto-Bann.
Bannt den Benutzer in jeder Zielgilde über die Discord-API.
Erfasst Einträge in der DB.
Behandlung von Entbannungen
Kennzeichnet den Bann in der DB als inaktiv.
Synchronisiert Entbann: Automatisches Entbannen oder sendet ein Review-Log.
Für den Review-Modus:
Verwendet
unbanLoggerum eine Nachricht mit einem Auswahlmenü für Entbann/Ignore zu senden.
Datenbank-Interaktionen
Gemanagt von manager.ts unter Verwendung von pg (PostgreSQL-Client).
Initialisierung
Liest
.sqlDateien ausschemas/und führt sie aus, um Tabellen zu erstellen (z. B.guilds,ban_events,guild_bans,truth_sources).
Wesentliche Operationen
Gilden-Konfigurationen: CRUD für Einstellungen (aktiviert, Auto-Bann, Entbann-Modus, Logging-Kanal).
Bann-Ereignisse: Einfügen und Abfragen globaler Banns.
Gilden-Banns: Verfolgt Bann-Status pro Gilde.
Wahrheitsquellen: Verwalten vertrauenswürdiger Benutzer pro Gilde.
Beispielabfrage:
Logging und Entbann-Verarbeitung
Allgemeines Logging
logger.ts verwendet eine Warteschlange für sequentielle Webhook-Sends:
Reihenfolge der Logs, um Rate-Limits zu vermeiden.
Aktiviert wenn
LOGGING_WEBHOOKin.env.
Entban-Logging
gesetzt ist unbanLogger.ts
components: builder.build(details, type),
Erstellt Container mit Text, Trennern, Thumbnails für Entbann-Details.
Für den Review-Typ fügt es ein Auswahlmenü für Aktionen hinzu.
Sendet rohen Payload via REST-API an den Logging-Kanal.
Konfigurationsverwaltung config.ts .env lädt aus
Dateien:
ParstGUILDSals Array.
Verwaltet Wahrheitsquellen im Speicher (Map von Sets).
Bietet Methoden zum Hinzufügen/Entfernen von Quellen und zum Prüfen, ob ein Benutzer eine Wahrheitsquelle ist.
this._truthSources.set(guildId, _sources);
Fehlerbehandlung und Randfälle
Unbehandelte Rejections/Exceptions werden geloggt.
Datenbankabfragen verwenden parametrisierte Statements, um SQL-Injection zu verhindern.
Der Client prüft die Verfügbarkeit bevor Aktionen ausgeführt werden.
Zuletzt aktualisiert
War das hilfreich?