2018-06-13 22:25:08 +00:00
/ *
EndPwn3 System ( bootstrap )
Copyright 2018 EndPwn Project
Permission is hereby granted , free of charge , to any person obtaining a copy of this software and associated documentation files ( the "Software" ) , to deal in the Software without restriction , including without limitation the rights to use , copy , modify , merge , publish , distribute , sublicense , and / or sell copies of the Software , and to permit persons to whom the Software is furnished to do so , subject to the following conditions :
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software .
THE SOFTWARE IS PROVIDED "AS IS" , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE .
DO NOT EDIT THIS FILE ! Your bootstrap may overwrite changes to it , and you will lose your work !
EndPwn3 users : You can prevent this by creating a file in the same directory named DONTUPDATE
https : //github.com/endpwn/
* /
var internal = {
print : function ( str ) {
console . log ( ` %c[EndPwn3]%c ` + str , 'font-weight:bold;color:#0cc' , '' ) ;
} ,
warn : function ( str ) {
console . warn ( ` %c[EndPwn3]%c ` + str , 'font-weight:bold;color:#0cc' , '' ) ;
}
}
2018-06-16 00:05:38 +00:00
exports = {
2018-06-15 23:50:37 +00:00
manifest : {
replacements : [
// 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", `
2018-06-16 00:05:38 +00:00
} ,
// experiments
{
signature : "window.GLOBAL_ENV.RELEASE_CHANNEL" ,
payload : "'staging'"
2018-06-15 23:50:37 +00:00
}
] ,
} ,
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
preload : function ( ) {
window . reload = ( ) => { app . relaunch ( ) ; app . exit ( ) ; } ;
window . endpwn = {
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// 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' ,
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
onConfirm : ( ) => {
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
$api . localStorage . set ( 'safemode' , 1 ) ;
window . electron . getCurrentWindow ( ) . reload ( ) ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
}
} ) ;
} ,
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// 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' ,
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
onConfirm : ( ) => {
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
var data = $api . data ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
$api . settings . set ( 'WEBAPP_ENDPOINT' ) ;
$api . settings . set ( 'WEBAPP_PATH' ) ;
$api . settings . set ( 'UPDATE_ENDPOINT' ) ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
reload ( ) ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
}
} ) ;
} ,
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// endpwn customizer
customizer : krequire ( 'customizer' ) ,
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// settings page stuff
settings : krequire ( 'settings' ) ,
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// 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
} ) ;
} ,
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
_ _eval : e => eval ( e )
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
} ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// fetch the changelog
/ * i n t e r n a l . p r i n t ( ' r e t r i e v i n g c h a n g e l o g . . . ' ) ;
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 ]
2018-06-13 22:25:08 +00:00
} ;
2018-06-15 23:50:37 +00:00
} ) ; * /
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// early init payload
document . addEventListener ( 'ep-prepared' , ( ) => {
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// disable that obnoxious warning about not pasting shit in the console
internal . print ( 'disabling self xss warning...' ) ;
$api . util . findFuncExports ( 'consoleWarning' ) . consoleWarning = e => { } ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// 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
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
} ) ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
} ,
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
start : function ( ) {
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// disable analytics
internal . print ( 'disabling analytics...' ) ;
$api . util . findFuncExports ( "AnalyticEventConfigs" ) . default . track = ( ) => { } ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// enable experiments
internal . print ( 'enabling experiments menu...' ) ;
$api . util . findFuncExports ( 'isDeveloper' ) . _ _defineGetter _ _ ( 'isDeveloper' , ( ) => true ) ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// if we used start() in the other files, it would create a different instance -- we dont want that
endpwn . customizer . init ( ) ;
endpwn . settings . init ( ) ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// check for epapi updates
if ( $api . lite || ! fs . existsSync ( $api . data + '/DONTUPDATE' ) )
( function ( ) {
internal . print ( 'checking for EPAPI updates...' ) ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// fetch the latest build of epapi
fetch ( 'https://lambda.cynfoxwell.cf/epapi/epapi.js?_=' + Date . now ( ) ) . then ( x => x . text ( ) ) . then ( x => {
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// check the version
if ( kparse ( x ) . version > $api . version ) {
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// if the version on the server is newer, pester the user
$api . ui . showDialog ( {
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
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' ,
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// user pressed "Restart Now"
onConfirm : ( ) => {
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// refresh the page if we're running in a browser, reboot the app if we're running outside of lite mode
reload ( ) ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
} ,
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// they pressed "Later", for some reason
onCancel : ( ) => {
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
// bother them again in 6 hrs (* 60 min * 60 sec * 1000 ms)
setTimeout ( arguments . callee , 6 * 60 * 60 * 1000 ) ;
2018-06-13 22:25:08 +00:00
}
} ) ;
2018-06-15 23:50:37 +00:00
}
else setTimeout ( arguments . callee , 6 * 60 * 60 * 1000 ) ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
} ) ;
2018-06-13 22:25:08 +00:00
2018-06-15 23:50:37 +00:00
} ) ( ) ;
}
}