forked from jpgohlke/twitch-chat-filter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchat_filter.min.js
1 lines (1 loc) · 12.6 KB
/
chat_filter.min.js
1
(function(){"use strict";function s(e,t){for(var n=0;n<e.length;n++){t(e[n],n,e)}}function o(e,t){for(var n=0;n<e.length;n++){if(t(e[n]))return true}return false}function u(e,t){for(var n=0;n<e.length;n++){if(!t(e[n]))return false}return true}function a(e,t){for(var n in e){if(Object.prototype.hasOwnProperty.call(e,n)){t(n,e[n])}}}function f(e,t){e=e.toLowerCase();return e.indexOf(t.toLowerCase())>=0}function c(e){l.push(e)}function h(){s(l,function(e){e()})}function v(e){s(p,function(t){if(!(t in e)){throw new Error("Missing param "+t)}});a(e,function(e){if(p.indexOf(e)<0&&d.indexOf(e)<0){throw new Error("Unexpected param "+e)}});var t=this;a(e,function(e,n){t[e]=n});this._value=null;this._observers=[]}function E(e){var t=new v(e);m.push(t);g[t.name]=t;if(t.message_filter){y.push(t)}if(t.message_css){w.push(t)}if(t.message_rewriter){b.push(t)}}function S(e){return g[e].getValue()}function C(e){var t=window.localStorage.getItem(e);return t?JSON.parse(t):null}function k(e,t){window.localStorage.setItem(e,JSON.stringify(t))}function L(){var e={};var t=C(T);if(t){a(g,function(n){s(["filters","rewriters","stylers"],function(r){if(t[r].indexOf(n)>=0){e[n]=true}})})}var n=C(N);if(n){e["TppBanCustomWords"]=true;e["TppBannedWords"]=n}return e}function A(){var e;if(window.localStorage){e=C(x)||L()}else{e={}}a(g,function(t,n){if(t in e){n.setValue(e[t])}else{n.setValue(null)}})}function O(){if(!window.localStorage)return;var e={};a(g,function(t,n){if(n._value!==null){e[t]=n._value}});k(x,e);localStorage.removeItem(T);localStorage.removeItem(N)}function B(e){i("head").append("<style>"+e.join("")+"</style>")}function I(e,t){if(e.length===0)return t.length;if(t.length===0)return e.length;var n=[];var r,i;for(r=0;r<=t.length;r++){n[r]=[r]}for(i=0;i<=e.length;i++){n[0][i]=i}for(r=1;r<=t.length;r++){for(i=1;i<=e.length;i++){if(t.charAt(r-1)===e.charAt(i-1)){n[r][i]=n[r-1][i-1]}else{n[r][i]=1+Math.min(n[r-1][i-1],n[r][i-1],n[r-1][i])}}}return n[t.length][e.length]}function q(e){return o(j,function(t){return I(t.toLowerCase(),e.toLowerCase())<=F})}function R(e){if(/^([0-9]+),([0-9]+)$/.test(e.replace(/\s/g,""))){return true}return u(e.split(/\s+/),function(e){if(e.length<=0){return true}var t=e.match(/(?:([a-z]+)[^a-z]{0,2})+/ig);return t&&u(t,function(e){var t=e.match(/[a-z]+/ig);return u(t,q)})})}function z(e){var t=0;s(U,function(n){if(f(e,n)){t++}});return t>=2}function W(e){var t=0;for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(9600<=r&&r<=9632){t++}}return t>3}function X(e){return/[\u0400-\u04FF]/.test(e)}function $(e){var t=0;for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(V.indexOf(r)>=0){t++}}return t>1}function J(e){return e.split(/\s/g).length<=1}function K(e){return e.length>=200}function Q(e){return/^\s*\!/.test(e)}function G(e){return e.replace(/(.{4}.*?)(\s*?\1)+/g,"$1")}function Y(e){return e.replace(/[\u0300-\u036F]/g,"")}function et(e){var t=e;s(Z,function(e){t=t.replace(e,"")});return/^\s*$/.test(t)}function tt(e){var t=S("TppBanCustomWords");var n=S("TppBannedWords");return t&&o(n,function(t){return f(e,t)})}function rt(e){return u(y,function(t){return!(t.getValue()&&t.message_filter(e))})}function it(e){var t=e;s(b,function(e){if(e.getValue()){t=e.message_rewriter(t)||t}});return t}function ht(e){var t=Date.now();at=t;lt=ft;ft={text:e,time:t}}function pt(){ft=lt;lt=null}function dt(e){var t;if(/now in slow mode/.test(e)){t=/(\d+) second/.exec(e);if(t){if(ot==Number(t[1]))return false;ot=Number(t[1])}}if(/identical to the previous/.test(e)){t=/than (\d+) second/.exec(e);if(t){ut=Number(t[1])}pt()}if(/you are sending messages too quickly/.test(e)){t=/in (\d+) second/.exec(e);if(t){var n=Number(t[1]);var r=Date.now()-ft.time+1e3*n;ot=Math.ceil(r/1e3)}pt()}if(/You are banned/.test(e)){t=/for (\d+) more second/.exec(e);if(t){var i=Number(t[1]);ct=Date.now()+1e3*i}pt()}wt();return true}function vt(e){var t=Date.now();if(ct){var n=ct-t;if(n>0){return{blocked:true,error:"you are banned",wait:n}}}if(ft){var r=at+st-t;if(r>0){return{blocked:true,error:"",wait:null}}if(e===ft.text){var i=ft.time+1e3*ut-t;if(i>0){return{blocked:true,error:"repeated message",wait:i}}}var s=ft.time+1e3*ot-t;if(s>0){return{blocked:true,error:"slowmode",wait:s}}}return{blocked:false}}function wt(){var e=i(P).val();var t=vt(e);var n=i(H);if(S("TppSlowmodeHelper")&&t.blocked){var r;if(t.error){r="Wait "+Math.ceil(t.wait/1e3)+" seconds ("+t.error+")"}else{r="..."}n.addClass(gt);n.text(r);bt=false}else{if(!bt){n.removeClass(gt);n.text(yt);bt=true}}}var e="2.6";var t="TPP Chat Filter version "+e+" loaded. Please report bugs and suggestions to https://github.com/jpgohlke/twitch-chat-filter";var n;try{n=unsafeWindow}catch(r){n=window}var i=n.jQuery;var l=[];var p=["name","comment","category","defaultValue"];var d=["longComment","message_filter","message_css","message_rewriter"];v.prototype.getValue=function(){if(this._value!==null){return this._value}else{return this.defaultValue}};v.prototype.setValue=function(e){var t=this.getValue();this._value=e;var n=this.getValue();s(this._observers,function(e){e(n,t)})};v.prototype.reset=function(){this.setValue(null)};v.prototype.observe=function(e){this._observers.push(e)};v.prototype.forceObserverUpdate=function(){var e=this.getValue();s(this._observers,function(t){t(e,e)})};var m=[];var g={};var y=[];var b=[];var w=[];var x="tpp-chat-filter-settings";var T="tpp-custom-filter-active";var N="tpp-custom-filter-phrases";c(function(){s(m,function(e){e.observe(function(){O()})})});var M=".chat-room";var _=".message";var D=".chat-line";var P=".chat-interface textarea";var H=".send-chat-button button";var j=["left","right","up","down","start","select","a","b","l","r","democracy","anarchy","wait"];var F=2;E({name:"TppFilterCommand",comment:"Emulator commands",longComment:j.join(", "),category:"filters_category",defaultValue:true,message_filter:R});var U=["misty","whitney","milk","guys","we have to","we need to","beat"];E({name:"TppFilterMisty",comment:"Misty meme",longComment:"Guys we need to milk Witney",category:"filters_category",defaultValue:true,message_filter:z});E({name:"TppFilterAscii",comment:"Blocky Drawings",longComment:"Stuff like this: ¦¦¦¦¦¦¦¦¦ ¯¦¯¦_¦",category:"filters_category",defaultValue:true,message_filter:W});E({name:"TppFilterCyrillic",comment:"Cyrillic",longComment:"Cyrillic characters in copypastas confuse our other filters",category:"filters_category",defaultValue:true,message_filter:X});var V=[3720,9685,664,8362,3232,176,8248,8226,7886,3237];E({name:"TppFilterDonger",comment:"Dongers",longComment:"????????",category:"filters_category",defaultValue:false,message_filter:$});E({name:"TppFilterSmall",comment:"One-word messages",category:"filters_category",defaultValue:false,message_filter:J});E({name:"TppFilterLong",comment:"Overly long messages",longComment:"Hide messages over 200 characters (around 4 lines)",category:"filters_category",defaultValue:false,message_filter:K});E({name:"TppFilterBets",comment:"Pokemon Stadium Bets",longComment:'Any message starting with a "!". ex.: "!bet 100 blue"',category:"filters_category",defaultValue:true,message_filter:Q});E({name:"TppRewriteDuplicates",comment:"Copy pasted repetitions",category:"rewriters_category",defaultValue:true,message_rewriter:G});E({name:"TppMopUpDrinks",comment:"Mop up spilled drinks",category:"rewriters_category",defaultValue:true,message_rewriter:Y});E({name:"TppConvertAllcaps",comment:"Lowercase everything",longComment:null,category:"visual_category",defaultValue:true,message_css:_+"{text-transform:lowercase !important;}"});var Z=[];c(function(){if(n.Twitch){n.Twitch.api.get("chat/emoticons").then(function(e){s(e.emoticons,function(e){var t=e.regex;if(t.match(/^\w+$/)){t="\\b"+t+"\\b"}Z.push(new RegExp(t,"g"))})})}});E({name:"TppHideEmoticons",comment:"Hide emoticons",category:"visual_category",defaultValue:false,message_css:_+" .emoticon{display:none !important;}",message_filter:et});E({name:"TppNoColor",comment:"Uncolor messages",longComment:"Remove color from messages created with the /me command",category:"visual_category",defaultValue:false,message_css:_+" {color:inherit !important;}"});E({name:"TppBanCustomWords",comment:"Activate custom banlist",longComment:"",category:"customs_category",defaultValue:false,message_css:"#menu-TppBannedWords { display:inherit; }"});c(function(){B(["#menu-TppBannedWords { display:none; }"])});E({name:"TppBannedWords",comment:"Banned Phrases",longComment:"If the custom banlist is activated, these messages will be hidden",category:"customs_category",defaultValue:[],message_filter:tt});var nt=".chat-settings";c(function(){function r(){var n=t.height();if(n>0){e.css("max-height",.9*n)}}function o(e,t){e.append(i("<label>").attr("for",t.name).attr("title",t.longComment||"").append(i('<input type="checkbox">').attr("id",t.name)).append(document.createTextNode(" "+t.comment)));var n=i("#"+t.name);n.on("change",function(){t.setValue(i(this).prop("checked"))});t.observe(function(e){n.prop("checked",e)})}function u(e,t){function n(e){var n=t.getValue().slice();if(n.indexOf(e)<0){n.push(e);t.setValue(n)}}function r(e){var n=t.getValue().slice();n.splice(e,1);t.setValue(n)}function o(){i("#show-"+t.name).show();i("#hide-"+t.name).hide();i("#clear-"+t.name).hide();i("#list-"+t.name).hide()}function u(){i("#show-"+t.name).hide();i("#hide-"+t.name).show();i("#clear-"+t.name).show();i("#list-"+t.name).show()}e.append(i("<label>").attr("for",t.name).attr("title",t.longComment||"").append(document.createTextNode("Add "+t.comment)).append(i('<input type="text">').attr("id",t.name).css("width","100%"))).append(i("<button>").attr("id","show-"+t.name).append(document.createTextNode("Show ")).append(i("<span>").attr("id","num-banned-"+t.name)).append(document.createTextNode(" "+t.comment))).append(i("<button>").attr("id","hide-"+t.name).append(document.createTextNode("Hide "+t.comment))).append(i('<div class="custom_list_menu">').attr("id","list-"+t.name)).append(i("<button>").attr("id","clear-"+t.name).append(document.createTextNode("Clear "+t.comment)));o();t.observe(function(e){i("#num-banned-"+t.name).text(e.length);var n=i("#list-"+t.name);n.empty();s(e,function(e,t){n.append(i("<li>").text(e).append(i('<a href="#">').text("[X]").click(function(){r(t)})))})});i("#"+t.name).keyup(function(e){var t=i(this).val().trim();if(e.keyCode===13&&t!==""){n(t);i(this).val("")}});i("#show-"+t.name).click(function(e){e.preventDefault();u()});i("#hide-"+t.name).click(function(e){e.preventDefault();o()});i("#clear-"+t.name).click(function(e){e.preventDefault();t.setValue([])})}function a(t){i('<div class="chat-menu-header"/>').text(t).appendTo(e);var n=i('<div class="chat-menu-content">').appendTo(e);return n}function f(e,t){s(m,function(n){if(n.category!==t)return;var r=i("<p>").attr("id","menu-"+n.name).addClass("dropmenu_action").appendTo(e);var s=typeof n.defaultValue;if(s==="boolean"){o(r,n)}else if(s==="object"){u(r,n)}else{throw new Error("Unrecognized setting "+s)}})}B([".chat-room { z-index: inherit !important; }",".chat-settings { z-index: 100 !important; }",".custom_list_menu li {background: #bbb; display: block; list-style: none; margin: 1px 0; padding: 0 2px}",".custom_list_menu li a {float: right;}"]);var e=i(nt);var t=i(M);e.css("overflow-y","auto");r();setInterval(r,500);i(window).resize(r);var l=a("Hide");f(l,"filters_category");var c=a("Automatically rewrite");f(c,"rewriters_category");var h=a("Visual tweaks");f(h,"visual_category");var p=a("Custom Banlist");f(p,"customs_category");var d=a("Misc");d.append(i("<button>Reset TPP filter settings</a>").click(function(){if(n.confirm("This will reset all Twitch Chat Filter settings to their default values and will delete all custom banned phrases. Are you sure you want to continue?")){s(m,function(e){e.reset()})}}))});c(function(){var e=[];s(w,function(t){e.push(M+"."+t.name+" "+t.message_css)});B(e);s(w,function(e){e.observe(function(t){i(M).toggleClass(e.name,t)})})});c(function(){s(m,function(e){e.observe(function(){i(D).each(function(){var e=i(this);var t=e.find(_).text().trim();e.toggle(rt(t))})})})});var st=1e3;var ot=2;var ut=30;var at=null;var ft=null;var lt=null;var ct=null;var mt=500;var gt="tpp-slowmode-warning";var yt=null;var bt=true;c(function(){yt=i(H).text();B(["."+gt+"{ opacity:0.7 !important}"]);i(P).keyup(function(e){if(e.keyCode!==13){wt()}});setInterval(function(){wt()},mt)});E({name:"TppSlowmodeHelper",comment:"Slowmode Helper",longComment:"Shows a countdown of how long you need to wait until being able to chat again",category:"visual_category",defaultValue:true});c(function(){var e=n.App.Room.prototype;var t=e.addMessage;e.addMessage=function(e){if(e.style==="admin"){if(!dt(e.message)){return false}}else{e.message=it(e.message);if(!rt(e.message)){return false}}return t.apply(this,arguments)};var r=e.send;e.send=function(e){ht(e);return r.apply(this,arguments)}});i(function(){h();A();console.log(t)})})()