//META{"name":"ChatFilter"}*// class ChatFilter { getName () {return "ChatFilter";} getVersion () {return "3.3.2";} getAuthor () {return "DevilBro";} getDescription () {return "Allows the user to censor words or block complete messages based on words in the chatwindow.";} initConstructor () { this.patchModules = { "Message":["componentDidMount","componentDidUpdate"], "StandardSidebarView":"componentWillUnmount" }; this.configs = ["empty","case","exact"]; this.css = ` ${BDFDB.dotCNS.messagegroup + BDFDB.dotCN.messageaccessory}.blocked:not(.revealed), ${BDFDB.dotCNS.messagegroup + BDFDB.dotCN.messagemarkup}.blocked:not(.revealed) { font-weight: bold; font-style: italic; }`; this.defaults = { replaces: { blocked: {value:"~~BLOCKED~~", title:"Block:", description:"Default Replace Word for blocked Messages:"}, censored: {value:"$!%&%!&", title:"Censor:", description:"Default Replace Word for censored Messages:"} }, settings: { showMessageOnClick: {value:{blocked:true, censored:true}, enabled:{blocked:true, censored:true}, description:"Show original Message on Click:"}, hideMessage: {value:{blocked:false, censored:false}, enabled:{blocked:true, censored:false}, description:"Completely hide targeted Messages:"} } }; } getSettingsPanel () { if (!global.BDFDB || typeof BDFDB != "object" || !BDFDB.loaded || !this.started) return; var replaces = BDFDB.getAllData(this, "replaces"); var settings = BDFDB.getAllData(this, "settings"); var settingshtml = `
${this.getName()}
`; for (let rtype in replaces) { var words = BDFDB.loadData(rtype, this, "words"); settingshtml += `

${this.defaults.replaces[rtype].title}

With:

`; for (let key in settings) { if (this.defaults.settings[key].enabled[rtype]) settingshtml += `

${this.defaults.settings[key].description}

`; } settingshtml += `

${this.defaults.replaces[rtype].description}

`; settingshtml += `

List of ${rtype} Words:

`; for (let config of this.configs) { settingshtml += `
${config.toUpperCase()}
`; } settingshtml += `
`; for (let word in words) { settingshtml += `
${BDFDB.encodeToHTML(word)} (${BDFDB.encodeToHTML(words[word].replace)})
` for (let config of this.configs) { settingshtml += `
`; } settingshtml += `
`; } settingshtml += `
` settingshtml += `

Remove all added words.

