diff --git a/src/app/services/util/profanity-filter.service.spec.ts b/src/app/services/util/profanity-filter.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..eedd82f92a4d343ff20c7590b230f0389f0bde1c --- /dev/null +++ b/src/app/services/util/profanity-filter.service.spec.ts @@ -0,0 +1,17 @@ +/*import { TestBed } from '@angular/core/testing'; + +import { ProfanityFilterService } from './profanity-filter.service'; + +describe('ProfanityFilterService', () => { + let service: ProfanityFilterService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ProfanityFilterService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); +*/ diff --git a/src/app/services/util/profanity-filter.service.ts b/src/app/services/util/profanity-filter.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..9d96d23fcc8828e52ca9371a746181603d6c63f0 --- /dev/null +++ b/src/app/services/util/profanity-filter.service.ts @@ -0,0 +1,93 @@ +import { Injectable } from '@angular/core'; +import { Observable, Subject } from 'rxjs'; +import * as BadWords from 'naughty-words'; + +@Injectable({ + providedIn: 'root' +}) +export class ProfanityFilterService { + + private customProfanityWords: Subject<string[]>; + private readonly profanityKey = 'custom-Profanity-List'; + private profanityWords = []; + + constructor() { + this.customProfanityWords = new Subject<string[]>(); + this.profanityWords = BadWords['en'] + .concat(BadWords['de']) + .concat(BadWords['fr']) + .concat(BadWords['ar']) + .concat(BadWords['ru']) + .concat(BadWords['es']) + .concat(BadWords['it']) + .concat(BadWords['nl']) + .concat(BadWords['pt']) + .concat(BadWords['tr']); + } + + get getProfanityList(): string[] { + return this.getProfanityListFromStorage().concat(this.profanityWords); + } + + getProfanityListFromStorage() { + const list = localStorage.getItem(this.profanityKey); + return list ? JSON.parse(list) : []; + } + + getCustomProfanityList(): Observable<string[]> { + this.customProfanityWords.next(this.getProfanityListFromStorage()); + return this.customProfanityWords.asObservable(); + } + + addToProfanityList(word: string) { + if (word !== undefined) { + const plist = this.getProfanityListFromStorage(); + if (!plist.includes(word.toLowerCase().trim())) { + plist.push(word.toLowerCase().trim()); + localStorage.setItem(this.profanityKey, JSON.stringify(plist)); + this.customProfanityWords.next(plist); + } + } + } + + removeFromProfanityList(word: string) { + const plist = this.getProfanityListFromStorage(); + plist.splice(plist.indexOf(word, 0), 1); + localStorage.setItem(this.profanityKey, JSON.stringify(plist)); + this.customProfanityWords.next(plist); + } + + removeProfanityList() { + localStorage.removeItem(this.profanityKey); + } + + filterProfanityWords(str: string, censorPartialWordsCheck: boolean, censorLanguageSpecificCheck: boolean, lang?: string){ + let filteredString = str; + let profWords = []; + if (censorLanguageSpecificCheck) { + profWords = BadWords[(lang !== 'AUTO' ? lang.toLowerCase() : localStorage.getItem('currentLang'))]; + } else { + profWords = this.profanityWords; + } + // eslint-disable-next-line max-len + const toCensoredString = censorPartialWordsCheck ? str.toLowerCase() : str.toLowerCase().split(/[\s,.]+/); + profWords.concat(this.getProfanityListFromStorage()).forEach(word => { + if (toCensoredString.includes(word)) { + filteredString = this.replaceString(filteredString, word, this.generateCensoredWord(word.length)); + } + }); + return filteredString; + } + + private replaceString(str: string, search: string, replace: string) { + return str.replace(new RegExp(search, 'gi'), replace); + } + + private generateCensoredWord(count: number) { + let res = ''; + for (let i = 0; i < count; i++) { + res += '*'; + } + return res; + } +} diff --git a/src/app/services/util/room-data.service.ts b/src/app/services/util/room-data.service.ts index 28660f0d64bb6c5d90b01bb2ff5f1ca328d73dd4..5e24a138d622ecd14c7f646d08a0def56f58dbc3 100644 --- a/src/app/services/util/room-data.service.ts +++ b/src/app/services/util/room-data.service.ts @@ -6,7 +6,7 @@ import { Comment } from '../../models/comment'; import { CommentService } from '../http/comment.service'; import { CorrectWrong } from '../../models/correct-wrong.enum'; import { RoomService } from '../http/room.service'; -import { TopicCloudAdminService } from './topic-cloud-admin.service'; +import { ProfanityFilterService } from './profanity-filter.service'; import { ProfanityFilter, Room } from '../../models/room'; import { WsRoomService } from '..//websockets/ws-room.service'; @@ -99,7 +99,7 @@ export class RoomDataService { constructor(private wsCommentService: WsCommentService, private commentService: CommentService, private roomService: RoomService, - private topicCloudAdminService: TopicCloudAdminService, + private profanityFilterService: ProfanityFilterService, private wsRoomService: WsRoomService) { } @@ -173,7 +173,7 @@ export class RoomDataService { private filterCommentOfProfanity(room: Room, comment: Comment): string { const partialWords = room.profanityFilter === ProfanityFilter.all || room.profanityFilter === ProfanityFilter.partialWords; const languageSpecific = room.profanityFilter === ProfanityFilter.all || room.profanityFilter === ProfanityFilter.languageSpecific; - return this.topicCloudAdminService.filterProfanityWords(comment.body, partialWords, languageSpecific, comment.language); + return this.profanityFilterService.filterProfanityWords(comment.body, partialWords, languageSpecific, comment.language); } private removeCommentBodies(key: string) { diff --git a/src/app/services/util/topic-cloud-admin.service.ts b/src/app/services/util/topic-cloud-admin.service.ts index 1c38f86d265c1d4a26f9344720a8fc2f1c01df0d..1c923f11084b1eacc4b629e54e135110af177fac 100644 --- a/src/app/services/util/topic-cloud-admin.service.ts +++ b/src/app/services/util/topic-cloud-admin.service.ts @@ -1,5 +1,4 @@ import { Injectable } from '@angular/core'; -import * as BadWords from 'naughty-words'; import { TopicCloudAdminData, KeywordOrFulltext, @@ -11,6 +10,7 @@ import { TranslateService } from '@ngx-translate/core'; import { NotificationService } from './notification.service'; import { Observable, Subject } from 'rxjs'; import { WsRoomService } from '..//websockets/ws-room.service'; +import { ProfanityFilterService } from './profanity-filter.service'; @Injectable({ providedIn: 'root', @@ -19,28 +19,15 @@ export class TopicCloudAdminService { private static readonly adminKey = 'Topic-Cloud-Admin-Data'; private adminData: Subject<TopicCloudAdminData>; private blacklist: Subject<string[]>; - private profanityWords = []; - private customProfanityWords: Subject<string[]>; - private readonly profanityKey = 'custom-Profanity-List'; constructor(private roomService: RoomService, private translateService: TranslateService, private wsRoomService: WsRoomService, + private profanityFilterService: ProfanityFilterService, private notificationService: NotificationService) { this.blacklist = new Subject<string[]>(); this.adminData = new Subject<TopicCloudAdminData>(); - this.customProfanityWords = new Subject<string[]>(); - this.profanityWords = BadWords['en'] - .concat(BadWords['de']) - .concat(BadWords['fr']) - .concat(BadWords['ar']) - .concat(BadWords['ru']) - .concat(BadWords['es']) - .concat(BadWords['it']) - .concat(BadWords['nl']) - .concat(BadWords['pt']) - .concat(BadWords['tr']); this.wsRoomService.getRoomStream(localStorage.getItem('roomId')).subscribe(msg => { const message = JSON.parse(msg.body); const room = message.payload.changes; @@ -100,7 +87,7 @@ export class TopicCloudAdminService { _adminData.blacklist = list; } if (_adminData.profanityFilter !== ProfanityFilter.deactivated) { - _adminData.blacklist = _adminData.blacklist.concat(this.getProfanityListFromStorage().concat(this.profanityWords)); + _adminData.blacklist = _adminData.blacklist.concat(this.profanityFilterService.getProfanityList); } this.adminData.next(_adminData); }); @@ -114,38 +101,6 @@ export class TopicCloudAdminService { return this.blacklist.asObservable(); } - getProfanityListFromStorage() { - const list = localStorage.getItem(this.profanityKey); - return list ? JSON.parse(list) : []; - } - - getCustomProfanityList(): Observable<string[]> { - this.customProfanityWords.next(this.getProfanityListFromStorage()); - return this.customProfanityWords.asObservable(); - } - - addToProfanityList(word: string) { - if (word !== undefined) { - const plist = this.getProfanityListFromStorage(); - if (!plist.includes(word.toLowerCase().trim())) { - plist.push(word.toLowerCase().trim()); - localStorage.setItem(this.profanityKey, JSON.stringify(plist)); - this.customProfanityWords.next(plist); - } - } - } - - removeFromProfanityList(word: string) { - const plist = this.getProfanityListFromStorage(); - plist.splice(plist.indexOf(word, 0), 1); - localStorage.setItem(this.profanityKey, JSON.stringify(plist)); - this.customProfanityWords.next(plist); - } - - removeProfanityList() { - localStorage.removeItem(this.profanityKey); - } - getRoom(): Observable<Room> { return this.roomService.getRoom(localStorage.getItem('roomId')); } @@ -195,34 +150,4 @@ export class TopicCloudAdminService { }); }); } - - filterProfanityWords(str: string, censorPartialWordsCheck: boolean, censorLanguageSpecificCheck: boolean, lang?: string){ - let filteredString = str; - let profWords = []; - if (censorLanguageSpecificCheck) { - profWords = BadWords[(lang !== 'AUTO' ? lang.toLowerCase() : localStorage.getItem('currentLang'))]; - } else { - profWords = this.profanityWords; - } - // eslint-disable-next-line max-len - const toCensoredString = censorPartialWordsCheck ? str.toLowerCase() : str.toLowerCase().split(/[\s,.]+/); - profWords.concat(this.getProfanityListFromStorage()).forEach(word => { - if (toCensoredString.includes(word)) { - filteredString = this.replaceString(filteredString, word, this.generateCensoredWord(word.length)); - } - }); - return filteredString; - } - - private replaceString(str: string, search: string, replace: string) { - return str.replace(new RegExp(search, 'gi'), replace); - } - - private generateCensoredWord(count: number) { - let res = ''; - for (let i = 0; i < count; i++) { - res += '*'; - } - return res; - } }