diff --git a/js/main.js b/js/main.js index 7ef6aa04..90193ffa 100644 --- a/js/main.js +++ b/js/main.js @@ -898,7 +898,7 @@ QuickEmoteMenu.prototype.init = function() { $(document).on("mousedown", function(e) { if(e.target.id != "rmenu") $("#rmenu").remove(); }); - + this.favoriteEmotes = {}; var fe = localStorage["bdfavemotes"]; if (fe != undefined) { this.favoriteEmotes = JSON.parse(atob(fe)); diff --git a/js/main.min.js b/js/main.min.js index 24ccbd9c..8e9c12de 100644 --- a/js/main.min.js +++ b/js/main.min.js @@ -1,80 +1,2 @@ -var settingsPanel,emoteModule,utils,quickEmoteMenu,opublicServers,voiceMode,pluginModule,themeModule,customCssEditor;var jsVersion=1.63;var supportedVersion="0.2.5";var mainObserver;var twitchEmoteUrlStart="https://static-cdn.jtvnw.net/emoticons/v1/";var twitchEmoteUrlEnd="/1.0";var ffzEmoteUrlStart="https://cdn.frankerfacez.com/emoticon/";var ffzEmoteUrlEnd="/1";var bttvEmoteUrlStart="https://cdn.betterttv.net/emote/";var bttvEmoteUrlEnd="/1x";var mainCore;var settings={"Save logs locally":{"id":"bda-gs-0","info":"Saves chat logs locally","implemented":false,"hidden":false,"cat":"core"},"Public Servers":{"id":"bda-gs-1","info":"Display public servers button","implemented":true,"hidden":false,"cat":"core"},"Minimal Mode":{"id":"bda-gs-2","info":"Hide elements and reduce the size of elements.","implemented":true,"hidden":false,"cat":"core"},"Voice Mode":{"id":"bda-gs-4","info":"Only show voice chat","implemented":true,"hidden":false,"cat":"core"},"Hide Channels":{"id":"bda-gs-3","info":"Hide channels in minimal mode","implemented":true,"hidden":false,"cat":"core"},"Dark Mode":{"id":"bda-gs-5","info":"Make certain elements dark by default(wip)","implemented":true,"hidden":false,"cat":"core"},"Override Default Emotes":{"id":"bda-es-5","info":"Override default emotes","implemented":false,"hidden":false,"cat":"core"},"Voice Disconnect":{"id":"bda-dc-0","info":"Disconnect from voice server when closing Discord","implemented":true,"hidden":false,"cat":"core"},"Custom css live update":{"id":"bda-css-0","info":"","implemented":true,"hidden":true,"cat":"core"},"Custom css auto udpate":{"id":"bda-css-1","info":"","implemented":true,"hidden":true,"cat":"core"},"Show Emotes":{"id":"bda-es-7","info":"Show any emotes","implemented":true,"hidden":false,"cat":"emote"},"FrankerFaceZ Emotes":{"id":"bda-es-1","info":"Show FrankerFaceZ Emotes","implemented":true,"hidden":false,"cat":"emote"},"BetterTTV Emotes":{"id":"bda-es-2","info":"Show BetterTTV Emotes","implemented":true,"hidden":false,"cat":"emote"},"Emote Menu":{"id":"bda-es-0","info":"Show Twitch/Favourite emotes in emote menu","implemented":true,"hidden":false,"cat":"emote"},"Emoji Menu":{"id":"bda-es-9","info":"Show Discord emoji menu","implemented":true,"hidden":false,"cat":"emote"},"Emote Autocomplete":{"id":"bda-es-3","info":"Autocomplete emote commands","implemented":false,"hidden":false,"cat":"emote"},"Emote Auto Capitalization":{"id":"bda-es-4","info":"Autocapitalize emote commands","implemented":true,"hidden":false,"cat":"emote"},"Show Names":{"id":"bda-es-6","info":"Show emote names on hover","implemented":true,"hidden":false,"cat":"emote"},"Show emote modifiers":{"id":"bda-es-8","info":"Enable emote mods","implemented":true,"hidden":false,"cat":"emote"},};var links={"Jiiks.net":{"text":"Jiiks.net","href":"http://jiiks.net","target":"_blank"},"twitter":{"text":"Twitter","href":"http://twitter.com/jiiksi","target":"_blank"},"github":{"text":"Github","href":"http://github.com/jiiks","target":"_blank"}};var defaultCookie={"version":jsVersion,"bda-gs-0":false,"bda-gs-1":true,"bda-gs-2":false,"bda-gs-3":false,"bda-gs-4":false,"bda-gs-5":true,"bda-es-0":true,"bda-es-1":true,"bda-es-2":true,"bda-es-3":false,"bda-es-4":false,"bda-es-5":true,"bda-es-6":true,"bda-es-7":true,"bda-es-8":true,"bda-jd":true,"bda-es-8":true,"bda-dc-0":false,"bda-css-0":false,"bda-css-1":false,"bda-es-9":true};var bdchangelog={"changes":{"darkmode":{"title":"v1.63 : Dark Mode","text":"Dark mode makes certain elements dark by default(currently only applies to emote menu)","img":""},"emotemenu":{"title":"v1.62 : Brand new emote menu that fits in Discord emoji menu!","text":"The emote menu has been replaced by a new one that injects itself in the Discord emoji menu!","img":""},"cccss":{"title":"v1.61 : New custom CSS editor","text":"The custom CSS editor now has options and can be detached!","img":""},"vdc":{"title":"v1.61 : Voice Disconnect","text":"Disconnect from voice server when closing Discord!","img":""},"pslist":{"title":"v1.60 : New public server list!","text":'New and shiny public server list powered by DiscordServers.com!',"img":""},"api":{"title":"v1.59 : New plugin api callback","text":"Use the `observer(e)` callback instead of creating your own MutationObserver","img":""},"emotemods":{"title":"v1.59 : New emote mods!","text":"The following emote mods have been added: :shake2, :shake3, :flap","img":""},"minmode":{"title":"v1.59: Minimal mode","text":"Minimal mode embed fixed size has been removed","img":""}},"fixes":{"modal":{"title":"v1.62 : Fixed modals","text":"Fixed broken modal introduced by 0.0.287","imt":""},"emotes":{"title":"v1.59 : Native sub emote mods","text":"Emote mods now work with native sub emotes!","img":""},"emotes2":{"title":"v1.59 : Emote mods and custom emotes","text":"Emote mods will no longer interfere with custom emotes using :","img":""}}};var settingsCookie={};function Core(){} -Core.prototype.init=function(){var self=this;if(version
Please download the latest version from BetterDiscord.net");return;} -utils=new Utils();var sock=new BdWSocket();sock.start();utils.getHash();emoteModule=new EmoteModule();quickEmoteMenu=new QuickEmoteMenu();voiceMode=new VoiceMode();emoteModule.init();this.initSettings();this.initObserver();function gwDefer(){console.log(new Date().getTime()+" Defer");if($(".guilds-wrapper .guilds").children().length>0){console.log(new Date().getTime()+" Defer Loaded");var guilds=$(".guilds>li:first-child");var showChannelsButton=$("'+' '+'
'+'
';if(bdchangelog.changes!=null){changeLog+=''+'

'+' New Stuff'+'

'+'
    ';for(var change in bdchangelog.changes){change=bdchangelog.changes[change];changeLog+=''+'
  • '+' '+change.title+''+'
    '+change.text+'
    '+'
  • ';} -changeLog+='
';} -if(bdchangelog.fixes!=null){changeLog+=''+'

'+' Fixed'+'

'+'
    ';for(var fix in bdchangelog.fixes){fix=bdchangelog.fixes[fix];changeLog+=''+'
  • '+' '+fix.title+''+'
    '+fix.text+'
    '+'
  • ';} -changeLog+='
';} -if(bdchangelog.upcoming!=null){changeLog+=''+'

'+' Coming Soon'+'

'+'
    ';for(var upc in bdchangelog.upcoming){upc=bdchangelog.upcoming[upc];changeLog+=''+'
  • '+' '+upc.title+''+'
    '+upc.text+'
    '+'
  • ';} -changeLog+='
';} -changeLog+=''+'
'+'
'+' '+' '+' '+'';return changeLog;};Core.prototype.alert=function(title,text){$("body").append(''+'
'+'
'+' '+title+''+'
×
'+'
'+'
'+'
'+'
'+text+'
'+'
'+'
'+'
');};var emotesFfz={};var emotesBTTV={};var emotesTwitch={"emotes":{"emote":{"image_id":0}}};var subEmotesTwitch={};function EmoteModule(){} -EmoteModule.prototype.init=function(){};EmoteModule.prototype.getBlacklist=function(){$.getJSON("https://cdn.rawgit.com/Jiiks/betterDiscordApp/"+_hash+"/data/emotefilter.json",function(data){bemotes=data.blacklist;});};EmoteModule.prototype.obsCallback=function(mutation){var self=this;if(!settingsCookie["bda-es-7"])return;$(".emoji").each(function(){var t=$(this);if(t.attr("src").indexOf(".png")!=-1){var next=t.next();var newText=t.attr("alt");if(next.size()>0){if(next.prop("tagName")=="SPAN"){newText+=next.text();next.remove();}} -if(t.parent().prop("tagName")!="SPAN"){t.replaceWith(""+newText+"");}else{t.replaceWith(newText);}}});for(var i=0;i-1){return;} -markup.addClass("spoiler");markup.on("click",function(){$(this).removeClass("spoiler");spoilered.push($(this).attr("data-reactid"));});return;} -if(word.length<4){return;} -if(word=="ClauZ"){parentInnerHTML=parentInnerHTML.replace("ClauZ",'');return;} -var useEmoteCss=false;var sWord=word;var emoteClass="";var allowedClasses=["emoteflip","emotespin","emotepulse","emotespin2","emotespin3","emote1spin","emote2spin","emote3spin","emotetr","emotebl","emotebr","emoteshake","emoteshake2","emoteshake3","emoteflap"];if(word.indexOf(":")>-1){var split=word.split(/:(?!.*:)/);if(split[0]!=""&&split[1]!=""){userEmoteCss=true;sWord=split[0];if(settingsCookie["bda-es-8"]){emoteClass="emote"+split[1];if(allowedClasses.indexOf(emoteClass)<0){emoteClass="";}}}} -if($.inArray(sWord,bemotes)!=-1)return;if(emotesTwitch.emotes.hasOwnProperty(sWord)){var len=Math.round(sWord.length / 4);var name=sWord.substr(0,len)+"\uFDD9"+sWord.substr(len,len)+"\uFDD9"+sWord.substr(len*2,len)+"\uFDD9"+sWord.substr(len*3);var url=twitchEmoteUrlStart+emotesTwitch.emotes[sWord].image_id+twitchEmoteUrlEnd;parentInnerHTML=parentInnerHTML.replace(word,'
'+name+'
');return;} -if(subEmotesTwitch.hasOwnProperty(sWord)){var len=Math.round(sWord.length / 4);var name=sWord.substr(0,len)+"\uFDD9"+sWord.substr(len,len)+"\uFDD9"+sWord.substr(len*2,len)+"\uFDD9"+sWord.substr(len*3);var url=twitchEmoteUrlStart+subEmotesTwitch[sWord]+twitchEmoteUrlEnd;parentInnerHTML=parentInnerHTML.replace(word,'
'+name+'
');return;} -if(typeof emotesFfz!=='undefined'&&settingsCookie["bda-es-1"]){if(emotesFfz.hasOwnProperty(sWord)){var len=Math.round(sWord.length / 4);var name=sWord.substr(0,len)+"\uFDD9"+sWord.substr(len,len)+"\uFDD9"+sWord.substr(len*2,len)+"\uFDD9"+sWord.substr(len*3);var url=ffzEmoteUrlStart+emotesFfz[sWord]+ffzEmoteUrlEnd;parentInnerHTML=parentInnerHTML.replace(word,'
'+name+'
');return;}} -if(typeof emotesBTTV!=='undefined'&&settingsCookie["bda-es-2"]){if(emotesBTTV.hasOwnProperty(sWord)){var len=Math.round(sWord.length / 4);var name=sWord.substr(0,len)+"\uFDD9"+sWord.substr(len,len)+"\uFDD9"+sWord.substr(len*2,len)+"\uFDD9"+sWord.substr(len*3);var url=emotesBTTV[sWord];parentInnerHTML=parentInnerHTML.replace(word,'
'+name+'
');return;}} -if(typeof emotesBTTV2!=='undefined'&&settingsCookie["bda-es-2"]){if(emotesBTTV2.hasOwnProperty(sWord)){var len=Math.round(sWord.length / 4);var name=sWord.substr(0,len)+"\uFDD9"+sWord.substr(len,len)+"\uFDD9"+sWord.substr(len*2,len)+"\uFDD9"+sWord.substr(len*3);var url=bttvEmoteUrlStart+emotesBTTV2[sWord]+bttvEmoteUrlEnd;parentInnerHTML=parentInnerHTML.replace(word,'
'+name+'
');return;}}});if(parent.parentElement==null)return;var oldHeight=parent.parentElement.offsetHeight;parent.innerHTML=parentInnerHTML.replace(new RegExp("\uFDD9","g"),"");var newHeight=parent.parentElement.offsetHeight;var scrollPane=$(".scroller.messages").first();scrollPane.scrollTop(scrollPane.scrollTop()+(newHeight-oldHeight));} -if(edited){setTimeout(inject,250);}else{inject();}};EmoteModule.prototype.autoCapitalize=function(){var self=this;$('body').delegate($(".channel-textarea-inner textarea"),'keyup change paste',function(){if(!settingsCookie["bda-es-4"])return;var text=$(".channel-textarea-inner textarea").val();if(text==undefined)return;var lastWord=text.split(" ").pop();if(lastWord.length>3){if(lastWord=="danSgame")return;var ret=self.capitalize(lastWord.toLowerCase());if(ret!==null&&ret!==undefined){$(".channel-textarea-inner textarea").val(text.replace(lastWord,ret));}}});};EmoteModule.prototype.capitalize=function(value){var res=emotesTwitch.emotes;for(var p in res){if(res.hasOwnProperty(p)&&value==(p+'').toLowerCase()){return p;}}};function PublicServers(){} -PublicServers.prototype.getPanel=function(){return this.container;};PublicServers.prototype.init=function(){var self=this;var guilds=$(".guilds>li:first-child");guilds.after($("
  • ",{id:"bd-pub-li",css:{"height":"20px","display":settingsCookie["bda-gs-1"]==true?"":"none"}}).append($("
    ",{class:"guild-inner",css:{"height":"20px","border-radius":"4px"}}).append($("").append($("
    ",{css:{"line-height":"20px","font-size":"12px"},text:"public",id:"bd-pub-button"})))));$("#bd-pub-button").on("click",function(){self.show();});var panelBase="";panelBase+="
    ";panelBase+="
    ";panelBase+=" <\/span><\/span><\/span><\/span>";panelBase+=" <\/div>";panelBase+="
    ";panelBase+="

    Public Servers<\/h2>";panelBase+=" ';html+='

    ';html+='
    ';$("#slist").append(html);$("button[data-server-invite-code="+icode+"]").on("click",function(){self.joinServer(icode);});});},done:function(){$("#pubs-spinner").hide();$("#sbtn").prop("disabled",false);$("#sterm").prop("disabled",false);},always:function(){$("#pubs-spinner").hide();$("#sbtn").prop("disabled",false);$("#sterm").prop("disabled",false);},error:function(){$("#pubs-spinner").hide();$("#sbtn").prop("disabled",false);$("#sterm").prop("disabled",false);},complete:function(){$("#pubs-spinner").hide();$("#sbtn").prop("disabled",false);$("#sterm").prop("disabled",false);}});};PublicServers.prototype.search=function(){var dataset={"sort":[{"online":"desc"}],"from":0,"size":20,"query":{"filtered":{"query":{"match_all":{}}}}};var filter={"filter":{"and":[{"query":{"match_phrase_prefix":{"name":$("#sterm").val()}}}]}};if($("#sterm").val()){$.extend(dataset,filter);} -this.loadServers(dataset,true);};PublicServers.prototype.joinServer=function(code){$(".guilds-add").click();$(".action.join .btn").click();$(".create-guild-container input").val(code);$(".form.join-server .btn-primary").click();};function QuickEmoteMenu(){} -QuickEmoteMenu.prototype.init=function(){$(document).on("mousedown",function(e){if(e.target.id!="rmenu")$("#rmenu").remove();});var fe=localStorage["bdfavemotes"];if(fe!=undefined){this.favoriteEmotes=JSON.parse(atob(fe));} -var qmeHeader="";qmeHeader+="
    ";qmeHeader+=" ";attachEditor+=" <\/div>";attachEditor+="<\/div>";this.attachEditor=attachEditor;$("#bd-customcss-innerpane").append(attachEditor);$("#bd-customcss-detached-update").on("click",function(){self.applyCustomCss(self.editor.getValue(),true,false);return false;});$("#bd-customcss-detached-save").on("click",function(){self.applyCustomCss(self.editor.getValue(),false,true);return false;});var detachEditor="";detachEditor+="
    ";detachEditor+="
    ";detachEditor+=" <\/div>";detachEditor+="<\/div>";this.detachedEditor=detachEditor;};CustomCssEditor.prototype.attach=function(){$("#editor-detached").hide();$("#app-mount").removeClass("bd-detached-editor");$("#bd-customcss-pane").append($("#bd-customcss-innerpane"));$("#bd-customcss-detached-detach").show();$("#bd-customcss-detach-container").remove();};CustomCssEditor.prototype.detach=function(){var self=this;this.attach();$("#editor-detached").show();$("#bd-customcss-detached-detach").hide();$("#app-mount").addClass("bd-detached-editor");$(".app").parent().append(this.detachedEditor);$("#bd-customcss-detach-editor").append($("#bd-customcss-innerpane"));};CustomCssEditor.prototype.applyCustomCss=function(css,forceupdate,forcesave){if($("#customcss").length==0){$("head").append('');} -if(forceupdate||settingsCookie["bda-css-0"]){$("#customcss").html(css);} -if(forcesave||settingsCookie["bda-css-1"]){localStorage.setItem("bdcustomcss",btoa(css));}};var settingsButton=null;var panel=null;function SettingsPanel(){utils.injectJs("https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.9.0/codemirror.min.js");utils.injectJs("https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.9.0/mode/css/css.min.js");utils.injectJs("https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.4.2/Sortable.min.js");} -SettingsPanel.prototype.init=function(){var self=this;self.construct();var body=$("body");if(settingsCookie["bda-es-0"]){$("#twitchcord-button-container").show();}else{$("#twitchcord-button-container").hide();} -if(settingsCookie["bda-gs-2"]){body.addClass("bd-minimal");}else{body.removeClass("bd-minimal");} -if(settingsCookie["bda-gs-3"]){body.addClass("bd-minimal-chan");}else{body.removeClass("bd-minimal-chan");} -if(settingsCookie["bda-gs-4"]){voiceMode.enable();} -if(settingsCookie["bda-gs-5"]){$("#app-mount").addClass("bda-dark");} -if(settingsCookie["bda-es-6"]){emoteNamePopup=$("
    ");$(document).on("mouseover",".emote",function(){var x=$(this).offset();var title=$(this).attr("alt");$(emoteNamePopup).find(".tipsy-inner").text(title);$(emoteNamePopup).css('left',x.left-25);$(emoteNamePopup).css('top',x.top-32);$("div[data-reactid='.0.1.1']").append($(emoteNamePopup));});$(document).on("mouseleave",".emote",function(){$(".tipsy").remove();});}else{$(document).off('mouseover','.emote');}};var customCssInitialized=false;var lastTab="";SettingsPanel.prototype.changeTab=function(tab){var self=this;lastTab=tab;var controlGroups=$("#bd-control-groups");$(".bd-tab").removeClass("selected");$(".bd-pane").hide();$("#"+tab).addClass("selected");$("#"+tab.replace("tab","pane")).show();switch(tab){case"bd-settings-tab":break;case"bd-customcss-tab":if(!customCssInitialized){customCssEditor.init();customCssInitialized=true;} -break;}};SettingsPanel.prototype.updateSetting=function(checkbox){var cb=$(checkbox).children().find('input[type="checkbox"]');var enabled=!cb.is(":checked");var id=cb.attr("id");cb.prop("checked",enabled);if(id=="bda-css-2"){$("#app-mount").removeClass("bd-hide-bd");customCssEditor.hideBackdrop=enabled;if(enabled){$("#app-mount").addClass("bd-hide-bd")}} -settingsCookie[id]=enabled;if(settingsCookie["bda-es-0"]){$("#twitchcord-button-container").show();}else{$("#twitchcord-button-container").hide();} -if(settingsCookie["bda-gs-2"]){$("body").addClass("bd-minimal");}else{$("body").removeClass("bd-minimal");} -if(settingsCookie["bda-gs-3"]){$("body").addClass("bd-minimal-chan");}else{$("body").removeClass("bd-minimal-chan");} -if(settingsCookie["bda-gs-1"]){$("#bd-pub-li").show();}else{$("#bd-pub-li").hide();} -if(settingsCookie["bda-gs-4"]){voiceMode.enable();}else{voiceMode.disable();} -$("#app-mount").removeClass("bda-dark");if(settingsCookie["bda-gs-5"]){$("#app-mount").addClass("bda-dark");} -if(settingsCookie["bda-es-6"]){emoteNamePopup=$("
    ");$(document).on("mouseover",".emote",function(){var x=$(this).offset();var title=$(this).attr("alt");$(emoteNamePopup).find(".tipsy-inner").text(title);$(emoteNamePopup).css('left',x.left-25);$(emoteNamePopup).css('top',x.top-32);$("div[data-reactid='.0.1.1']").append($(emoteNamePopup));});$(document).on("mouseleave",".emote",function(){$(".tipsy").remove();});}else{$(document).off('mouseover','.emote');} -mainCore.saveSettings();};SettingsPanel.prototype.construct=function(){var self=this;panel=$("
    ",{id:"bd-pane",class:"settings-inner",css:{"display":"none"}});var settingsInner=''+'
    '+'
    '+'
    '+'
    Core
    '+'
    Emotes
    '+'
    Custom CSS
    '+'
    Plugins
    '+'
    Themes
    '+'
    '+'
    '+' ';settingsInner+='';var ccss=atob(localStorage.getItem("bdcustomcss"));customCssEditor.applyCustomCss(ccss,true,false);settingsInner+=''+' '+''+' '+' '+''+'
    '+'
    '+'
    '+'
    ';function showSettings(){$(".tab-bar-item").removeClass("selected");settingsButton.addClass("selected");$(".form .settings-right .settings-inner").first().hide();panel.show();if(lastTab==""){self.changeTab("bd-settings-tab");}else{self.changeTab(lastTab);}} -settingsButton=$("
    ",{class:"tab-bar-item",text:"BetterDiscord",id:"bd-settings-new",click:showSettings});panel.html(settingsInner);function defer(){if($(".btn.btn-settings").length<1){setTimeout(defer,100);}else{$(".btn.btn-settings").first().on("click",function(){function innerDefer(){if($(".modal-inner").first().is(":visible")){panel.hide();var tabBar=$(".tab-bar.SIDE").first();$(".tab-bar.SIDE .tab-bar-item").click(function(){$(".form .settings-right .settings-inner").first().show();$("#bd-settings-new").removeClass("selected");panel.hide();});tabBar.append(settingsButton);$(".form .settings-right .settings-inner").last().after(panel);$("#bd-settings-new").removeClass("selected");}else{setTimeout(innerDefer,100);}} -innerDefer();});}} -defer();};var _hash;function Utils(){} -Utils.prototype.getTextArea=function(){return $(".channel-textarea-inner textarea");};Utils.prototype.jqDefer=function(fnc){if(window.jQuery){fnc();}else{setTimeout(function(){this.jqDefer(fnc);},100);}};Utils.prototype.getHash=function(){$.getJSON("https://api.github.com/repos/Jiiks/BetterDiscordApp/commits/master",function(data){_hash=data.sha;emoteModule.getBlacklist();});};Utils.prototype.loadHtml=function(html,callback){var container=$("
    ",{class:"bd-container"}).appendTo("body");html='//cdn.rawgit.com/Jiiks/BetterDiscordApp/'+_hash+'/html/'+html+'.html';container.load(html,callback());};Utils.prototype.injectJs=function(uri){$("