feat: moderacion lolicon - cuarentena + decision desde Discord (webhook links aprobar/rechazar)
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
const Database = require("better-sqlite3");
|
||||
const db = new Database("./data/worst-scan.db");
|
||||
|
||||
// ===== AUDITORIA LOLICON - borrar posts problematicos =====
|
||||
// Caso 1: tags explícitos lolicon/shotacon/loli/shota
|
||||
// Caso 2: posts conocidos dudosos (por gid)
|
||||
|
||||
// Blacklist con match de palabra completa (no substring) para evitar falsos
|
||||
// positivos como "hololive" (VTubers adultas) que contienen "loli".
|
||||
const EXPLICIT = [
|
||||
/\blolicon\b/i,
|
||||
/\bshotacon\b/i,
|
||||
/\bloli\b/i,
|
||||
/\bshota(?!live)\b/i, // "shota" pero no "hololive"
|
||||
/\bchild\b/i,
|
||||
/\bchildren\b/i,
|
||||
/\bkids\b/i,
|
||||
/\bminor\b/i,
|
||||
];
|
||||
const KNOWN_BAD_GIDS = ["669957"]; // Idol no Kimi no Tonari no Boku 3
|
||||
|
||||
let deleted = 0;
|
||||
|
||||
// 1) Tags explícitos
|
||||
const all = db.prepare("SELECT id, gid, title, tags FROM posts WHERE published=1").all();
|
||||
for (const p of all) {
|
||||
let tags = [];
|
||||
try { tags = JSON.parse(p.tags || "[]"); } catch {}
|
||||
const hits = tags.filter(t => EXPLICIT.some(re => re.test(t)));
|
||||
if (hits.length > 0) {
|
||||
const r = db.prepare("DELETE FROM posts WHERE id = ?").run(p.id);
|
||||
console.log(`[borrado] ${p.title} | tags: ${hits.join(", ")}`);
|
||||
deleted += r.changes;
|
||||
}
|
||||
}
|
||||
|
||||
// 2) Gids conocidos
|
||||
for (const gid of KNOWN_BAD_GIDS) {
|
||||
const r = db.prepare("DELETE FROM posts WHERE gid = ?").run(gid);
|
||||
if (r.changes > 0) {
|
||||
console.log(`[borrado por gid] ${gid}`);
|
||||
deleted += r.changes;
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\nTotal borrados: ${deleted}`);
|
||||
console.log("Posts publicados restantes: " + db.prepare("SELECT COUNT(*) c FROM posts WHERE published=1").get().c);
|
||||
db.close();
|
||||
Reference in New Issue
Block a user