From f87dcbd7f83c6d671b35034ca972e58f1de4ccbd Mon Sep 17 00:00:00 2001 From: NguyenVanDat Date: Mon, 23 Mar 2026 10:46:10 +0700 Subject: [PATCH] add badword filter version 1 --- Assets/PerfectWorld/Data/clean_words.txt | 1374 +++++++++++++++++ Assets/PerfectWorld/Data/clean_words.txt.meta | 7 + .../Boostrap/BootstrapSceneController.cs | 6 +- .../Scripts/Utility/ChatFilter.meta | 8 + .../Scripts/Utility/ChatFilter/ChatFilter.cs | 183 +++ .../Utility/ChatFilter/ChatFilter.cs.meta | 2 + .../Utility/ChatFilter/ChatFilterService.cs | 68 + .../ChatFilter/ChatFilterService.cs.meta | 2 + .../Scripts/Utility/ChatFilter/TestFilter.cs | 21 + .../Utility/ChatFilter/TestFilter.cs.meta | 2 + 10 files changed, 1671 insertions(+), 2 deletions(-) create mode 100644 Assets/PerfectWorld/Data/clean_words.txt create mode 100644 Assets/PerfectWorld/Data/clean_words.txt.meta create mode 100644 Assets/PerfectWorld/Scripts/Utility/ChatFilter.meta create mode 100644 Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilter.cs create mode 100644 Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilter.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilterService.cs create mode 100644 Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilterService.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/Utility/ChatFilter/TestFilter.cs create mode 100644 Assets/PerfectWorld/Scripts/Utility/ChatFilter/TestFilter.cs.meta diff --git a/Assets/PerfectWorld/Data/clean_words.txt b/Assets/PerfectWorld/Data/clean_words.txt new file mode 100644 index 0000000000..b51b765027 --- /dev/null +++ b/Assets/PerfectWorld/Data/clean_words.txt @@ -0,0 +1,1374 @@ +5otrieu +adm +admin +administrator +administrators +admjn +admln +admod +aiquoc +ala +alqueda +amao +amdao +amdich +amen +amho +amvat +anal +anam +ancac +anduongvuong +anghen +anhunglaodong +anhungnup +anhungquandoi +anhungquandoinhandan +anhungquandoinhandanvietnam +anhungquandoinhandanvn +auco +aulac +bachcm +bacho +bachochiminh +backy +bacton +badaloc +bahuyenthanhquan +baicutcho +baicutrau +balamon +balechan +bamay +bamevietnam +bamevietnamanhung +bamevn +bana +bandam +bandamhepho +bangvesinh +banhduchoai +banhoa +banoimay +bantrinh +baocaosu +baodai +baodam +barakobama +batrieu +baucu +bede +benxegiapbat +benxemydinh +bevandan +bienchet +biendao +biendong +bieutinh +binladen +bitch +bithu +bithuhuyenuy +bithuquanuy +bithuthanhuy +bithutinhuy +biudai +biz +bobienga +bochim +bochinhtri +bodoi +bodoibacho +bodoicuho +boitoan +bomay +bome +boncho +bonchoghe +bonkhonan +bop +bopcu +bopemdianh +botat +botiensu +botruong +bucac +buchim +buclong +bucu +budit +budu +buingocduong +buithixuan +buixuongtrach +bulon +bulonkhonganh +bulshit +buoi +butcher +ca +cac +cacbe +cacbu +cachet +cachmang +cachmangthang8 +cachmangthangio +cachmangthangmuoi +cachmangthangtam +cachon +cacmac +cacnho +cacto +caibuoi +caichim +caicu +caihim +cail +cailin +cailo +cailon +cailonque +canchim +cancu +cand +candu +canhandan +canhsat +canlaonhanvi +caobanha +caobaquat +caodai +caothang +catholic +catholism +cautieu +cautieucongcong +cave +cavu +cayxon +cayxonphomvihan +chachungmay +chamay +chamaychu +chathai +chatsex +chauamem +chaungoanbacho +chdcndtrieutien +chevara +chi +chichxongsoc +chiensithidua +chim +chimamay +chimemay +chiminh +chimto +chinhphu +chinhthongiao +chinhtri +cho +chocai +chochet +chode +choghe +chogiai +choidi +choigai +choilasuong +choilodit +chotchitmemay +chua +chuacaodai +chuagiesu +chuamotcot +chuanlai +chunghia +chunghiaxahoi +chunghja +chutich +chutichdnd +chutichnuoc +chutichoidongnhandan +chutichubnd +chutichuybanhandan +chuvanan +chuyendong2ah +chxhcn +chxhcnvietnam +chxhcnvn +cia +cmt8 +cmtam +cmthang8 +cmthangio +cmtio +cmtmuoi +cncs +cnxh +cock +code +codoc +coke +cokr +com +comaythoigiangm +comz +conayhama +conc +concac +concactotuong +concho +conco +concu +concube +concubu +concucac +conculon +conculong +conculongla +concungong +concunho +concuto +concutotuong +condi +condicho +condiem +condiemgia +condiemthoi +condiemthui +condigia +condime +condimemay +condingua +condinon +condithoi +condithui +congan +congand +conganhandan +congchuangochan +conghoa +conghoaxahoichunghia +conghoaxahoichunghiavietnam +conghoaxahoichunghiavn +congiao +congquynh +congsan +congsanchunghia +congsand +congsandongduong +congtychauamem +conheo +conlon +conm2 +conme +conmemay +conpho +conquicai +conquidamduc +conquirauxanh +conquycai +conquydamduc +conquyrauxanh +conyeurauxanh +conz +coza +csan +csandongduong +cschunghia +cscn +csdongduong +csthidua +cube +cubu +cuc +cucac +cucbo +cucga +cucheo +cuchi +cuchinhlan +cucho +cuclon +cucphan +cuctrau +cuctruong +cucuc +cucut +cucutcho +cucutga +cucutlon +cucuton +cudenthui +cuemto +cuho +cuhochiminh +culon +culong +cungong +cunho +cuongdam +cuonghiep +cut +cutbo +cutcho +cutga +cutheo +cutlon +cuto +cutrau +dadao +dai +daibieuquochoi +daicoviet +daiduc +daila +dailaohoathuong +dailathanh +daithudamtac +daituong +daiviet +dam +damdang +damlon +damn +damtac +damthue +danchu +danchuconghoa +danchui +dang +dangala +dangcanlao +dangcanlaonhanvi +dangconghoa +dangcongsan +dangcongsand +dangcongsandongduong +dangcongsanvietnam +dangcongsanvn +dangcs +dangcsdongduong +dangcsvietnam +dangdanchu +dangdung +danglaodong +danglaodongvietnam +danglaodongvn +dangldvn +dangnguyencan +dangs +dangsan +dangsand +dangsandongduong +dangsanvietnam +dangsanvn +dangsdongduong +dangsvietnam +dangtat +dangthaimai +dangthaithan +dangthingocthinh +dangtieubinh +dangtoicao +dangtrancon +dangxahoi +dangxh +danhbom +danhloile +dankhoan +danquyen +dantoc +daoduyanh +daoduytu +daongu +daotan +datlailatma +datungdai +datuong +daubuoi +dautoditbe +dautoditeo +day +dcm +dcs +dech +degaule +deo +deoconmemay +deome +deomemay +dequocmy +det +dicho +dick +dienbienphu +diepkiemanh +diet +dietchung +dietcong +dietcongsan +dietcs +dietsan +dildo +dimemay +dingua +dinhbolinh +dinhcong +dinhcongbaithi +dinhcongtrang +dinhlathang +dinhle +dinhlien +dinhliet +dinhthehuynh +dinhtienhoang +dis +disbo +disme +dit +ditbo +ditbomay +ditbu +ditconme +ditconmemay +ditcu +diteo +dithangchamay +ditme +ditmemay +ditnhau +dito +djs +dkm +dm +dma +dmamay +dmay +dmcs +dme +dmedcha +dmemay +doanthanhniencongsan +doanthanhniencongsanhcm +doanthidiem +dobaty +docbagianghogm +docbagm +dochieu +docho +dochocai +dochocon +dochode +dochoghe +dochogiai +doconcho +doconheo +doconhoang +doconlon +doconon +dodi +dodidiem +dodiem +dodiemgia +dodiemthoi +dodiemthui +dodinon +dogamai +dogathien +dogfucker +doheogiong +doheonai +doheonoc +doinhucailon +doinhuconcac +doithieunientienphong +doithieunientienphonghcm +doitruy +dokhon +dolongiong +domacdich +domactoi +domatday +domuoi +dongcuc +dongcut +dongkhanh +dongkhoi +dongocthanh +dongu +doquidoan +doquydoan +dostoievski +dosucvat +dote +dothaigiao +dothuvat +dotoi +dotoibai +dotraubo +ducba +ducgiamuc +ducgiaohoang +duchongy +duchongygiaochu +ductongiamuc +duma +dumamay +dume +dumeducha +dumemay +dungsidietmi +dungsidietmy +dunhau +duongdinhnghe +duongluoibo +duongquangham +duongvanduong +duongvanga +duongvat +dut +dutcacvao +emanmaulon +fbi +fcuk +fidelcastro +filter +fomosa +formosa +fuck +fuckas +fucked +fucker +fucks +fuckyou +gaibanhoa +gaidiem +gaidungduong +gaigiangho +gaitrinhbandam +gamemaster +gandi +gangdi +gay +giaicap +giaicapcongnhan +giaicapnongdan +giaiphong +giaiphongmienam +gialong +giamuc +giangthanh +giangvanminh +giankhoan +giaochumahomed +giaochumahomet +giaohoang +giesu +giet +giethet +gietnguoi +gmx +gov +govbf +hack +hacking +hahuytap +haibatrung +haihon +haihongiai +haithuonglanong +haivien +hamhiep +hamlong +hamnghi +hang +hangochien +hanhkinh +hanthuyen +harlot +hatinh +haumon +hcm +hd98i +hengxomrin +heonai +heonoc +hethong +hiepdam +hilaryclinton +hindu +hitle +hitler +hoahao +hoangcam +hoangdaothuy +hoangdieu +hoangdigm +hoanghauylan +hoanghoatham +hoangminhgiam +hoangsa +hoangtichchu +hoangtrunghai +hoangvanthai +hoangvanthu +hoangyigm +hoaquocphong +hoathuong +hoaxahoichunghia +hoaxahoichunghiavietnam +hoaxahoichunghiavn +hoaxhcn +hoaxhcnvn +hocamdao +hochiminh +hochjminh +hochjmjnh +hochutich +hochutjch +hodacdi +hohaohon +hohoankiem +hoigiao +hongiai +hongygiaochu +hoquili +hoquily +hoquyli +hoquyly +hotle +hotungmau +hoxuanhuong +huangyigm +hungvuong +hunsen +huyentrancongchua +huynhdinhai +huynhphuso +huynhthuckhang +hxhcn +hxhcnvietnam +hxhcnvn +iengsari +info +karlmark +karlmax +kememay +kgb +khaidinh +khangchienchongmy +khangchienchongphap +khaudam +khieudam +khieusamphan +khieusamphon +khodam +khoi8ao6 +khonan +khongtu +khuatduytien +khuchao +khungbo +kieplamdi +kil +kiler +kimdong +kimjongil +kimnhathanh +kinhduongvuong +kinhnguyet +kisinger +kopakolong +laclongquan +lambu +lamtinh +lanhdao +laolon +laotu +latma +leanhxuan +lechieuthong +ledaihanh +ledoanhop +leduan +leducanh +leductho +lehoan +lehoangquan +lehonganh +lehongminh +lehongphong +lekhaphieu +lelai +leloi +leminhtri +leminhxuan +lengoatrieu +lengochan +lenin +leptolstoi +lequidon +lequydon +lesat +lesbian +lethaito +lethanhai +lethanhnghi +lethanhton +lethibachcat +lethinga +lethirieng +letrongtan +letruc +levanluong +levansi +lichieuhoang +liconguan +lidaothanh +liem +liemcac +liemcactaone +liemgiai +liemlon +lieuchet +lieugiai +lihienlong +linamde +linba +linchi +linhanton +linhmuc +liquangdieu +liquocsu +lithaito +lithanhtong +lithantong +lithuongkiet +litutrong +lodit +loichim +loicu +loile +lon +lonai +lonbeo +lonbu +longay +longcu +longhe +longiai +longlon +longmu +longnach +lonma +lonmap +lonoc +lonque +lonthoi +lonthui +lonto +louispasteur +lucho +luchode +luchoma +luhuphuoc +lukhon +lukhonan +lulon +luoibo +luongdinhcua +luongkhanhthien +luongthevinh +luongvancan +lutraubo +lychieuhoang +lyconguan +lydaothanh +lyhienlong +lynamde +lynhanton +lyquangdieu +lyquocsu +lythaito +lythanhtong +lythuongkiet +lytutrong +macdinhchi +macthibuoi +mafia +mahomed +mahomet +maihacde +maithucloan +maixuanthuong +makelove +makinglove +mamay +manhtu +maotrachdong +maso +matcac +matlon +matrangiaiphong +matrangiaiphongmienam +matranphucquoc +matrantoquoc +maukinh +maulon +maulonque +mauque +maydiena +mekiep +memay +memaychu +menvedev +metin +minhkhai +minhmang +mitinh +moa +mocbo +mod +mohamet +mongbu +mongdoc +mongto +motherfucker +mothoixelon +muadam +mucsu +mulon +muonlamtinh +murayamatomichi +muslim +muslism +mutbuoi +mutcac +myquoc +nac +nake +nambokhangchien +namcam +namcao +namky +namkykhoinghia +namoadida +namoadidaphat +namphi +nerhu +neru +net +nexon +ngochancongchua +ngochanh +ngochoang +ngodinhdiem +ngoducke +ngogiakham +ngogiatu +ngoquyen +ngosilien +ngotato +ngothinham +ngothoinhiem +ngovanso +ngoxuanlich +nguacac +nguacu +ngualon +ngudan +ngunhubo +ngunhucho +ngunhuheo +ngunhulon +ngunhutrau +nguoinole +nguy +nguyenaiquoc +nguyenaninh +nguyenbathanh +nguyenbinh +nguyenbinhkhiem +nguyencanhchan +nguyencao +nguyenchithanh +nguyenconghoan +nguyencongtru +nguyencudam +nguyencuphu +nguyencuvan +nguyendinhchieu +nguyendu +nguyenducanh +nguyenduchai +nguyengiathieu +nguyenhac +nguyenhien +nguyenhoabinh +nguyenhoang +nguyenhong +nguyenhucanh +nguyenhuchinh +nguyenhue +nguyenhuhuan +nguyenhutho +nguyenhuytu +nguyenhuytuong +nguyenkhachieu +nguyenkhanhtoan +nguyenkhoai +nguyenkhuyen +nguyenkiem +nguyenkim +nguyenluongbang +nguyenmanhcam +nguyenminhtriet +nguyenmintriet +nguyenphikhanh +nguyenphongsac +nguyenphutrong +nguyensieu +nguyensinhcon +nguyensinhcung +nguyensinhsac +nguyensinhung +nguyenson +nguyentandung +nguyentathanh +nguyenthaihoc +nguyenthanhai +nguyenthethao +nguyenthibinh +nguyenthidinh +nguyenthidoan +nguyenthienhan +nguyenthienthuat +nguyenthiep +nguyenthikimngan +nguyenthiminhkhai +nguyenthithap +nguyenthuonghien +nguyenthuonhien +nguyenthuyanh +nguyentieula +nguyentrai +nguyentriphuong +nguyentrungtruc +nguyentruongto +nguyentuan +nguyenvanbinh +nguyenvancu +nguyenvanhuyen +nguyenvanlinh +nguyenvanto +nguyenvantroi +nguyenvietxuan +nguyenxuanphuc +nguynhukontum +nhacau +nhanuoc +nhathoducba +nhaxi +nhiemdoc +nhincailonmemay +nicholasarkozy +nico +nixon +nole +nongducmanh +notranglong +nuhoanganh +nuhoangelizabeth +nung +nungcac +nunglon +nuocdai +nuoctieu +nut +obama +ongiabao +ongichkhiem +ongnoimay +org +pabloneruda +pasteur +pathetlao +pede +penis +phambinhminh +phamdinho +phamgiakhiem +phamhung +phamhuythong +phaminhchinh +phamngocthach +phamngulao +phamphuongthao +phamsumanh +phamvandong +phamvanhai +phan +phanboichau +phanchutrinh +phandanglu +phandinhgiot +phandinhphung +phandong +phanhuychu +phanhuyich +phankebinh +phanliem +phanphutien +phanquangkhai +phanquoc +phansaonam +phantayho +phanthanhgian +phanton +phanvankhai +phat +phatba +phatbaquanam +phatdilac +phatgiao +phathichca +phathichcamauni +phato +phatonhulai +phatrinh +phetchetmay +phocai +phoduc +phoduchinh +phongtraodongkhoi +phongtraodonkhoi +phothutuong +phucquoc +phudongthienvuong +phungchikien +phunghung +phungkhackhoan +phungquangthanh +phungquochien +phungthanhquang +polpot +ponpot +porn +pusy +putin +quanam +quanambotat +quandoinhandan +quangtrung +quantheam +quantheambotat +quehuongdongkhoi +quicai +quidau +quinhaptrang +quirauxanh +quycai +quydau +quynguoithuong +quynhaptrang +quyrauxanh +rape +restrom +richardnixon +romu +rongkinh +san +sanchunghia +sand +sandongduong +sarkozy +schunghia +scn +sdongduong +sex +shit +shite +shits +shutup +sihanuc +sihanuk +sochang +sochim +soclo +socu +solon +solong +soncut +sondai +sonofbitch +sontay +sosoncut +sosondai +sovaicut +sovaidai +sperm +stalin +stupid +subochungmay +sucac +sucat +suchachungmay +suck +sukien +suni +suongnguyetanh +suport +suthienchieu +suvanhanh +tamquocgm +tamsa +tanbinh +tanda +tandanguyenkhachieu +tangbatho +tanhoaxa +tapcanbinh +taquangbu +taysa +taysai +tayson +tenloman +test +tester +thacsin +thaihauduongvanga +thaksin +thamnhung +thangbomay +thangbomgia +thangchamay +thangcho +thangchochet +thangchode +thangconhoang +thangcumay +thangdibom +thangheonoc +thangkhon +thangkhonan +thanglonoc +thangmaco +thangmacomacao +thangmatday +thangvuphu +thanhala +thanhdaila +thanhgiong +thanhmahomet +thankimqui +thichbopvu +thichca +thichcamauni +thichgiaohop +thichgiaophoi +thichquangduc +thienchua +thienchuagiao +thiensu +thieutri +thieutuong +thisach +thochuyet +thoidime +thongbao +thongdam +thongthiphong +thucdanphap +thudam +thukhoahuan +thuongde +thuongtoa +thuongtoathich +thuongtuong +thutuong +tiensubo +tiensubomay +tiensubono +tiensucha +tiensuchamay +tiensuchano +tieubavuongm +tinguong +tinhdich +tinhkhi +tinhtrung +tinlanh +toalet +tochamay +tochano +tohienthanh +tohieu +tohu +tohuyrua +toilet +tolam +tomichi +tondatien +tonducthang +tongbitho +tongbithonongducmanh +tongbithu +tongbithunongducmanh +tongcuctruong +tongduytan +tongiamuc +tongiao +tongocvan +tongthiphong +tonthathiep +tonthathuyet +tonthatung +tontrungson +tonvan +tonyblair +tovinhdien +tranao +tranbinhtrong +trancaovan +trandaiquang +trandinhxu +trando +tranducluong +tranguyenhan +tranhanton +tranhatduat +tranhungdao +tranhuylieu +trankhanhdu +trankhatchan +tranphu +tranquangdieu +tranquangkhai +tranquicap +tranquoctoan +tranquoctuan +tranquocvuong +tranquycap +trantexuong +tranthaiton +tranthaitong +tranthanhtong +tranthudo +trantrieuluat +trantuankhai +tranvantra +tranvantuy +tranxuansoan +trieuquangphuc +trieuquocdat +trieuthitrinh +trinhoaiduc +troski +trosky +trotki +trotky +trungcong +trungnhi +trungquoc +trungtrac +truongchinh +truongcongdinh +truongdinh +truonghansieu +truonghoabinh +truongminhtuan +truongsa +truongtansang +truongthimai +truongvinhky +truongvinhtrong +tsgm +tuban +tucungdamau +tuduc +tuetinh +tungthienvuong +tuoilongi +tuongioithach +tusan +tutuong +tuxuong +tuylyvuong +twelvesky2gm +typhugm +uncleho +uongchulu +utich +vagina +vaicalon +vaicaphan +vaicut +vaidai +vailin +vanba +vancao +vantiendung +vaomahiep +vcl +vcong +vgian +victohugo +victohuygo +victorhugo +viet +vietan +vietcong +vietgian +vietminh +vietnam +vina +vjetcong +vjetgian +vjetgjan +vjetmjnh +vnam +vochicong +vonguyengiap +vothisau +votrongviet +vovangan +vovankiet +vovantan +vovanthuong +vuahung +vuahungvuong +vuale +vualy +vuatran +vubu +vudai +vuducdam +vulva +vumuop +vungocphan +vuongcungthnahduong +vuongdinhue +vuongthuavu +vuotbien +vuteo +vuthikimtien +vuthongduagang +vuto +vutrongphung +xahoichunghia +xahoicn +xaolonanhghet +xhchunghia +xhcn +xinduocgiaohop +xuandieu +xuanthuy +yersin +yetkieu +yeurauxanh +ylanhoanghau +conggiao +du diff --git a/Assets/PerfectWorld/Data/clean_words.txt.meta b/Assets/PerfectWorld/Data/clean_words.txt.meta new file mode 100644 index 0000000000..010494c378 --- /dev/null +++ b/Assets/PerfectWorld/Data/clean_words.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6ab087813f7c53349baf2a476e6904f1 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Boostrap/BootstrapSceneController.cs b/Assets/PerfectWorld/Scripts/Boostrap/BootstrapSceneController.cs index dc940440ce..2f4891e1db 100644 --- a/Assets/PerfectWorld/Scripts/Boostrap/BootstrapSceneController.cs +++ b/Assets/PerfectWorld/Scripts/Boostrap/BootstrapSceneController.cs @@ -1,5 +1,6 @@ using UnityEngine; using System.Collections; +using BrewMonster.PerfectWorld.Scripts.Utility.ChatFilter; using UnityEngine.SceneManagement; namespace BrewMonster @@ -10,6 +11,7 @@ namespace BrewMonster IEnumerator Start() { + ChatFilterService.Init(); // Load the next scene after 1 second yield return new WaitForSeconds(1f); LoadNextScene(); @@ -20,8 +22,8 @@ namespace BrewMonster #if TESTFAST SceneManager.LoadSceneAsync(_nextSceneName,LoadSceneMode.Additive); #else - SceneManager.LoadScene(_nextSceneName); + SceneManager.LoadScene(_nextSceneName); #endif } } -} \ No newline at end of file +} diff --git a/Assets/PerfectWorld/Scripts/Utility/ChatFilter.meta b/Assets/PerfectWorld/Scripts/Utility/ChatFilter.meta new file mode 100644 index 0000000000..49b2a72c77 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Utility/ChatFilter.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 89107298c9450ab4fae2d12e2426713e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilter.cs b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilter.cs new file mode 100644 index 0000000000..28d9fe206f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilter.cs @@ -0,0 +1,183 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; + +namespace BrewMonster.PerfectWorld.Scripts.Utility.ChatFilter +{ + public class ChatFilter + { + private HashSet badWordSet = new HashSet(); + + // ========================= + // BUILD + // ========================= + public void Build(string[] words) + { + badWordSet.Clear(); + + foreach (var w in words) + { + if (!string.IsNullOrWhiteSpace(w)) + badWordSet.Add(w.Trim()); + } + } + + // ========================= + // NORMALIZE + // ========================= + private string NormalizeRuntime(string input, out List map) + { + map = new List(); + + string formD = input.Normalize(NormalizationForm.FormD); + StringBuilder sb = new StringBuilder(); + + bool lastWasSpace = false; + + for (int i = 0; i < formD.Length; i++) + { + char c = formD[i]; + + var uc = Char.GetUnicodeCategory(c); + if (uc == UnicodeCategory.NonSpacingMark) + continue; + + char n = NormalizeChar(c); + + if (n == '\0') + { + if (!lastWasSpace) + { + sb.Append(' '); + map.Add(i); + lastWasSpace = true; + } + } + else + { + sb.Append(n); + map.Add(i); + lastWasSpace = false; + } + } + + return sb.ToString().Trim(); + } + + private char NormalizeChar(char c) + { + c = char.ToLower(c); + + if (c == 'đ') return 'd'; + + switch (c) + { + case '@': return 'a'; + case '4': return 'a'; + case '0': return 'o'; + case '1': return 'i'; + case '!': return 'i'; + case '$': return 's'; + case '3': return 'e'; + } + + if (char.IsLetterOrDigit(c)) + return c; + + return '\0'; + } + + // ========================= + // TOKEN → CHAR INDEX + // ========================= + private int FindCharIndex(string normalized, int tokenIndex, List map) + { + int tokenCounter = 0; + + for (int i = 0; i < normalized.Length; i++) + { + if (normalized[i] == ' ') + continue; + + if (tokenCounter == tokenIndex) + return map[i]; + + // skip current token + while (i < normalized.Length && normalized[i] != ' ') + i++; + + tokenCounter++; + } + + return -1; + } + + // ========================= + // MATCH JOINED TOKENS + // ========================= + private bool MatchJoinedTokens(string[] tokens, int index, out int length) + { + length = 0; + + // thử ghép tối đa 3 token + for (int size = 1; size <= 3 && index + size <= tokens.Length; size++) + { + string merged = ""; + + for (int j = 0; j < size; j++) + merged += tokens[index + j]; + + if (badWordSet.Contains(merged)) + { + length = size; + return true; + } + } + + return false; + } + + // ========================= + // FILTER + // ========================= + public string Filter(string input, out bool isValidWord) + { + isValidWord = false; + if (string.IsNullOrEmpty(input)) + return input; + isValidWord = true; + List map; + string normalized = NormalizeRuntime(input, out map); + + var tokens = normalized.Split(' ', StringSplitOptions.RemoveEmptyEntries); + + char[] result = input.ToCharArray(); + + for (int i = 0; i < tokens.Length; i++) + { + if (MatchJoinedTokens(tokens, i, out int len)) + { + int startToken = i; + int endToken = i + len - 1; + + int startChar = FindCharIndex(normalized, startToken, map); + int endChar = FindCharIndex(normalized, endToken, map); + + if (startChar >= 0 && endChar >= 0) + { + for (int k = startChar; k <= endChar && k < result.Length; k++) + { + result[k] = '*'; + isValidWord = false; + } + } + + i += len - 1; + } + } + + return new string(result); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilter.cs.meta b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilter.cs.meta new file mode 100644 index 0000000000..3c7a2db508 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 436ad91ec808a7d4d80d00ab164d42b7 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilterService.cs b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilterService.cs new file mode 100644 index 0000000000..41ec60c8f1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilterService.cs @@ -0,0 +1,68 @@ +using System.IO; +using UnityEngine; + +namespace BrewMonster.PerfectWorld.Scripts.Utility.ChatFilter +{ + public static class ChatFilterService + { + private static ChatFilter _filter; + private static bool _initialized = false; + + // ========================= + // INIT + // ========================= + public static void Init() + { + if (_initialized) return; + + _filter = new ChatFilter(); + + string path = Path.Combine(Application.dataPath, "PerfectWorld/Data/clean_words.txt"); + + if (!File.Exists(path)) + { + BMLogger.LogError("ChatFilter file not found: " + path); + return; + } + + var lines = File.ReadAllLines(path); + + _filter.Build(lines); + + _initialized = true; + + Debug.Log("ChatFilterV2 initialized"); + } + + // ========================= + // FILTER + // ========================= + public static string Filter(string input, out bool isValidWord) + { + isValidWord =false; + if (!_initialized) + { + BMLogger.LogError("ChatFilter not initialized!"); + return input; + } + + return _filter.Filter(input, out isValidWord); + } + + // ========================= + // CHECK ONLY (không mask) + // ========================= + public static bool ContainsBadWord(string input) + { + if (!_initialized) + { + BMLogger.LogError("ChatFilter not initialized!"); + return false; + } + + _filter.Filter(input, out var isValidWord); + + return !isValidWord; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilterService.cs.meta b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilterService.cs.meta new file mode 100644 index 0000000000..0fa22a3433 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/ChatFilterService.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b09bed44157324f46b0f980aa4da0720 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Utility/ChatFilter/TestFilter.cs b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/TestFilter.cs new file mode 100644 index 0000000000..25685c5c5f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/TestFilter.cs @@ -0,0 +1,21 @@ +using BrewMonster.PerfectWorld.Scripts.Utility.ChatFilter; +using UnityEngine; + +namespace BrewMonster +{ + public class TestFilter : MonoBehaviour + { + public string input; + [ContextMenu("Filter")] + void Test() + { + ChatFilterService.Init(); + + // string msg = "d*m*m mày"; + + string filtered = ChatFilterService.Filter(input, out var isValidWord); + + Debug.Log($"Is valid: {isValidWord}: "+filtered); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Utility/ChatFilter/TestFilter.cs.meta b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/TestFilter.cs.meta new file mode 100644 index 0000000000..448dd30bc2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Utility/ChatFilter/TestFilter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c235df647ffffd54a84fdae3527eedff \ No newline at end of file