1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-06-28 05:15:54 +00:00
FrankerFaceZ/script.min.js

30 lines
15 KiB
JavaScript
Raw Normal View History

(function wrapper(m,s){if(s){var p=document.createElement("script");p.textContent="("+wrapper+")(window, false)";document.body.appendChild(p);document.body.removeChild(p)}else{var t=/\.([\w\-_]+)\s*?\{content:\s*?"([^"]+)";\s*?background-image:\s*?url\("([^"]+)"\);\s*?height:\s*?(\d+)px;\s*?width:\s*?(\d+)[^}]*\}/mg,r=-1!==location.search.indexOf("frankerfacez"),c=function(){this.alive=!0;this.donors={};this.getting={};this.emoticons=[];this.emotesets={};this.channels={};this.collections={};this.globals=
{};this.global_sets=[];this.styles={};this.pending_styles=[];this._log=[];this._log2=[];this.init(10)};c.prototype.last_set=0;c.prototype.last_emote=0;c.prototype.manger=null;c.prototype.has_bttv=!1;c.commands={};c.prototype.log=function(b){this._log.push(b);b="FFZ"+(this.alive?": ":" (Dead): ")+b;console.log(b);if(r){var d,a;for(a in this.channels)if(this.channels[a]&&this.channels[a].room){d=this.channels[a];break}d?d.room.addTmiMessage(b):this._log2.push(b)}};c.prototype.init=function(b,d){this.alive&&
(void 0==m.Ember||void 0==m.App||void 0==App.EmoticonsController||void 0==App.Room?6E4<=d?this.log('Twitch API not detected in "'+location.toString()+'". Aborting.'):setTimeout(this.init.bind(this,b,(d||0)+b),b):this.setup())};c.prototype.setup=function(){this.alive&&(this.log("Hooking Ember application."),this.modify_room(),this.modify_viewers(),this.modify_emotes(),this.modify_lines(),this.log("Loading data."),this.load_donors(),this.load_emotes("global"),document.body||(this.listen_dom=this.listen_dom.bind(this),
document.addEventListener("DOMContentLoaded",this.listen_dom,!1)),this.find_bttv(10),this.log("Initialization complete."))};c.prototype.destroy=function(){this.alive&&(alive=!1,m.ffz===this&&(m.ffz=void 0),delete this._log,delete this._log2)};c.prototype.listen_dom=function(){for(document.removeEventListener("DOMContentLoaded",this.listen_dom,!1);this.pending_styles.length;)document.body.appendChild(this.pending_styles.pop())};c.prototype._msg=function(b,d){if(this.has_bttv)return BetterTTV.chat.helpers.serverMessage(d.replace(/\n/g,
"<br>"));d=d.split("\n");for(var a=0;a<d.length;a++)b.addMessage({style:"ffz admin",from:"FFZ",message:d[a]})};c.prototype.run_command=function(b,d){var a=(d.substr(5)||"list").split(" "),g=a.shift().toLowerCase();this.log("Got FFZ Command: "+g+" "+JSON.stringify(a));(a=(g=c.commands[g])?g.bind(this)(b,a):"No such sub-command.")&&this._msg(b,a)};c.commands.help=function(b,d){if(d&&0<d.length){var a=c.commands[d[0].toLowerCase()];return a?a&&void 0==a.help?"No help available for: "+d[0]:a.help:"No such sub-command: "+
d[0]}var g=[];for(a in c.commands)c.commands.hasOwnProperty(a)?g.push(a):!1;return"Available sub-commands are: "+g.join(", ")};c.commands.help.help="Usage: /ffz help [command]\nList available commands, or show help for a specific command.";c.commands.log=function(b,d){var a="FrankerFaceZ Session Log\n\n"+this._log.join("\n"),a=a+"\n\n--------------------------------------------------------------------------------\nInternal State\n\nChannels:\n",g;for(g in this.channels)if(this.channels.hasOwnProperty(g)){var c=
this.channels[g];if(c){a+=" "+g+":\n";a+=" set_id: "+c.set_id+"\n";if(c.set){for(var a=a+" set:\n",f=0;f<c.set.length;f++)var e=c.set[f],a=a+(" isEmoticon: "+e.isEmoticon+", cls: "+JSON.stringify(e.cls)+", regex: "+e.regex.toString()+"\n");a+="\n"}else a+=" set (Unloaded)\n";if(c.style){e=c.style.innerHTML.split("\n");a+=" style:\n";for(f=0;f<e.length;f++)a+=" "+e[f]+"\n";a+="\n"}else a+=" style (Unloaded)"}else a+=" "+g+" (Unloaded)\n"}a+="\nGlobal Sets:\n";for(g in this.globals)if(this.globals.hasOwnProperty(g))if(f=
this.globals[g]){a+=" "+g+":\n";a+=" set_id: "+f+"\n";if(c=this.emotesets[f]){a+=" set:\n";for(f=0;f<c.length;f++)e=c[f],a+=" isEmoticon: "+e.isEmoticon+", cls: "+JSON.stringify(e.cls)+", regex: "+e.regex.toString()+"\n";a+="\n"}else a+=" set (Unloaded)\n";if(f=this.styles[g]){e=f.innerHTML.split("\n");a+=" style:\n";for(f=0;f<e.length;f++)a+=" "+e[f]+"\n";a+="\n"}else a+=" style (Unloaded)\n"}else a+=" "+g+" (Unloaded)\n";a+="\nEmotes:\n";for(f=0;f<this.emoticons.length;f++)e=
this.emoticons[f],a+=" "+e.text+" ("+e.image.id+")\n",a+=" ffzset: "+e.ffzset+" ("+e.image.emoticon_set+")\n",a+=" channel: "+e.channel+"\n",a+=" regex: "+e.regex.toString()+"\n",a+=" height: "+e.image.height+", width: "+e.image.width+"\n",a+=" url: "+e.image.url+"\n",a+=" html: "+e.image.html+"\n\n";m.open("data:text/plain,"+encodeURIComponent(a),"_blank")};c.commands.log.help="Usage: /ffz log\nOpen a window with FFZ's debugging output.";c.commands.list=function(b,d){var a=
"",g,c=this.has_bttv;d&&0<d.length&&(g=d.join(" ").toLowerCase());c&&(a+='<table style="width:100%">');for(var f in this.collections){if(!this.collections.hasOwnProperty(f))return;if(g?-1!==f.toLowerCase().indexOf(g):"FFZ Global Emotes"!==f){var a=c?a+('<thead><th colspan="2">'+f+"</th></thead><tbody>"):a+(f+"\n"),e=this.collections[f],l;for(l in e)if(e.hasOwnProperty(l)){var k=e[l],n=k.text;c?a+='<tr style="line-height:'+k.image.height+'px"><td>'+n+"</td><td>"+k.image.html+"</td></tr>":(n=n[0]+"\u200b"+
n.substr(1),a+=" "+n+" = "+k.text+"\n")}c&&(a+="</tbody>")}}c&&(a+="</table>");return-1===a.indexOf(c?"<td>":"\u200b")?"There are no available FFZ channel emoticons. If this is in error, please try the /ffz reload command.":"The following emotes are available:\n"+a};c.commands.list.help="Usage: /ffz list [global]\nList available FFZ emoticons. Use the global parameter to list ALL FFZ emoticons, or filter for a specific set.";c.commands.global=function(b,d){return c.commands.list.bind(this)(b,["global"])};
c.commands.global.help="Usage: /ffz global\nShorthand for /ffz list global. List ALL FFZ emoticons, including FFZ global emoticons.";c.commands.reload=function(b,d){for(var a in this.channels)this.channels.hasOwnProperty(a)&&this.channels[a]&&this.load_emotes(a,!0);this.load_emotes("global");this.load_donors();return"Attempting to reload FFZ data from the server."};c.commands.reload.help="Usage: /ffz reload\nAttempt to reload FFZ emoticons and donors.";c.commands.inject=function(b,d){if(!d||1!==d.length)return"/ffz inject requires exactly 1 argument.";
var a=d[0].split("/").pop().split("?").shift().split("#").shift();this._msg(b,'Attempting to load test emoticons from imgur album "'+a+'"...');var c="https://api.imgur.com/3/album/"+a;m.localStorage&&localStorage.removeItem("ffz_"+c);this.get(c,this.do_imgur.bind(this,b,a),1,{Accept:"application/json",Authorization:"Client-ID e48d122e3437051"},5)};c.commands.inject.help="Usage: /ffz inject [album-id]\nLoads emoticons from an imgur album for testing. album-id can simply be the album URL. Ex: /ffz inject http://imgur.com/a/v4aZr";
c.prototype.do_imgur=function(b,d,a){if(void 0===a)return this._msg(b,"An error occurred communicating with Imgur.");if(!a)return this._msg(b,"The named album does not exist or is private.");a=JSON.parse(a).data;a=a.images;for(var g="",h=0;h<a.length;h++){var f=a[h],e=f.title?f.title:d+(h+1),l=18<f.height?(f.height-18)/-2:0,k=f.description?f.description.trim().split(/(?:\W*\n\W*)+/):void 0,n="";if(k)for(var q=0;q<k.length;q++)if("css: "===k[q].substr(0,5).toLowerCase()){n=k[q].substr(5);break}g+=
".imgur-"+d+"-"+(h+1)+' {content: "'+e+'"; background-image: url("'+f.link+'"); height: '+f.height+"px; width: "+f.width+"px; margin: "+l+"px 0px; "+n+"}\n"}a=this.process_css("imgur-"+d,"FFZ Global Emotes - Imgur Album: "+d,g);this._msg(b,"Loaded "+a+" emoticons from Imgur.");this._msg(b,c.commands.list.bind(this)(b,[d]))};c.prototype.find_bttv=function(b,d){if(this.alive){if(m.BTTVLOADED)return this.setup_bttv();void 0===d&&this.log("BetterTTV not yet loaded. Waiting...");6E4<=d?this.log('BetterTTV not detected in "'+
location.toString()+'". Giving up.'):setTimeout(this.find_bttv.bind(this,b,(d||0)+b),b)}};var u={type:"ffz-donor",name:"",description:"FFZ Donor"};c.prototype.setup_bttv=function(){this.log("BetterTTV was detected. Installing hook.");this.has_bttv=!0;var b=BetterTTV.chat.templates.privmsg,d=this;BetterTTV.chat.templates.privmsg=function(a,c,h,f,e){if(d.check_donor(e.sender)){var l=_.defaults({},u);BetterTTV.settings.get("alphaTags")&&(l.type+=" alpha");for(var k=!1,n=0;n<e.badges.length;n++){var q=
e.badges[n].type;if("turbo"==q||"subscriber"==q){e.badges.insertAt(n,l);k=!0;break}}k||e.badges.push(l)}return b(a,c,h,f,e)}};c.prototype.add_badge=function(b,d){if(this.check_donor(b)){var a=document.createElement("span");a.className="badge-container tooltip";a.setAttribute("title","FFZ Donor");var c=document.createElement("div");c.className="badge ffz-donor";a.appendChild(c);a.appendChild(document.createTextNode(" "));c=d.find(".badge-container").filter(function(a){a=this.title.toLowerCase();return"subscriber"==
a||"turbo"==a}).first();c.length?c.before(a):d.append(a)}};c.prototype.modify_lines=function(){var b=this;App.LineView.reopen({didInsertElement:function(){this._super();b.add_badge(this.get("context.model.from"),this.$(".badges"))}})};c.prototype._modify_room=function(b){var d=this;b.reopen({init:function(){this._super();d.alive&&d.add_channel(this.id,this)},willDestroy:function(){this._super();d.alive&&d.remove_channel(this.id)},send:function(a){if(!d.alive||"/ffz "!=a.substr(0,5)&&"/ffz"!=a)return this._super(a);
this.set("messageToSend","");d.run_command(this,a)}})};c.prototype.modify_room=function(){this._modify_room(App.Room);var b=App.Room.instances,d;for(d in b)if(b.hasOwnProperty(d)){var a=b[d];this.alive&&this.add_channel(a.id,a);a.tmiRoom&&this.alive?this.alter_tmi(a.id,a.tmiRoom):a.viewers&&this._modify_viewers(a.viewers);this._modify_room(a)}};c.prototype._modify_viewers=function(b){var d=this;b.reopen({tmiRoom:Ember.computed(function(a,b){1<arguments.length&&(this.tmiRoom=b,d.alive&&d.alter_tmi(this.id,
b))})})};c.prototype.modify_viewers=function(){this._modify_viewers(App.Room.Viewers)};c.prototype._modify_emotes=function(b){var d=this;b.reopen({_emoticons:b.emoticons||[],init:function(){this._super();d.alive&&d.get_manager(this)},emoticons:Ember.computed(function(a,b){1<arguments.length&&(this._emoticons=b,d.log("Twitch standard emoticons loaded."));return d.alive?_.union(this._emoticons,d.emoticons):this._emoticons})})};c.prototype.modify_emotes=function(){this._modify_emotes(App.EmoticonsController);
var b=App.__container__.lookup("controller:emoticons");b&&(this._modify_emotes(b),this.get_manager(b))};c.prototype.get_manager=function(b){this.manager=b;for(var d in this.emotesets)this.emotesets.hasOwnProperty(d)&&(b.emoticonSets[d]=this.emotesets[d])};c.prototype.add_channel=function(b,d){if(this.alive){this.log("Registered channel: "+b);this.channels[b]={id:b,room:d,tmi:null,style:null};if(0<this._log2.length)for(var a=this.has_bttv?BetterTTV.chat.helpers.serverMessage:d.addTmiMessage;this._log2.length;)a(this._log2.shift());
this.load_emotes(b)}};c.prototype.remove_channel=function(b){var d=this.channels[b];d&&(this.log("Removing channel: "+b),this.unload_emotes(b),d.tmi&&delete d.tmi.getEmotes,this.channels[b]=!1)};c.prototype.alter_tmi=function(b,d){var a=this.channels[b],c=this;if(a&&this.alive&&!a.tmi){a.tmi=d;var h=d.__proto__.getEmotes.bind(d);d.getEmotes=function(b){return _.union([a.set_id],c.global_sets,h(b)||[])}}};c.prototype.load_emotes=function(b,d){var a=/^_(.+)_\d+$/.exec(b),c=b;null!=a&&(c=a[1]);this.get("//cdn.frankerfacez.com/channel/"+
c+".css",this.process_css.bind(this,b,void 0),d?1:108E5)};c.prototype.process_css=function(b,d,a){if(!this.alive||void 0===a)return 0;this.unload_emotes(b);if(null==a)return 0;var c=this.channels[b];if(!1!==c){var h=--this.last_set,f=[],e=document.createElement("style");c?(c.set_id=h,c.set=f,c.style=e,d="FFZ Channel Emotes: "+b):(this.globals[b]=h,this.global_sets.push(h),this.styles[b]=e,d||(d="FFZ Global Emotes"+("global"!=b?": "+b:"")));this.emotesets[h]=f;this.manager&&(this.manager.emoticonSets[h]=
f);e.type="text/css";e.innerHTML=a;document.body?document.body.appendChild(e):this.pending_styles.push(e);var l=0,k=this,n=this.collections[d]=[];a.replace(t,function(a,c,e,g,m,p){m=parseInt(m);p=parseInt(p);g={emoticon_set:h,height:m,width:p,url:g,html:'<span class="'+c+' emoticon" title="'+e+'"></span>',id:--k.last_emote};a="!"===e[e.length-1]?new RegExp("\\b"+e+"(?=\\W|$)","g"):new RegExp("\\b"+e+"\\b","g");e={image:g,images:[g],text:e,channel:d,hidden:!1,regex:a,ffzset:b};n.push(e);k.emoticons.push(e);
f.push({isEmoticon:!0,cls:c,regex:a});l++});this.log("Loaded "+l+" emotes from collection: "+b);return l}};c.prototype.unload_emotes=function(b){if(this.alive){var d=this.channels[b],a,c,h;if(!1!==d){d?(a=d.set_id,c=d.style,h="FFZ Channel Emotes: "+b,delete d.set,delete d.set_id,delete d.style):(a=this.globals[b],c=this.styles[b],h="FFZ Global Emotes"+("global"!=b?": "+b:""),delete this.globals[b],delete this.styles[b],d=this.global_sets.indexOf(a),-1!==d&&this.global_sets.splice(d,1));this.collections[h]&&
delete this.collections[h];if(c)try{c.parentNode.removeChild(c)}catch(f){}delete this.emotesets[a];this.manager&&delete this.manager.emoticonSets[a];this.emoticons=this.emoticons.filter(function(a){return a.ffzgroup!==b})}}};c.prototype.check_donor=function(b){return this.donors[b]||!1};c.prototype.load_donors=function(b){this.get("//cdn.frankerfacez.com/scripts/donors.txt",this.process_donors.bind(this),b?1:108E5)};c.prototype.process_donors=function(b){if(this.alive){this.donors={};var d=0;if(null!=
b){b=b.trim().split(/\W+/);for(var a=0;a<b.length;a++)this.donors[b[a]]=!0;d+=b.length}this.log("Loaded "+d+" donors.")}};c.prototype.get=function(b,d,a,c,h){if(this.alive)if(this.getting[b])this.log("Already getting resource: "+b);else{this.getting[b]=!0;h=h||10;var f=0,e=(new Date).getTime();if(m.localStorage){var l=localStorage.getItem("ffz_"+b);if(null!=l){this.log("Found resource in localStorage: "+b);try{d(JSON.parse(l))}catch(k){this.log("Error in callback: "+k)}f=parseInt(localStorage.getItem("ffz_age_"+
b)||0)}}r||!f||void 0!==a&&null!==a&&e-f>a?(this.log("Resource expired. Fetching: "+b),this.do_get(b,d,0,c,h)):this.getting[b]=!1}};c.prototype.do_get=function(b,d,a,c,h){function f(){var e=(a||0)+1;if(!h||e<=h)return setTimeout(k.do_get.bind(k,b,d,e,c,h),1E3),!0}if(this.alive){var e=new XMLHttpRequest;e.open("GET",b);if(c)for(var l in c)c.hasOwnProperty(l)&&e.setRequestHeader(l,c[l]);var k=this;e.addEventListener("error",function(a){if(!f()){k.getting[b]=!1;try{d(void 0)}catch(c){k.log("Error in callback: "+
c)}}},!1);e.addEventListener("load",function(a){if(200===e.status){if(a=e.responseText,m.localStorage){var c=localStorage.getItem("ffz_last_"+b),g=e.getResponseHeader("Last-Modified");if(c&&c==g){k.log("Resource not modified: "+b);localStorage.setItem("ffz_age_"+b,(new Date).getTime());k.getting[b]=!1;return}localStorage.setItem("ffz_last_"+b,g)}}else{if(304===e.status){k.log("Resource not modified: "+b);m.localStorage&&localStorage.setItem("ffz_age_"+b,(new Date).getTime());k.getting[b]=!1;return}if(404===
e.status)a=null;else{if(f())return;a=void 0}}m.localStorage&&void 0!==a&&(localStorage.setItem("ffz_"+b,JSON.stringify(a)),localStorage.setItem("ffz_age_"+b,(new Date).getTime()));k.getting[b]=!1;try{d(a)}catch(h){k.log("Error in callback: "+h)}},!1);e.send()}else this.getting[b]=!1};m.ffz=new c}})(this.unsafeWindow||window,window.chrome?!0:!1);