Files

48 lines
1.5 KiB
JavaScript

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();