2018-04-22 03:46:11 +00:00
/ *
EndPwn Stage 2 Shared
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 .
https : //github.com/endpwn/
* /
( ( ) => {
// define this with a default value as a fallback
var _ _goodies = {
guilds : [ ] ,
bots : [ ] ,
users : { }
} ;
2018-04-22 15:59:10 +00:00
function fetchGoodies ( ) {
// fetch goodies.json
fetch ( 'https://endpwn.cathoderay.tube/goodies.json?_=' + Date . now ( ) )
. then ( x => x . json ( ) )
. then ( r => _ _goodies = r ) ;
}
2018-04-25 02:51:36 +00:00
2018-04-22 15:59:10 +00:00
// Fetch goodies now and every half hour
fetchGoodies ( ) ;
setInterval ( fetchGoodies , 1800000 ) ;
2018-04-22 03:46:11 +00:00
2018-04-22 04:05:47 +00:00
// early init payload
document . addEventListener ( 'ep-prepared' , ( ) => {
// fetch the changelog
fetch ( 'https://endpwn.github.io/changelog.md?_=' + Date . now ( ) ) . then ( r => r . text ( ) ) . then ( l => {
2018-04-22 04:41:03 +00:00
// we're racing discord's initialization procedures; try and hit a timing sweetspot
2018-04-22 05:27:32 +00:00
setTimeout ( function ( ) {
2018-04-22 04:05:47 +00:00
2018-04-22 05:27:32 +00:00
try {
2018-04-22 04:05:47 +00:00
2018-04-22 05:27:32 +00:00
// get the changelog object
var log = $api . util . findFuncExports ( 'changeLog' ) ;
var data = l . split ( ';;' ) ;
2018-04-22 04:41:03 +00:00
2018-04-22 05:27:32 +00:00
// set the date
if ( log . changeLog . date <= data [ 0 ] )
log . changeLog . date = data [ 0 ] ;
2018-04-22 04:41:03 +00:00
2018-04-22 05:27:32 +00:00
// prepend to the changelog body
log . changeLog . body = data [ 1 ] + '\n\n' + log . changeLog . body ;
}
catch ( e ) {
// it failed, try again in 10 ms
2018-04-22 10:07:01 +00:00
setTimeout ( arguments . callee , 100 ) ;
2018-04-22 05:27:32 +00:00
}
} , 100 ) ;
2018-04-22 04:05:47 +00:00
} ) ;
} ) ;
// post-init payload
2018-04-22 03:46:11 +00:00
document . addEventListener ( 'ep-ready' , ( ) => {
2018-04-28 00:23:51 +00:00
// hijack the crash handler
// TODO: make this less ugly
$api . util . findFuncExports ( 'CRASH' , 'prototype' ) . prototype . render = function ( ) {
console . error ( '*** DISCORD CRASH!!! ***\nLOCKING DISPATCH AND HIJACKING PAGE' ) ;
// disable dispatch(), essentially freezing react
$api . internal . dispatcher . default . dispatch = ( ) => { } ;
// clear css
$ ( "link[rel='stylesheet']" ) . remove ( ) ;
$$ ( "style" ) . forEach ( x => x . remove ( ) ) ;
// add a simple style to the body
$ ( 'body' ) . style . color = '#fff' ;
$ ( 'body' ) . style . backgroundColor = '#000082' ;
$ ( 'body' ) . style . fontFamily = 'monospace' ;
// write our message to app-mount
$ ( '#app-mount' ) . innerHTML = ` <h1>EndPwn: Discord Fatal Error</h1>
< h3 >
Something has gone very , very wrong , and Discord has crashed . < br > < br >
If this is the first time you ' ve seen this error screen , press Ctrl + R and hope for the best . If this screen appears again , follow these steps : < br > < br >
Try removing any new plugins and restarting again . If this solves the problem there may be a bug in the plugin . < br > < br >
If problems continue , it ' s likely that there is a bug in EndPwn or Discord . < a href = "https://discord.gg/wXdPNf2" target = "_blank" style = "color:#0ff" > Join the EndPwn Discord server < / a > f o r a s s i s t a n c e . < b r > < b r >
Details may be available in the console ( Ctrl + Shift + I ) , but at this level of crash we can ' t be certain .
< / h 3 >
< button onclick = "electron.getCurrentWindow().reload()" > Reload < / b u t t o n >
< button onclick = "$api.localStorage.set('safemode',1);electron.getCurrentWindow().reload()" > Reload in safe mode < / b u t t o n > ` ;
// crash whatever was calling render()
throw 'render abort' ;
}
2018-04-25 03:28:54 +00:00
// disable analytics
2018-04-28 00:23:51 +00:00
$api . util . findFuncExports ( "AnalyticEventConfigs" ) . default . track = ( ) => { } ;
2018-04-25 03:28:54 +00:00
2018-04-22 03:46:11 +00:00
// enable experiments
$api . util . findFuncExports ( 'isDeveloper' ) . _ _defineGetter _ _ ( 'isDeveloper' , ( ) => true ) ;
// disable that obnoxious warning about not pasting shit in the console
$api . util . findFuncExports ( 'consoleWarning' ) . consoleWarning = e => { } ;
2018-04-23 09:55:23 +00:00
// apply custom discrims/bot tags from EndPwn Customizer (endpwn.cathoderay.tube)
2018-04-22 03:46:11 +00:00
$api . util . wrapAfter (
"wc.findCache('getUser')[0].exports.getUser" ,
x => {
if ( x === undefined || x === null ) return ;
if ( _ _goodies . bots . contains ( x . id ) ) x . bot = true ;
if ( _ _goodies . users [ x . id ] !== undefined ) x . discriminator = _ _goodies . users [ x . id ] ;
return x ;
}
) ;
// verify servers directly associated with the endpwn project
$api . util . wrapAfter (
"wc.findCache('getGuild')[0].exports.getGuild" ,
x => {
if ( x === undefined || x === null ) return ;
if ( _ _goodies . guilds . contains ( x . id ) ) x . features . add ( 'VERIFIED' ) ;
return x ;
}
) ;
2018-04-25 02:51:36 +00:00
// check for epapi updates
2018-04-25 03:45:52 +00:00
if ( $api . lite || ! fs . existsSync ( $api . data + '/DONTUPDATE' ) )
2018-04-25 03:07:04 +00:00
( function ( ) {
2018-04-25 02:51:36 +00:00
2018-04-26 11:33:21 +00:00
console . log ( ` %c[EndPwn]%c checking for EPAPI updates... ` , 'font-weight:bold;color:#0cc' , '' ) ;
2018-04-25 03:07:04 +00:00
// fetch the latest build of epapi
fetch ( 'https://endpwn.github.io/epapi/epapi.js?_=' + Date . now ( ) ) . then ( x => x . text ( ) ) . then ( x => {
2018-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +00:00
// check the version
if ( kparse ( x ) . version > $api . version ) {
2018-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +00:00
// if the version on the server is newer, pester the user
$api . ui . showDialog ( {
2018-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +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-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +00:00
// user pressed "Restart Now"
onConfirm : ( ) => {
2018-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +00:00
// refresh the page if we're running in a browser, reboot the app if we're running outside of lite mode
2018-04-25 03:33:10 +00:00
reload ( ) ;
2018-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +00:00
} ,
2018-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +00:00
// they pressed "Later", for some reason
onCancel : ( ) => {
2018-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +00:00
// bother them again in 6 hrs (* 60 min * 60 sec * 1000 ms)
setTimeout ( arguments . callee , 6 * 60 * 60 * 1000 ) ;
2018-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +00:00
}
2018-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +00:00
} ) ;
}
2018-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +00:00
} ) ;
2018-04-25 02:51:36 +00:00
2018-04-25 03:07:04 +00:00
} ) ( ) ;
2018-04-25 02:51:36 +00:00
2018-04-22 03:46:11 +00:00
} ) ;
2018-04-22 15:59:10 +00:00
} ) ( ) ;