diff --git a/plugin/customizer.js b/plugin/customizer.js index b9011d5..8727189 100644 --- a/plugin/customizer.js +++ b/plugin/customizer.js @@ -25,104 +25,98 @@ var internal = { } -if (window.$api === undefined && typeof $api != 'undefined') { - console.warn('$api is defined, but window.$api is not! assuming we are running under epapi6 and exporting an empty object...'); - exports = {}; -} -else - exports = { +module.exports = { + manifest: { + replacements: [ - manifest: { - replacements: [ + // fix for custom discrims breaking search + { + signature: '#([0-9]{4})', + payload: '#(.{1,4})' + }, - // fix for custom discrims breaking search - { - signature: '#([0-9]{4})', - payload: '#(.{1,4})' - }, - - // endpwn dev badges - { - //signature: 'return t.hasFlag(H.UserFlags.STAFF)', - signature: /return (\w)\.hasFlag\((\w)\.UserFlags\.STAFF\)&&(\w)\.push/g, - //payload: 'return t.hasFlag(4096)&&r.push({tooltip:"EndPwn Developer",onClick:function(){return window.open("https://endpwn.github.io/","_blank")},class:"endpwn"}),t.hasFlag(H.UserFlags.STAFF)' - payload: 'return $1.hasFlag(4096)&&$3.push({tooltip:"EndPwn Developer",onClick:function(){return window.open("https://endpwn.github.io/","_blank")},class:"endpwn"}),t.hasFlag($2.UserFlags.STAFF)&&r.push' - } - - ], - }, - - // fallback data - data: { - guilds: [], - devs: [], - bots: [], - users: {} - }, - - get me() { - return { - bot: exports.data.bots.indexOf($me()) != -1, - discrim: exports.data.users[$me()] + // endpwn dev badges + { + //signature: 'return t.hasFlag(H.UserFlags.STAFF)', + signature: /return (\w)\.hasFlag\((\w)\.UserFlags\.STAFF\)&&(\w)\.push/g, + //payload: 'return t.hasFlag(4096)&&r.push({tooltip:"EndPwn Developer",onClick:function(){return window.open("https://endpwn.github.io/","_blank")},class:"endpwn"}),t.hasFlag(H.UserFlags.STAFF)' + payload: 'return $1.hasFlag(4096)&&$3.push({tooltip:"EndPwn Developer",onClick:function(){return window.open("https://endpwn.github.io/","_blank")},class:"endpwn"}),t.hasFlag($2.UserFlags.STAFF)&&r.push' } - }, - update: function () { - // fetch goodies.json - internal.print('fetching data from server...'); - fetch('https://endpwn.cathoderay.tube/goodies.json?_=' + Date.now()) - .then(x => x.json()) - .then(r => endpwn.customizer.data = r); - }, + ], + }, - init: function () { - - // prevent doublecalling - delete endpwn.customizer.init; - - // apply custom discrims/bot tags/badges/server verif from EndPwn Customizer (endpwn.cathoderay.tube) - internal.print('initializing...'); - - // refetch customizer stuff every half hour - setInterval(endpwn.customizer.update, 1800000); - endpwn.customizer.update(); - - // add the endpwn dev badge to the class obfuscation table - wc.findFunc('profileBadges:"profileBadges')[0].exports['profileBadgeEndpwn'] = 'profileBadgeEndPwn'; - - // hook getUser() so we can apply custom discrims/bot tags/badges - $api.util.wrapAfter( - "wc.findCache('getUser')[0].exports.getUser", - - x => { - - if (x === undefined || x === null) return; - - if (endpwn.customizer.data.bots.includes(x.id)) x.bot = true; - if (endpwn.customizer.data.users[x.id] !== undefined) x.discriminator = endpwn.customizer.data.users[x.id]; - if (endpwn.customizer.data.devs.includes(x.id)) x.flags += x.flags & 4096 ? 0 : 4096; - - return x; - } - ); - - // make sure devs' badges actually render - $api.events.hook('USER_PROFILE_MODAL_FETCH_SUCCESS', x => { if (endpwn.customizer.data.devs.includes(x.user.id)) x.user.flags += x.user.flags & 4096 ? 0 : 4096; }) - - // hook getGuild() so we can verify servers - $api.util.wrapAfter( - "wc.findCache('getGuild')[0].exports.getGuild", - - x => { - - if (x === undefined || x === null) return; - - if (endpwn.customizer.data.guilds.includes(x.id)) x.features.add('VERIFIED'); - - return x; - } - ); + // fallback data + data: { + guilds: [], + devs: [], + bots: [], + users: {} + }, + get me() { + return { + bot: exports.data.bots.indexOf($me()) != -1, + discrim: exports.data.users[$me()] } + }, + + update: function () { + // fetch goodies.json + internal.print('fetching data from server...'); + fetch('https://endpwn.cathoderay.tube/goodies.json?_=' + Date.now()) + .then(x => x.json()) + .then(r => endpwn.customizer.data = r); + }, + + init: function () { + + // prevent doublecalling + delete endpwn.customizer.init; + + // apply custom discrims/bot tags/badges/server verif from EndPwn Customizer (endpwn.cathoderay.tube) + internal.print('initializing...'); + + // refetch customizer stuff every half hour + setInterval(endpwn.customizer.update, 1800000); + endpwn.customizer.update(); + + // add the endpwn dev badge to the class obfuscation table + wc.findFunc('profileBadges:"profileBadges')[0].exports['profileBadgeEndpwn'] = 'profileBadgeEndPwn'; + + // hook getUser() so we can apply custom discrims/bot tags/badges + $api.util.wrapAfter( + "wc.findCache('getUser')[0].exports.getUser", + + x => { + + if (x === undefined || x === null) return; + + if (endpwn.customizer.data.bots.includes(x.id)) x.bot = true; + if (endpwn.customizer.data.users[x.id] !== undefined) x.discriminator = endpwn.customizer.data.users[x.id]; + if (endpwn.customizer.data.devs.includes(x.id)) x.flags += x.flags & 4096 ? 0 : 4096; + + return x; + } + ); + + // make sure devs' badges actually render + $api.events.hook('USER_PROFILE_MODAL_FETCH_SUCCESS', x => { if (endpwn.customizer.data.devs.includes(x.user.id)) x.user.flags += x.user.flags & 4096 ? 0 : 4096; }) + + // hook getGuild() so we can verify servers + $api.util.wrapAfter( + "wc.findCache('getGuild')[0].exports.getGuild", + + x => { + + if (x === undefined || x === null) return; + + if (endpwn.customizer.data.guilds.includes(x.id)) x.features.add('VERIFIED'); + + return x; + } + ); } + +} diff --git a/plugin/settings.js b/plugin/settings.js index b0d3335..7db2f00 100644 --- a/plugin/settings.js +++ b/plugin/settings.js @@ -16,293 +16,286 @@ https://github.com/endpwn/ */ +module.exports = { + manifest: { + replacements: [ + { + signature: /{section:(\w)\.SectionTypes\.DIVIDER},{section:"logout",/g, + payload: '{section:$1.SectionTypes.DIVIDER},{section:"ENDPWN",label:"ΣndPwn Settings",element:window.BlankSettingsElement,color:"#0cc"},{section:$1.SectionTypes.DIVIDER},{section:"logout",' + } + ], + }, -if (window.$api === undefined && typeof $api != 'undefined') { - console.warn('$api is defined, but window.$api is not! assuming we are running under epapi6 and exporting an empty object...'); - exports = {}; -} -else - exports = { + init: function () { - manifest: { - replacements: [ - { - signature: /{section:(\w)\.SectionTypes\.DIVIDER},{section:"logout",/g, - payload: '{section:$1.SectionTypes.DIVIDER},{section:"ENDPWN",label:"ΣndPwn Settings",element:window.BlankSettingsElement,color:"#0cc"},{section:$1.SectionTypes.DIVIDER},{section:"logout",' - } - ], - }, + delete endpwn.settings.init; - init: function () { + var currentSection = ''; - delete endpwn.settings.init; + $api.events.listen('ENDPWN_PSEUDO_IPC', msg => { + $api.localStorage.set('customizer_signature', JSON.parse(msg.data).signature); + console.log(currentSection); + renderSettings(currentSection); + }); - var currentSection = ''; + window.BlankSettingsElement = $api.util.findConstructor('FormSection', 'FormSection').FormSection; + + var buttons = $api.util.findFuncExports('button-', 'colorBlack'); + var checkboxes = $api.util.findFuncExports('checkboxEnabled'); + var misc = $api.util.findFuncExports('statusRed-', 'inputDefault'); + var misc2 = $api.util.findFuncExports('multiInputField'); + var headers = $api.util.findFuncExports('h5-', 'h5'); + + var panels = wc.findFunc('flexChild-')[0].exports; + var panels2 = $api.util.findFuncExports('errorMessage-', 'inputWrapper'); + + function createVerticalPanel() { + return createElement("div") + .withClass(panels2.vertical, 'epButtonPanel') + } + + function createHorizontalPanel() { + return createElement("div") + .withClass(panels.horizontal, 'epButtonPanel') + } + + function createButton(name) { + return createElement('button') + .withContents(name) + .withClass( + buttons.button, + buttons.lookFilled, + buttons.colorBrand, + buttons.sizeSmall, + buttons.grow, + 'epMargin' + ); + } + + function createWarnButton(name) { + return createElement('button') + .withContents(name) + .withClass( + buttons.button, + buttons.lookOutlined, + buttons.colorYellow, + buttons.sizeSmall, + buttons.grow, + 'epMargin' + ); + } + + function createDangerButton(name) { + return createElement('button') + .withContents(name) + .withClass( + buttons.button, + buttons.lookOutlined, + buttons.colorRed, + buttons.sizeSmall, + buttons.grow, + 'epMargin' + ); + } + + function createH2(text) { + //h2-2gWE-o title-3sZWYQ size16-14cGz5 height20-mO2eIN weightSemiBold-NJexzi defaultColor-1_ajX0 defaultMarginh2-2LTaUL marginBottom20-32qID7 + return createElement("h2") + .withClass( + headers.h2, + headers.title, + headers.size16, + headers.height20, + headers.weightSemiBold, + headers.defaultColor, + 'epMargin' + ) + .withText(text); + } + + function createH5(text) { + return createElement("h5") + .withClass( + headers.h5, + headers.title, + headers.size12, + headers.height16, + headers.weightSemiBold + ) + .withText(text); + } + + function createInput(v) { + return createElement("input") + .withClass( + misc.inputDefault, + misc.input, + misc.size16, + 'epMargin' + ) + .modify(x => x.value = v) + } + + // + //switchEnabled-V2WDBB switch-3wwwcV valueUnchecked-2lU_20 value-2hFrkk sizeDefault-2YlOZr size-3rFEHg themeDefault-24hCdX + //switchEnabled-V2WDBB switch-3wwwcV valueChecked-m-4IJZ value-2hFrkk sizeDefault-2YlOZr size-3rFEHg themeDefault-24hCdX + function updateSwitch(s, w) { + if (s.checked) { + w.classList.remove(checkboxes.valueUnchecked.split(' ')[0]); + w.classList.add(checkboxes.valueChecked.split(' ')[0]) + } + else { + w.classList.remove(checkboxes.valueChecked.split(' ')[0]); + w.classList.add(checkboxes.valueUnchecked.split(' ')[0]) + } + } + function createSwitch(c, i) { + if (c === undefined) c = () => { }; + if (i === undefined) i = false; + var s, w = createElement('div') + .withClass( + checkboxes.switch, + checkboxes.switchEnabled, + checkboxes.size, + checkboxes.sizeDefault, + checkboxes.themeDefault + ) + .withChildren( + s = createElement("input") + .withClass( + checkboxes.checkbox, + checkboxes.checkboxEnabled + ) + .modify(x => x.type = 'checkbox') + .modify(x => x.checked = i) + .modify(x => x.onchange = () => { + updateSwitch(s, w); + c(s.checked); + }) + ) + updateSwitch(s, w); + return w; + } + + function authorizeCustomizer() { + var endpoint = $api.internal.constants.API_HOST; + var url = `https://${endpoint}/oauth2/authorize?client_id=436715820970803203&redirect_uri=https%3A%2F%2Fendpwn.cathoderay.tube%2Fauth%2Fdiscord%2Fintegratedcallback&response_type=code&scope=identify`; + + var win = new window.electron.BrowserWindow({ + width: 420, + height: 500, + transparent: false, + frame: false, + resizable: true, + nodeIntegration: true + }); + win.loadURL(url); + } + + function submitCustomizer(d, b) { + + fetch('https://endpwn.cathoderay.tube/set', { + headers: { + 'Content-type': 'application/json' + }, + method: 'POST', + body: JSON.stringify({ + id: $me(), + signature: $api.localStorage.get('customizer_signature'), + discriminator: d, + bot: b + }) + }).then(r => { + + r.text().then(k => { + $api.ui.showDialog({ + title: 'Server Response', + body: k + }); + }); + + endpwn.customizer.update(); - $api.events.listen('ENDPWN_PSEUDO_IPC', msg => { - $api.localStorage.set('customizer_signature', JSON.parse(msg.data).signature); - console.log(currentSection); - renderSettings(currentSection); }); - window.BlankSettingsElement = $api.util.findConstructor('FormSection', 'FormSection').FormSection; + } - var buttons = $api.util.findFuncExports('button-', 'colorBlack'); - var checkboxes = $api.util.findFuncExports('checkboxEnabled'); - var misc = $api.util.findFuncExports('statusRed-', 'inputDefault'); - var misc2 = $api.util.findFuncExports('multiInputField'); - var headers = $api.util.findFuncExports('h5-', 'h5'); + function renderSettings(e) { - var panels = wc.findFunc('flexChild-')[0].exports; - var panels2 = $api.util.findFuncExports('errorMessage-', 'inputWrapper'); + currentSection = e; + if ($("#ep_settings")) $("#ep_settings").remove(); - function createVerticalPanel() { - return createElement("div") - .withClass(panels2.vertical, 'epButtonPanel') - } + if (e.section == "ENDPWN") { - function createHorizontalPanel() { - return createElement("div") - .withClass(panels.horizontal, 'epButtonPanel') - } + var pane = $(".content-column.default"); + if (!pane) return; - function createButton(name) { - return createElement('button') - .withContents(name) - .withClass( - buttons.button, - buttons.lookFilled, - buttons.colorBrand, - buttons.sizeSmall, - buttons.grow, - 'epMargin' - ); - } + var needAuth = !$api.localStorage.get('customizer_signature'); - function createWarnButton(name) { - return createElement('button') - .withContents(name) - .withClass( - buttons.button, - buttons.lookOutlined, - buttons.colorYellow, - buttons.sizeSmall, - buttons.grow, - 'epMargin' - ); - } - - function createDangerButton(name) { - return createElement('button') - .withContents(name) - .withClass( - buttons.button, - buttons.lookOutlined, - buttons.colorRed, - buttons.sizeSmall, - buttons.grow, - 'epMargin' - ); - } - - function createH2(text) { - //h2-2gWE-o title-3sZWYQ size16-14cGz5 height20-mO2eIN weightSemiBold-NJexzi defaultColor-1_ajX0 defaultMarginh2-2LTaUL marginBottom20-32qID7 - return createElement("h2") - .withClass( - headers.h2, - headers.title, - headers.size16, - headers.height20, - headers.weightSemiBold, - headers.defaultColor, - 'epMargin' + var content = createElement('div') + .withId('ep_settings') + .withClass('flex-vertical') + .withChildren( + createElement("div") + .withClass('epSettingsHeader') + .withText('ΣndPwn Settings') ) - .withText(text); - } + .appendTo(pane); - function createH5(text) { - return createElement("h5") - .withClass( - headers.h5, - headers.title, - headers.size12, - headers.height16, - headers.weightSemiBold - ) - .withText(text); - } + if (!$api.localStorage.get('customizer_signature')) { - function createInput(v) { - return createElement("input") - .withClass( - misc.inputDefault, - misc.input, - misc.size16, - 'epMargin' - ) - .modify(x => x.value = v) - } + createHorizontalPanel() + .withChildren( + createButton("Authorize EndPwn Customizer") + .modify(x => x.onclick = authorizeCustomizer) + ) + .appendTo(content); - // - //switchEnabled-V2WDBB switch-3wwwcV valueUnchecked-2lU_20 value-2hFrkk sizeDefault-2YlOZr size-3rFEHg themeDefault-24hCdX - //switchEnabled-V2WDBB switch-3wwwcV valueChecked-m-4IJZ value-2hFrkk sizeDefault-2YlOZr size-3rFEHg themeDefault-24hCdX - function updateSwitch(s, w) { - if (s.checked) { - w.classList.remove(checkboxes.valueUnchecked.split(' ')[0]); - w.classList.add(checkboxes.valueChecked.split(' ')[0]) } else { - w.classList.remove(checkboxes.valueChecked.split(' ')[0]); - w.classList.add(checkboxes.valueUnchecked.split(' ')[0]) - } - } - function createSwitch(c, i) { - if (c === undefined) c = () => { }; - if (i === undefined) i = false; - var s, w = createElement('div') - .withClass( - checkboxes.switch, - checkboxes.switchEnabled, - checkboxes.size, - checkboxes.sizeDefault, - checkboxes.themeDefault - ) - .withChildren( - s = createElement("input") - .withClass( - checkboxes.checkbox, - checkboxes.checkboxEnabled - ) - .modify(x => x.type = 'checkbox') - .modify(x => x.checked = i) - .modify(x => x.onchange = () => { - updateSwitch(s, w); - c(s.checked); - }) - ) - updateSwitch(s, w); - return w; - } - function authorizeCustomizer() { - var endpoint = $api.internal.constants.API_HOST; - var url = `https://${endpoint}/oauth2/authorize?client_id=436715820970803203&redirect_uri=https%3A%2F%2Fendpwn.cathoderay.tube%2Fauth%2Fdiscord%2Fintegratedcallback&response_type=code&scope=identify`; + var discrim, bot; - var win = new window.electron.BrowserWindow({ - width: 420, - height: 500, - transparent: false, - frame: false, - resizable: true, - nodeIntegration: true - }); - win.loadURL(url); - } - - function submitCustomizer(d, b) { - - fetch('https://endpwn.cathoderay.tube/set', { - headers: { - 'Content-type': 'application/json' - }, - method: 'POST', - body: JSON.stringify({ - id: $me(), - signature: $api.localStorage.get('customizer_signature'), - discriminator: d, - bot: b - }) - }).then(r => { - - r.text().then(k => { - $api.ui.showDialog({ - title: 'Server Response', - body: k - }); - }); - - endpwn.customizer.update(); - - }); - - } - - function renderSettings(e) { - - currentSection = e; - if ($("#ep_settings")) $("#ep_settings").remove(); - - if (e.section == "ENDPWN") { - - var pane = $(".content-column.default"); - if (!pane) return; - - var needAuth = !$api.localStorage.get('customizer_signature'); - - var content = createElement('div') - .withId('ep_settings') - .withClass('flex-vertical') + createVerticalPanel() .withChildren( - createElement("div") - .withClass('epSettingsHeader') - .withText('ΣndPwn Settings') - ) - .appendTo(pane); + createH5('Discriminator'), + createHorizontalPanel() + .withChildren( + discrim = createInput(endpwn.customizer.me.discrim ? endpwn.customizer.me.discrim : '') + .withClass('epDiscrimField') + .modify(x => x.maxLength = 4), + createVerticalPanel() + .withChildren( + createH5('Bot?'), + bot = createSwitch(() => { }, endpwn.customizer.me.bot) + ), + createButton("Submit") + .modify(x => x.onclick = () => submitCustomizer(discrim.value, bot.children[0].checked)) + ) - if (!$api.localStorage.get('customizer_signature')) { - - createHorizontalPanel() - .withChildren( - createButton("Authorize EndPwn Customizer") - .modify(x => x.onclick = authorizeCustomizer) - ) - .appendTo(content); - - } - else { - - var discrim, bot; - - createVerticalPanel() - .withChildren( - createH5('Discriminator'), - createHorizontalPanel() - .withChildren( - discrim = createInput(endpwn.customizer.me.discrim ? endpwn.customizer.me.discrim : '') - .withClass('epDiscrimField') - .modify(x => x.maxLength = 4), - createVerticalPanel() - .withChildren( - createH5('Bot?'), - bot = createSwitch(() => { }, endpwn.customizer.me.bot) - ), - createButton("Submit") - .modify(x => x.onclick = () => submitCustomizer(discrim.value, bot.children[0].checked)) - ) - - ) - .appendTo(content); - - } - - createElement("div") - .withClass(panels.horizontal, 'epButtonPanel') - .withChildren( - createButton("Open Data Folder") - .modify(x => x.onclick = () => { electron.shell.openExternal($api.data) }), - createWarnButton("Restart in safe mode") - .modify(x => x.onclick = endpwn.safemode), - createDangerButton("Uninstall EndPwn") - .modify(x => x.onclick = endpwn.uninstall) ) .appendTo(content); } + createElement("div") + .withClass(panels.horizontal, 'epButtonPanel') + .withChildren( + createButton("Open Data Folder") + .modify(x => x.onclick = () => { electron.shell.openExternal($api.data) }), + createWarnButton("Restart in safe mode") + .modify(x => x.onclick = endpwn.safemode), + createDangerButton("Uninstall EndPwn") + .modify(x => x.onclick = endpwn.uninstall) + ) + .appendTo(content); + } - $api.events.hook("USER_SETTINGS_MODAL_SET_SECTION", renderSettings); - $api.events.hook("USER_SETTINGS_MODAL_INIT", e => setTimeout(_ => renderSettings(e), 200)); } + $api.events.hook("USER_SETTINGS_MODAL_SET_SECTION", renderSettings); + $api.events.hook("USER_SETTINGS_MODAL_INIT", e => setTimeout(_ => renderSettings(e), 200)); } + +} diff --git a/plugin/system.js b/plugin/system.js index 6d31ccd..6eda84a 100644 --- a/plugin/system.js +++ b/plugin/system.js @@ -28,181 +28,170 @@ var internal = { } -if (window.$api === undefined && typeof $api != 'undefined') { - console.warn('$api is defined, but window.$api is not! assuming we are running under epapi6 and exporting an empty object...'); - exports = {}; -} -else - exports = { +module.exports = { + manifest: { + replacements: [ - manifest: { + // changelog injection + /*{ + signature: /key:"changeLog",get:function\(\){return (\w)}/g, + payload: 'key:"changeLog",get:function(){if(!$1.injected){$1.injected=1;$1.date=$1.date<=window.endpwn.changelog.date?window.endpwn.changelog.date:$1.date;$1.body=window.endpwn.changelog.body+"\\n\\n"+$1.body}return $1}' + },*/ - replacements: [ + // crash screen hijack + { + signature: /var (\w)=(\w)\("div",{},void 0,\w\("p",{},void 0,(\w)\.default\.Messages\.ERRORS_UNEXPECTED_CRASH\),\w\("p",{},void 0,\w\.default\.Messages\.ERRORS_ACTION_TO_TAKE\)\),(\w)=\w\((\w)\.default,{size:(\w)\.ButtonSizes\.LARGE,onClick:this\._handleSubmitReport},void 0,a\.default\.Messages\.ERRORS_RELOAD\);return o\(u\.default,{theme:this\.props.theme,title:a\.default\.Messages\.UNSUPPORTED_BROWSER_TITLE,/g, + payload: `var $1=$2("div",{},void 0,$2("p",{},void 0,"Something has gone very, very wrong, and Discord has crashed."),$2("p",{},void 0,"If this is the first time you've seen this error screen, reload and hope for the best. If this screen appears again, follow these steps:"),$2("p",{},void 0,"Try removing any new plugins and restarting again. If this solves the problem there may be a bug in a plugin or a conflict."),$2("p",{},void 0,"If problems continue, it's likely that there is a bug in EndPwn or Discord."),$2("p",{},void 0,"If you need help, join the EndPwn Discord server (https://discord.gg/wXdPNf2)"),$2("p",{},void 0,"Details may be available in the console (Ctrl+Shift+I), but at this level of crash we can't be certain.")),$4=$2("div",{},void 0,$2($5.default,{size:$6.ButtonSizes.LARGE,onClick:()=>window.electron.getCurrentWindow().reload()},void 0,"Reload"),$2($5.default,{size:$6.ButtonSizes.LARGE,onClick:()=>{window.$api.localStorage.set('safemode',1);window.electron.getCurrentWindow().reload()}},void 0,"Reload in safe mode"));return $2(u.default,{theme:this.props.theme,title:"Discord: Fatal Error",` + } - // changelog injection - /*{ - signature: /key:"changeLog",get:function\(\){return (\w)}/g, - payload: 'key:"changeLog",get:function(){if(!$1.injected){$1.injected=1;$1.date=$1.date<=window.endpwn.changelog.date?window.endpwn.changelog.date:$1.date;$1.body=window.endpwn.changelog.body+"\\n\\n"+$1.body}return $1}' - },*/ + ], + }, - // crash screen hijack - { - signature: /var (\w)=(\w)\("div",{},void 0,\w\("p",{},void 0,(\w)\.default\.Messages\.ERRORS_UNEXPECTED_CRASH\),\w\("p",{},void 0,\w\.default\.Messages\.ERRORS_ACTION_TO_TAKE\)\),(\w)=\w\((\w)\.default,{size:(\w)\.ButtonSizes\.LARGE,onClick:this\._handleSubmitReport},void 0,a\.default\.Messages\.ERRORS_RELOAD\);return o\(u\.default,{theme:this\.props.theme,title:a\.default\.Messages\.UNSUPPORTED_BROWSER_TITLE,/g, - payload: `var $1=$2("div",{},void 0,$2("p",{},void 0,"Something has gone very, very wrong, and Discord has crashed."),$2("p",{},void 0,"If this is the first time you've seen this error screen, reload and hope for the best. If this screen appears again, follow these steps:"),$2("p",{},void 0,"Try removing any new plugins and restarting again. If this solves the problem there may be a bug in a plugin or a conflict."),$2("p",{},void 0,"If problems continue, it's likely that there is a bug in EndPwn or Discord."),$2("p",{},void 0,"If you need help, join the EndPwn Discord server (https://discord.gg/wXdPNf2)"),$2("p",{},void 0,"Details may be available in the console (Ctrl+Shift+I), but at this level of crash we can't be certain.")),$4=$2("div",{},void 0,$2($5.default,{size:$6.ButtonSizes.LARGE,onClick:()=>window.electron.getCurrentWindow().reload()},void 0,"Reload"),$2($5.default,{size:$6.ButtonSizes.LARGE,onClick:()=>{window.$api.localStorage.set('safemode',1);window.electron.getCurrentWindow().reload()}},void 0,"Reload in safe mode"));return $2(u.default,{theme:this.props.theme,title:"Discord: Fatal Error",` - } + preload: function () { + window.reload = () => { app.relaunch(); app.exit(); }; + window.endpwn = { - ], - }, + // safemode + safemode: function () { + $api.ui.showDialog({ + title: 'EndPwn: safe mode', + body: 'This will restart your client in a state without plugin support.', + confirmText: 'Yes', cancelText: 'No', - preload: function () { + onConfirm: () => { - window.reload = () => { app.relaunch(); app.exit(); }; - window.endpwn = { + $api.localStorage.set('safemode', 1); + window.electron.getCurrentWindow().reload(); - // safemode - safemode: function () { + } + }); + }, + + // uninstaller + uninstall: function () { + $api.ui.showDialog({ + title: 'EndPwn: confirm uninstallation', + body: 'Are you sure you want to remove EndPwn from your client? You can reinstall it at any time.', + confirmText: 'Yes', cancelText: 'No', + + onConfirm: () => { + + var data = $api.data; + + $api.settings.set('WEBAPP_ENDPOINT'); + $api.settings.set('WEBAPP_PATH'); + $api.settings.set('UPDATE_ENDPOINT'); + + reload(); + + } + }); + }, + + // endpwn customizer + customizer: krequire('customizer'), + + // settings page stuff + settings: krequire('settings'), + + // wrapper function for dispatch() + // intended to simplify using executeJavaScript() from other windows as a bad IPC method + // we do this since afaik we cant use electron.ipc in a useful way (maybe im wrong? if i am ill make this better later on lol) + pseudoipc: function (e) { + $api.events.dispatch({ + type: 'ENDPWN_PSEUDO_IPC', + data: e + }); + }, + + __eval: e => eval(e) + + }; + + // fetch the changelog + /*internal.print('retrieving changelog...'); + fetch('https://dr1ft.xyz/ep/changelog.txt?_=' + Date.now()).then(r => r.text()).then(l => { + var data = l.split(';;'); + window.endpwn.changelog = { + date: data[0], + body: data[1] + }; + });*/ + + // early init payload + document.addEventListener('ep-prepared', () => { + + // disable that obnoxious warning about not pasting shit in the console + internal.print('disabling self xss warning...'); + $api.util.findFuncExports('consoleWarning').consoleWarning = e => { }; + + // fuck sentry + internal.print('fucking sentry...'); + var sentry = wc.findCache('_originalConsoleMethods')[0].exports; + window.console = Object.assign(window.console, sentry._originalConsoleMethods); // console + sentry._wrappedBuiltIns.forEach(x => x[0][x[1]] = x[2]); // other stuff + sentry._breadcrumbEventHandler = () => () => { }; // break most event logging + sentry.captureBreadcrumb = () => { }; // disable breadcrumb logging + + }); + + }, + + start: function () { + + // disable analytics + internal.print('disabling analytics...'); + $api.util.findFuncExports("AnalyticEventConfigs").default.track = () => { }; + + // enable experiments + internal.print('enabling experiments menu...'); + $api.util.findFuncExports('isDeveloper').__defineGetter__('isDeveloper', () => true); + + // if we used start() in the other files, it would create a different instance -- we dont want that + endpwn.customizer.init(); + endpwn.settings.init(); + + // check for epapi updates + if ($api.lite || !fs.existsSync($api.data + '/DONTUPDATE')) + (function () { + internal.print('checking for EPAPI updates...'); + + // fetch the latest build of epapi + fetch('https://lambda.cynfoxwell.cf/epapi/epapi.js?_=' + Date.now()).then(x => x.text()).then(x => { + + // check the version + if (kparse(x).version > $api.version) { + + // if the version on the server is newer, pester the user $api.ui.showDialog({ - title: 'EndPwn: safe mode', - body: 'This will restart your client in a state without plugin support.', - confirmText: 'Yes', cancelText: 'No', + title: 'EndPwn3: EPAPI Update Available', + body: 'An update to EPAPI has been released. It is recommended that you restart your client in order to gain access to new features and maintain compatibility.', + confirmText: 'Restart Now', cancelText: 'Later', + + // user pressed "Restart Now" onConfirm: () => { - $api.localStorage.set('safemode', 1); - window.electron.getCurrentWindow().reload(); - - } - }); - }, - - // uninstaller - uninstall: function () { - $api.ui.showDialog({ - title: 'EndPwn: confirm uninstallation', - body: 'Are you sure you want to remove EndPwn from your client? You can reinstall it at any time.', - confirmText: 'Yes', cancelText: 'No', - - onConfirm: () => { - - var data = $api.data; - - $api.settings.set('WEBAPP_ENDPOINT'); - $api.settings.set('WEBAPP_PATH'); - $api.settings.set('UPDATE_ENDPOINT'); - + // refresh the page if we're running in a browser, reboot the app if we're running outside of lite mode reload(); + }, + + // they pressed "Later", for some reason + onCancel: () => { + + // bother them again in 6 hrs (* 60 min * 60 sec * 1000 ms) + setTimeout(arguments.callee, 6 * 60 * 60 * 1000); + } + }); - }, - // endpwn customizer - customizer: krequire('customizer'), - - // settings page stuff - settings: krequire('settings'), - - // wrapper function for dispatch() - // intended to simplify using executeJavaScript() from other windows as a bad IPC method - // we do this since afaik we cant use electron.ipc in a useful way (maybe im wrong? if i am ill make this better later on lol) - pseudoipc: function (e) { - $api.events.dispatch({ - type: 'ENDPWN_PSEUDO_IPC', - data: e - }); - }, - - __eval: e => eval(e) - - }; - - // fetch the changelog - /*internal.print('retrieving changelog...'); - fetch('https://dr1ft.xyz/ep/changelog.txt?_=' + Date.now()).then(r => r.text()).then(l => { - var data = l.split(';;'); - window.endpwn.changelog = { - date: data[0], - body: data[1] - }; - });*/ - - // early init payload - document.addEventListener('ep-prepared', () => { - - // disable that obnoxious warning about not pasting shit in the console - internal.print('disabling self xss warning...'); - $api.util.findFuncExports('consoleWarning').consoleWarning = e => { }; - - // fuck sentry - internal.print('fucking sentry...'); - var sentry = wc.findCache('_originalConsoleMethods')[0].exports; - window.console = Object.assign(window.console, sentry._originalConsoleMethods); // console - sentry._wrappedBuiltIns.forEach(x => x[0][x[1]] = x[2]); // other stuff - sentry._breadcrumbEventHandler = () => () => { }; // break most event logging - sentry.captureBreadcrumb = () => { }; // disable breadcrumb logging + } + else setTimeout(arguments.callee, 6 * 60 * 60 * 1000); }); - }, - - start: function () { - - // disable analytics - internal.print('disabling analytics...'); - $api.util.findFuncExports("AnalyticEventConfigs").default.track = () => { }; - - // enable experiments - internal.print('enabling experiments menu...'); - $api.util.findFuncExports('isDeveloper').__defineGetter__('isDeveloper', () => true); - - // if we used start() in the other files, it would create a different instance -- we dont want that - endpwn.customizer.init(); - endpwn.settings.init(); - - // check for epapi updates - if ($api.lite || !fs.existsSync($api.data + '/DONTUPDATE')) - (function () { - - internal.print('checking for EPAPI updates...'); - - // fetch the latest build of epapi - fetch('https://lambda.cynfoxwell.cf/epapi/epapi.js?_=' + Date.now()).then(x => x.text()).then(x => { - - // check the version - if (kparse(x).version > $api.version) { - - // if the version on the server is newer, pester the user - $api.ui.showDialog({ - - title: 'EndPwn3: EPAPI Update Available', - body: 'An update to EPAPI has been released. It is recommended that you restart your client in order to gain access to new features and maintain compatibility.', - confirmText: 'Restart Now', cancelText: 'Later', - - // user pressed "Restart Now" - onConfirm: () => { - - // refresh the page if we're running in a browser, reboot the app if we're running outside of lite mode - reload(); - - }, - - // they pressed "Later", for some reason - onCancel: () => { - - // bother them again in 6 hrs (* 60 min * 60 sec * 1000 ms) - setTimeout(arguments.callee, 6 * 60 * 60 * 1000); - - } - - }); - - } - else setTimeout(arguments.callee, 6 * 60 * 60 * 1000); - - }); - - })(); - - } - - } \ No newline at end of file + })(); + } +} \ No newline at end of file