Files
pixel.horse/src/ts/common/swears.ts
T
Tyler Schrock 782f8c731c Archive Update 53.1 (#62)
* Normalize BOM and line endings

* Archive update 0.53.1
2019-09-02 12:40:04 -05:00

1605 lines
47 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { repeat } from 'lodash';
import { charsToCodes } from '../common/stringUtils';
const otherChars = 'ąăãçćıłńęśóöøğüțţťżź';
const wordBreakRU = `[^a-zA-Z\u0400-\u04FF${otherChars}}]`;
const wordStartRU = `(?:^|${wordBreakRU})`;
const wordEndRU = `(?=$|${wordBreakRU})`;
function createBadWords(fast: boolean) {
const emoji = fast ? '*' : '😀-🙏☀-⛿✀-➿🚀-🛶⬀-⯯🌀-🗿';
const separators1 = `:;!|\`"@#$%^&'*,._=+~\\-`; // \\(\\)\\{\\}\\]\\[
const separators2 = `${separators1}\\(\\)/\\\\`;
const sep = `[ ${emoji}${separators2}]`;
const sep2 = `[${emoji}${separators2}]`;
const sep3 = `[${emoji}${separators1}]`;
const sep4 = `[${emoji}${separators1}\\(\\)\\{\\}\\]\\[]`;
const sep5 = `[ ${emoji}${separators1}\\(\\)\\{\\}\\]\\[]`;
const sep2OrNum = `[0-9${emoji}${separators2}]`;
const onlyLetterT = fast ? 't' : 'tţțťтᴛ';
const letter = {
a: '[aаáα@4åα]',
b: '[bв🅱]',
c: '[cсćčçḉĉɕċƈȼ¢ς©ᴄ<]',
e: '[eе3єεęėëê€é]',
f: '[fғƒꜰ]',
g: '[gɢ]',
h: '[hн]',
i: '[ıιi!1íĭǐîïḯịȉìỉȋīįᶖɨĩḭᴉᵢ¡İ|🕯ɪ]',
k: '[kĸкḱǩķⱪꝃḳƙḵᶄꝁꝅʞκᴋ]',
n: '[nηɴñń]',
o: '[o○о0σõø🍪🥚°]',
p: '[pр]',
s: '[sş5$š]',
ss: fast ? 'ss' : '(?:ss|ß)',
t: `[${onlyLetterT}^7]`,
u: '[υuúŭǔûṷüǘǚǜǖṳụűȕùủưứựừửữȗūṻųᶙůũṹṵᴜ]',
x: '[xх]',
ь: '[ьЪ]',
};
if (fast) {
Object.keys(letter).forEach(key => {
(letter as any)[key] = (letter as any)[key].replace(/[^\u0020-\u007e]/g, '');
});
}
const anyD = '(?:d|\\|\\))';
const anyH = '(?:h|\\|-\\|)';
const anyK = '(?:k|\\|<)';
const anyL = '(?:l|\\|_)';
const anyN = '(?:n|\\|\\\\\\|)';
const anyO = '(?:o|0|\\(\\))';
const anyU = '(?:u|\\|_\\||\\\\/|\\(_\\))';
const wordBreak = fast ? `[^a-zA-Z]` : wordBreakRU;
const wordStart = `(?:^|${wordBreak})`;
const wordEnd = `(?=$|${wordBreak})`;
// sp
const oó = fast ? 'o' : 'oó';
// pr
const ã = fast ? 'a' : 'aã';
const á = fast ? 'a' : 'aá';
// ro
const ă = fast ? 'a' : 'aă';
const ț = fast ? 't' : 'tț';
// pl
const ą = fast ? 'a' : 'aą';
const ę = fast ? 'e' : 'eę';
const ć = fast ? 'c' : 'cć';
const ń = fast ? 'n' : 'nń';
const ł = fast ? 'l' : 'lł';
const ó = fast ? 'u' : 'uó';
const ś = fast ? 's' : 'sś';
function separeted(letters: string, separator = sep): string {
return letters.split('').map(x => `${(letter as any)[x] || x}+`).join(`${separator}*`);
}
function baseSeparate(letters: string, sep: string, optional?: string) {
return `_*${separeted(letters, sep)}${(optional ? `(?:${separeted(optional, sep)})?` : '')}_*`;
}
function separate(letters: string, optional?: string, separator = sep): string {
return baseSeparate(letters, separator, optional);
}
function separate2(letters: string, optional?: string): string {
return baseSeparate(letters, sep2, optional);
}
function alts(letters: string) {
return letters.split('').map(x => `${(letter as any)[x] || x}+`).join('');
}
let fuckWords: string[];
const badWords = [
// english
'aborted ?fetus',
'all?(?:uh|ah ?u?a?|uah) ?a+c?k(?:ba+r*)?',
'(?<!hea(?:r|w)ing|band) aids',
'akbar',
'anal(?:fisting)?',
'(?:my|your|his|her)?a[*]?nus', // anus
'i want uranus',
'a n u s',
'poopoo hole',
'(?:b[i1]tch|fat)?a+[s$]{2,}(?:es|fucks?| ?w?holes?|hats?|lickers?|wipes?)?', // ass
'arse? ?hole',
'as[*]+ole',
separate('asshole', 's'),
'a[*]+h[o0]les?',
'a+[sz2*$%#@&-]+h+oles?',
'your a s s',
'bootyhole',
`a${sep2}?s${sep2}?s`,
'a+ss+m+e+a+t+',
'dumb a ss',
'autis(?:ts?|ms?|tic)',
'a *u *t *i *s *[mt]',
'bend over',
'bea?stiality',
'lets bang',
'bangs (?:her|him)',
'son ?of(?: ?a)? ?(?:bitch|beach)', // bitch
'beatch',
'beach no',
'you (beach|batch)',
'bitv?c ?h',
'b[%*]+ch',
'b[i1][s$]h',
'b[*]th',
'b[*]{2,}s',
`b(?:\\*|${letter.i})+[ae]*th?c+h+(?:e?[sz]+)?`,
'b+i+t+s?c+h+',
'bit?ach(?:es)?',
'bit?<h(?:es)?',
'b[it*]+ch(?:e[sz]+)?',
'b+[i*]+c+t+h+',
'b[hw]itch',
'binch(?:es)?',
'bio ?tch(?:e[sz])?',
'(?:b|bi)[*]+(?:tch|ch|h)',
'bi?y[ao]tch',
'bi+ta+ch',
'betch(?:es)?',
'b *e +t *c +h',
'b +i +o +t +c +h',
'b-i-c-t-h',
'b +i +c +t +h',
'b\\.? *i *c\\.? *h',
'biti?chi',
'bit[sx]h',
'bithc',
'bitcj?',
'bihtch',
'b1ch',
'bxitch',
'(?:little|hi) b *e *a *c *h',
`b${sep2}tch`,
`b${sep3}{3,}h`,
`b(?:${letter.i}|\\|)${letter.t}${letter.c}h`,
'bi[ct] h',
'bicht(?:es)?',
'b[*]t[*]h',
'b[*.]tch',
'btc[*.]h',
'bit[*.]h',
'bi[*]{2}es',
`b[i1]+s+h+(?:es)?`, // bish
'b[*] sh',
`b${sep2}+s+h+(?:es)?`,
'b(?:ei|ic)tc+h+e?s?',
separate('bitch', 'es', sep5),
separate('bietch', 'es'),
separate('bictch', 'es', sep5),
`b${sep2}(?:i${sep2}|t)ch`,
'(?:you little|son of a) b',
'bi tc',
'b[i!1][t+]ch(?:es)?',
'bitces',
'bi1?t1?ch',
'b+i+c+h+',
'b[i1l]tch',
'b\\|7h',
'b\\(\\S+\\)tch',
'\\S*lilbetch\\S*',
'(?:bl[o0]w|hoof|foot|hand|rim) ?jobs?',
'boners?',
'bone ?(?:me|you|him|her)',
'b[o0]{2,}b(?:i+e+[sz]|ie|s|z| ?jobs?)', // boobs
'b[o0]{2}b',
'b[. ]+o[. ]+o[. ]+b(?: s)?',
'butt ?plugs?',
'put+ in the butt',
'in the but+hole',
'bukake',
'ballsacks?', // balls
'balls ?(?:deep|slapp?ing)',
'(?:sweaty|his|lick my|empty my) ?balls',
'my balls swell',
'(?:butt|arse) ?holes?',
'b[*]tthole',
'(?<!died of )can[cs]er+(?:s|ous)?(?! patient)',
'i hope you get (?:\\S+ )?cancer?', // cancer
`(?<!died of )${separate('cancer')}(?! patient)`,
'(?:horse|mare)?c\\Scks?(?! gun)', // cock
'c[o0][c<]k(?:socks?)?',
separate('cock'),
'co[cq]ksuckers?',
'c[o0][ck]c',
`c${sep2}[ck]c`,
'cockhead',
'his cok',
'condo[nm]', // condom
'climaxe[ds]', // climax
'(?:his|her|has a|hit my) climax',
'clit(?:o[*]?ris)?',
'clopp(?:ing|ers?)',
'(?:whale)?cum+(?:s|ing|ies)',
'cum ?(?:dump(?:sters?)?|buckets?|guzzl(?:ing|ers?)|soaken|stain|huge load)',
//'cum', // cant use because of spanish
'cum (?:in(?:side)?|on) (?:your?|my|me|her)',
'cum (?:inside|outside|spewing|for me|harder|a ?lot|more|all|stain(?:s|ed)?|slave|on (?:yo)?ur|squirts|'
+ 'fills|deep|massive)',
'cum for(?!ç)',
`(?:m[ey]|your?|i|h+is|warm|makes? u|me to|g[ou]nna|to not|more|make her|please|daddys|stallion`
+ `|will|they|can|swallows|salty|of|some|with|licks?|leaks|pls|in|from|sticky|the|her|its|spurt(?:s|ing)`
+ `|(?:going|start(?:ed|s)?|ready|about|get|want) (?:t-)?to|what|yes|did|don'?t|let'?s|say|i'?ll|zebra|and) cum`,
'cum cum',
'gonna c-cum',
'i camm+e+',
'c +u +m +(?:m +)+i +e +s',
'cumme[rd]',
'precum',
'c(?:[*._-]n|u[*._-]|n[*])ts*', // cunt
separate('cunt', 's'),
'cunt(?:bo[iy]s?|lord|muffin|bags?)',
`c${anyU}${anyN}t`,
`c +${anyU} +${anyN} +t`,
'c[.]unx?t',
'cvnts?',
'cxunt[sz]?',
'(?:d[a4]dd?y|(?:bite|poke) me|do it) harder', // daddy/harder
'(?:(?:duck|rut) ?me|harder|oh ?yes|s-so big) ?d[a4]dd?[yi]', // daddy
'd[e3]{2}p ?throa[t7](?:ing|s|ed)?', // deepthroat
`(?:horse)?d[i!](?:<|${letter.c})k+s?(?:wads?|suck(?:ing|ers?)?)?`, // dick
'd[i*71!]+[c*]k+(?:les|face)?',
'di\\[k',
'dii+c+s?',
'di+ +i+c+k+',
'dic+s',
'dicc+',
'd[!?][(c]c',
'dcks',
'd[*] +ck',
'di[ck]+ ?hea?ds?',
separate('dick', 's'),
separate('dicc', 's'),
'limpdick',
`di?${sep}c[ck](?:s|heads?)?`,
`di?${sep}+ks`,
'dick(?:girls?|hole)',
'dikk',
'd *l *c *k',
'eat pee pee',
'(?:your|my) d in (?:your|my) p',
'suck (?:a|my) (?:d *i *c *k|d(?:ic)?)',
'(?:my|your) di[ck]',
'(?:my|your) d *e *k',
'dildo(?:sa?)?', // dildo
'dwildo',
'd +i +l +d +o',
'drink bleach',
'do me hard',
'ejaculat(?:e[sd]?|ing|ion)',
'f[a*]p(?:p?ing)?', // fapping
'f +a +p +p +i +n +g',
separate('faps'),
'foalcon',
separate('fagot', 's'), // faggot
separate('faggot', 's'),
'fgt',
'f ag',
'dafag',
'(?:normal|brony|furry?|gay|horse|pony|nigg?er)?f[a@]g(?:s|g?[0oi]t(?:s|ry)?)?',
'f+a+g+s*',
'f[ae]ggets?',
'faguette',
'fxaggots?',
'fagatron',
'fa[*]{2,}ots?',
'f[a4][g69]{2,}[o0][t7]s',
'fist( me|ing)',
'fingering',
...(fuckWords = [
'shut ?the ?fuck ?up', // fuck
'(?:f[*]+|f[uy]ck|fuq|fvk) ?(?:ed|ers?|ing|face|you+|off+|u+|me|up|urself)',
separate('fucking'),
separate('fuckin'),
separate('fucker', 's'),
separate('focker', 's'),
separate('fvck'),
separate('fucc'),
separate('fack'),
'f[u ]+[c ]+k',
'facken',
'fucc(?:e?n|d)',
'f[a4]ck[e3]d',
'f *u *c *c *s',
'fu[#$%&_]+(?:ed|ing)',
'f[#$%&_]cki[#$%&_]?ng',
'fuack',
'fuk+a',
'fukwad',
'dufuk',
'fux{2,}g',
'fxxx',
'g[ie]t fuk[td]',
'f[vu]+ck',
'fk +(?:ing|o *f *f)',
'f *k i *n *g',
'f *u *k *i *n *g',
'fu(?:[qk]s|vk|cj|kn)',
'fkc',
'fvkn?',
'fvcc',
'\\S*f[uv]<k(?:ing|er)',
'ufck(?:ed|ing)?',
'fuck\\S+',
`f${sep2}+uck`,
'f[*] +ck',
'f ucj',
'f-?uckie',
'fuq[qk]ing?',
'fuqk',
'fuke up',
'fukd',
'fcng',
'fwu[ac]k',
'f x u x c x k',
'fuchs',
'f[ou]ke+n',
'fakiu',
'f- u',
'f *_+ *(k|u|everyone)',
'fu<k',
'f[.\\[]u[.\\]]k(?:you|me)?',
'uck m e',
'fu[*_.,-]+ing',
'the f (?:up|away|out)',
'fukbo[iy]',
'the(?:fuck|fuk|fuccin)',
'fuke me',
'fu[*\\[]king',
`fu${sep2}?ccs?`,
`fuc${sep2}ing`,
'fu[0-9]ing',
`f${sep3}+(?:ng|ing|ed)`,
`f${anyU} ?ck`,
'Fu *sh *ck *it',
'f u [*] [*](?: i n g)?',
'flu+ck(?:ing?|er|s)?',
'flu+c?k(?:ing?|er|s)',
'f *o *c *k *i *n *g',
'fakk+(?:in|er)?',
'f00k(?:in|er)?',
'fy+c+king',
'(?:faq|f\\.\\.k) *(?:ing|er|this|dis|u|you|yoursel(?:f|ves))',
'(?:fyuck|fcuk)(?:ing|er)?',
'(?:brony|furry?|gay|horse|pony|nigg?er|butt|mother ?|mo|mutha|da|de)?'
+ 'f+[ou*8&%$#@]+[ck]+(?:ed|ers?|in[9g]?|able|faces?|balls?|toys?|ta+rds?|bo[iy]s?)?', // motherfucker
'm[o0]therf\\S*',
'm[uao](?:th|d)?af[au]c?k(?:as?|in)?',
'moderfocke+r',
'mothertrucker',
'mother ?fukas',
'm[aou]tha fu(?:kas?)?',
'motha f',
'mdfcka',
'm[au]d[ai]f[au]c?kas?',
'f+.?ck+(?:s|ed|er|ng|ing?|ign)?',
'f.?u.?cking?',
`f${sep}+cking`,
`fu${sep2}+k`,
'f[u*]\\[k(ing|er|s)?',
`f${sep2}{2,}ing`,
`f${sep2}{2,}g`,
`f${anyU}k`,
`f +${anyU} +k`,
'fuc[k*]i(?:ng|gn)\\S+',
'fuc(?:lk?|ken)',
'foc(?:ki?-*ng?|uking)',
'fuci(?:kn|nk)g',
'fuxc*k(?:ing|er+)',
'fxuck',
'(?:mc)?f[zx]xk(?:er|ing)?',
'fucvk(?:ing)?',
'fuyck',
'fuvkers?',
'fuk+en',
'fukign',
'fooken',
'fking?',
'f+u+ic+k+',
'(?:fac+|f-k) (?:me|you|him|her|them|off)',
'fac{2,}',
'(?:fk|f uk)(?:er|ing)',
'fo+uo+co+k',
'f[ _]*u[ _]*c[ _]*c[ _]?k?(?:me|you)?',
'f *[^a-z ] *c *k(?: *e *r)?',
'f[*]+[kgrd]',
'(?:f+ ?k|ef+|fak|fek|fugk|fu|uck) (?:her|him|you|of+|out|me|urself|yourself)',
'(?:e+f+|f+k+) u+',
'f[u-]+ck(?:tard)?',
'(?:phack|phuck?)(?:ers?)?',
'f[.-]+ing',
'fq(?:er|ing)',
'(?:fak|fuq|fudge) (?:me|you|u)',
'fa{2,}k',
'(?:da)?fuqs?',
'daf+u+q+',
'f ?u [kq]',
'f+a+c+k+',
'f[_*]xk',
'f[0-9*._]u[0-9*._]ck',
'(?:go)?fukyou\\S*',
'mcfuc[ck]ing?',
'mother fu?',
'what the fu?',
'phcking?',
separate('fucking', '', sep5),
separate('fuced', '', sep5),
separate('fock', '', sep5),
`${separate('fuck', '', sep5)}(?:you|me|ed)?`,
'f[^a-z ]+king',
`f${anyU}${letter.c}k(s|ing|ed)?`,
`f +${anyU} +${letter.c} +k(s|ing|ed)?`,
'f[ .]+u[ .]+c',
// `f +${anyU} +k +n`,
]),
'gang ?bang(?:ed|ing)?',
'gtfo',
'get(?:ting)? laid',
'get \\S+ laid',
'g-spot',
'laid (?:me|you|her|him|them) hard',
'lo[.]?lis?',
`h *${letter.e} *n *t *${letter.a} *i`, // hentai
'h+e+n+t+[b-z]?a+i+',
'hentai[a-z]',
'hen[*-]ai',
'h[e*]nt[a*]i',
'henta+i+(?:s+|heaven|hero|commie|tale)?',
'h[ae4][i1]l ?h[i1]t+l(?:[e3]rs?|a)', // hail hitler
'ha?i hitler',
// `you(?:'re a)? hoes?`,
`h${letter.o}[e3]s?`, // hoe
`h[o0.]+${letter.e}s`, // hoes
'h[o0]+kers?', // hooker
'horn[*-]*y',
'humps?(?: (?:me|you)|ing)',
'i hope (?:your parents+|you|u) die',
// 'go die',
`(?:i${anyN}|self)c[e3]st(?:uous)?`, // incest
'(?:jerk|j[a@]ck)(?:ing|s)? ?off',
'j +e +r +k +(?:s|i +n +g) +o +f +f',
'jerk(?:ing)? (?:you|u|him|them) off',
'jizz(?:ed|ing)?',
'jihad',
'kikes', // jews
'kys',
`(?<!don'?t )k[i1] ?ll (?:ur|y[o0]u?r) ?s[e3]l(?:f|ves)`, // kill yourself
'lub(?:ing|ed|e)',
'marehood',
'mast[ue]rbat(?:e[ds]?|ion|ing)?', // masturbation
'm[a4][s5]turb(?:ar|o|en?)', // masturbo
'm *a *s *t *u *r *b *a *t *e *[ss]',
// 'milfs?',
`m${anyO}an(?:s|ed|ing)?`, // moans
'molest(?:ation|ing|ering?|ed|s|ia)?',
'molistiah*',
'(?<!grammar )nazi(?:sts?|sm|s)?',
`(?<!grammar )${separate('nazi')}`,
'necrophile?',
// '(?<!ojos |son )negr[o0]s', // nigger
'negr0s',
'(?:black|stfu) negros?',
'negros? (?:be|die|are|is|everywhere)',
'negr[.]os',
'n[1i!*]?[g3]{2,}[eo]r[sz]?',
'n[1i!*](?:qg|gq)[e3]r[sz]?',
'n[1i!*]gg?r?[e3](?:rs?|st)?',
'niges+t+',
`n[1i!*](?:ggr|g+ah?|${letter.b}{2}a)s?`,
`ni${sep2}{2}a`,
`n${sep2}(?:gg|bb)(?:as?|ers?)`,
'n *i *g *g *e *s *t',
'nigg[sy]',
'niqqer',
'niggurs?',
'nig(?:ro|let)',
separate('niger', 's'),
separate('nigger', 's'),
separate('nigga', 's'),
`nig:[a-z]+:ger`,
'ngigers?',
'niggars?',
'nigx?gx?ers?',
'nyggas?',
'neegah',
'n[i1]bbers?',
'n[i1][g69]{2,}([e3]r|a)s?',
'n [i1|] b b a',
'7igga',
'niqqas?',
'ni9{2,}ers?',
'nig a',
'nya?-?ggers?',
'knee+gur+',
'n0*i0*g0*g0*a',
'normies+',
'nudes',
'oral',
'orga[sz]m[so]?s?', // orgasm
'urgazmo?z?',
`o+r+g+(?:y+|ies|${letter.i}a)`, // orgy
'piss(?:ing|face)?', // piss
'p[e3*]n[i1][s$z](?:es)?', // penis
separate('penis'),
'p[e3]n[i1]s(?:[e3]h?s)?',
'p[e3]{2,}ns?',
'peepee',
'peenus',
'pengis',
'penius',
`b${letter.e}nis`,
'pee(?:bnis|ner)',
'p(?:ie|ea)ce of (?:shit|crap)',
'pneis',
'p[_*]nis',
'(?:hard|surprise) ?penetration',
'p[o0*]r[*]?no?', // porno
'pr[o0]n',
`${separate('porn')}${fast ? '' : '(?![ãÃóÓ])'}`,
'(?:child )?pornogra(?:fia|phy)',
'pound(?:ing)? (?:me|you|her|him|us)',
'prostitut[ae]s?',
'prostate',
'(?:octo|horse|pony|wet)?(?!puss ?in ?boots)pu+[s$5]{2,}(?:y+|ies+)?(?:juice)?',
'(?:horse|pony|boi)?pw?u[s$5]+(?:y|ies|i)(?:juice)?', // pussy
'horsephssuy',
separate('pussy'),
`p${sep}ssy`,
'p[_*][s$5]{2,}y',
'pyssy',
'pussy(?!cat|foot(?:ing)?)\\S+',
'pu[s$_-]{2,}y',
'pussa[hy]',
`p${anyU}[s5]{2,}y`,
'p[o0]{2,}s+ay',
'pus{2,}i',
'p[uv][sz$5]+y',
'poo+ *s+y',
'r[a@*]e?p(?:i[s$]ts?|ing|[e3](?:ists?|ing|s|d)?)', // rape
separate('rapes'),
separate('rape', 'd'),
separate('rapist', 's'),
'r/+p(?:ed?|ists?)',
`r${sep2}pe[sd]?`,
'r +a +p +i +n +g',
`r${sep2}?a${sep2}?p${sep2}?e(?:s|d|ing)?`,
'rhap(?:es|ed?|ist|ing)',
'(?:eye|ass)rape',
'raep',
'r3pe',
'(?:rap[*]|repe) +(?:yu|you|u|me|us|her|him|them)',
'(?:wr|rw)ap(?:e|ists?)',
'grape noises',
'retard(?:s|ed|ads)?',
separate('retard', 's'),
'scr[e*]w(?:ing|ed)? (?:you|u|me|us|her|him|them|all)',
'(?:[sz]ieg|s[ae]ig|[sz]ig) ?h[ae]il',
'se[.]?men', // semen
'sea ?men',
'cmen',
'send nu+des',
'sex(?: *slave| *abuser?)',
'(?:anal|butt|oral)?(?:[s$]ex+8?|secks|seks)', // sex
'(?:anal|butt|oral) ?secs',
's+[e3*&_]x+o*',
's +[e*] +x',
's *e *x',
`${separate2('sex')}(?!${sep2}*y)`,
'saex',
'sexe',
'have sax',
'sexual(?:ly)?',
'sax with e',
'stf ?[uv]+', // stfu
's +t +f +u+',
'sc?hl?ongs?',
'(?:my|his) shaft', // shaft
'(?:bull|dip|oh|holy)?[s$]+h[i1*!]+e?t+(?:s|ing)?', // shit
's[*]+i?t',
`s[#■]it`,
'(?:bull|dip)?shite(?! (?:iru|ageru|kudasai))',
'shite?(?:heads?|faced?)',
'shit(?:head|stain|lord)',
's+h[ie#]t',
's#{2,}t',
'shjet',
`sh${sep2}t`,
`s${anyH}[i!|][t7]s?`,
`s +${anyH} +[i!|] +[t7]s?`,
'holy ?shee+t',
'shitt+y',
's[0-9]?h[0-9]?i[0-9]?t[0-9]?s?',
'shxit',
'shota',
'sl[u#*]t(?:s|ty)?', // slut
separate('slut', 's'),
's(?:;l|l;)ut',
's[*]ut',
`s${anyL}${anyU}t`,
's+p+e+r+m+a*', // sperm
'spank me',
'spicks',
'spunk',
'sucks? dic?k',
'(c[o0]ck)?s *u *c *k(?:ing|er)', // sucks
'c[o0]ck *s *u *c *k(?:ing|er)?',
'sucks (?:balls|dic|harder|deeper)',
`(?<!(?:it|that|this|which|school) )${separate('suck', 's', sep5)}(?! (?:(?:the )?blood|(?:(?:his|her|my|their) )?neck|at ))`,
`${separate('succ', 's', sep5)}`, // succ
'sukks?',
'suk my',
'su[(<\\[]k',
's *[u*] *c *cs?',
`s${anyU}+c{2,}s?`,
`s\\|_\\|+c${anyK}s?`,
`s${anyU}+c\\|<s?`,
`s +${anyU} +< +ks?`,
'su[c<]{2,}(?:ed|ing)',
's[*]cks',
'su+[i|]?[c<]ide', // suicide
'suic[*]+de',
'tampon',
'testicles',
'the kkk',
`t[_ ]+${anyH}[_ ]+o[_ ]+t([_ ]+s)?`, // thots
`t *\\|-\\| *[o0] *t`,
'th0ts?',
`th${sep}+ot`,
'th:ots',
'thotties',
'sup thots?',
'thrusts? into (?:her|him)',
'tit(?:s|ty|ties?)', // tits titties
't\\[i\\]i?ts',
'tiddies',
't i t s(?! [a-z] )',
`t *${letter.i} *[td] *[td] *${letter.i} *e *s`,
'tranny',
'touch my d',
'wank(?:ing|e+r[sz]?)?',
'wh[o0*]re+s?', // whore
'w\\Shore',
'w *h *o *r *es?',
'whorae',
`w${anyH}${anyO}res?`,
`w +${anyH} +${anyO} +r +es?`,
'austic hore',
separate('vagina', 's'),
'v[*]gina',
'vag[*]na',
'vaginales',
'vagina[a-z]',
'vagin[ig]a',
'(?:my|your|her) vag(?:ina)?',
'[vb]aginal',
'vagbo[iy]s?',
'vibra[td]or(s|ima|om|es?)?', // vibrator
`v${anyO}r(?:e[sd]?|ing)`, // vore
'v[.-]?o[.-]?r[.-]?e',
'vulva',
'(?:white|wyte) ?(?:power|supremacy)',
'yiff(?:s|ing|ed|ers?|u)?',
'y i f f',
'zo[o*]+(?:f|ph)ili(?:a+h?|cos)', // zoophilia
// other
'black ?supremacy',
'(?:gas|kill)(?: (?:the|some|their))? jews?',
'jews? burning',
'x *v *i *d *e *o *s',
'alt ?(?:[+-] ?)?f4',
'(?:ctrl|control) ?[+-]? ?w',
'touch +my +pp',
'(?:my|your) dix',
'(?:my|your) +p *p',
'lick my pencil',
'shoves? (?:my|your|his|her) horn into (?:me|you|him|her|them)',
'rub my nipples?',
// FOREIGN
// bulgarian
'nekoi hui', // some dick
// dutch
'hoer', // whore
// portuguese
'estupra',
'filho da puta', // son of a bitch
'caralho+', // fuck / dick
'pu?ta madr?e', // motherfucker
'p+[uv*]+t+a+[sh]?', // puta - whore
'p[uv]+tazoh?', // puta
`p${sep2}?u${sep2}?t${sep2}?ah*`,
'p +u +t +a', // whore
'p[v¡]to', // misspelled "puto"
'putaria+', // whore
'ptazos',
'p+o+rr+a+', // fuck
'vadia', // slut
'malditos', // fucking
'fud(?:er|ido)', // fuck
'foda[ =-]?[sc]e+h?', // fuck
'se fode',
'f o d a - s e', // fuck
'fodac?', // fuck
'fodaci', // fuck
'se fude(?:r|u)?', // fuck
'm[e3]rdas?', // shit [it]
`chupa+r? (?:me[ou]|minha|seu|su|mi) (?:p[${ã}4][ou]h?|rola|miembro|polla|pal)`, // suck my|your dick|member
`chupa+r? *(tampones|pollas)`, // suck tampones
'chupa(?:le|ndo) ?(?:la ?)?(?:tetas|punta)', // suck her tits | sucking the tip
't3t4s', // tetas
'chup(?:a|a[rs]|enle) ?(?:el ?)?(?:ano|orto)', // suck my ass
`(?:lo )?chupa (?:a (?:minha|salsicha)|r[${á}]pido|entero)`, // suck my ... | sucks fast | sucks whole
'chupale ?mejor', // suck him
'chupamela', // suck me
'lo chupa', // sucks him
`chupando (?:a salsicha|forte|m[${á}]s fuerte)`, // sucking the sausage | sucking hard
'meu pau', // my dick
'soplame(?: el)?(?: pito)?', // blow my dick
'sexo+',
'penetra+ fort(?:e|ao)', // penetrates strongly
'do pau dele', // his cock
'cima do pau', // up the dick
'tocar no pau', // touch the dick
'lamber meu rabo', // lick my ass
// spanish
'ca[zx]{2,}[o0i]+', // shit / cocks
'c[a*4]+r[a4]jo', // fuck
'coje rejalo', // fuck you
'c[o0]j[e3]r(?:conmi|h+)?', // cojer fuck
'chingar?(?: tu madre)?', // fuck
'chingados', // fucking
`chup(?:o|ando) (?:fuerte )?tu pe[sz][${oó}]n`, // suck nipple / chupo
'chupo con fuerza', // sucks hard
'chupo(?: mas)? rapido', // sucks hard | sucks fast
'sigue chupando', // keep sucking
'cule(?:ro|ar)',
'f[o0]ll[.]?[a4](?:r(?:[ms]eh?)?|mos|da|s)?', // fuck me / follarme
'gilipollas', // douchebag
'hij[ao]s? de? pt[ao]',
'inbesil',
'jop[uv]tas',
'j[o0]d[a4]+s', // jodas / fuck
'j[o0]d[e3a4]r', // joder / fuck
'j[o0]dier[o0]n', // they fucked
'mi[e3]rda+h*', // fuck / shit
'tu miembro', // your member
'mrda', // shit
'matate', // kill yourself
'mereces morir', // you deserve to die
'n[oi] mereces vivir', // you do not deserve to live
'n[e3]pes?h*', // penis / nepe
'maric[o0]n', // maricon
'p[uvw#*.]t[ao][zhs]*', // fucking puta / puto
'pollas', // cocks
'pvtaso',
'pu[.]?t[ao]', // fucking
'puti[.]?ta', // bitch,
'p[uv]t[a4](madre|kos)',
'p[t7][ao]', // puta
'pij[.]?a', // prick
'se le corre', // cums
'sou foda', // I'm fucking
'suicidat', // commit suicide
'violando(?! la)', // raping
`v1${letter.o}l[eo]`, // violo / viole
`[vb][i1]${letter.o}l[a4]r`, // rapes
`vi0lare`, // rapes
`[vb]1${letter.o}laci${letter.o}nes`, // violaciones
'violo a', // raped
'la viole', // raped
'la mete', // puts it in
'lamer la punta', // lick the tip
'[bv]ete ?a ?la ?[bv]erga?', // fuck off
'v[e3]?rga', // cock
'zemen+', // semen
'zorra', // bitch
// italian
'arrap(?:at[eiao]|ano|are|[oi])', // horny
'bagasci[ae]',
'baldracc(?:a|he)', // whore
'bastard[eiao]', // bastards
'bocchin(?:[io]|ar[ae])', // suckers
'bordello',
'butt[ao]n[ae]', // bitch
'cagna', // bitch
'cagare', // shitting
'k[a4]g[a4]r', // cagar / shit
'caghi(?:amo)?',
'caga(?:no|te)', // crap
'cazz(?:on[iae]|at[ea])', // cocks
'checc(?:a|he)', // queers
'chiav(?:o|are)', // screw
'chia?[bv]at[ae]', // fucked
'c[o0]glion[aie]',
'cortigian[ae]', // courtesans
'culatton[ie]',
'ditalin[io]', // fingering
'ebet[ie]', // stupid
'eiacul(?:i|o|are|azione)', // ejaculation
'(?:vaf)?fanculo', // fuck
'fanculizzati',
'fotte(?:te[lvm]i|re)', // fuck you
'fott[io](?:[tm]i|l[oaie])?', // fuck
'fottut[aeio]', // fucking
'frocio?', // fags
'fregna', // cunt
'gigolo',
'gnocc(?:he|a)', // chicks
'handicappat[aeio]', // disabled (insult)
'la figa', // pussy
'negraccio', // nigger
'perra+', // bitch
'pirla', // idiot
'p[e3]l[o0][t7]ud(a|o|ito)', // asshole
'p[e3]?n[.]?dej(a+|o+h?s?)', // stupid | pendejo
'p[e3]nej(a+|o+h?s?)',
'poll[.]*as', // dicks
// 'porco', // pig
'pompin(?:[io]|ar[ieao])', // blowjob
'puth?[o0]s*', // fucking
'putada', // bitch
'puttan(?:[ae]+s?|at[ae])', // whore
'prostitu(?:irsi|zione)', // prostitution
'scopa(?:ndo|mi)', // fucking
'incazza(?:t[aeio]|rsi)', // pissed
'incul(?:o|i(?:amo)?|a(?:rti|li|lo|la|no|te|re)?)', // pounding your butt
'lecc(?:hin[io]|acul[io])',
'masturb(?:[ai]h?|alo|ami|are|arsi|azione|ate(?:li|vi)|iamol[oi]|iamoci|ando|as)', // masturbation
'merdos[ao]', // shitty
'meretric[ie]', // harlots
'mignott[ae]', // whore
'minchi(?:[ae]|at[ae]|on[iea])', // bullshit
'masturbarmi', // masturbation
'rompi(?:palle|coglioni)',
'ricchion[ie]',
'rincoglionit[ieao]',
'sborr(?:o|a|ano|ate|i|iamo|are)', // cum
'sburro',
'scopal[ao]',
'scopar[tm]i',
'scassacazz[io]',
'sesso+', // sex
'sessuale',
'segaiol[io]',
'sfott(?:[io]|ere)',
'sgualdrin[ae]', // whore
'spomipina',
'spompina(no|re)',
'stupratore', // rapist
'sputtan[ai](?:l[io]|no|amo|t[aeio]|re)?',
'sputtaniamol[oi]',
'stronz[eaio]',
'stronzat[ae]',
'stupro', // rape
'zoccol[ae]', // bitch
'(?<!la )pene', // penis (also in spanish)
'el pne',
'vagine', // vagina
'troi[ae](?:io|h)?', // slut
'trombare',
'tromb[io]',
'trombate',
'trombano',
'trombal[ao]', // ???
'trombiamo(?:l[eiao])?', // ???
// 'fica', // pussy
// finnish
'perkele', // fuck
'vittu', // fuck
// french
'(?:fils de )?pute', // (son of a) bitch
'pute(?:u+h+)?', // bitch
'merde', // shit
// sweedish
'fitta', // pussy
// german
'arsch', // ass
'fotzen?', // cunt
`schei${letter.ss}\\S+`, // shit
'(?:[gb]e)?schissen', // shit
'(?:[gb]e)?(?:wichs|kack|fick)(?:est|en|et|e|test|te|t|st)',
'(?:[gb]e)?(?:piss)(?:est|en|et|test|te)',
`hurens(?:oe|[${fast ? 'o' : 'öo'}])hne?`, // son of bitch
'huren', // bitch
'schlampen?', // bitch
'schwuchteln?', // faggot
'neger', // nigger
'wichser?', // fucker / cum
'wixxer?', // fucker / cum
'verpiss ?dich', // fuck off
'verdammter', // fucking
'm[ea]in ?kampf',
'lutsch meinen schwanz', // suck my dick
// other
'9/11',
// sexually suggestive
'against (?:her|his|your) insides',
'creamy load',
'empty my load',
'cherry got popped',
'into (?:her|your) (?:cervix|uterus)',
'tight cervix',
'(?:my|his|her|your) crotch',
'panting heav(?:il)?y',
'pegs her',
'penetrat(?:es?|ing) (?:him|her|you|your)',
'put(?:s|t?ing) (?:it|that) in (?:your|my|his|her) mouth',
'pounds? (?:against|her|deeper)',
'pump(?:ing)? my (?:large )?(?:seed|load)',
'pushes (?:my tongue|deeper inside)',
'pushing deep',
'prodding my tip',
'gets it inside',
'goes (?:harder and |in )?deeper',
'groans and th?rusts',
'grabs her breasts?',
'grinding her',
'(?:starts|keeps|begins) thrusting',
'thrusting (?:her|his|him|(?:even )?harder)',
'thrusts? (?:slightly )?(?:deep|hard)(?:er)?',
'thrusts? (?:my tongue|against)',
'tongue inside',
'(?:thick|my) hot load',
'thick and creamy',
'tight walls',
'fast and (?:hard|deep)',
'forcing every inch inside',
'hard and deep',
'her slit',
'(?:her|his) nether regions?',
'faster and (?:deeper|harder)',
'fully erect',
'deeper and harder',
'harder and (?:harder|faster|rougher|deeper)',
'filling her up',
'(?:his|my) knot',
'(?:her|your) (?:wombs?|wet cave|wet tunnel)',
'her plothole',
'kisses (?:him|her) lewdly',
'womb with his',
'(?:he|gently) thrusts',
'(?:sticky )?(?:hot|warm) loads?',
'hot seed',
'seed into her',
'mare juices?',
'milk(?:ed|ing) him',
'my fluids',
'makes (?:you|u) squirt',
'(?:his|your|my) (?:huge )?member',
'pushes member (?:inside|into her)',
'inside of her(?! mind)',
`(?<!hold me |hugs |it'?s )so tight`,
'fingers (?:inside )?her',
'release my (?:heavy )?load',
'rubs? her area',
'screams in pleasure',
'slides it in and out',
'shoves (?:my tongue|the rest in)',
'shoots out jizz?',
'starts? (?:pounding|thrusting)',
'sticks tongue in',
'squirts on (?:your|his|her) face',
'spreads her legs',
'spraying (?:your|his|her) insides',
't-tight',
'tailhole',
'throbbing hard',
'with each thrust',
'your dirty hole',
`you're so wet`,
// russian
'pidor[sy]?', // faggot
'pizdec+\\S?',
'huinya',
'kurva', // bitch
'blyad', // bitch
'bliat', // fuck
];
const badWordsForeign = [
// romanian
`suga ?pul[${ă}]`, // suck dick
'muie', // blowjob
`s[${ă}] ?te ?fut`, // fuck you
`futu-?[${ț}]i ?pizda`, // fuck your pussy
...(fast ? [] : [
'pulă', // dick
]),
// polish
`ci+p(?:a{2,}|ę|ą|k(?:ami|[${ą}]|[${ę}]|i|owate|o)|ek|eczka|usie[${ń}]ka|ule[${ń}]ka)`, // pussy
'chu{2,}j', // dick
'chuj(?:u|ek?|ami|a)', // dicks
'(?:ten|w) chuj|chuj wie', // fuck
'c?huj (?:ci|wam|w dupe)(?: w dupe)?', // fuck you
'c *h *u *j *[eua]',
'huj[aeu]', // dick
'huj ?pizda', // dick cunt
'cycki', // boobs
// 'debil(?:[aie]|ami|em)?',
'kutas(?:y|ami|iarzu?)?', // dick
'pornosy?', // porn
`dziwk(?:ami|om|[${ą}${ę}io])`, // bitch
`k[.*]+rwa`, // bitch
`kurwa ?ma[${ć}]`, // bitch
`k *u *r *w *a(?: m a [${ć}])?`, // bitch
`k[${ó}]+r[w*](?:ie|ami|y+|[${ę}]+|[${ą}]+|om|o+)x*`, // bitch
`ku${sep2OrNum}+r?w(a+|o+)`, // bitch
'ku[*]{2,}a+', // bitch
separate('kurwa'), // bitch
`wkurwi[${ł}][ay]?`, // bitch
`wkurwia*(?:sz|my?|j[${ą}]?|[${ć}])?`, // bitch
'skurwiel(?:em?|ami|i|a)?',
`pi[z*]d[${ą}${ă}${ę}y]`, // cunt (also romanian)
`(?:roz|ja|s|wy?)?pierd[o*]l(?:[${ę}]|i?cie|isz|i[${ł}](?:[ao]|[ae][${ś}])|i[${ć}]|eni|e|on[eay]| si[${ę}])?`, // fuck
`roz[*]+ba[${ć}]`,
`(?:s|za|wy?)pier?(?:[d*]a|[da*])la(?:jcie|j[${ą}]?|my?|cie|[${ć}])?`, // fuck
`(?:s|za|wy?)pieprza(j|[${ć}]|j[${ą}]|jmy)`, // fuck
`z?g[wf]a[u${ł}](?:t|tem|ty|tów|tami|cenie?|ceni|con[aey]|c[eoąi]|[${ć}]my|ci[${ć}]|ci[${ł}]+[iay]|cimy?)`, // rape
'(?:za|wy|z|u|na|prze|po|roz|przy)?'
+ `je+[b*](?:ie(?:sz|my)?|i[${ą}]|a+[*]?n[yaei]+(?:mi|m|go)?|a[${ł}][aeiyo][m${ś}]?|a+[${ć}${ł}]|a[${ń}]ce)`, // fuck
`jeb(?: ma[${ł}]e)? dzieci`,
`(?:wy)?r${sep2OrNum}*ucha(?:my?|jmy|jcie|j[${ą}]?|[${ć}]|nym?|n[ae]|nie?)`, // fucks
'peda(?:le|lsk(?:ie|im|i|a)?)', // fag
...(fast ? [] : [
`pe[d*]ał(?:y|a|em|ami|[${ó}*]w)?`, // fag
'gówn(?:o|a|iaki?)', // shit
'suką+', // bitch
'żesz chuj', // oh fuck
'fapać', // fap
]),
's *p *i *e *r *d *a *l *a *j', // fuck off
'p *i *e *r *d *o *l *e', // fuck
'j *e *b *a *n *[aeyi]', // fucking
'p *i *e *p *r *z *s *i *e', // fuck you
`g *w *a *[${ł}] *t`, // rape
'fapie', // fap
`zabij ?si[${ę}]`, // kys
`wejd[${ę}] w ciebie`, // I'll penetrate you
`w dup[${ę}]`, // in the ass
'morda psie', // shut the fuck up
's[.]*u[.]*k+aa+', // bitch
's[.]*u[.]*k[.]*k+a+', // bitch
'su ka', // bitch
// spanish
...(fast ? [] : [
'coño+', // pussy
]),
// czech
...(fast ? [] : [
'srát', // shit
'piča', // cunt
]),
// turkish
'sikiyimmi(?: seni)?', // fuck
...(fast ? [] : [
'göt(?: ?k[ıI]l[ıI]| ?veren)?', // ass (hole, giver)
'orospu(?: ?çocuğu)?', // bitch (son of a)
'(?:anan[ıI] ?|ecdad[ıI]n[ıI] ?)?sikiyim', // fuck
'ana?nı sikim', // fuck
'am[ıI]na ?koyayim', // fuck
'amc[ıI]k', // cunt
'yarra[ğg][ıI]m[ıI](?: ?ye)?', // eat my dick
'sikiş', // porn
]),
'seni ?sikerim', // fuck
'sikiyim', // fuck
'siktir(?: ?git)?', // fuck
'yarrak(?: ?kafa)?', // dick (head)
'orospu', // bitch
// russian
'cy[k*]a ?(?:bl(?:ye|a|ie+)t+|bylat|blyt|blayt|bl[*]at)', // fuck bitch
'[sc][uy]ka ?bl[yiue]*?a[td]?', // fuck bitch
'b-?l-?y-?a-?d',
'pisda', // cunt
'bly+a+t+', // fuck
'blya{3,}', // fuck
'c[*]{2,}a', // bitch
'cykablye+t',
'cykaxd+',
'cyak ?blyat',
'ckya', // bitch
separate('blyat'), // fuck
separate('cyka'),
'(?:cyka)+',
'c ?ica blia', // cyka blyat misspelled
'govno+', // shit
...(fast ? [] : [
'б/?\\\\yat',
'суда вручат', // cyka blyat misspelled
'анал(?:ьные)?', // anal
'а +н +а +л',
'бля(?:ть)?ъ', // fuck
`(?!бл ять|б лять)${separate('блять')}э?`,
'[cс][yу][0-9]*[kк][aа]+',
separate('сука'), // cyka
'су\\dка',
'су[57]+а',
`с${sep2}+ч?ка|су${sep2}+а|сук${sep2.replace(/[.,!?"'()]/g, '')}+`, // bitch
'[сc][*]{2,}[аa]', // bitch
'с[*]{3,}', // bitch
'сцука+', // cyka (misspelled)
'Сюка', // bitch
'[*]+ка', // bitch
'с+у+к+и+н?', // bitch
'сук[оo0]+', // bitch
'секс(?:ам|а+|е|у|ом)?', // sex
'срать', // crap
`(?:вы|по)?е[б6]+[*]?(?:у|учая|ётесь|а?ться|а+т[ьъ]+|ало?м?ъ?|на|ались|аные|ан+ая|[*])`, // fuck
`(?:вы|по)?е[б6]+${sep2}(?:у|тесь|ться|ть|лись|ные|н+ая|чий|чие)`, // fuck
'е[б6]етс', // fucks
'я *ебаl', // fucked
'выепать', // fuck
'влагалища', // vagina
'вибратора?', // vibrator
`е${sep2}?[б6]${sep2}?[ёуа]${sep2}?ть?`, // fucks
'е[б6](?:ать?ся+|ёнок|.ть|анный|алом?ъ?|нулся|нутая|анутся)', // fuck
'з[б6]ать', // fuck
'бл[*]{2,}ь', // whore
'б[л*]я(?:.ь|[яа]*)', // whore
'(?:е|лэ)?б+[лl]+[я*]+(?:ч|т+ь+э?|т+б*|дина|ди|дь|дя)?', // fuck / whore
`б(?:л${sep2}|${sep2}я+|${sep2}{2})ть`, // whore
'бл[эая]ть', // whore
'б[*]+[ья]+', // whore
'зае[б6](али?|лся)', // fucked
'з[*]ебуьс',
'е[б6]а', // fuck
'е[*]б',
separate2('заебал'), // whore
separate2('бля'), // whore
'з[а_*]еб[а_*]ли?', // whore
'б *л *я', // whore
'вы[*]+', // fuck
'говно+м?', // shit
'мать твою', // fuck
'онанист', // onanist
'орг(?:ия|азм)', // orgy/orgasm
'охуительны(х|е)', // fucking
'о[б6]осса(на|ть)', // pee on somebody
'шалаву', // slut
`ш${sep2}?л${sep2}?ю${sep2}?(шк[аa]+|[хx]и|[хx][аa]+)`, // slut / whore
'ш +л +ю +(ш +к +а|х +[иа])', // slut
'шл[_*]ха', // slut
'пенис', // penis
'потрахались', // have sex
'тр[а@*]х(атьс(еб)?я|аьт|нула|алаъ)', // fuck
'дрочить', // masturbate
'порнухой', // porn
'изн[ак]силую', // rape
`у?пи[*]?[3з${emoji}]+д(?:абол(?:ка?)?|ое[б6]+учий|овать|овал|олизка|ы|а|ецъ?|е|юк|уйте|уй|ос?)`, // cunt / pussy
'п[_*]здец', // pussy
`письки`, // pussy
'киск[иеуа]', // pussy
'сперму', // sperm
'кончи(?:л|шь)', // cum/cumshot
'пид[о0]+р(ы|а[зс])?', // fag
`п${sep2}здуй`,
'ниггеров', // niggers
'мудак[аи]?', // asshole
'лохи', // fuckers
'соси писос', // suck dick
'сосу член', // suck dick
'члено(?:м|соса?)', // cock/cocksucker
'(?:иди)?на[хx]уй', // fuck
`[хx]${sep}ль`, // fuck
'[хx]ерню', // garbage
'(?:н[аa])?[хx][уy*]+[йи]+(?:ло|ка|э|у+|ъ+|н[ёе]й|н[юя]?)?', // garbage / prick / fucking // наxyй
'н[.]*а[.]*х[.]*у[.]*[йи]',
'(?:ху[йя])+', // fuck / dick
'ху[\\\\/]*ли', // fuck
'х[_.*]ли', // fuck
`ху${sep}+[йи]`,
`[хx]+${sep}?у+${sep}?[йия]+${sep}?у*`,
`[хx][${emoji}](?:[йия]|ёв)`,
`[хx]у[${emoji}]`,
`на(?:${sep2}у|х${sep2})[йи]`,
'(?:ни|на|ha)?хер(?:а|ней)?', // dick / fuck
`(?:по|идина)?х(?:у|${sep2})[йию](?:ло|лестия)?`, // dick
'(?:по|на)\\)\\(у[йию]', // dick
'мастурбация', // masturbation
`[хx] *${sep2}+ *у *${sep2}+ *й`,
`п(?:а|${sep2})дика`, // fagot
'насил(?:ьник|уют)', // rapist
'ни[хx]уя', // fucking
'на[*]+й', // dick
'н[*]{3,}й', // dick
'насрать', // shit
'дерьмо', // shit
'дебилы?', // moron
'ты еб', // you fuck
// 'дохуя', // f*cking much (shitload)
'\\bхуе\\b', // dick
'за(?:сранец|лупа|дницу)', // dickhead / ass
'гавном?', // shit
`т${sep2}?р${sep2}?а+${sep2}?[хx](?:ни(?:те)?|нуть|ну|ает|а+ть)?(?: (?:тебя|меня))?`, // poke / fuck (you|me)
'жоп(?:у|ай?)', // ass(hole)
`про[е${emoji}]бал(?:ся)?`, // fucked
'анал', // anal
'3===+э',
'зиг ха[ий]?ль', // seig hail
'(?:на|г|б)[*]{2,}',
'(?:наша|нас|моя|моей) ?(?:территори[яи]|терра)', // our|my territory
'кунт', // cunt (phonetic)
'х[*]{2,}',
'[Ъb][*іi][тt][cc][нh]', // bitch
`\\)\\(${sep}?у+${sep}?[йия]+${sep}?у*`,
'fuск\\S*',
]),
// en
'b[i!]tc\\|-\\|',
'di(?:l|\\|_)d(?:o|\\(\\))', // dildo
'(?<!grammar )n[a4]z[i1]s?', // nazi
'fu[*-]{2}',
'sh[*-]{2}',
'wh[o0]r3s?',
'\\*{4}(?:ed|ing)',
'\\|\\\\\\| *[i1] *[g9] *[g9] *e *rs?', // nigger
'[$]+(?:hit|perm|luts?|uck(?:ing)?|ex)',
'tit',
'[a@]+[s$]{2,}',
'pi[$]{2,}',
'[abcdfsn][*#]{2,}',
'bit?[*]{2,}',
'fu[*]+',
'bic[*]+',
'\\*+(?:ck)?ing',
'(?<!-)se[*]',
'(?:di|sh|ra|bi)[*]{2,}',
'\\*sshole',
'\\*{3}hole',
`\\/\\|\\/iggers?`,
'su\\(\\(',
'd[i!1](?:\\(\\(|\\|<)',
`c${anyO}c\\|<`,
'f[o0][ck]\\(',
'f[o0]\\([ck]',
'f [o0] \\( [ck]',
`${letter.c}${letter.o}${letter.c}${letter.k}`, // cock
`w${letter.h}${letter.o}r${letter.e}`, // whore
// japanese
'ファックユー?',
];
const badWordsOther = [
'👉👌',
'sexoanal',
'masturbar',
'cykably[ae]t',
'autists?\\b',
'bitch',
'pussy(?!cat|foot(?:ing)?)',
'nastyhoe',
'(?:^| )irape',
'rapechild',
'ifinger',
'^negros[.!?]*$', // nigger
'f[a@]+[g3]+[eou0i]ts?\\b', // faggot
'fags?\\b',
'\\bfag(?:g|o)ot',
`${alts('fuck')}(?:${alts('ing')}|${alts('er')}s?)?`, // fuck
'\\bfuk(?:you|ass|of+)', // fuck
'f[au]ck(?:er[sz]?|ing)',
'fuking',
'fvkin',
'fvck',
'fu(?:ck|kc)',
'f +u +c *k',
'^a s s$', // ass
'fukin',
'[*]+exual', // sexual
'(?:^| )ʞɔnɟ(?: |$)', // fuck
'(?:^| )[aα]ss(?: |$)', // anal
'(?:^| )[a4]n[a4]l(?: |$)', // anal
'^beaches$', // bitch
`(?:^| )b *[i!] *t *c *${anyH}(?: |$)`, // bitch
`(?:^| )f *${anyU} *${letter.c} *${anyK}(?: |$)`, // fuck
'(?:^| )fv\\|<(?: |$)', // fv|<
'(?:^| )fu[#&%_]{2,}(?: |$)', // fu??
'(?:^| )fu\\[\\|<(?:ing|er)?(?: |$)', // fu[|<
`${separate('fuck', 's')}`,
'(?:^| )cum~+(?: |$)', // cum
'(?:^| )[*]+cum[*]+(?: |$)', // cum
'(?:^| )dild0\\d*(?: |$)', // dildo
`(?:^| )${alts('cunt')}(?: |$)`, // cunt
`(?:^| )${alts('tits')}(?: |$)`, // tits
`(?:^| )${alts('bitch')}(?: |$)`, // bitch
`(?:^| )${alts('penis')}(?: |$)`, // penis
`(?:^| )${alts('nigga')}(?: |$)`, // nigga
`(?:^| )${alts('nigger')}(?: |$)`, // nigger
'(?:^| )n[i1][g69]{2,}[a4][s5]?(?: |$)', // nigga
`(?:^| )\\|\\\\\\|az[i|]s?(?: |$)`, // nazi
`(?:^| )\\|-\\|e${anyN}ta[i|](?: |$)`, // hentai
`(?:^| )\\$${anyH}it(?: |$)`, // shit
`(?:^| )sh[i1!][+](?: |$)`, // shit
`(?:^| )👃unts?(?: |$)`, // cunt
`(?:^| )d${letter.i}${letter.c}${letter.k}(?: |$)`, // dick
`(?:^| )${anyD}[i1][c(]k[s$]?(?: |$)`, // dick
`(?:^| )stf${anyU}(?: |$)`, // stfu
`(?:^| )s +t +f +${anyU}(?: |$)`, // stfu
`(?:^| )\\$hithead(?: |$)`, // shithead
`(?:^| )${letter.s}${letter.e}${letter.x}(?: |$)`, // sex
`(?:^| )${letter.p}${letter.o}r${letter.n}(?: |$)`, // porn
`(?:^| )p${letter.o}rn${letter.o}+h*(?: |$)`, // porno
`(?:^| )p[*]rn${letter.o}+(?: |$)`, // porno
'(?:^| )l[o0]l[i1](s|x|cons?)?(?: |$)', // loli
'(?:^| )[*]humps[*](?: |$)',
`(?:^| )${letter.o}+r+g+(?:y+|ies|${letter.i}[a4])(?: |$)`, // orgy / orgia
`(?:^| )${letter.o}rg${letter.a}sm(?: |$)`, // orgasm
`(?:^| )${letter.o}v[e3]r?s[e3]x[e3]d(?: |$)`, // oversexed
`(?:^| )${letter.o}r4l(?: |$)`, // oral
`(?:^| )h[e*]nt[a*][i1](?: |$)`, // hentai
`suckmydick`, // suck my dick
'^(?:(?:sup|hi|hey|you) )?botch[!.]*$',
// spanish
'(?:^| )an[0○](?: |$)', // ano
'(?:^| )(?:ort0|0r[t7][o0])(?: |$)', // orto
'(?:^| )m[i1][e3]rd4(?: |$)', // mierda
'(?:^| )mi?er[d#][#]+(?: |$)', // mierda / merda
'(?:^| )maric[a4](?: |$)', // marica
'(?:^| )c[a*4]+r[a4]j[o0](?: |$)', // carajo
'(?:^| )caralh[0#](?: |$)', // caralho
'(?:^| )put[04#]+[sh]*(?: |$)', // puta put0
`(?:^| )p${letter.u}t${letter.a}(?: |$)`, // puta
`(?:^| )pu[*]{2}(?: |$)`, // puta
`(?:^| )p[vw]t${letter.o}(?: |$)`, // puta / pvto
`(?:^| )pvt${letter.a}[s!]?(?: |$)`, // puta
`(?:^| )pvt${letter.a}s[o0]s(?: |$)`, // puta
`(?:^| )-*pv?t${letter.a}z[o0]h?-*(?: |$)`, // puta
'(?:^| )p[t7][@0](?: |$)', // puta
'(?:^| )(?:chupa(?:r|me) la )?p[i1]j4h?(?: |$)', // pija
'(?:^| )p[e3]?nd[e3]j0[sz]?(?: |$)', // pendejo
'(?:^| )(p4j[a4]|paj4)(?: |$)', // paja
'(?:^| )p[e3€]n[3€]h*(?: |$)', // pene
'(?:^| )p[3€]n[e3€]h*(?: |$)', // pene
'(?:^| )porr[@#](?: |$)', // porra
'(?:^| )su<<(?: |$)', // succ
'(?:^| )fod[4@#](?: |$)', // foda
'(?:^| )c[o0]ñ[o0](?: |$)', // cono
'(?:^| )cul[o0](?: |$)', // ass
'(?:^| )n[e3]p3(?: |$)', // nepe
'(?:^| )a[_]?[s$5]{2}(?: |$)', // ass
'(?:^| )\\/\\\\[s$]{2}(?: |$)', // ass /\$$
'(?:^| )\\+turbar(?: |$)', // +turbar (masturbar)
'(?:^| )kg4rl4(?: |$)', // cagarla // fuck it up
'(?:^| )[*]viola[*]?(?: |$)', // *rapes*
'(?:^| )v[e3]?rg[a4](?: |$)', // verga / berga // cock
'(?:^| )b[e3]?rg4(?: |$)', // verga / berga // cock
`(?:^| )[vb][i1]${letter.o}l[03](?: |$)`, // violo / viole
`(?:^| )s${letter.e}x${letter.o}(?: |$)`, // sexo
'(?:^| )p[e3]l[o0][t7]ud0(?: |$)', // asshole
'(?:^| )j[o0]d[e3]t[e3](?: |$)', // jodete / fuck
'suicidate', // commit suicide
// portuguese
'^[* ]*chupando[* ]*$', // sucking
...(fast ? [] : [
'(?:^| )6+ля(?: |$)', // fuck
'(?:^| )6лять(?: |$)', // fuck
'(?<!бар)с+[у*]+ч*к+а+', // bitch (except: барсука // badger)
]),
'(?:^| )fu[(|]<(?:ing)?(?: |$)', // fu(< fu|< fu|<ing
`(?:^| )${alts('nigger')}(?: |$)`, // nigger
`(?:^|^${sep4} ?|\\S\\S | U )f+ +(?:her|him|you|of+|out|me|urself|yourself|everyone|admins|mods|moderators|my life|harder)\\b`,
`(?:^|[ \\(\\)\\{\\}\\]\\[:;!|\`"@#$%^&*,._=+~\\-])(?!(?:s+hh+|ss+h)[ .,!-]+it)${separate('shit', 's')}\\b`,
'(?:^| )[a][*#]{2}( |$)',
'\\bbi.ch\\b(?! tree)', // bitch
'\\bc+[y*]+u*k+a+\\b', // bitch
'^cum$', // cum
'^fu?[*]+(?: |$)', // f* fu*
' fu?[*]+ ', // f* fu*
'[a-z]{2,} f+[*]* +u+$', // just f u (avoid matching "o f u")
'\\bf{2,}[*]* +u+$', // fffff u
'^f+[*]* +u+(?= +[^a-z ])', // f u
'^f+[*]* +u+(?! *s *i *o *n)(?= +[a-z][a-z]+)', // f u
'^f+[*]* +u+$', // f u
'^f u c$',
'^fak$',
`(?:^| )${sep3}{2,} *(?:uck+(?:ing)?|itch)(?: |$)`, // __uck __itch
`(?:^| )${sep4} *(?:uck+(?:ing)?|itch)(?: |$)`, // (uck %itch
'\\bf[@#$%^&*]{2,}(?: |$)', // f@#$
'(?:^| )[*]{3,} (?:her+|him+|you+r?|of+|out|me+)\\b', // **** you
'(?:^ *|[^s ] +)h +[o0] *e *s?\\b', // h o e
`(?:^|${sep})di${sep}[ck](?:$|${sep})`, // di c / di k
'8[:=-]{3,}[|]?[oD3>][-~]*', // penis ascii art
'8==[|]?[oD]', // penis ascii art
'8[ =]{2,}D', // penis ascii art
'(?:^| )[.][i|][.](?: |$)', // penis ascii art
'c[=-]{3,}3',
'(?:^| )n [i!] g g [e3] s [t^](?: |$)',
`(?<!\\bi)${wordStart}${alts('tho')}[${onlyLetterT}]+${wordEnd}`, // thot
'child *porn', // porn
'\\Sporn\\b',
'nigger',
'childrapist', // rape
'rapeyou',
'\\brapist',
'(?:\\bg|being)rape?(?:ing|d)\\b',
'rule *34',
'[48]chan\\.', // 4chan
'^aids$',
'(?:p[o0]rno?hub|redtube|lemonparty|brazzers|youporn|xvidios)',
'yiffyiff',
// russian
'[(]+[yу][kк][aа]', // cyka
// polish
fast ? 'jeban[aey]' : 'jeba(?:ć|ł[ay]?|n[aey])',
'rozjebie', // (in any part of text)
'spieprzaj',
'odpierdol ?sie',
// japanese
'(?:^| )くそ(?: |$)',
// moans
// '(?:^| )o-ohh+~+(?: |$)',
// '(?:^| )a-ahh+~*(?: |$)',
// '(?:^| )ahh+~+(?: |$)',
];
const badWordsSpecific = [
'\\bgRAPE\\b',
];
return { all: badWords, foreign: badWordsForeign, other: badWordsOther, specific: badWordsSpecific, fuck: fuckWords };
}
if (DEVELOPMENT && false) {
(function () {
const words = createBadWords(true);
let failed = 0;
for (const phrase of [...words.all, ...words.other, ...words.foreign, ...words.specific]) {
if (!isAscii(phrase)) {
console.log(`not ascii: "${phrase}" [${charsToCodes(phrase).join(', ')}]`);
failed++;
}
}
console.log('failed: ', failed);
})();
}
export function isAscii(text: string) {
return /^[\u0020-\u007e]+$/i.test(text);
}
const unicode = createBadWords(false);
const ascii = createBadWords(true);
function tryRegex(value: string, flags: string) {
try {
return new RegExp(value, flags);
} catch (e) {
console.error(e.message);
return new RegExp(/(?!.*)/);
}
}
const replaceRegex = (values: string[]) => tryRegex(`\\b(?:${values.join('|')})\\b`, 'ugi');
const replaceRegexRU = (values: string[]) => tryRegex(`${wordStartRU}(?:${values.join('|')})${wordEndRU}`, 'ugi');
const replaceRegexOther = (values: string[]) => tryRegex(`(?:${values.join('|')})`, 'ugi');
const replaceRegexSpecific = (values: string[]) => tryRegex(`(?:${values.join('|')})`, 'ug');
const testRegex = (values: string[]) => tryRegex(`\\b(?:${values.join('|')})\\b`, 'ui');
const testRegexRU = (values: string[]) => tryRegex(`${wordStartRU}(?:${values.join('|')})${wordEndRU}`, 'ui');
const testRegexOther = (values: string[]) => tryRegex(`(?:${values.join('|')})`, 'ui');
const testRegexSpecific = (values: string[]) => tryRegex(`(?:${values.join('|')})`, 'u');
const regexReplace = replaceRegex(unicode.all);
const regexReplaceRU = replaceRegexRU(unicode.foreign);
const regexReplaceOther = replaceRegexOther(unicode.other);
const regexReplaceSpecific = replaceRegexSpecific(unicode.specific);
const regexReplaceFast = replaceRegex(ascii.all);
const regexReplaceRUFast = replaceRegexRU(ascii.foreign);
const regexReplaceOtherFast = replaceRegexOther(ascii.other);
const regexReplaceSpecificFast = replaceRegexSpecific(ascii.specific);
const regexTest = testRegex(unicode.all);
const regexTestRU = testRegexRU(unicode.foreign);
const regexTestOther = testRegexOther(unicode.other);
const regexTestSpecific = testRegexSpecific(unicode.specific);
const regexTestFast = testRegex(ascii.all);
const regexTestRUFast = testRegexRU(ascii.foreign);
const regexTestOtherFast = testRegexOther(ascii.other);
const regexTestSpecificFast = testRegexSpecific(ascii.specific);
const regexTestFuck = testRegex(unicode.fuck);
const regexReplaceRUSingle = tryRegex(`${unicode.foreign.join('|')}`, 'ugi');
const regexReplacePartial = tryRegex(`${[
...unicode.all, ...unicode.foreign, ...unicode.other, ...unicode.specific
].join('|')}`, 'ugi');
type Replacer = (match: string) => string;
const defaultReplacer: Replacer = match => repeat('*', match.length);
const createReplacerRU = (replacer = defaultReplacer): Replacer => match => match.replace(regexReplaceRUSingle, replacer);
function canUseFast(text: string) {
return isAscii(text);
}
function slowReplace(text: string, replacer: Replacer, replacerRU: Replacer) {
return text
.replace(regexReplace, replacer)
.replace(regexReplaceRU, replacerRU)
.replace(regexReplaceOther, replacer)
.replace(regexReplaceSpecific, replacer);
}
function fastReplace(text: string, replacer: Replacer, replacerRU: Replacer) {
return text
.replace(regexReplaceFast, replacer)
.replace(regexReplaceRUFast, replacerRU)
.replace(regexReplaceOtherFast, replacer)
.replace(regexReplaceSpecificFast, replacer);
}
export function createFilter(replacer = defaultReplacer) {
const replacerRU = createReplacerRU(replacer);
return (text: string) => canUseFast(text) ?
fastReplace(text, replacer, replacerRU) :
slowReplace(text, replacer, replacerRU);
}
function slowTest(text: string) {
return regexTest.test(text) ||
regexTestRU.test(text) ||
regexTestOther.test(text) ||
regexTestSpecific.test(text);
}
function fastTest(text: string) {
return regexTestFast.test(text) ||
regexTestRUFast.test(text) ||
regexTestOtherFast.test(text) ||
regexTestSpecificFast.test(text);
}
export function hasBadWords(text: string) {
return canUseFast(text) ? fastTest(text) : slowTest(text);
}
export function hasFuck(text: string) {
return regexTestFuck.test(text);
}
export const filterBadWords = createFilter();
export function filterName(name: string) {
const filtered = filterBadWords(name);
return name === filtered ? name : repeat('*', name.length);
}
export function filterBadWordsPartial(text: string, replacer = defaultReplacer): string {
return text.replace(regexReplacePartial, replacer);
}
export function findMatch(text: string): string | undefined {
return unicode.all.find(x => (tryRegex(`\\b(?:${x})\\b`, 'ui')).test(text))
|| unicode.foreign.find(x => (tryRegex(`${wordStartRU}(?:${x})${wordEndRU}`, 'ui')).test(text))
|| unicode.other.find(x => (tryRegex(`${x}`, 'u')).test(text))
|| unicode.specific.find(x => (tryRegex(`${x}`, 'u')).test(text));
}
export function createMatchEntries() {
return [
...unicode.all.map(line => ({ line, regex: tryRegex(`\\b(?:${line})\\b`, 'ui') })),
...unicode.foreign.map(line => ({ line, regex: tryRegex(`${wordStartRU}(?:${line})${wordEndRU}`, 'ui') })),
...unicode.other.map(line => ({ line, regex: tryRegex(line, 'ui') })),
...unicode.specific.map(line => ({ line, regex: tryRegex(line, 'u') })),
];
}