diff --git a/js/main.js b/js/main.js index 4e5e7d51..119efc68 100644 --- a/js/main.js +++ b/js/main.js @@ -388,10 +388,12 @@ Core.prototype.injectColoredText = function() { this.cancelColoredText = Utils.monkeyPatch(BDV2.MessageContentComponent.prototype, "render", {after: (data) => { if (!settingsCookie["bda-gs-7"]) return; - const markup = data.returnValue.props.children[1]; - const roleColor = data.thisObject.props.message.colorString; - if (markup && roleColor) markup.props.style = {color: roleColor}; - return data.returnValue; + Utils.monkeyPatch(data.returnValue.props, "children", {silent: true, after: ({returnValue}) => { + const markup = returnValue.props.children[1]; + const roleColor = data.thisObject.props.message.colorString; + if (markup && roleColor) markup.props.style = {color: roleColor}; + return returnValue; + }}); }}); }; @@ -656,66 +658,68 @@ EmoteModule.prototype.init = async function () { if (this.cancelEmoteRender) return; this.cancelEmoteRender = Utils.monkeyPatch(BDV2.MessageContentComponent.prototype, "render", {after: ({returnValue}) => { - const markup = returnValue.props.children[1]; - if (!markup.props.children) return; - const nodes = markup.props.children[1]; - if (!nodes || !nodes.length) return; - for (let n = 0; n < nodes.length; n++) { - const node = nodes[n]; - if (typeof(node) !== "string") continue; - const words = node.split(/([^\s]+)([\s]|$)/g); - for (let c = 0, clen = this.categories.length; c < clen; c++) { - for (let w = 0, wlen = words.length; w < wlen; w++) { - let emote = words[w]; - let emoteSplit = emote.split(":"); - let emoteName = emoteSplit[0]; - let emoteModifier = emoteSplit[1] ? emoteSplit[1] : ""; - let emoteOverride = emoteModifier.slice(0); - - if (bemotes.includes(emoteName) || emoteName.length < 4) continue; - if (!this.modifiers.includes(emoteModifier) || !settingsCookie["bda-es-8"]) emoteModifier = ""; - if (!this.overrides.includes(emoteOverride)) emoteOverride = ""; - else emoteModifier = emoteOverride; - - let current = this.categories[c]; - if (emoteOverride === "twitch") { - if (window.bdEmotes.TwitchGlobal[emoteName]) current = "TwitchGlobal"; - else if (window.bdEmotes.TwitchSubscriber[emoteName]) current = "TwitchSubscriber"; - } - else if (emoteOverride === "bttv") { - if (window.bdEmotes.BTTV[emoteName]) current = "BTTV"; - else if (window.bdEmotes.BTTV2[emoteName]) current = "BTTV2"; - } - else if (emoteOverride === "ffz") { - if (window.bdEmotes.FrankerFaceZ[emoteName]) current = "FrankerFaceZ"; - } - - if (!window.bdEmotes[current][emoteName] || !settingsCookie[window.bdEmoteSettingIDs[current]]) continue; - const results = nodes[n].match(new RegExp(`([\\s]|^)${utils.escape(emoteModifier ? emoteName + ":" + emoteModifier : emoteName)}([\\s]|$)`)); - if (!results) continue; - const pre = nodes[n].substring(0, results.index + results[1].length); - const post = nodes[n].substring(results.index + results[0].length - results[2].length); - nodes[n] = pre; - const emoteComponent = BDV2.react.createElement(BDEmote, {name: emoteName, url: window.bdEmotes[current][emoteName], modifier: emoteModifier}); - nodes.splice(n + 1, 0, post); - nodes.splice(n + 1, 0, emoteComponent); - n = n + 2; - } - } - } - const onlyEmotes = nodes.every(r => { - if (typeof(r) == "string" && r.replace(/\s*/, "") == "") return true; - else if (r.type && r.type.name == "BDEmote") return true; - else if (r.props && r.props.children && r.props.children.props && r.props.children.props.emojiName) return true; - return false; - }); - if (!onlyEmotes) return; + Utils.monkeyPatch(returnValue.props, "children", {silent: true, after: ({returnValue}) => { + const markup = returnValue.props.children[1]; + if (!markup.props.children) return; + const nodes = markup.props.children[1]; + if (!nodes || !nodes.length) return; + for (let n = 0; n < nodes.length; n++) { + const node = nodes[n]; + if (typeof(node) !== "string") continue; + const words = node.split(/([^\s]+)([\s]|$)/g); + for (let c = 0, clen = this.categories.length; c < clen; c++) { + for (let w = 0, wlen = words.length; w < wlen; w++) { + let emote = words[w]; + let emoteSplit = emote.split(":"); + let emoteName = emoteSplit[0]; + let emoteModifier = emoteSplit[1] ? emoteSplit[1] : ""; + let emoteOverride = emoteModifier.slice(0); + + if (bemotes.includes(emoteName) || emoteName.length < 4) continue; + if (!this.modifiers.includes(emoteModifier) || !settingsCookie["bda-es-8"]) emoteModifier = ""; + if (!this.overrides.includes(emoteOverride)) emoteOverride = ""; + else emoteModifier = emoteOverride; + + let current = this.categories[c]; + if (emoteOverride === "twitch") { + if (window.bdEmotes.TwitchGlobal[emoteName]) current = "TwitchGlobal"; + else if (window.bdEmotes.TwitchSubscriber[emoteName]) current = "TwitchSubscriber"; + } + else if (emoteOverride === "bttv") { + if (window.bdEmotes.BTTV[emoteName]) current = "BTTV"; + else if (window.bdEmotes.BTTV2[emoteName]) current = "BTTV2"; + } + else if (emoteOverride === "ffz") { + if (window.bdEmotes.FrankerFaceZ[emoteName]) current = "FrankerFaceZ"; + } + + if (!window.bdEmotes[current][emoteName] || !settingsCookie[window.bdEmoteSettingIDs[current]]) continue; + const results = nodes[n].match(new RegExp(`([\\s]|^)${utils.escape(emoteModifier ? emoteName + ":" + emoteModifier : emoteName)}([\\s]|$)`)); + if (!results) continue; + const pre = nodes[n].substring(0, results.index + results[1].length); + const post = nodes[n].substring(results.index + results[0].length - results[2].length); + nodes[n] = pre; + const emoteComponent = BDV2.react.createElement(BDEmote, {name: emoteName, url: window.bdEmotes[current][emoteName], modifier: emoteModifier}); + nodes.splice(n + 1, 0, post); + nodes.splice(n + 1, 0, emoteComponent); + n = n + 2; + } + } + } + const onlyEmotes = nodes.every(r => { + if (typeof(r) == "string" && r.replace(/\s*/, "") == "") return true; + else if (r.type && r.type.name == "BDEmote") return true; + else if (r.props && r.props.children && r.props.children.props && r.props.children.props.emojiName) return true; + return false; + }); + if (!onlyEmotes) return; - for (let node of nodes) { - if (typeof(node) != "object") continue; - if (node.type.name == "BDEmote") node.props.jumboable = true; - else if (node.props && node.props.children && node.props.children.props && node.props.children.props.emojiName) node.props.children.props.jumboable = true; - } + for (let node of nodes) { + if (typeof(node) != "object") continue; + if (node.type.name == "BDEmote") node.props.jumboable = true; + else if (node.props && node.props.children && node.props.children.props && node.props.children.props.emojiName) node.props.children.props.jumboable = true; + } + }}); }}); }; @@ -1709,6 +1713,7 @@ devMode.prototype.getSelector = function(element) { $(document).off("contextmenu.bdDevModeCtx"); }; + var ClassNormalizer = class ClassNormalizer { constructor() { this.classFormat = new RegExp(`^(?!da-)[A-Za-z]+-([A-Za-z]|[0-9]|-|_){6}$`); diff --git a/js/main.min.js b/js/main.min.js index cecfdae9..5b2316f6 100644 --- a/js/main.min.js +++ b/js/main.min.js @@ -1,4 +1,4 @@ -(function(){let t=window.require("fs"),a=window.require("process"),o=a.platform,d=("win32"===o?a.env.APPDATA:"darwin"===o?a.env.HOME+"/Library/Preferences":process.env.HOME+"/.config")+"/BetterDiscord/",l="localStorage.json",u={};if(t.existsSync(`${d}${l}`))try{u=JSON.parse(t.readFileSync(`${d}${l}`))}catch(b){console.log(b)}else if(t.existsSync(l))try{u=JSON.parse(t.readFileSync(l))}catch(b){console.log(b)}var h=u;h.setItem=function(b,f){h[b]=f,this.save()},h.getItem=function(b){return h[b]||null},h.save=function(){t.writeFileSync(`${d}${l}`,JSON.stringify(this),null,4)};var g=new Proxy(h,{set:function(b,f,y){h[f]=y,h.save()},get:function(b,f){return h[f]||null}});window.localStorage=g})(),(()=>{let t=document.createElement("div");t.className="bd-loaderv2",t.title="BetterDiscord is loading...",document.body.appendChild(t)})(),window.bdStorage={},window.bdStorage.get=function(t){return betterDiscordIPC.sendSync("synchronous-message",{arg:"storage",cmd:"get","var":t})},window.bdStorage.set=function(t,a){betterDiscordIPC.sendSync("synchronous-message",{arg:"storage",cmd:"set","var":t,data:a})},window.bdPluginStorage={},window.bdPluginStorage.get=function(t,a){return betterDiscordIPC.sendSync("synchronous-message",{arg:"pluginstorage",cmd:"get",pn:t,"var":a})},window.bdPluginStorage.set=function(t,a,o){betterDiscordIPC.sendSync("synchronous-message",{arg:"pluginstorage",cmd:"set",pn:t,"var":a,data:o})};var bdSettings={},bdSettingsStorage={};bdSettingsStorage.initialize=function(){let t=require("fs"),a={};if(t.existsSync(bdConfig.dataPath+"/bdsettings.json"))try{a=JSON.parse(t.readFileSync(bdConfig.dataPath+"/bdsettings.json"))}catch(o){a={}}bdSettings=a?a:{}},bdSettingsStorage.get=function(t){return bdSettings[t]?bdSettings[t]:null},bdSettingsStorage.set=function(t,a){let o=require("fs");bdSettings[t]=a;try{return o.writeFileSync(bdConfig.dataPath+"/bdsettings.json",JSON.stringify(bdSettings,null,4)),!0}catch(d){return utils.err(d),!1}};var settingsPanel,emoteModule,utils,quickEmoteMenu,voiceMode,pluginModule,themeModule,dMode,publicServersModule,jsVersion=1.792,supportedVersion="0.2.81",bbdVersion="0.1.0",mainCore,settings={"Save logs locally":{id:"bda-gs-0",info:"Saves chat logs locally",implemented:!1,hidden:!1,cat:"core"},"Public Servers":{id:"bda-gs-1",info:"Display public servers button",implemented:!0,hidden:!1,cat:"core"},"Minimal Mode":{id:"bda-gs-2",info:"Hide elements and reduce the size of elements.",implemented:!0,hidden:!1,cat:"core"},"Voice Mode":{id:"bda-gs-4",info:"Only show voice chat",implemented:!0,hidden:!1,cat:"core"},"Hide Channels":{id:"bda-gs-3",info:"Hide channels in minimal mode",implemented:!0,hidden:!1,cat:"core"},"Dark Mode":{id:"bda-gs-5",info:"Make certain elements dark by default(wip)",implemented:!0,hidden:!1,cat:"core"},"Override Default Emotes":{id:"bda-es-5",info:"Override default emotes",implemented:!1,hidden:!1,cat:"core"},"Voice Disconnect":{id:"bda-dc-0",info:"Disconnect from voice server when closing Discord",implemented:!0,hidden:!1,cat:"core"},"Custom css live update":{id:"bda-css-0",info:"",implemented:!0,hidden:!0,cat:"core"},"Custom css auto udpate":{id:"bda-css-1",info:"",implemented:!0,hidden:!0,cat:"core"},"24 Hour Timestamps":{id:"bda-gs-6",info:"Replace 12hr timestamps with proper ones",implemented:!0,hidden:!1,cat:"core"},"Coloured Text":{id:"bda-gs-7",info:"Make text colour the same as role colour",implemented:!0,hidden:!1,cat:"core"},"BetterDiscord Blue":{id:"bda-gs-b",info:"Replace Discord blue with BD Blue",implemented:!0,hidden:!1,cat:"core"},"Developer Mode":{id:"bda-gs-8",info:"Developer Mode",implemented:!0,hidden:!1,cat:"core"},"Startup Error Modal":{id:"fork-ps-1",info:"Show a modal with plugin/theme errors on startup",implemented:!0,hidden:!1,cat:"fork"},"Show Toasts":{id:"fork-ps-2",info:"Shows a small notification for starting and stopping plugins & themes",implemented:!0,hidden:!1,cat:"fork"},"Scroll To Settings":{id:"fork-ps-3",info:"Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)",implemented:!0,hidden:!1,cat:"fork"},"Animate On Hover":{id:"fork-es-2",info:"Only animate the emote modifiers on hover",implemented:!0,hidden:!1,cat:"fork"},"Copy Selector":{id:"fork-dm-1",info:"Adds a \"Copy Selector\" option to context menus when developer mode is active",implemented:!0,hidden:!1,cat:"fork"},"Download Emotes":{id:"fork-es-3",info:"Download emotes when the cache is expired",implemented:!0,hidden:!1,cat:"fork"},"Normalize Classes":{id:"fork-ps-4",info:"Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)",implemented:!0,hidden:!1,cat:"fork"},"Twitch Emotes":{id:"bda-es-7",info:"Show Twitch emotes",implemented:!0,hidden:!1,cat:"emote"},"FrankerFaceZ Emotes":{id:"bda-es-1",info:"Show FrankerFaceZ Emotes",implemented:!0,hidden:!1,cat:"emote"},"BetterTTV Emotes":{id:"bda-es-2",info:"Show BetterTTV Emotes",implemented:!0,hidden:!1,cat:"emote"},"Emote Menu":{id:"bda-es-0",info:"Show Twitch/Favourite emotes in emote menu",implemented:!0,hidden:!1,cat:"emote"},"Emoji Menu":{id:"bda-es-9",info:"Show Discord emoji menu",implemented:!0,hidden:!1,cat:"emote"},"Emote Autocomplete":{id:"bda-es-3",info:"Autocomplete emote commands",implemented:!1,hidden:!1,cat:"emote"},"Emote Auto Capitalization":{id:"bda-es-4",info:"Autocapitalize emote commands",implemented:!0,hidden:!1,cat:"emote"},"Show Names":{id:"bda-es-6",info:"Show emote names on hover",implemented:!0,hidden:!1,cat:"emote"},"Show emote modifiers":{id:"bda-es-8",info:"Enable emote mods (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)",implemented:!0,hidden:!1,cat:"emote"}},defaultCookie={version:jsVersion,"bda-gs-0":!1,"bda-gs-1":!0,"bda-gs-2":!1,"bda-gs-3":!1,"bda-gs-4":!1,"bda-gs-5":!0,"bda-gs-6":!1,"bda-gs-7":!1,"bda-gs-8":!1,"bda-es-0":!0,"bda-es-1":!0,"bda-es-2":!0,"bda-es-3":!1,"bda-es-4":!1,"bda-es-5":!0,"bda-es-6":!0,"bda-es-7":!0,"bda-gs-b":!1,"bda-es-8":!0,"bda-jd":!0,"bda-dc-0":!1,"bda-css-0":!1,"bda-css-1":!1,"bda-es-9":!0,"fork-dm-1":!1,"fork-ps-1":!0,"fork-ps-2":!0,"fork-ps-3":!0,"fork-ps-4":!0,"fork-es-2":!1,"fork-es-3":!0},settingsCookie={},bdpluginErrors,bdthemeErrors,bdConfig=null;function Core(t){window.bdConfig=t}var classNormalizer;Core.prototype.init=async function(){function t(){0
Please download the latest version from BetterDiscord.net"):void(utils=new Utils,await utils.getHash(),utils.log("Initializing Settings"),this.initSettings(),classNormalizer=new ClassNormalizer,emoteModule=new EmoteModule,utils.log("Initializing EmoteModule"),window.emotePromise=emoteModule.init().then(()=>{emoteModule.initialized=!0}),publicServersModule=new V2_PublicServers,quickEmoteMenu=new QuickEmoteMenu,voiceMode=new VoiceMode,dMode=new devMode,$(document).ready(function(){setTimeout(t,100)}))},Core.prototype.injectExternals=function(){utils.injectJs("https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js")},Core.prototype.initSettings=function(){if(bdSettingsStorage.initialize(),$.cookie("better-discord"))return settingsCookie=JSON.parse($.cookie("better-discord")),this.saveSettings(),void $.removeCookie("better-discord",{path:"/"});if(!bdSettingsStorage.get("settings"))settingsCookie=defaultCookie,this.saveSettings();else for(var t in this.loadSettings(),$("`),settingsCookie["fork-ps-2"]&&mainCore.showToast(`${bdthemes[t].name} v${bdthemes[t].version} has been applied.`)},ThemeModule.prototype.disableTheme=function(t){themeCookie[t]=!1,this.saveThemeData(),$(`#${utils.escapeID(bdthemes[t].name)}`).remove(),settingsCookie["fork-ps-2"]&&mainCore.showToast(`${bdthemes[t].name} v${bdthemes[t].version} has been removed.`)},ThemeModule.prototype.toggleTheme=function(t){themeCookie[t]?this.disableTheme(t):this.enableTheme(t)},ThemeModule.prototype.loadThemeData=function(){if($.cookie("bd-themes"))return themeCookie=JSON.parse($.cookie("bd-themes")),this.saveThemeData(),void $.removeCookie("bd-themes",{path:"/"});let t=bdSettingsStorage.get("themes");t&&(themeCookie=t)},ThemeModule.prototype.saveThemeData=function(){bdSettingsStorage.set("themes",themeCookie)};var BdApi={get React(){return BDV2.react},get ReactDOM(){return BDV2.reactDom},injectCSS:function(t,a){$("head").append($(""),$("#customcss").html(this.editor.session.getValue()).detach().appendTo(document.head)}saveCss(){window.bdStorage.set("bdcustomcss",btoa(this.editor.session.getValue()))}}class V2C_CssEditor extends BDV2.reactComponent{constructor(t){super(t);let a=this;a.props.lines=0,a.setInitialState(),a.attach=a.attach.bind(a),a.detachedEditor=BDV2.react.createElement(V2C_CssEditorDetached,{attach:a.attach}),a.onClick=a.onClick.bind(a),a.updateCss=a.updateCss.bind(a),a.saveCss=a.saveCss.bind(a),a.detach=a.detach.bind(a)}setInitialState(){this.state={detached:this.props.detached||BDV2.editorDetached}}componentDidMount(){this.editor=ace.edit("bd-customcss-editor"),this.editor.setTheme("ace/theme/monokai"),this.editor.session.setMode("ace/mode/css"),this.editor.setShowPrintMargin(!1),this.editor.setFontSize(14),this.editor.on("change",()=>{settingsCookie["bda-css-0"]&&(this.saveCss(),this.updateCss())})}componentWillUnmount(){this.editor.destroy()}componentDidUpdate(t,a){let o=this;a.detached&&!o.state.detached&&BDV2.reactDom.unmountComponentAtNode(o.detachedRoot)}codeMirror(){}get options(){return{lineNumbers:!0,mode:"css",indentUnit:4,theme:"material",scrollbarStyle:"simple"}}get css(){let t=window.bdStorage.get("bdcustomcss"),a="";return t&&""!==t&&(a=atob(t)),a}updateLineCount(){let t=this.refs.editor.value.split("\n").length;t==this.props.lines||(this.refs.lines.textContent=Array.from(Array(t),(a,o)=>o+1).join(".\n")+".",this.props.lines=t)}render(){let t=this,{detached:a}=t.state;return BDV2.react.createElement("div",{className:"content-column default",style:{padding:"60px 40px 0px"}},a&&BDV2.react.createElement("div",{id:"editor-detached"},BDV2.react.createElement(V2Components.SettingsTitle,{text:"Custom CSS Editor"}),BDV2.react.createElement("h3",null,"Editor Detached"),BDV2.react.createElement("button",{className:"btn btn-primary",onClick:()=>{t.attach()}},"Attach")),!a&&BDV2.react.createElement("div",null,BDV2.react.createElement(V2Components.SettingsTitle,{text:"Custom CSS Editor"}),BDV2.react.createElement("div",{className:"editor-wrapper"},BDV2.react.createElement("div",{id:"bd-customcss-editor",className:"editor",ref:"editor"},t.css)),BDV2.react.createElement("div",{id:"bd-customcss-attach-controls"},BDV2.react.createElement("ul",{className:"checkbox-group"},BDV2.react.createElement(V2Components.Checkbox,{id:"live-update",text:"Live Update",onChange:this.onChange,checked:settingsCookie["bda-css-0"]})),BDV2.react.createElement("div",{id:"bd-customcss-detach-controls-button"},BDV2.react.createElement("button",{style:{borderRadius:"3px 0 0 3px",borderRight:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{t.onClick("update")}},"Update"),BDV2.react.createElement("button",{style:{borderRadius:"0",borderLeft:"1px solid #2d2d2d",borderRight:"1px solid #2d2d2d"},className:"btn btn-primary",onClick:()=>{t.onClick("save")}},"Save"),BDV2.react.createElement("button",{style:{borderRadius:"0 3px 3px 0",borderLeft:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{t.onClick("detach")}},"Detach"),BDV2.react.createElement("span",{style:{fontSize:"10px",marginLeft:"5px"}},"Unsaved changes are lost on detach")))))}onClick(t){let a=this;"update"===t?a.updateCss():"save"===t?a.saveCss():"detach"===t?a.detach():void 0}onChange(t,a){"live-update"===t?(settingsCookie["bda-css-0"]=a,mainCore.saveSettings()):void 0}updateCss(){0==$("#customcss").length&&$("head").append(""),$("#customcss").html(this.editor.session.getValue()).detach().appendTo(document.head)}saveCss(){window.bdStorage.set("bdcustomcss",btoa(this.editor.session.getValue()))}detach(){let t=this;t.setState({detached:!0});let a=t.detachedRoot;return a?void BDV2.reactDom.render(t.detachedEditor,a):void console.log("FAILED TO INJECT ROOT: .app")}get detachedRoot(){let t=$("#bd-customcss-detach-container");return t.length?t[0]:this.injectDetachedRoot()?this.detachedRoot:null}injectDetachedRoot(){return!!$(".app").length&&($("
",{id:"bd-customcss-detach-container"}).insertAfter($(".app")),!0)}attach(){let t=this;t.setState({detached:!1})}}class V2C_List extends BDV2.reactComponent{constructor(t){super(t)}render(){return BDV2.react.createElement("ul",{className:this.props.className},this.props.children)}}class V2C_ContentColumn extends BDV2.reactComponent{constructor(t){super(t)}render(){return BDV2.react.createElement("div",{className:"content-column default"},BDV2.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},this.props.title),this.props.children)}}class V2C_PluginCard extends BDV2.reactComponent{constructor(t){super(t);let a=this;a.onChange=a.onChange.bind(a),a.showSettings=a.showSettings.bind(a),a.setInitialState(),a.hasSettings="function"==typeof a.props.plugin.getSettingsPanel,a.settingsPanel=""}setInitialState(){this.state={checked:pluginCookie[this.props.plugin.getName()],settings:!1}}componentDidUpdate(){if(this.state.settings){if("object"==typeof this.settingsPanel&&this.refs.settingspanel.appendChild(this.settingsPanel),!settingsCookie["fork-ps-3"])return;var t=(d,l)=>{let u=d.scrollTop,h=u+d.clientHeight,g=l.offsetTop,b=g+l.clientHeight;return gh};let a=$(BDV2.reactDom.findDOMNode(this)),o=a.parents(".scroller");if(!t(o[0],a[0]))return;o.animate({scrollTop:a.offset().top-o.offset().top+o.scrollTop()-30},300)}}render(){let t=this,{plugin:a}=this.props,o=a.getName(),d=a.getAuthor(),l=a.getDescription(),u=a.getVersion(),h=bdplugins[o].website,g=bdplugins[o].source;if(this.state.settings){try{t.settingsPanel=a.getSettingsPanel()}catch(b){utils.err("Unable to get settings panel for "+a.getName()+".",b)}return BDV2.react.createElement("li",{className:"settings-open ui-switch-item"},BDV2.react.createElement("div",{style:{float:"right",cursor:"pointer"},onClick:()=>{this.refs.settingspanel.innerHTML="",t.setState({settings:!1})}},BDV2.react.createElement(V2Components.XSvg,null)),"object"==typeof t.settingsPanel&&BDV2.react.createElement("div",{id:`plugin-settings-${o}`,className:"plugin-settings",ref:"settingspanel"}),"object"!=typeof t.settingsPanel&&BDV2.react.createElement("div",{id:`plugin-settings-${o}`,className:"plugin-settings",ref:"settingspanel",dangerouslySetInnerHTML:{__html:t.settingsPanel}}))}return BDV2.react.createElement("li",{"data-name":o,"data-version":u,className:"settings-closed ui-switch-item"},BDV2.react.createElement("div",{className:"bda-header"},BDV2.react.createElement("span",{className:"bda-header-title"},BDV2.react.createElement("span",{className:"bda-name"},o)," v",BDV2.react.createElement("span",{className:"bda-version"},u)," by ",BDV2.react.createElement("span",{className:"bda-author"},d)),BDV2.react.createElement("label",{className:"ui-switch-wrapper ui-flex-child",style:{flex:"0 0 auto"}},BDV2.react.createElement("input",{checked:this.state.checked,onChange:this.onChange,className:"ui-switch-checkbox",type:"checkbox"}),BDV2.react.createElement("div",{className:this.state.checked?"ui-switch checked":"ui-switch"}))),BDV2.react.createElement("div",{className:"bda-description-wrap scroller-wrap fade"},BDV2.react.createElement("div",{className:"bda-description scroller"},l)),(h||g||this.hasSettings)&&BDV2.react.createElement("div",{className:"bda-footer"},BDV2.react.createElement("span",{className:"bda-links"},h&&BDV2.react.createElement("a",{className:"bda-link bda-link-website",href:h,target:"_blank"},"Website"),h&&g&&" | ",g&&BDV2.react.createElement("a",{className:"bda-link bda-link-source",href:g,target:"_blank"},"Source")),this.hasSettings&&BDV2.react.createElement("button",{onClick:this.showSettings,className:"bda-settings-button",disabled:!this.state.checked},"Settings")))}onChange(){this.setState({checked:!this.state.checked}),pluginModule.togglePlugin(this.props.plugin.getName())}showSettings(){this.hasSettings&&this.setState({settings:!0})}}class V2C_ThemeCard extends BDV2.reactComponent{constructor(t){super(t),this.setInitialState(),this.onChange=this.onChange.bind(this)}setInitialState(){this.state={checked:themeCookie[this.props.theme.name]}}render(){let{theme:t}=this.props,a=t.name,o=t.description,d=t.version,l=t.author,u=bdthemes[a].website,h=bdthemes[a].source;return BDV2.react.createElement("li",{"data-name":a,"data-version":d,className:"settings-closed ui-switch-item"},BDV2.react.createElement("div",{className:"bda-header"},BDV2.react.createElement("span",{className:"bda-header-title"},BDV2.react.createElement("span",{className:"bda-name"},a)," v",BDV2.react.createElement("span",{className:"bda-version"},d)," by ",BDV2.react.createElement("span",{className:"bda-author"},l)),BDV2.react.createElement("label",{className:"ui-switch-wrapper ui-flex-child",style:{flex:"0 0 auto"}},BDV2.react.createElement("input",{checked:this.state.checked,onChange:this.onChange,className:"ui-switch-checkbox",type:"checkbox"}),BDV2.react.createElement("div",{className:this.state.checked?"ui-switch checked":"ui-switch"}))),BDV2.react.createElement("div",{className:"bda-description-wrap scroller-wrap fade"},BDV2.react.createElement("div",{className:"bda-description scroller"},o)),(u||h)&&BDV2.react.createElement("div",{className:"bda-footer"},BDV2.react.createElement("span",{className:"bda-links"},u&&BDV2.react.createElement("a",{className:"bda-link",href:u,target:"_blank"},"Website"),u&&h&&" | ",h&&BDV2.react.createElement("a",{className:"bda-link",href:h,target:"_blank"},"Source"))))}onChange(){this.setState({checked:!this.state.checked}),themeModule.toggleTheme(this.props.theme.name)}}class V2Cs_TabBar{static get Item(){return V2C_TabBarItem}static get Header(){return V2C_TabBarHeader}static get Separator(){return V2C_TabBarSeparator}}class V2Components{static get SettingsPanel(){return V2C_SettingsPanel}static get Switch(){return V2C_Switch}static get Scroller(){return V2C_Scroller}static get TabBar(){return V2Cs_TabBar}static get SideBar(){return V2C_SideBar}static get Tools(){return V2C_Tools}static get SettingsTitle(){return V2C_SettingsTitle}static get CssEditor(){return V2C_CssEditor}static get Checkbox(){return V2C_Checkbox}static get List(){return V2C_List}static get PluginCard(){return V2C_PluginCard}static get ThemeCard(){return V2C_ThemeCard}static get ContentColumn(){return V2C_ContentColumn}static get XSvg(){return V2C_XSvg}static get Layer(){return V2C_Layer}static get SidebarView(){return V2C_SidebarView}static get ServerCard(){return V2C_ServerCard}}class V2_SettingsPanel_Sidebar{constructor(t){this.onClick=t}get items(){return[{text:"Core",id:"core"},{text:"Zere's Fork",id:"fork"},{text:"Emotes",id:"emotes"},{text:"Custom CSS",id:"customcss"},{text:"Plugins",id:"plugins"},{text:"Themes",id:"themes"}]}get component(){return BDV2.react.createElement("span",null,BDV2.react.createElement(V2Components.SideBar,{onClick:this.onClick,headerText:"Bandaged BD",items:this.items}),BDV2.react.createElement("div",{style:{fontSize:"12px",fontWeight:"600",color:"#72767d",padding:"2px 10px"}},`BD v${bdVersion} by `,BDV2.react.createElement("a",{href:"https://github.com/Jiiks/",target:"_blank"},"Jiiks")),BDV2.react.createElement("div",{style:{fontSize:"12px",fontWeight:"600",color:"#72767d",padding:"2px 10px"}},`BBD v${bbdVersion} by `,BDV2.react.createElement("a",{href:"https://github.com/rauenzi/",target:"_blank"},"Zerebos")))}get root(){let t=$("#bd-settings-sidebar");return t.length?t[0]:this.injectRoot()?this.root:null}injectRoot(){let t=$("[class*='side-'] > [class*='item-']:not([class*=Danger])").last();return!!t.length&&($("",{id:"bd-settings-sidebar"}).insertBefore(t.prev()),!0)}render(){let t=this.root;return t?void(BDV2.reactDom.render(this.component,t),Utils.onRemoved(t,()=>{BDV2.reactDom.unmountComponentAtNode(t)})):void console.log("FAILED TO LOCATE ROOT: [class*='side-'] > [class*='item-']:not([class*=Danger])")}}class V2_SettingsPanel{constructor(){let t=this;t.sideBarOnClick=t.sideBarOnClick.bind(t),t.onChange=t.onChange.bind(t),t.updateSettings=this.updateSettings.bind(t),t.sidebar=new V2_SettingsPanel_Sidebar(t.sideBarOnClick)}get root(){let t=$("#bd-settingspane-container");return t.length?t[0]:this.injectRoot()?this.root:null}injectRoot(){if(!$(".layer-3QrUeG .ui-standard-sidebar-view, .layer-3QrUeG .ui-standard-sidebar-view").length)return!1;const t=$("
",{"class":"content-region",id:"bd-settingspane-container"});return $(".layer-3QrUeG .ui-standard-sidebar-view, .layer-3QrUeG .ui-standard-sidebar-view").append(t),Utils.onRemoved(t[0],()=>{BDV2.reactDom.unmountComponentAtNode(t[0])}),!0}get coreSettings(){return this.getSettings("core")}get forkSettings(){return this.getSettings("fork")}get emoteSettings(){return this.getSettings("emote")}getSettings(t){return Object.keys(settings).reduce((a,o)=>{let d=settings[o];return d.cat===t&&d.implemented&&!d.hidden&&(d.text=o,a.push(d)),a},[])}sideBarOnClick(t){let a=this;$(".content-region").first().hide(),$(a.root).show();"core"===t?a.renderCoreSettings():"fork"===t?a.renderForkSettings():"emotes"===t?a.renderEmoteSettings():"customcss"===t?a.renderCustomCssEditor():"plugins"===t?a.renderPluginPane():"themes"===t?a.renderThemePane():void 0}onClick(){}onChange(t,a){settingsCookie[t]=a,this.updateSettings()}updateSettings(){let t=settingsCookie;t["bda-es-0"]?$("#twitchcord-button-container").show():$("#twitchcord-button-container").hide(),t["bda-gs-b"]?$("body").addClass("bd-blue"):$("body").removeClass("bd-blue"),t["bda-gs-2"]?$("body").addClass("bd-minimal"):$("body").removeClass("bd-minimal"),t["bda-gs-3"]?$("body").addClass("bd-minimal-chan"):$("body").removeClass("bd-minimal-chan"),t["bda-gs-1"]?$("#bd-pub-li").show():$("#bd-pub-li").hide(),t["bda-gs-4"]?voiceMode.enable():voiceMode.disable(),t["bda-gs-5"]?$("#app-mount").addClass("bda-dark"):$("#app-mount").removeClass("bda-dark"),t["bda-gs-6"]&&mainCore.inject24Hour(),t["bda-gs-7"]?mainCore.injectColoredText():mainCore.removeColoredText(),t["fork-ps-4"]?classNormalizer.start():classNormalizer.stop(),t["bda-gs-8"]?dMode.enable(t["fork-dm-1"]):dMode.disable(),mainCore.saveSettings()}renderSidebar(){let t=this;$("[class*='side-'] > [class*='item-']").off("click.v2settingspanel").on("click.v2settingspanel",()=>{BDV2.reactDom.unmountComponentAtNode(t.root),$(t.root).hide(),$(".content-region").first().show()}),t.sidebar.render()}get coreComponent(){return BDV2.react.createElement(V2Components.Scroller,{contentColumn:!0,fade:!0,dark:!0,children:[BDV2.react.createElement(V2Components.SettingsPanel,{key:"cspanel",title:"Core Settings",onChange:this.onChange,settings:this.coreSettings}),BDV2.react.createElement(V2Components.Tools,{key:"tools"})]})}get forkComponent(){return BDV2.react.createElement(V2Components.Scroller,{contentColumn:!0,fade:!0,dark:!0,children:[BDV2.react.createElement(V2Components.SettingsPanel,{key:"fspanel",title:"Zere's Fork Settings",onChange:this.onChange,settings:this.forkSettings,button:{title:"Clear Emote Cache",onClick:()=>{emoteModule.clearEmoteData(),emoteModule.init(),quickEmoteMenu.init()}}}),BDV2.react.createElement(V2Components.Tools,{key:"tools"})]})}get emoteComponent(){return BDV2.react.createElement(V2Components.Scroller,{contentColumn:!0,fade:!0,dark:!0,children:[BDV2.react.createElement(V2Components.SettingsPanel,{key:"espanel",title:"Emote Settings",onChange:this.onChange,settings:this.emoteSettings}),BDV2.react.createElement(V2Components.Tools,{key:"tools"})]})}get customCssComponent(){return BDV2.react.createElement(V2Components.Scroller,{contentColumn:!0,fade:!0,dark:!0,children:[BDV2.react.createElement(V2Components.CssEditor,{key:"csseditor"}),BDV2.react.createElement(V2Components.Tools,{key:"tools"})]})}get pluginsComponent(){let t=Object.keys(bdplugins).reduce((l,u)=>{return l.push(BDV2.react.createElement(V2Components.PluginCard,{key:u,plugin:bdplugins[u].plugin})),l},[]),a=BDV2.react.createElement(V2Components.List,{key:"plugin-list",className:"bda-slist",children:t}),o=BDV2.react.createElement("button",{key:"folder-button",className:"bd-pfbtn",onClick:()=>{betterDiscordIPC.send("asynchronous-message",{arg:"opendir",path:"plugindir"})}},"Open Plugin Folder"),d=BDV2.react.createElement(V2Components.ContentColumn,{key:"pcolumn",title:"Plugins",children:[o,a]});return BDV2.react.createElement(V2Components.Scroller,{contentColumn:!0,fade:!0,dark:!0,children:[d,BDV2.react.createElement(V2Components.Tools,{key:"tools"})]})}get themesComponent(){let t=Object.keys(bdthemes).reduce((l,u)=>{return l.push(BDV2.react.createElement(V2Components.ThemeCard,{key:u,theme:bdthemes[u]})),l},[]),a=BDV2.react.createElement(V2Components.List,{key:"theme-list",className:"bda-slist",children:t}),o=BDV2.react.createElement("button",{key:"folder-button",className:"bd-pfbtn",onClick:()=>{betterDiscordIPC.send("asynchronous-message",{arg:"opendir",path:"themedir"})}},"Open Theme Folder"),d=BDV2.react.createElement(V2Components.ContentColumn,{key:"tcolumn",title:"Themes",children:[o,a]});return BDV2.react.createElement(V2Components.Scroller,{contentColumn:!0,fade:!0,dark:!0,children:[d,BDV2.react.createElement(V2Components.Tools,{key:"tools"})]})}renderCoreSettings(){let t=this.root;return t?void BDV2.reactDom.render(this.coreComponent,t):void console.log("FAILED TO LOCATE ROOT: .layer .ui-standard-sidebar-view")}renderForkSettings(){let t=this.root;return t?void BDV2.reactDom.render(this.forkComponent,t):void console.log("FAILED TO LOCATE ROOT: .layer .ui-standard-sidebar-view")}renderEmoteSettings(){let t=this.root;return t?void BDV2.reactDom.render(this.emoteComponent,t):void console.log("FAILED TO LOCATE ROOT: .layer .ui-standard-sidebar-view")}renderCustomCssEditor(){let t=this.root;return t?void BDV2.reactDom.render(this.customCssComponent,t):void console.log("FAILED TO LOCATE ROOT: .layer .ui-standard-sidebar-view")}renderPluginPane(){let t=this.root;return t?void BDV2.reactDom.render(this.pluginsComponent,t):void console.log("FAILED TO LOCATE ROOT: .layer .ui-standard-sidebar-view")}renderThemePane(){let t=this.root;return t?void BDV2.reactDom.render(this.themesComponent,t):void console.log("FAILED TO LOCATE ROOT: .layer .ui-standard-sidebar-view")}}class V2C_Layer extends BDV2.reactComponent{constructor(t){super(t)}componentDidMount(){$(window).on(`keyup.${this.props.id}`,t=>{27===t.which&&BDV2.reactDom.unmountComponentAtNode(this.refs.root.parentNode)}),$(`#${this.props.id}`).animate({opacity:1},{step:function(t){$(this).css("transform",`scale(${1.1-0.1*t}) translateZ(0px)`)},duration:200,done:()=>{$(`#${this.props.id}`).css("opacity","").css("transform","")}})}componentWillUnmount(){$(window).off(`keyup.${this.props.id}`),$(`#${this.props.id}`).animate({opacity:0},{step:function(t){$(this).css("transform",`scale(${1.1-0.1*t}) translateZ(0px)`)},duration:200,done:()=>{$(`#${this.props.rootId}`).remove()}}),$("[class*=\"layer-\"]").removeClass("publicServersOpen").animate({opacity:1},{step:function(t){$(this).css("transform",`scale(${0.07*t+0.93}) translateZ(0px)`)},duration:200,done:()=>{$("[class*=\"layer-\"]").css("opacity","").css("transform","")}})}componentWillMount(){$("[class*=\"layer-\"]").addClass("publicServersOpen").animate({opacity:0},{step:function(t){$(this).css("transform",`scale(${0.07*t+0.93}) translateZ(0px)`)},duration:200})}render(){return BDV2.react.createElement("div",{className:"layer bd-layer layer-3QrUeG",id:this.props.id,ref:"root",style:{opacity:0,transform:"scale(1.1) translateZ(0px)"}},this.props.children)}}class V2C_SidebarView extends BDV2.reactComponent{constructor(t){super(t)}render(){let{sidebar:t,content:a,tools:o}=this.props.children;return BDV2.react.createElement("div",{className:"ui-standard-sidebar-view"},BDV2.react.createElement("div",{className:"sidebar-region"},BDV2.react.createElement(V2Components.Scroller,{key:"sidebarScroller",ref:"sidebarScroller",sidebar:!0,fade:t.fade||!0,dark:t.dark||!0,children:t.component})),BDV2.react.createElement("div",{className:"content-region"},BDV2.react.createElement("div",{className:"content-transition-wrap"},BDV2.react.createElement("div",{className:"scrollerWrap-2lJEkd content-region-scroller-wrap scrollerThemed-2oenus themeGhost-28MSn0 scrollerTrack-1ZIpsv"},BDV2.react.createElement("div",{className:"scroller-2FKFPG content-region-scroller scroller",ref:"contentScroller"},BDV2.react.createElement("div",{className:"content-column default"},a.component),o.component)))))}}class V2_PublicServers{constructor(){}get component(){return BDV2.react.createElement(V2Components.Layer,{rootId:"pubslayerroot",id:"pubslayer",children:BDV2.react.createElement(V2C_PublicServers,{rootId:"pubslayerroot"})})}get root(){let t=document.getElementById("pubslayerroot");return t?t:this.injectRoot()?this.root:null}injectRoot(){return!!$(".layers, .layers-3iHuyZ").length&&($(".layers, .layers-3iHuyZ").append($("
",{id:"pubslayerroot"})),!0)}render(){let t=this.root;return t?void BDV2.reactDom.render(this.component,t):void console.log("FAILED TO LOCATE ROOT: .layers")}get button(){let t=$("
",{"class":BDV2.guildClasses.guild,id:"bd-pub-li",css:{height:"20px",display:settingsCookie["bda-gs-1"]?"":"none"}}).append($("
",{"class":BDV2.guildClasses.guildInner,css:{height:"20px","border-radius":"4px"}}).append($("",{}).append($("
",{text:"public",id:"bd-pub-button",css:{"line-height":"20px","font-size":"12px"},click:()=>{this.render()}}))));return t}initialize(){let t=$(`.${BDV2.guildClasses.guilds}>:first-child`);t.after(this.button)}}class V2C_ServerCard extends BDV2.reactComponent{constructor(t){super(t),this.props.server.iconUrl||(this.props.server.iconUrl=this.props.fallback),this.state={imageError:!1,joined:this.props.guildList.includes(this.props.server.identifier)}}render(){let{server:t}=this.props;return BDV2.react.createElement("div",{className:`card-3Qj_Yx cardPrimary-1Hv-to marginBottom8-AtZOdT bd-server-card${t.pinned?" bd-server-card-pinned":""}`},BDV2.react.createElement("img",{ref:"img",className:"bd-server-image",src:t.iconUrl,onError:this.handleError.bind(this)}),BDV2.react.createElement("div",{className:"flexChild-faoVW3 bd-server-content"},BDV2.react.createElement("div",{className:"flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-header"},BDV2.react.createElement("h5",{className:"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name"},t.name),BDV2.react.createElement("h5",{className:"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count"},t.members," Members")),BDV2.react.createElement("div",{className:"flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6"},BDV2.react.createElement("div",{className:"scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container"},BDV2.react.createElement("div",{className:"scroller-2FKFPG scroller bd-server-description"},t.description))),BDV2.react.createElement("div",{className:"flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer"},BDV2.react.createElement("div",{className:"flexChild-faoVW3 bd-server-tags",style:{flex:"1 1 auto"}},t.categories.join(", ")),this.state.joined&&BDV2.react.createElement("button",{type:"button",className:"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY",style:{minHeight:"12px",marginTop:"4px",backgroundColor:"#3ac15c"}},BDV2.react.createElement("div",{className:"ui-button-contents"},"Joined")),t.error&&BDV2.react.createElement("button",{type:"button",className:"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug",style:{minHeight:"12px",marginTop:"4px",backgroundColor:"#c13a3a"}},BDV2.react.createElement("div",{className:"ui-button-contents"},"Error")),!t.error&&!this.state.joined&&BDV2.react.createElement("button",{type:"button",className:"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN",style:{minHeight:"12px",marginTop:"4px"},onClick:()=>{this.join()}},BDV2.react.createElement("div",{className:"ui-button-contents"},"Join")))))}handleError(){this.props.server.iconUrl=this.props.fallback,this.setState({imageError:!0})}join(){this.props.join(this)}}class V2C_PublicServers extends BDV2.reactComponent{constructor(t){super(t),this.setInitialState(),this.close=this.close.bind(this),this.changeCategory=this.changeCategory.bind(this),this.search=this.search.bind(this),this.searchKeyDown=this.searchKeyDown.bind(this),this.checkConnection=this.checkConnection.bind(this),this.join=this.join.bind(this),this.connect=this.connect.bind(this),this.GuildStore=BDV2.WebpackModules.findByUniqueProperties(["getGuilds"]),this.AvatarDefaults=BDV2.WebpackModules.findByUniqueProperties(["getUserAvatarURL","DEFAULT_AVATARS"]),this.InviteActions=BDV2.WebpackModules.findByUniqueProperties(["acceptInvite"]),this.SortedGuildStore=BDV2.WebpackModules.findByUniqueProperties(["getSortedGuilds"])}componentDidMount(){this.checkConnection()}setInitialState(){this.state={selectedCategory:-1,title:"Loading...",loading:!0,servers:[],next:null,connection:{state:0,user:null}}}close(){BDV2.reactDom.unmountComponentAtNode(document.getElementById(this.props.rootId))}search(t,a){let o=this;$.ajax({method:"GET",url:`${o.endPoint}${t}${t?"&schema=new":"?schema=new"}`,success:d=>{let l=d.results.reduce((g,b)=>{return b.joined=!1,g.push(b),g},[]);a||(l=o.state.servers.concat(l));let u=d.size+d.from;d.next=`?from=${u}`,o.state.term&&(d.next+=`&term=${o.state.term}`),o.state.selectedCategory&&(d.next+=`&category=${o.categoryButtons[o.state.selectedCategory]}`),u>=d.total&&(u=d.total,d.next=null);let h=`Showing 1-${u} of ${d.total} results in ${o.categoryButtons[o.state.selectedCategory]}`;o.state.term&&(h+=` for ${o.state.term}`),o.setState({loading:!1,title:h,servers:l,next:d.next}),a&&(o.refs.sbv.refs.contentScroller.scrollTop=0)},error:()=>{o.setState({loading:!1,title:"Failed to load servers. Check console for details"})}})}join(t){return t.props.pinned?this.InviteActions.acceptInvite(t.props.invite_code):void $.ajax({method:"GET",url:`${this.joinEndPoint}/${t.props.server.identifier}`,headers:{Accept:"application/json;","Content-Type":"application/json;","x-discord-id":this.state.connection.user.id,"x-discord-token":this.state.connection.user.accessToken},crossDomain:!0,xhrFields:{withCredentials:!0},success:()=>{t.setState({joined:!0})}})}connect(){let t=this,a=t.windowOptions;a.x=Math.round(window.screenX+window.innerWidth/2-a.width/2),a.y=Math.round(window.screenY+window.innerHeight/2-a.height/2),t.joinWindow=new(window.require("electron").remote.BrowserWindow)(a);let o=window.location.hostname.split(".")[0],d=t.connectEndPoint+("canary"===o||"ptb"===o?`/${o}`:"")+"?betterDiscord";t.joinWindow.webContents.on("did-navigate",(l,u)=>{"https://join.discordservers.com/session"!=u||(t.joinWindow.close(),t.checkConnection())}),t.joinWindow.loadURL(d)}get windowOptions(){return{width:500,height:550,backgroundColor:"#282b30",show:!0,resizable:!1,maximizable:!1,minimizable:!1,alwaysOnTop:!0,frame:!1,center:!1}}get bdServer(){let a=this.SortedGuildStore.guildPositions,o=this.AvatarDefaults.DEFAULT_AVATARS;return BDV2.react.createElement(V2Components.ServerCard,{server:{name:"BetterDiscord",online:"7500+",members:"20000+",categories:["community","programming","support"],description:"Official BetterDiscord server for support etc",identifier:"86004744966914048",iconUrl:"https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp",nativejoin:!0,invite_code:"0Tmfo5ZbORCRqbAd",pinned:!0},pinned:!0,join:this.join,guildList:a,fallback:o[Math.floor(5*Math.random())]})}get endPoint(){return"https://search.discordservers.com"}get joinEndPoint(){return"https://join.discordservers.com"}get connectEndPoint(){return"https://join.discordservers.com/connect"}checkConnection(){let t=this;try{$.ajax({method:"GET",url:`${t.joinEndPoint}/session`,headers:{Accept:"application/json;","Content-Type":"application/json;"},crossDomain:!0,xhrFields:{withCredentials:!0},success:a=>{t.setState({selectedCategory:0,connection:{state:2,user:a}}),t.search("",!0)},error:a=>{if(403===a.status||404===a.status)return void t.setState({title:"Not connected to discordservers.com!",loading:!0,selectedCategory:-1,connection:{state:1,user:null}})}})}catch(a){t.setState({title:"Not connected to discordservers.com!",loading:!0,selectedCategory:-1,connection:{state:1,user:null}})}}render(){return BDV2.react.createElement(V2Components.SidebarView,{ref:"sbv",children:this.component})}get component(){return{sidebar:{component:this.sidebar},content:{component:this.content},tools:{component:BDV2.react.createElement(V2Components.Tools,{key:"pt",ref:"tools",onClick:this.close})}}}get sidebar(){return BDV2.react.createElement("div",{className:"sidebar",key:"ps"},BDV2.react.createElement("div",{className:"ui-tab-bar SIDE"},BDV2.react.createElement("div",{className:"ui-tab-bar-header",style:{fontSize:"16px"}},"Public Servers"),BDV2.react.createElement(V2Components.TabBar.Separator,null),this.searchInput,BDV2.react.createElement(V2Components.TabBar.Separator,null),BDV2.react.createElement(V2Components.TabBar.Header,{text:"Categories"}),this.categoryButtons.map((t,a)=>{return BDV2.react.createElement(V2Components.TabBar.Item,{id:a,onClick:this.changeCategory,key:a,text:t,selected:this.state.selectedCategory===a})}),BDV2.react.createElement(V2Components.TabBar.Separator,null),this.footer,this.connection))}get searchInput(){return BDV2.react.createElement("div",{className:"ui-form-item"},BDV2.react.createElement("div",{className:"ui-text-input flex-vertical",style:{width:"172px",marginLeft:"10px"}},BDV2.react.createElement("input",{ref:"searchinput",onKeyDown:this.searchKeyDown,onChange:()=>{},type:"text",className:"input default",placeholder:"Search...",maxLength:"50"})))}searchKeyDown(t){let a=this;if(!(a.state.loading||13!==t.which)){a.setState({loading:!0,title:"Loading...",term:t.target.value});let o=`?term=${t.target.value}`;0!==a.state.selectedCategory&&(o+=`&category=${a.categoryButtons[a.state.selectedCategory]}`),a.search(o,!0)}}get categoryButtons(){return["All","FPS Games","MMO Games","Strategy Games","Sports Games","Puzzle Games","Retro Games","Party Games","Tabletop Games","Sandbox Games","Simulation Games","Community","Language","Programming","Other"]}changeCategory(t){let a=this;if(!a.state.loading)return a.refs.searchinput.value="",a.setState({loading:!0,selectedCategory:t,title:"Loading...",term:null}),0===t?void a.search("",!0):void a.search(`?category=${a.categoryButtons[t]}`,!0)}get content(){let t=this,a=this.SortedGuildStore.guildPositions,o=this.AvatarDefaults.DEFAULT_AVATARS;return 1===t.state.connection.state?t.notConnected:[BDV2.react.createElement("div",{ref:"content",key:"pc",className:"content-column default"},BDV2.react.createElement(V2Components.SettingsTitle,{text:t.state.title}),t.bdServer,t.state.servers.map(d=>{return BDV2.react.createElement(V2Components.ServerCard,{key:d.identifier,server:d,join:t.join,guildList:a,fallback:o[Math.floor(5*Math.random())]})}),t.state.next&&BDV2.react.createElement("button",{type:"button",onClick:()=>{t.state.loading||(t.setState({loading:!0}),t.search(t.state.next,!1))},className:"ui-button filled brand small grow",style:{width:"100%",marginTop:"10px",marginBottom:"10px"}},BDV2.react.createElement("div",{className:"ui-button-contents"},t.state.loading?"Loading":"Load More")),0`),o=[t(bdpluginErrors),t(bdthemeErrors)];a.find(".tab-bar-item").on("click",d=>{d.preventDefault(),a.find(".tab-bar-item").removeClass("selected"),$(d.target).addClass("selected"),a.find(".scroller").empty().append(o[$(d.target).index()])}),a.find(".footer button").on("click",()=>{a.addClass("closing"),setTimeout(()=>{a.remove()},300)}),a.find(".bd-backdrop").on("click",()=>{a.addClass("closing"),setTimeout(()=>{a.remove()},300)}),a.appendTo("#app-mount"),a.find(".tab-bar-item")[0].click()}},Core.prototype.showToast=function(t,a={}){if(bdConfig.deferLoaded){if(!document.querySelector(".bd-toasts")){let h=document.createElement("div");h.classList.add("bd-toasts");let g=document.querySelector(".chat-3bRxxu form, #friends, .noChannel-Z1DQK7, .activityFeed-28jde9");h.style.setProperty("left",g?g.getBoundingClientRect().left+"px":"0px"),h.style.setProperty("width",g?g.offsetWidth+"px":"100%"),h.style.setProperty("bottom",(document.querySelector(".chat-3bRxxu form")?document.querySelector(".chat-3bRxxu form").offsetHeight:80)+"px"),document.querySelector(".app").appendChild(h)}const{type:o="",icon:d=!0,timeout:l=3e3}=a;let u=document.createElement("div");u.classList.add("bd-toast"),o&&u.classList.add("toast-"+o),o&&d&&u.classList.add("icon"),u.innerText=t,document.querySelector(".bd-toasts").appendChild(u),setTimeout(()=>{u.classList.add("closing"),setTimeout(()=>{u.remove(),document.querySelectorAll(".bd-toasts .bd-toast").length||document.querySelector(".bd-toasts").remove()},300)},l)}},window.emotesFfz={},window.emotesBTTV={},window.emotesBTTV2={},window.emotesTwitch={},window.subEmotesTwitch={},window.bdEmotes={TwitchGlobal:{},TwitchSubscriber:{},BTTV:{},FrankerFaceZ:{},BTTV2:{}},window.bdEmoteSettingIDs={TwitchGlobal:"bda-es-7",TwitchSubscriber:"bda-es-7",BTTV:"bda-es-2",FrankerFaceZ:"bda-es-1",BTTV2:"bda-es-2"};function EmoteModule(){}EmoteModule.prototype.init=async function(){this.modifiers=["flip","spin","pulse","spin2","spin3","1spin","2spin","3spin","tr","bl","br","shake","shake2","shake3","flap"],this.overrides=["twitch","bttv","ffz"],this.categories=["TwitchGlobal","TwitchSubscriber","BTTV","BTTV2","FrankerFaceZ"];let t={TwitchGlobal:{url:"https://twitchemotes.com/api_cache/v3/global.json",backup:"https://"+bdConfig.updater.CDN+"/"+bdConfig.repo+"/BetterDiscordApp/"+bdConfig.hash+"/data/emotedata_twitch_global.json",variable:"TwitchGlobal",oldVariable:"emotesTwitch",getEmoteURL:a=>`https://static-cdn.jtvnw.net/emoticons/v1/${a.id}/1.0`,getOldData:(a,o)=>{return{id:a.match(/\/([0-9]+)\//)[1],code:o,emoticon_set:0,description:null}}},TwitchSubscriber:{url:"https://twitchemotes.com/api_cache/v3/subscriber.json",backup:"https://"+bdConfig.updater.CDN+"/"+bdConfig.repo+"/BetterDiscordApp/"+bdConfig.hash+"/data/emotedata_twitch_subscriber.json",variable:"TwitchSubscriber",oldVariable:"subEmotesTwitch",parser:a=>{let o={};for(let d in a){let l=a[d];for(let g,u=0,h=l.emotes.length;u{return a},getEmoteURL:a=>`https://static-cdn.jtvnw.net/emoticons/v1/${a}/1.0`,getOldData:a=>a.match(/\/([0-9]+)\//)[1]},FrankerFaceZ:{url:"https://"+bdConfig.updater.CDN+"/"+bdConfig.repo+"/BetterDiscordApp/"+bdConfig.hash+"/data/emotedata_ffz.json",variable:"FrankerFaceZ",oldVariable:"emotesFfz",getEmoteURL:a=>`https://cdn.frankerfacez.com/emoticon/${a}/1`,getOldData:a=>a.match(/\/([0-9]+)\//)[1]},BTTV:{url:"https://api.betterttv.net/emotes",variable:"BTTV",oldVariable:"emotesBTTV",parser:a=>{let o={};for(let u,d=0,l=a.emotes.length;d`${a}`,getOldData:a=>a},BTTV2:{url:"https://"+bdConfig.updater.CDN+"/"+bdConfig.repo+"/BetterDiscordApp/"+bdConfig.hash+"/data/emotedata_bttv.json",variable:"BTTV2",oldVariable:"emotesBTTV2",getEmoteURL:a=>`https://cdn.betterttv.net/emote/${a}/1x`,getOldData:a=>a.match(/emote\/(.+)\//)[1]}};for(await this.getBlacklist(),await this.loadEmoteData(t);!BDV2.MessageContentComponent;)await new Promise(a=>setTimeout(a,100));this.cancelEmoteRender||(this.cancelEmoteRender=Utils.monkeyPatch(BDV2.MessageContentComponent.prototype,"render",{after:({returnValue:a})=>{Utils.monkeyPatch(a.props,"children",{silent:!0,after:({returnValue:o})=>{const d=o.props.children[1];if(d.props.children){const l=d.props.children[1];if(l&&l.length){for(let h=0;hz.length)){this.modifiers.includes(V)&&settingsCookie["bda-es-8"]||(V=""),this.overrides.includes(U)?V=U:U="";let W=this.categories[O];if("twitch"===U?window.bdEmotes.TwitchGlobal[z]?W="TwitchGlobal":window.bdEmotes.TwitchSubscriber[z]&&(W="TwitchSubscriber"):"bttv"===U?window.bdEmotes.BTTV[z]?W="BTTV":window.bdEmotes.BTTV2[z]&&(W="BTTV2"):"ffz"==U&&window.bdEmotes.FrankerFaceZ[z]&&(W="FrankerFaceZ"),window.bdEmotes[W][z]&&settingsCookie[window.bdEmoteSettingIDs[W]]){const H=l[h].match(new RegExp(`([\\s]|^)${utils.escape(V?z+":"+V:z)}([\\s]|$)`));if(H){const Z=l[h].substring(0,H.index+H[1].length),J=l[h].substring(H.index+H[0].length-H[2].length);l[h]=Z;const K=BDV2.react.createElement(BDEmote,{name:z,url:window.bdEmotes[W][z],modifier:V});l.splice(h+1,0,J),l.splice(h+1,0,K),h+=2}}}}}}const u=l.every(h=>{return"string"==typeof h&&""==h.replace(/\s*/,"")||h.type&&"BDEmote"==h.type.name||h.props&&h.props.children&&h.props.children.props&&h.props.children.props.emojiName});if(u)for(let h of l)"object"==typeof h&&("BDEmote"==h.type.name?h.props.jumboable=!0:h.props&&h.props.children&&h.props.children.props&&h.props.children.props.emojiName&&(h.props.children.props.jumboable=!0))}}}})}}))},EmoteModule.prototype.clearEmoteData=async function(){let t=require("fs"),o=bdConfig.dataPath+"emote_data.json",d=t.existsSync(o);d&&t.unlinkSync(o),window.bdEmotes={TwitchGlobal:{},TwitchSubscriber:{},BTTV:{},FrankerFaceZ:{},BTTV2:{}}},EmoteModule.prototype.goBack=async function(t){for(let a in t)for(let o in window.bdEmotes[t[a].variable])window[t[a].oldVariable][o]=t[a].getOldData(window.bdEmotes[t[a].variable][o],o)},EmoteModule.prototype.loadEmoteData=async function(t){let a=require("fs"),d=bdConfig.dataPath+"emote_data.json",l=a.existsSync(d);if(l&&!bdConfig.cache.expired){settingsCookie["fork-ps-2"]&&mainCore.showToast("Loading emotes from cache.",{type:"info"}),utils.log("[Emotes] Loading emotes from local cache.");let u=await new Promise(g=>{a.readFile(d,"utf8",(b,f)=>{utils.log("[Emotes] Emotes loaded from cache."),b&&(f={}),g(f)})}),h=Utils.testJSON(u);for(let g in h&&(window.bdEmotes=JSON.parse(u)),t)h=0setTimeout(g,1e3));let h=await this.downloadEmotes(t[u]);window.bdEmotes[t[u].variable]=h}settingsCookie["fork-ps-2"]&&mainCore.showToast("All emotes successfully downloaded.",{type:"success"});try{a.writeFileSync(d,JSON.stringify(window.bdEmotes),"utf8")}catch(u){utils.err("[Emotes] Could not save emote data.",u)}quickEmoteMenu.init()},EmoteModule.prototype.downloadEmotes=function(t){let a=require("request"),o={url:t.url,timeout:t.timeout?t.timeout:5e3};return utils.log("[Emotes] Downloading: "+t.variable),new Promise((d,l)=>{a(o,(u,h,g)=>{if(u)return utils.err("[Emotes] Could not download "+t.variable,u),t.backup?(t.url=t.backup,t.backup=null,t.backupParser&&(t.parser=t.backupParser),d(this.downloadEmotes(t))):l({});let b={};try{b=JSON.parse(g)}catch(f){return utils.err("[Emotes] Could not download "+t.variable,u),t.backup?(t.url=t.backup,t.backup=null,t.backupParser&&(t.parser=t.backupParser),d(this.downloadEmotes(t))):l({})}for(let f in"function"==typeof t.parser&&(b=t.parser(b)),b)b[f]=t.getEmoteURL(b[f]);d(b),utils.log("[Emotes] Downloaded: "+t.variable)})})},EmoteModule.prototype.getBlacklist=function(){return new Promise(t=>{$.getJSON("https://cdn.rawgit.com/rauenzi/betterDiscordApp/"+_hash+"/data/emotefilter.json",function(a){t(bemotes=a.blacklist)})})};var bemotes=[];EmoteModule.prototype.autoCapitalize=function(){$("body").delegate($(".channelTextArea-1LDbYG textarea:first"),"keyup change paste",()=>{if(settingsCookie["bda-es-4"]){var t=$(".channelTextArea-1LDbYG textarea:first").val();if(void 0!=t){var a=t.split(" ").pop();if(3",a+=" ",a+=" ",a+="
",this.qmeHeader=a;var o="";o+="
",o+="
",o+="
",o+="
";var d="";for(let u in window.bdEmotes.TwitchGlobal)window.bdEmotes.TwitchGlobal.hasOwnProperty(u)&&(d=window.bdEmotes.TwitchGlobal[u],o+="
",o+=" \"\"",o+=" ",o+="
");o+="
",o+="
",o+="
",o+="
",this.teContainer=o;var l="";for(let u in l+="
",l+="
",l+="
",l+="
",this.favoriteEmotes)d=this.favoriteEmotes[u],l+="
",l+=" \"\"",l+=" ",l+="
";l+="
",l+="
",l+="
",l+="
",this.faContainer=l},QuickEmoteMenu.prototype.favContext=function(t,a){t.stopPropagation();var o=$("
",{id:"rmenu","data-emoteid":$(a).prop("title"),text:"Remove","class":"context-menu theme-dark"});return o.css({top:t.pageY-$("#bda-qem-favourite-container").offset().top,left:t.pageX-$("#bda-qem-favourite-container").offset().left}),$(a).parent().append(o),o.on("click",function(d){return d.preventDefault(),d.stopPropagation(),$(this).remove(),delete quickEmoteMenu.favoriteEmotes[$(this).data("emoteid")],quickEmoteMenu.updateFavorites(),!1}),!1},QuickEmoteMenu.prototype.switchHandler=function(t){this.switchQem($(t).attr("id"))},QuickEmoteMenu.prototype.switchQem=function(t){var a=$("#bda-qem-twitch"),o=$("#bda-qem-favourite"),d=$("#bda-qem-emojis");a.removeClass("active"),o.removeClass("active"),d.removeClass("active"),$(".emojiPicker-3m1S-j").hide(),$("#bda-qem-favourite-container").hide(),$("#bda-qem-twitch-container").hide();"bda-qem-twitch"===t?(a.addClass("active"),$("#bda-qem-twitch-container").show()):"bda-qem-favourite"===t?(o.addClass("active"),$("#bda-qem-favourite-container").show()):"bda-qem-emojis"===t?(d.addClass("active"),$(".emojiPicker-3m1S-j").show(),$(".emojiPicker-3m1S-j .search-bar-inner input, .emojiPicker-3m1S-j .search-bar-inner input").focus()):void 0;this.lastTab=t;var l=$(".emote-icon");l.off(),l.on("click",function(){var u=$(this).attr("title"),h=utils.getTextArea();utils.insertText(h[0]," "==h.val().slice(-1)?h.val()+u:h.val()+" "+u)})},QuickEmoteMenu.prototype.obsCallback=function(t){var a=$(t);settingsCookie["bda-es-9"]?a.removeClass("bda-qme-hidden"):a.addClass("bda-qme-hidden");settingsCookie["bda-es-0"]&&(a.prepend(this.qmeHeader),a.append(this.teContainer),a.append(this.faContainer),this.lastTab==void 0&&(this.lastTab="bda-qem-favourite"),this.switchQem(this.lastTab))},QuickEmoteMenu.prototype.favorite=function(t,a){this.favoriteEmotes.hasOwnProperty(t)||(this.favoriteEmotes[t]=a),this.updateFavorites()},QuickEmoteMenu.prototype.updateFavorites=function(){var t="";for(var a in t+="
",t+="
",t+="
",t+="
",this.favoriteEmotes){var o=this.favoriteEmotes[a];t+="
",t+=" \"\"",t+=" ",t+="
"}t+="
",t+="
",t+="
",t+="
",this.faContainer=t,$("#bda-qem-favourite-container").replaceWith(t),window.bdStorage.set("bdfavemotes",btoa(JSON.stringify(this.favoriteEmotes)))};var _hash;function Utils(){}Utils.prototype.getTextArea=function(){return $(".channelTextArea-1LDbYG textarea")},Utils.prototype.insertText=function(t,a){t.focus(),t.selectionStart=0,t.selectionEnd=t.value.length,document.execCommand("insertText",!1,a)},Utils.prototype.jqDefer=function(t){window.jQuery?t():setTimeout(function(){this.jqDefer(t)},100)},Utils.prototype.getHash=function(){return new Promise(t=>{$.getJSON("https://api.github.com/repos/rauenzi/BetterDiscordApp/commits/master").done(function(a){_hash=a.sha,bdConfig.hash=_hash,t(_hash)}).fail(()=>{_hash=_bdhash||"48844445d65c6fb5a019eff14d7dcffcc1744071",t(_hash)})})},Utils.prototype.loadHtml=function(t,a){var o=$("
",{"class":"bd-container"}).appendTo("body");t="//cdn.rawgit.com/Jiiks/BetterDiscordApp/"+_hash+"/html/"+t+".html",o.load(t,a())},Utils.prototype.injectJs=function(t){$("