Mod-Log: eigenes Gedaechtnis, damit beim Loeschen nicht "unbekannt" dasteht
Dein Eintrag war der Normalfall, nicht die Ausnahme:
User: unbekannt
Inhalt: [kein Text / nicht im Cache]
Discord schickt beim Loeschen nur eine Huelle, sobald die Nachricht nicht mehr
im Cache des Bots liegt. Der reicht ein paar hundert Nachrichten weit und faengt
erst beim Start des Bots an — bei einem Post von gestern ist sie also nie drin.
Ein Protokoll, das genau dann nichts weiss, wenn es interessant wird, ist keins.
Also merkt sich der Bot Nachrichten jetzt kurz selbst: Verfasser, Wortlaut,
Namen der Anhaenge. Beim Loeschen steht das im Eintrag, danach wird der Merker
weggeworfen. Wie lange aufbewahrt wird, steht unter Werte — sieben Tage
voreingestellt, 0 heisst gar nicht mitschreiben. Bewusst knapp und einstellbar:
das ist ein Werkzeug zum Nachvollziehen von Loeschungen, kein Archiv.
Dazu drei Sachen, die vorher fehlten:
- Wer geloescht hat. Steht in Discords Audit-Log, aber nur wenn es jemand
anders war als der Verfasser. Gemeldet wird nur, was frisch ist und zu Kanal
und Verfasser passt — Discord zaehlt bei wiederholtem Loeschen denselben
Eintrag hoch statt neue anzulegen, da ist eine falsche Angabe schnell
gemacht. Lieber keine als eine falsche.
- Sammel-Loeschungen. /purge und Discords eigenes Aufraeumen standen gar nicht
im Log: eine geloeschte Nachricht fiel auf, hundert nicht. Jetzt mit Anzahl,
Kanal und den ersten fuenfzehn Zeilen.
- Anhaenge. Dass ein Bild dranhing, war vorher nirgends zu sehen — und das
Bild selbst ist nach dem Loeschen ohnehin weg.
Nebenbei: "[kein Text / nicht im Cache]" waren zwei Aussagen in einer und beide
unklar. Jetzt steht dort entweder der Wortlaut, oder dass die Nachricht keinen
hatte, oder dass sie aelter ist als die Aufbewahrung reicht.
Beim Testen gefunden: pruneMessageCache(0) hat nichts geloescht. "-0 days" ist
genau jetzt, und `created_at < jetzt` laesst die eben geschriebene Zeile stehen.
Bei 0 wird jetzt alles geleert, wie es gemeint war.
Geprueft: Merken, Wiederfinden, Anhaenge durch JSON, Bearbeiten zieht mit,
Vergessen nach dem Loggen, unbekannte ID, doppelte ID, Aufbewahrung mit einem
zu alten und einem frischen Eintrag, und der 0-Fall. Ereignisnamen und
AuditLogEvent gegen die installierte discord.js geprueft.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1269,6 +1269,52 @@ export const getRoleMenu = (id) => getRoleMenuStmt.get(id) ?? null;
|
||||
export const listRoleMenus = () => listRoleMenusStmt.all();
|
||||
export const deleteRoleMenu = (id) => deleteRoleMenuStmt.run(id).changes > 0;
|
||||
|
||||
// Kurzes Gedaechtnis fuer Nachrichten — nur fuers Mod-Log.
|
||||
//
|
||||
// Discord schickt beim Loeschen nur eine Huelle, sobald die Nachricht nicht
|
||||
// mehr im Cache des Bots liegt; bei einem Post von gestern ist sie das nie.
|
||||
// Im Log stand dann „unbekannt" und „[kein Text]" — also genau nichts.
|
||||
//
|
||||
// Deshalb hier eine eigene, kurzlebige Kopie: Verfasser, Wortlaut, Anhaenge.
|
||||
// Die Aufbewahrung ist einstellbar und bewusst knapp — das hier ist ein
|
||||
// Werkzeug zum Nachvollziehen von Loeschungen, kein Archiv.
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS message_cache (
|
||||
message_id TEXT PRIMARY KEY,
|
||||
channel_id TEXT NOT NULL,
|
||||
author_id TEXT NOT NULL,
|
||||
author TEXT NOT NULL,
|
||||
content TEXT NOT NULL DEFAULT '',
|
||||
anhaenge TEXT NOT NULL DEFAULT '[]',
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_msgcache_ts ON message_cache (created_at);
|
||||
`);
|
||||
const rememberMsgStmt = db.prepare(`
|
||||
INSERT OR REPLACE INTO message_cache
|
||||
(message_id, channel_id, author_id, author, content, anhaenge)
|
||||
VALUES (@message_id, @channel_id, @author_id, @author, @content, @anhaenge)
|
||||
`);
|
||||
const editMsgStmt = db.prepare('UPDATE message_cache SET content = ? WHERE message_id = ?');
|
||||
const recallMsgStmt = db.prepare('SELECT * FROM message_cache WHERE message_id = ?');
|
||||
const forgetMsgStmt = db.prepare('DELETE FROM message_cache WHERE message_id = ?');
|
||||
const pruneMsgStmt = db.prepare(`DELETE FROM message_cache WHERE created_at < datetime('now', ?)`);
|
||||
const clearMsgStmt = db.prepare('DELETE FROM message_cache');
|
||||
export const rememberMessage = (m) => rememberMsgStmt.run(m);
|
||||
export const editRememberedMessage = (id, text) => editMsgStmt.run(text, id).changes > 0;
|
||||
export const recallMessage = (id) => {
|
||||
const row = recallMsgStmt.get(id);
|
||||
return row ? { ...row, anhaenge: JSON.parse(row.anhaenge || '[]') } : null;
|
||||
};
|
||||
export const forgetMessage = (id) => forgetMsgStmt.run(id);
|
||||
/**
|
||||
* Zu Altes vergessen. Bei 0 Tagen wird alles vergessen — „-0 days" ist genau
|
||||
* jetzt, und `< jetzt` liesse die eben geschriebene Zeile stehen.
|
||||
*/
|
||||
export const pruneMessageCache = (tage) => (tage > 0
|
||||
? pruneMsgStmt.run(`-${tage} days`).changes
|
||||
: clearMsgStmt.run().changes);
|
||||
|
||||
// Ticket-System (Button → privater Thread)
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS tickets (
|
||||
|
||||
Reference in New Issue
Block a user