1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-06-28 23:37:41 +00:00
FrankerFaceZ/script.min.js

6 lines
162 KiB
JavaScript
Raw Normal View History

2015-07-04 17:06:36 -04:00
!function(e){!function t(e,s,o){function n(a,r){if(!s[a]){if(!e[a]){var d="function"==typeof require&&require;if(!r&&d)return d(a,!0);if(i)return i(a,!0);throw new Error("Cannot find module '"+a+"'")}var u=s[a]={exports:{}};e[a][0].call(u.exports,function(t){var s=e[a][1][t];return n(s?s:t)},u,u.exports,t,e,s,o)}return s[a].exports}for(var i="function"==typeof require&&require,a=0;a<o.length;a++)n(o[a]);return n}({1:[function(t){var s=e.FrankerFaceZ,o=t("./constants"),n=t("./utils");s.settings_info.show_badges={type:"boolean",value:!0,category:"Chat",name:"Additional Badges",help:"Show additional badges for bots, FrankerFaceZ donors, and other special users."},s.prototype.setup_badges=function(){this.log("Preparing badge system."),this.badges={},this.log("Creating badge style element.");var e=this._badge_style=document.createElement("style");e.id="ffz-badge-css",document.head.appendChild(e),this.log("Adding legacy donor badges."),this._legacy_add_donors()},s.ws_commands.reload_badges=function(){this._legacy_load_bots(),this._legacy_load_donors()},s.ws_commands.set_badge=function(e){var t=e[0],s=e[1],o=e[2],n=this.users[t]=this.users[t]||{},i=n.badges=n.badges||{};void 0===o||null===o?delete i[s]:i[s]=o};var i=function(e){return".badges .ffz-badge-"+e.id+" { background-color: "+e.color+'; background-image: url("'+e.image+'"); '+(e.extra_css||"")+"}"};s.prototype.bttv_badges=function(e){if(this.settings.show_badges){var t=e.sender,s=this.users[t],o=[],n=-1,i=BetterTTV.settings.get("alphaTags");if(s&&s.badges){e.badges||(e.badges=[]);for(var a=0;a<e.badges.length;a++){var r=e.badges[a];if("subscriber"==r.type||"turbo"==r.type){n=a;break}}for(var d in s.badges)if(s.badges.hasOwnProperty(d)){var r=s.badges[d],u=this.badges[r.id]||{},c=r.title||u.title,l="";if(void 0!==u.visible){var h=u.visible;if("function"==typeof h&&(h=h.bind(this)(null,t)),!h)continue}if(u.replaces){for(var f=!1,a=0;a<e.badges.length;a++){var _=e.badges[a];if(_.type==u.replaces){_.type="ffz-badge-replacement "+_.type,_.description+=", "+(r.title||u.title)+'" style="background-image: url(&quot;'+(r.image||u.image)+"&quot;)",f=!0;break}}if(f)continue}r.image&&(l+="background-image: url(&quot;"+r.image+"&quot;); "),r.color&&!i&&(l+="background-color: "+r.color+"; "),r.extra_css&&(l+=r.extra_css),l&&(c+='" style="'+l),o.push([(-1==n?1:-1)*d,{type:"ffz-badge-"+r.id+(i?" alpha":""),name:"",description:c}])}if(o.sort(function(e,t){return e[0]-t[0]}),-1==n)for(;o.length;)e.badges.push(o.shift()[1]);else for(;o.length;)e.badges.insertAt(n,o.shift()[1])}}},s.prototype.render_badge=function(e){if(this.settings.show_badges){var t=e.get("msgObject.from"),s=App.__container__.lookup("controller:chat").get("currentRoom.id"),o=e.$(".badges"),n=this.users[t];if(n&&n.badges){if(!o.length){var i=document.createElement("span"),a=e.$(".from");if(i.className="badges float-left",!a)return;a.before(i),o=$(i)}var r=o.find(".badge").filter(function(){var e=this.title.toLowerCase();return"subscriber"==e||"turbo"==e}).first(),d=[],u=!!r.length;for(var c in n.badges)if(n.badges.hasOwnProperty(c)){var l=n.badges[c],h=this.badges[l.id]||{};if(void 0!==h.visible){var f=h.visible;if("function"==typeof f&&(f=f.bind(this)(s,t)),!f)continue}if(h.replaces){var _=o[0].querySelector(".badge."+h.replaces);if(_){_.style.backgroundImage='url("'+(l.image||h.image)+'")',_.classList.add("ffz-badge-replacement"),_.title+=", "+(l.title||h.title);continue}}var _=document.createElement("div");_.className="badge float-left tooltip ffz-badge-"+l.id,_.setAttribute("title",l.title||h.title),l.image&&(_.style.backgroundImage='url("'+l.image+'")'),l.color&&(_.style.backgroundColor=l.color),l.extra_css&&(_.style.cssText+=l.extra_css),d.push([(u?1:-1)*c,_])}if(d.sort(function(e,t){return e[0]-t[0]}),u)for(;d.length;)r.before(d.shift()[1]);else for(;d.length;)o.append(d.shift()[1])}}},s.bttv_known_bots=["nightbot","moobot","sourbot","xanbot","manabot","mtgbot","ackbot","baconrobot","tardisbot","deejbot","valuebot","stahpbot"],s.prototype._legacy_add_donors=function(){this.badges[0]={id:0,title:"FFZ Developer",co
}}},{"../constants":3,"../utils":30}],6:[function(t){var s=e.FrankerFaceZ,o=t("../utils"),n=t("../constants"),i=function(e){return 1>e?"":e>=99?"99+":""+e};s.settings_info.minimal_chat={type:"boolean",value:!1,category:"Chat",name:"Minimalistic Chat",help:"Hide all of the chat user interface, only showing messages and an input box.",on_update:function(e){if(document.body.classList.toggle("ffz-minimal-chat",e),this.settings.group_tabs&&this._chatv&&this._chatv._ffz_tabs){var t=this;setTimeout(function(){t._chatv&&t._chatv.$(".chat-room").css("top",t._chatv._ffz_tabs.offsetHeight+"px")},0)}}},s.settings_info.prevent_clear={type:"boolean",value:!1,no_bttv:!0,category:"Chat Moderation",name:"Show Deleted Messages",help:"Fade deleted messages instead of replacing them, and prevent chat from being cleared.",on_update:function(e){if(!this.has_bttv&&this.rooms)for(var t in this.rooms){var s=this.rooms[t],o=s&&s.room;o&&o.get("messages").forEach(function(t,s){e&&!t.ffz_deleted&&t.deleted?o.set("messages."+s+".deleted",!1):!t.ffz_deleted||e||t.deleted||o.set("messages."+s+".deleted",!0)})}}},s.settings_info.chat_history={type:"boolean",value:!0,visible:!1,category:"Chat",name:"Chat History <span>Alpha</span>",help:"Load previous chat messages when loading a chat room so you can see what people have been talking about. <b>This currently only works in a handful of channels due to server capacity.</b>"},s.settings_info.group_tabs={type:"boolean",value:!1,no_bttv:!0,category:"Chat",name:"Chat Room Tabs <span>Beta</span>",help:"Enhanced UI for switching the current chat room and noticing new messages.",on_update:function(e){var t=!this.has_bttv&&e;this._chatv&&t!==this._group_tabs_state&&(t?this._chatv.ffzEnableTabs():this._chatv.ffzDisableTabs())}},s.settings_info.pinned_rooms={type:"button",value:[],category:"Chat",visible:!1,name:"Pinned Chat Rooms",help:"Set a list of channels that should always be available in chat."},s.prototype.setup_chatview=function(){document.body.classList.toggle("ffz-minimal-chat",this.settings.minimal_chat),this.log("Hooking the Ember Chat controller.");var e=App.__container__.lookup("controller:chat"),t=this;e&&e.reopen({ffzUpdateChannels:function(){t.settings.group_tabs&&t._chatv&&t._chatv.ffzRebuildTabs()}.observes("currentChannelRoom","connectedPrivateGroupRooms"),removeCurrentChannelRoom:function(){if(!t.settings.group_tabs||t.has_bttv)return this._super();var e=this.get("currentChannelRoom"),s=e&&e.get("id");t.settings.pinned_rooms&&-1!==t.settings.pinned_rooms.indexOf(s)||(e===this.get("currentRoom")&&this.blurRoom(),e&&e.destroy()),this.set("currentChannelRoom",void 0)}}),this.log("Hooking the Ember Chat view.");var e=App.__container__.resolve("view:chat");this._modify_cview(e);try{e.create().destroy()}catch(s){}for(var o in Ember.View.views)if(Ember.View.views.hasOwnProperty(o)){var n=Ember.View.views[o];if(n instanceof e){this.log("Manually updating existing Chat view.",n);try{n.ffzInit()}catch(s){this.error("setup: build_ui_link: "+s)}}}this.log("Hooking the Ember Layout controller.");var i=App.__container__.lookup("controller:layout");if(i){i.reopen({ffzFixTabs:function(){t.settings.group_tabs&&t._chatv&&t._chatv._ffz_tabs&&setTimeout(function(){t._chatv&&t._chatv.$(".chat-room").css("top",t._chatv._ffz_tabs.offsetHeight+"px")},0)}.observes("isRightColumnClosed")}),this.log("Hooking the Ember 'Right Column' controller. Seriously...");var a=App.__container__.lookup("controller:right-column");a&&a.reopen({ffzFixTabs:function(){t.settings.group_tabs&&t._chatv&&t._chatv._ffz_tabs&&setTimeout(function(){t._chatv&&t._chatv.$(".chat-room").css("top",t._chatv._ffz_tabs.offsetHeight+"px")},0)}.observes("firstTabSelected")})}},s.prototype._modify_cview=function(e){var t=this;e.reopen({didInsertElement:function(){this._super();try{this.ffzInit()}catch(e){t.error("ChatView didInsertElement: "+e)}},willClearRender:function(){try{this.ffzTeardown()}catch(e){t.error("ChatView willClearRender: "+e)}this._super()},ffzInit:function(){t._chatv=this,this.$(".textarea-contain").append(t.build_ui_link(this)),!t.has
var f=document.createElement("span");f.className="right",h.appendChild(f);for(var _=0;_<d.settings.mod_card_durations.length;_++)f.appendChild(l(d.settings.mod_card_durations[_]));t.appendChild(h),this.$("button.timeout").remove()}var m=t.querySelector("button.ban");d.settings.mod_card_hotkeys&&m.setAttribute("title","(B)an User");var p=document.createElement("button");p.className="unban button glyph-only light",p.innerHTML=r,p.title=(d.settings.mod_card_hotkeys?"(U)":"U")+"nban User",jQuery(p).tipsy(),p.addEventListener("click",c.bind(this,-1)),jQuery(m).after(p)}var g=t.querySelector("button.mod");if(g){var v=o.get("cardInfo.isChannelOwner"),b=ffz.get_user();can_op=v||b&&b.is_admin||b&&b.is_staff,can_op||g.parentElement.removeChild(g)}var y=t.querySelector(".interface > button");if(y&&y.classList.contains("message-button")&&(y.innerHTML=a,y.classList.add("glyph-only"),y.classList.add("message"),y.title="Whisper User",jQuery(y).tipsy()),d.settings.mod_card_history){var w=App.__container__.lookup("controller:chat"),z=w&&w.get("currentRoom"),k=z&&d.rooms&&d.rooms[z.get("id")],C=k&&k.user_history&&k.user_history[o.get("cardInfo.user.id")];if(C&&C.length){var E=document.createElement("ul"),T=!1;E.className="interface clearfix chat-history";for(var _=0;_<C.length;_++){var h=C[_],F=document.createElement("li");F.className="message-line chat-line",F.classList.toggle("ffz-alternate",T),T=!T,h.style&&F.classList.add(h.style),F.innerHTML=(s?'<span class="timestamp float-left">'+s.getTime(h.date)+"</span> ":"")+'<span class="message">'+("action"===h.style?"*"+h.from+" ":"")+d.render_tokens(h.cachedTokens)+"</span>";for(var x=F.querySelectorAll("a.deleted-link"),S=0;S<x.length;S++)x[S].addEventListener("click",d._deleted_link_click);jQuery("a",F).tipsy({html:!0}),E.appendChild(F)}t.appendChild(E),E.scrollTop=E.scrollHeight}}this.$().draggable({start:function(){t.focus()}}),t.focus()}catch(L){try{d.error("ModerationCardView didInsertElement: "+L)}catch(L){}}}})},o.chat_commands.purge=function(e,t){if(!t||!t.length)return"Purge Usage: /p username [more usernames separated by spaces]";if(t.length>10)return"Please only purge up to 10 users at once.";for(var s=0;s<t.length;s++){var o=t[s];o&&e.room.send("/timeout "+o+" 1")}},o.chat_commands.p=function(e,t){return o.chat_commands.purge.bind(this)(e,t)},o.chat_commands.p.enabled=function(){return this.settings.short_commands},o.chat_commands.t=function(e,t){return t&&t.length?void e.room.send("/timeout "+t.join(" ")):"Timeout Usage: /t username [duration]"},o.chat_commands.t.enabled=function(){return this.settings.short_commands},o.chat_commands.b=function(e,t){if(!t||!t.length)return"Ban Usage: /b username [more usernames separated by spaces]";if(t.length>10)return"Please only ban up to 10 users at once.";for(var s=0;s<t.length;s++){var o=t[s];o&&e.room.send("/ban "+o)}},o.chat_commands.b.enabled=function(){return this.settings.short_commands},o.chat_commands.u=function(e,t){if(!t||!t.length)return"Unban Usage: /u username [more usernames separated by spaces]";if(t.length>10)return"Please only unban up to 10 users at once.";for(var s=0;s<t.length;s++){var o=t[s];o&&e.room.send("/unban "+o)}},o.chat_commands.u.enabled=function(){return this.settings.short_commands}},{"../utils":30}],9:[function(t){var s=e.FrankerFaceZ,o=t("../constants"),n=t("../utils"),i=function(e){return e.moderator_badge?'.chat-line[data-room="'+e.id+'"] .badges .moderator:not(.ffz-badge-replacement) { background-image:url("'+e.moderator_badge+'") !important; }':""};s.prototype.setup_room=function(){this.rooms={},this.log("Creating room style element.");var e=this._room_style=document.createElement("style");e.id="ffz-room-css",document.head.appendChild(e),this.log("Hooking the Ember Room controller.");var t=App.__container__.lookup("controller:room");if(t){var s=t._actions.banUser,o=t._actions.timeoutUser;t._actions.banUser=function(e){s.bind(this)(e),this.get("model").clearMessages(e.user)},t._actions.timeoutUser=function(e){o.bind(this)(e),this.get("model").clearMessages(e.user)},t._actions.purgeUser=function(e){th
t=a.join(" ")}return'<span class="message" '+(n?'style="color: '+n+'" ':"")+'data-raw="'+i+'" data-emotes="'+(o?encodeURIComponent(JSON.stringify(o)):"false")+'">'+t+"</span>"}catch(d){return s.log("Error: ",d),c(e,t,o,n)}};var l=BetterTTV.chat.templates.emoticonize;BetterTTV.chat.templates.emoticonize=function(e,t){var a=l(e,t),r=i||BetterTTV.getChannel(),d=r&&r.toLowerCase(),c=u&&u.toLowerCase(),h=s.getEmotes(c,d),t=[],f=s.get_user(),m=f&&f.login===c;if(_.each(h,function(e){var o=s.emote_sets[e];o&&_.each(o.emoticons,function(e){_.any(a,function(t){return _.isString(t)&&t.match(e.regex)})&&t.push(e)})}),t.length&&_.each(t,function(e){var t=s._emote_tooltip(e),o=['<img class="emoticon" srcset="'+(e.srcSet||"")+'" src="'+e.urls[1]+'" alt="'+t+'" title="'+t+'" />'],n=a;a=[];for(var i=0;i<n.length;i++){var r=n[i];if("string"==typeof r)for(var u=r.split(e.regex);u.length;){var c=u.shift();u.length?(c+=u.shift(),c&&a.push(c),u.shift(),a.push(o),m&&d&&s.add_usage(d,e.id)):a.push(c)}else a.push(r)}}),s.settings.parse_emoji&&s.emoji_data){var p=a;a=[];for(var g=0;g<p.length;g++){var v=p[g];if("string"==typeof v)for(var b=v.split(o.EMOJI_REGEX);b.length;){var y=b.shift();if(y&&a.push(y),b.length){var w=b.shift(),z=b.shift();if(""===z)bits.push(w);else{var k=n.emoji_to_codepoint(w,z),C=s.emoji_data[k],E=w+(z||"");a.push(C?['<img class="emoticon" height="18px" srcset="'+(C.srcSet||"")+'" src="'+C.src+'" alt="'+E+'" title="Emoji: '+E+"\nName: "+C.short_name+'">']:w+(z||""))}}}else a.push(v)}}return a},this.update_ui_link()}},{"../constants":3,"../utils":30}],13:[function(){var t=e.FrankerFaceZ;t.prototype.find_emote_menu=function(t,s){return this.has_emote_menu=!1,e.emoteMenu&&emoteMenu.registerEmoteGetter?this.setup_emote_menu(s||0):void(s>=6e4?this.log("Emote Menu for Twitch was not detected after 60 seconds."):setTimeout(this.find_emote_menu.bind(this,t,(s||0)+t),t))},t.prototype.setup_emote_menu=function(e){this.log("Emote Menu for Twitch was detected after "+e+"ms. Registering emote enumerator."),emoteMenu.registerEmoteGetter("FrankerFaceZ",this._emote_menu_enumerator.bind(this))},t.prototype._emote_menu_enumerator=function(){for(var e=this.get_user(),s=e?e.login:null,o=App.__container__.lookup("controller:chat"),n=o?o.get("currentRoom.id"):null,i=this.getEmotes(s,n),a=[],r=0;r<i.length;r++){var d=this.emote_sets[i[r]];if(d&&d.emoticons)for(var u in d.emoticons)if(d.emoticons.hasOwnProperty(u)){var c=d.emoticons[u];if(!c.hidden){var l=d.title,h=d.icon||null;l=l?"FrankerFaceZ: "+l:"global"==d.id?"FrankerFaceZ Global Emotes":"globalevent"==d.id?"FrankerFaceZ Event Emotes":this.feature_friday&&d.id==this.feature_friday.set?"FrankerFaceZ "+this.feature_friday.title+": "+this.feature_friday.display_name:"FrankerFaceZ Set: "+t.get_capitalization(d.id),a.push({text:c.name,url:c.urls[1],hidden:!1,channel:l,badge:h})}}}return a}},{}],14:[function(t){var s=e.FrankerFaceZ=function(){s.instance=this,this._log_data=[],this.initialize()};s.get=function(){return s.instance};var o=s.version_info={major:3,minor:4,revision:10,toString:function(){return[o.major,o.minor,o.revision].join(".")+(o.extra||"")}};s.prototype.log=function(e,t,s,o){e="FFZ: "+e+(s?" -- "+JSON.stringify(t):""),this._log_data.push(e+(!s&&o?" -- "+JSON.stringify(t):"")),void 0!==t&&console.groupCollapsed&&console.dir?(console.groupCollapsed(e),-1!==navigator.userAgent.indexOf("Firefox/")?console.log(t):console.dir(t),console.groupEnd(e)):console.log(e)},s.prototype.error=function(e,t,s){e="FFZ Error: "+e+(s?" -- "+JSON.stringify(t):""),this._log_data.push(e),void 0!==t&&console.groupCollapsed&&console.dir?(console.groupCollapsed(e),-1!==navigator.userAgent.indexOf("Firefox/")?console.log(t):console.dir(t),console.groupEnd(e)):console.assert(!1,e)},s.prototype.paste_logs=function(){this._pastebin(this._log_data.join("\n"),function(e){return e?void console.log("FFZ: Your FrankerFaceZ log has been pasted to: "+e):console.log("FFZ Error: Unable to upload log to pastebin.")})},s.prototype._pastebin=function(e,t){jQuery.ajax({url:"http://putco.de/",type:"PUT",data:e,context:th
})?void 0:"There was an error communicating with the server."},s.ws_on_close.push(function(){var t=e.App&&App.__container__.lookup("controller:channel"),s=t&&t.get("id"),o=t&&t.get("hostModeTarget.id"),n=!1;if(this.follow_sets={},t){for(var i in this.follow_data)if(delete this.follow_data[i],(i===s||i===o)&&(n=!0),this.rooms&&this.rooms[i]&&this.rooms[i].extra_sets){var a=this.rooms[i].extra_sets;delete this.rooms[i].extra_sets;for(var r=0;r<a.length;r++){var d=this.emote_sets[a[r]];d&&(d.users.removeObject(i),this.global_sets.contains(a[r])||d.users.length||this.unload_set(a[r]))}}n&&this.rebuild_following_ui()}}),s.ws_commands.follow_buttons=function(t){var s=e.App&&App.__container__.lookup("controller:channel"),o=s&&s.get("id"),n=s&&s.get("hostModeTarget.id"),i=!1;this.follow_data=this.follow_data||{};for(var a in t)this.follow_data[a]=t[a],(a===o||a===n)&&(i=!0);i&&this.rebuild_following_ui()},s.ws_commands.follow_sets=function(e){{var t=App.__container__.lookup("controller:channel");t&&t.get("id"),t&&t.get("hostModeTarget.id")}this.follow_sets=this.follow_sets||{};for(var s in e)if(this.rooms&&this.rooms.hasOwnProperty(s)){for(var o=this.rooms[s].extra_sets||[],n=this.rooms[s].extra_sets=e[s],i=0;i<o.length;i++){var a=o[i];if(-1===n.indexOf(a)){var r=this.emote_sets&&this.emote_sets[a];r&&(r.users.removeObject(s),this.global_sets.contains(a)||r.users.length||this.unload_set(a))}}for(var i=0;i<n.length;i++){var a=n[i],r=this.emote_sets&&this.emote_sets[a];r?-1===r.users.indexOf(s)&&r.users.push(s):this.load_set(a,function(e,t){e&&t.users.push(s)})}}else this.follow_sets[s]=e[s]},s.prototype.rebuild_following_ui=function(){var e=App.__container__.lookup("controller:channel"),t=e&&e.get("id"),s=e&&e.get("hostModeTarget.id");if(this._cindex){if(t){var o=this.follow_data&&this.follow_data[t],n=this._cindex.get("element"),i=n&&n.querySelector(".stats-and-actions .channel-actions"),a=i&&i.querySelector("#ffz-ui-following");if(i&&this.settings.follow_buttons&&o&&o.length){if(a)a.innerHTML="";else{a=document.createElement("span"),a.id="ffz-ui-following";var r=i.querySelector(":scope > span");r?i.insertBefore(a,r):i.appendChild(a)}for(var d=0;d<o.length;d++)this._build_following_button(a,o[d])}else a&&a.parentElement.removeChild(a)}if(s){var o=this.follow_data&&this.follow_data[s],n=this._cindex.get("element"),i=n&&n.querySelector("#hostmode .channel-actions"),a=i&&i.querySelector("#ffz-ui-following");if(i&&this.settings.follow_buttons&&o&&o.length){if(a)a.innerHTML="";else{a=document.createElement("span"),a.id="ffz-ui-following";var r=i.querySelector(":scope > span");r?i.insertBefore(a,r):i.appendChild(a)}for(var d=0;d<o.length;d++)this._build_following_button(a,o[d])}else a&&a.parentElement.removeChild(a)}}},s.prototype._build_following_button=function(e,t){var o,n=document.createElement("a"),i=this,a=document.createElement("div"),r=document.createElement("a"),d=document.createElement("div"),u=!1,c=!1,l=function(){a.classList.toggle("is-following",u),n.title=(u?"Unf":"F")+"ollow "+o,n.innerHTML=(u?"":"Follow ")+o,d.classList.toggle("hidden",!u)},h=function(){var e=i.get_user();return e&&e.login?void Twitch.api.get("users/"+e.login+"/follows/channels/"+t).done(function(e){u=!0,c=e.notifications,a.classList.add("is-initialized"),l()}).fail(function(){u=!1,c=!1,a.classList.add("is-initialized"),l()}):(u=!1,notification=!1,a.classList.add("is-initialized"),l())},f=function(e){e!==!1&&(e=!0);var s=i.get_user();return s&&s.login?(c=e,Twitch.api.put("users/:login/follows/channels/"+t,{notifications:c}).fail(h)):null},_=function(e){o=e||t,l()};a.className="ember-follow follow-button",a.appendChild(n),r.className="toggle-notification-menu js-toggle-notification-menu",r.href="#",d.className="notification-controls v2 hidden",d.appendChild(r),n.addEventListener("click",function(){var e=i.get_user();return e&&e.login?(u=!u,l(),i.ws_send("track_follow",[t,u]),u?f():Twitch.api.del("users/:login/follows/channels/"+t).done(h),!1):Ember.$.login({mpSourceAction:"follow-button",follow:t})}),r.addEventListener("click",function(){var e=i._build
}catch(l){t.error("_update_subscribers: "+l)}}).fail(function(){var e=document.querySelector("#ffz-sub-display");e&&e.parentElement.removeChild(e)})}},{"../constants":3,"../utils":30}],29:[function(t){var s=e.FrankerFaceZ,o=t("../constants"),n=t("../utils");s.ws_commands.chatters=function(t){{var s=t[0],o=t[1],n=e.App&&App.__container__.lookup("controller:channel"),i=this.is_dashboard?location.pathname.match(/\/([^\/]+)/):void 0;this.is_dashboard?i&&i[1]:n&&n.get&&n.get("id")}if(!this.is_dashboard){var a=this.rooms&&this.rooms[s];return void(a&&(a.ffz_chatters=o,this._cindex&&this._cindex.ffzUpdateChatters()))}this._dash_chatters=o},s.ws_commands.viewers=function(t){var s=t[0],i=t[1],a=e.App&&App.__container__.lookup("controller:channel"),r=this.is_dashboard?location.pathname.match(/\/([^\/]+)/):void 0,d=this.is_dashboard?r&&r[1]:a&&a.get&&a.get("id");if(!this.is_dashboard){var u=this.rooms&&this.rooms[s];return void(u&&(u.ffz_viewers=i,this._cindex&&this._cindex.ffzUpdateChatters()))}if(this._dash_viewers=i,this.settings.chatter_count&&d===s){var c=document.querySelector("#ffz-ffzchatter-display"),l=o.ZREKNARF+" "+n.number_commas(i)+("number"==typeof this._dash_chatters?" ("+n.number_commas(this._dash_chatters)+")":"");if(c)c.innerHTML=l;else{var h=document.querySelector("#stats");if(!h)return;c=document.createElement("span"),c.id="ffz-ffzchatter-display",c.className="ffz stat",c.title="Viewers (In Chat) with FrankerFaceZ",c.innerHTML=l,h.appendChild(c),jQuery(c).tipsy(this.is_dashboard?{gravity:"s"}:void 0)}}}},{"../constants":3,"../utils":30}],30:[function(t,s){var o=(e.FrankerFaceZ,t("./constants"),{}),n=document.createElement("span"),i=function(e,t,s){return s=s||"s",t=t||"",1===e?t:s},a=function(e){return 1==e?"1st":2==e?"2nd":3==e?"3rd":null==e?"---":e+"th"},r=function(e,t){t=0===t?0:t||1,t=Math.round(255*-(t/100));var s=Math.max(0,Math.min(255,e[0]-t)),o=Math.max(0,Math.min(255,e[1]-t)),n=Math.max(0,Math.min(255,e[2]-t));return[s,o,n]},d=function(e){return"rgb("+e[0]+", "+e[1]+", "+e[2]+")"},u=function(e,t){return t=0===t?0:t||1,r(e,-t)},c=function(e){e=[e[0]/255,e[1]/255,e[2]/255];for(var t=0;t<e.length;t++)e[t]=e[t]<=.03928?e[t]/12.92:Math.pow((e[t]+.055)/1.055,2.4);return.2126*e[0]+.7152*e[1]+.0722*e[2]},l=/^(\d{4}|\+\d{6})(?:-?(\d{2})(?:-?(\d{2})(?:T(\d{2})(?::?(\d{2})(?::?(\d{2})(?:(?:\.|,)(\d{1,}))?)?)?(Z|([\-+])(\d{2})(?::?(\d{2}))?)?)?)?)?$/,h=function(e){var t=e.match(l);if(!t)return null;t[7]=t[7]&&t[7].length?t[7].substr(0,3):0;var s=Date.UTC(t[1],t[2]-1,t[3],t[4],t[5],t[6],t[7]);if(t[9]){var o=6e4*("-"==t[9]?1:-1)*(60*t[10]+1*t[11]);s+=o}return new Date(s)},f=function(e){e=$.trim(e);var t={raw:e},s=-1;"@"===e.charAt(0)&&(s=e.indexOf(" "),t.tags=e.substr(1,s-1));var o=s+1,n=-1;":"===e.charAt(o)&&(n=e.indexOf(" ",o),t.prefix=e.substr(o+1,n-(o+1)));var i=e.indexOf(" :",o);i>=0?t.trailing=e.substr(i+2):i=e.length;var a=e.substr(n+1,i-n-1).split(" ");return t.command=a[0],a.length>1&&(t.params=a.slice(1)),t},_={":":";",s:" ",r:"\r",n:"\n","\\":"\\"},m=function(e){for(var t="",s=0;s<e.length;s++){var o=e.charAt(s);if("\\"===o){if(s===e.length-1)throw"Improperly escaped tag";if(o=_[e.charAt(s+1)],void 0===o)throw"Improperly escaped tag";s++}t+=o}return t},p=function(e,t){switch(e){case"slow":try{return parseInt(t)}catch(s){return 0}case"subs-only":case"r9k":case"subscriber":case"turbo":return"1"===t;default:try{return m(t)}catch(s){return""}}},g=function(e){for(var t={},s=e.split(";"),o=0;o<s.length;++o){var n=s[o].split("=");2===n.length&&(t[n[0]]=p(n[0],n[1]))}return t},v={},b=function(e,t){if(v[e]&&v[e][t])return v[e][t];for(var s=""===t?e.slice(0,-1):3===e.length&&""===e.charAt(1)?e.charAt(0)+e.charAt(2):e,o=[],n=0,i=0,a=0;a<s.length;)n=s.charCodeAt(a++),i?(o.push((65536+(i-55296<<10)+(n-56320)).toString(16)),i=0):n>=55296&&56319>=n?i=n:o.push(n.toString(16));var r=v[e]=v[e]||{},d=r[t]=o.join("-");return d};s.exports={update_css:function(e,t,s){var o=e.innerHTML,n="/*BEGIN "+t+"*/",i="/*END "+t+"*/",a=o.indexOf(n),r=o.indexOf(i),d=-1!==a&&-1!==r&&r>a;(d||s)&&(d&&(o=o.substr(0,a)+o.substr(r+i.lengt