BetterDiscordApp-v2/core/src/sparkplug.js

76 lines
2.2 KiB
JavaScript

/**
* BetterDiscord Sparkplug
* Copyright (c) 2015-present JsSucks - https://github.com/JsSucks
* All rights reserved.
* https://github.com/JsSucks - https://betterdiscord.net
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* This file is evaluated in the renderer process!
*/
import electron, { ipcRenderer } from 'electron';
(() => {
if (module.exports.bd) return;
console.log('[BetterDiscord|Sparkplug]');
electron.webFrame.registerURLSchemeAsPrivileged('chrome-extension');
const currentWindow = electron.remote.getCurrentWindow();
if (currentWindow.__bd_preload) {
for (const preloadScript of currentWindow.__bd_preload) {
try {
require(preloadScript);
} catch (err) {
console.error('[BetterDiscord|Sparkplug] Error thrown in preload script', preloadScript, err);
}
}
}
ipcRenderer.on('--bd-inject-script', (event, {script, variable}) => {
console.log('[BetterDiscord|Sparkplug] Injecting script', script, variable);
if (variable) window[variable] = require(script);
else require(script);
});
const ls = window.localStorage;
if (!ls) console.warn('[BetterDiscord|Sparkplug] Failed to hook localStorage :(');
const wsOrig = window.WebSocket;
const bd = module.exports.bd = {
localStorage: ls,
wsHook: null,
wsOrig,
ignited: true
};
class WSHook extends window.WebSocket {
constructor(url, protocols) {
super(url, protocols);
this.hook(url, protocols);
}
hook(url, protocols) {
console.info(`[BetterDiscord|WebSocket Proxy] new WebSocket detected, url: ${url}`);
if (!url.includes('gateway.discord.gg')) return;
if (bd.setWS) {
bd.setWS(this);
console.info(`[BetterDiscord|WebSocket Proxy] WebSocket sent to instance`);
return;
}
console.info(`[BetterDiscord|WebSocket Proxy] WebSocket stored to bd.wsHook`);
bd.wsHook = this;
}
}
window.WebSocket = WSHook;
})();