genosdb
Version:
GenosDB (GDB): distributed graph database in real-time, peer-to-peer, scalable storage - efficient querying of complex relationships.
2 lines (1 loc) • 1.92 kB
JavaScript
async function _(j,{spamThreshold:B=3,spamWindowMs:k=2000,apiDebounceMs:E=500,sources:F=["https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/es","https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/en"]}={}){const P=["gay","boludo","gilipollas","cabron"].map(K);let L=new Set(P);try{const y=await Z(F);for(let q of y)L.add(q)}catch{console.warn("\uD83D\uDEE1\uFE0F Audit: Could not load the banned terms list.")}const I=(y)=>typeof y=="string"?X(y).some((q)=>L.has(q)):Array.isArray(y)?y.some(I):y&&typeof y=="object"?Object.values(y).some(I):!1,J=new Map,Q=O(()=>{for(let[y,q]of J)if(q&&I(q))j.remove?.(y),j.oplog?.remove?.(y),console.log(`\uD83D\uDEE1\uFE0F Audit: Node removed due to banned content \u2192 ${y}`);J.clear()},E);let C=[],G=0,R=O(()=>{if(C.length>=B){console.log(`\uD83D\uDEE1\uFE0F Audit: Spam detected (${C.length} ops in ${k/1000}s) [${C.map((y)=>y.id).join(", ")}]`);for(let y of C)j.remove?.(y.id),j.oplog?.remove?.(y.id)}C=[],G=0},E);const{unsubscribe:U}=j.map?.(({id:y,value:q,action:N,timestamp:V})=>{if((N==="added"||N==="updated")&&q){J.set(y,q),Q();const H=V.physical;C=G&&H-G<k?[...C,{id:y,ts:H}]:[{id:y,ts:H}],G=H,R()}})??{unsubscribe:()=>{}};return{stop:()=>U?.()}}var O=(j,B=500)=>{let k;return(...E)=>{clearTimeout(k),k=setTimeout(()=>j(...E),B)}},K=(j)=>j.toLowerCase().normalize("NFD").replace(/\p{M}/gu,""),X=(j)=>K(j).match(/\p{L}+/gu)||[],Y=async(j,B=1e4)=>{const k=new AbortController,E=setTimeout(()=>k.abort(),B);try{const F=await fetch(j,{mode:"cors",cache:"no-cache"});return F.ok?await F.text():""}finally{clearTimeout(E)}},Z=async(j)=>new Set((await Promise.all(j.map(Y))).flatMap((B)=>B.split(/\r?\n/).map((k)=>k.trim()).filter(Boolean)).map(K)),x=(j)=>{return console.log("\uD83D\uDEE1\uFE0F Audit module loaded."),_(j)};export{x as init,O as debounce,_ as Audit};