`; settingshtml += `
`; } var infoHidden = BDFDB.loadData("hideInfo", this, "hideInfo"); settingshtml += `
Information
`; settingshtml += `
Case: Will block/censor words while comparing lowercase/uppercase. apple => apple, not APPLE or AppLe
Not Case: Will block/censor words while ignoring lowercase/uppercase. apple => apple, APPLE and AppLe
Exact: Will block/censor words that are exactly the selected word. apple => apple, not applepie or pineapple
Not Exact: Will block/censor all words containing the selected word. apple => apple, applepie and pineapple
Empty: Ignores the default and set replace word and removes the word/message instead.
`; settingshtml += `
`; let settingspanel = BDFDB.htmlToElement(settingshtml); BDFDB.initElements(settingspanel, this); BDFDB.addEventListener(this, settingspanel, "keypress", ".wordInputs", e => {if (e.which == 13) this.updateContainer(settingspanel, e.currentTarget);}); BDFDB.addEventListener(this, settingspanel, "keyup", ".defaultInputs", e => {this.saveReplace(e.currentTarget);}); BDFDB.addEventListener(this, settingspanel, "click", ".btn-addword, .remove-word, .remove-all", e => {this.updateContainer(settingspanel, e.currentTarget);}); BDFDB.addEventListener(this, settingspanel, "click", BDFDB.dotCN.checkboxinput, e => {this.updateConfig(e.currentTarget);}); BDFDB.addEventListener(this, settingspanel, "click", ".toggle-info", e => {this.toggleInfo(e.currentTarget);}); return settingspanel; } //legacy load () {} start () { var libraryScript = document.querySelector('head script[src="https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"]'); if (!libraryScript || performance.now() - libraryScript.getAttribute("date") > 600000) { if (libraryScript) libraryScript.remove(); libraryScript = document.createElement("script"); libraryScript.setAttribute("type", "text/javascript"); libraryScript.setAttribute("src", "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"); libraryScript.setAttribute("date", performance.now()); libraryScript.addEventListener("load", () => { BDFDB.loaded = true; this.initialize(); }); document.head.appendChild(libraryScript); } else if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) this.initialize(); this.startTimeout = setTimeout(() => {this.initialize();}, 30000); } initialize () { if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) { if (this.started) return; BDFDB.loadMessage(this); BDFDB.WebModules.forceAllUpdates(this); } else { console.error(this.getName() + ": Fatal Error: Could not load BD functions!"); } } stop () { if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) { document.querySelectorAll(`${BDFDB.dotCN.messagemarkup}.blocked, ${BDFDB.dotCN.messageaccessory}.censored, ${BDFDB.dotCN.messagemarkup}.blocked, ${BDFDB.dotCN.messageaccessory}.censored`).forEach(message => {this.resetMessage(message);}); BDFDB.unloadMessage(this); } } // begin of own functions updateContainer (settingspanel, ele) { var wordvalue = null, replacevalue = null, action = ele.getAttribute("action"), rtype = ele.getAttribute("rtype"), words = BDFDB.loadData(rtype, this, "words") || {}; var update = () => { BDFDB.saveData(rtype, words, this, "words"); var containerhtml = ``; for (let word in words) { containerhtml += `
${BDFDB.encodeToHTML(word)} (${BDFDB.encodeToHTML(words[word].replace)})
` for (let config of this.configs) { containerhtml += `
`; } containerhtml += `
`; } containerhtml += `
`; settingspanel.querySelector("." + rtype + "-list").innerHTML = containerhtml; BDFDB.initElements(settingspanel, this); this.SettingsUpdated = true; }; if (action == "add") { var wordinput = settingspanel.querySelector("#input-" + rtype + "-wordvalue"); var replaceinput = settingspanel.querySelector("#input-" + rtype + "-replacevalue"); wordvalue = wordinput.value; replacevalue = replaceinput.value; if (wordvalue && wordvalue.trim().length > 0) { wordvalue = wordvalue.trim(); replacevalue = replacevalue.trim(); words[wordvalue] = { replace: replacevalue, empty: false, case: false, exact: true, regex: false }; wordinput.value = null; replaceinput.value = null; update(); } } else if (action == "remove") { wordvalue = ele.getAttribute("word"); if (wordvalue) { delete words[wordvalue]; update(); } } else if (action == "removeall") { BDFDB.openConfirmModal(this, "Are you sure you want to remove all added Words from your list?", () => { words = {}; update(); }); } } saveReplace (input) { var rtype = input.getAttribute("rtype"); var wordvalue = input.value; if (rtype) { var replaces = BDFDB.getData(rtype, this, "replaces"); BDFDB.saveData(rtype, wordvalue.trim(), this, "replaces"); } } updateConfig (ele) { var wordvalue = ele.getAttribute("word"); var config = ele.getAttribute("config"); var rtype = ele.getAttribute("rtype"); var words = BDFDB.loadData(rtype, this, "words") || {}; if (wordvalue && words[wordvalue] && config) { words[wordvalue][config] = ele.checked; BDFDB.saveData(rtype, words, this, "words"); } } toggleInfo (ele) { BDFDB.toggleClass(ele, BDFDB.disCN.categorywrappercollapsed); BDFDB.toggleClass(ele, BDFDB.disCN.categorywrapperdefault); var svg = ele.querySelector(BDFDB.dotCN.categoryicontransition); BDFDB.toggleClass(svg, BDFDB.disCN.directionright); BDFDB.toggleClass(svg, BDFDB.disCN.categoryiconcollapsed); BDFDB.toggleClass(svg, BDFDB.disCN.categoryicondefault); BDFDB.toggleEles(ele.nextElementSibling); BDFDB.saveData("hideInfo", BDFDB.isEleHidden(ele.nextElementSibling), this, "hideInfo"); } processMessage (instance, wrapper) { wrapper.querySelectorAll(`${BDFDB.dotCNC.messagemarkup + BDFDB.dotCN.messageaccessory}`).forEach(message => {this.hideMessage(message);}); } processStandardSidebarView (instance, wrapper) { if (this.SettingsUpdated) { delete this.SettingsUpdated; document.querySelectorAll(`${BDFDB.dotCN.messagemarkup}.blocked, ${BDFDB.dotCN.messageaccessory}.censored, ${BDFDB.dotCN.messagemarkup}.blocked, ${BDFDB.dotCN.messageaccessory}.censored`).forEach(message => {this.resetMessage(message);}); BDFDB.WebModules.forceAllUpdates(this); } } hideMessage (message) { if (message.tagName && !BDFDB.containsClass(message, "blocked", "censored", false)) { var orightml = message.innerHTML; var newhtml = ""; if (orightml) { var blocked = null; var strings = []; var count = 0; orightml.split("").forEach((chara) => { if (chara == "<") { if (strings[count]) count++; } strings[count] = strings[count] ? strings[count] + chara : chara; if (chara == ">") { count++; } }); var settings = BDFDB.getAllData(this, "settings"); var replaces = BDFDB.getAllData(this, "replaces"); var blockedWords = BDFDB.loadData("blocked", this, "words"); var blocked = false; for (let bWord in blockedWords) { var blockedReplace = blockedWords[bWord].empty ? "" : (blockedWords[bWord].replace || replaces.blocked); var reg = this.createReg(bWord, blockedWords[bWord]); strings.forEach(string => { if (this.testForEmoji(string, reg)) blocked = true; else if (string.indexOf(' 0 ? string.split('src="')[1] : null; url = url ? url.split('"')[0] : null; if (reg.test(url)) blocked = true; } else if (string.indexOf("<") != 0) { string.replace(/\n/g, " \n ").split(" ").forEach((word) => { let wordWithoutSpecial = word.replace(/[\?\¿\!\¡\.\"]/g, ""); if (word && reg.test(word) || wordWithoutSpecial && reg.test(wordWithoutSpecial)) blocked = true; }); } }); if (blocked) break; } if (blocked) { if (settings.hideMessage.blocked) BDFDB.toggleEles(message, false); newhtml = BDFDB.encodeToHTML(blockedReplace); message.innerHTML = newhtml; BDFDB.addClass(message, "blocked"); message.ChatFilterOriginalHTML = orightml; message.ChatFilterNewHTML = newhtml; this.addClickListener(message, settings.showMessageOnClick.blocked); } else { var censoredWords = BDFDB.loadData("censored", this, "words"); var censored = false; for (let cWord in censoredWords) { var censoredReplace = censoredWords[cWord].empty ? "" : (censoredWords[cWord].replace || replaces.censored); var reg = this.createReg(cWord, censoredWords[cWord]); strings.forEach((string,i) => { if (this.testForEmoji(string, reg)) { censored = true; strings[i] = BDFDB.encodeToHTML(censoredReplace); if (strings[i+1] && strings[i+1].indexOf(" 0 ? string.split('src="')[1] : null; url = url ? url.split('"')[0] : null; if (reg.test(url)) { censored = true; strings = [BDFDB.encodeToHTML(censoredReplace)]; } } else if (string.indexOf("<") != 0) { var newstring = []; string.replace(/\n/g, " \n ").split(" ").forEach((word) => { let wordWithoutSpecial = word.replace(/[\?\¿\!\¡\.\"]/g, ""); if (word && reg.test(word) || wordWithoutSpecial && reg.test(wordWithoutSpecial)) { censored = true; newstring.push(BDFDB.encodeToHTML(censoredReplace)); } else { newstring.push(word); } }); strings[i] = newstring.join(" ").replace(/ \n /g, "\n"); } }); } if (censored) { newhtml = strings.join(""); message.innerHTML = newhtml; BDFDB.addClass(message, "censored"); message.ChatFilterOriginalHTML = orightml; message.ChatFilterNewHTML = newhtml; this.addClickListener(message, settings.showMessageOnClick.censored); } } } } } createReg (word, config) { return new RegExp(BDFDB.encodeToHTML(config.exact ? "^" + BDFDB.regEscape(word) + "$" : BDFDB.regEscape(word)), config.case ? "" : "i"); } testForEmoji (string, reg) { if (string.indexOf(" -1)) { var emojiname = string.split('alt="').length > 0 ? string.split('alt="')[1].split('"')[0] : null; return emojiname = !emojiname ? false : (reg.test(emojiname) || reg.test(emojiname.replace(/:/g, ""))); } return false; } resetMessage (message) { message.innerHTML = message.ChatFilterOriginalHTML; BDFDB.removeClass(message, "blocked", "censored", "revealed"); BDFDB.toggleEles(message, true); delete message.ChatFilterOriginalHTML; delete message.ChatFilterNewHTML; message.removeEventListener("click", message.clickChatFilterListener); } addClickListener (message, addListener) { message.removeEventListener("click", message.clickChatFilterListener); if (addListener) { message.clickChatFilterListener = () => { if (BDFDB.containsClass(message, "revealed")) { BDFDB.removeClass(message, "revealed"); message.innerHTML = message.ChatFilterNewHTML; } else { BDFDB.addClass(message, "revealed"); message.innerHTML = message.ChatFilterOriginalHTML; } }; message.addEventListener("click", message.clickChatFilterListener); } } }