This repository was archived by the owner on Mar 7, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
executable file
·143 lines (123 loc) · 4.71 KB
/
Copy pathindex.js
File metadata and controls
executable file
·143 lines (123 loc) · 4.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
const { join } = require("path")
const electron = { ipcMain } = require("electron")
const { default: installExtension, REACT_DEVELOPER_TOOLS } = require("electron-devtools-installer")
const Module = require("module")
const _sass = require("sass")
const DataStore = require("./core/datastore")
const fs = require("fs")
const request = require("./core/request")
const Settings = DataStore("DR_DISCORD_SETTINGS")
electron.app.commandLine.appendSwitch("no-force-async-hooks-checks")
let Badges
request("https://raw.githubusercontent.com/Dr-Discord/DrDiscord/main/backend/Badges.json", (_, __, body) => Badges = JSON.parse(body))
function ipc(ev, func) {
ipcMain.on(ev, async (event, ...args) => {
event.IS_ON = true
const res = await func(event, ...args)
if (!event.returnValue) event.returnValue = res ?? "No response"
})
ipcMain.handle(ev, func)
}
let hasCrashed = false
class BrowserWindow extends electron.BrowserWindow {
constructor(opt) {
if (!opt || !opt.webPreferences || !opt.webPreferences.preload || !opt.title || process.argv.includes("--vanilla")) return super(opt)
const originalPreload = opt.webPreferences.preload
opt.webPreferences = Object.assign(opt.webPreferences, {
nodeIntegration: true,
preload: join(__dirname, "core", "preload.js"),
devTools: true
})
if (Settings.transparency) opt = Object.assign(opt, {
transparent: true,
backgroundColor: "#00000000"
})
let win = new electron.BrowserWindow(opt)
win.webContents.on("render-process-gone", () => hasCrashed = true)
ipc("DISCORD_PRELOAD", () => originalPreload)
ipc("ShowMessageBox", async (ev, opts) => {
if (ev.IS_ON) return electron.dialog.showMessageBoxSync(opts)
return await electron.dialog.showMessageBox(opts)
})
ipc("APP_DID_CRASH", () => hasCrashed)
ipc("DR_BADGES", () => Badges)
if (/\/vizality\/src\/preload\/main.js/.test(originalPreload.replace(/(\/|\\)/, "/"))) {
electron.dialog.showMessageBoxSync(win, {
type: "error",
title: "DrDiscord & Vizality",
message: "DrDiscord cannot work with Vizality.",
detail: "DrDiscord will fully load but Vizality will error."
})
}
return win
}
}
Object.assign(BrowserWindow, electron.BrowserWindow)
function LoadDiscord() {
const basePath = join(process.resourcesPath, "app.asar")
const pkg = require(join(basePath, "package.json"))
electron.app.setAppPath(basePath)
electron.app.name = pkg.name
Module._load(join(basePath, pkg.main), null, true)
}
// Set DevTools in settings to be true
const devToolsKey = "DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOING"
if (!global.appSettings) global.appSettings = {}
if (!global.appSettings?.settings) global.appSettings.settings = {}
const oldSettings = global.appSettings.settings
global.appSettings.settings = new Proxy(oldSettings, {
get(target, prop) {
if (prop === devToolsKey) return true
return target[prop]
},
set(target, prop, value) {
if (prop === devToolsKey) return
target[prop] = value
}
})
if (process.argv.includes("--vanilla")) return LoadDiscord()
ipc("COMPILE_SASS", (event, sass) => {
let toReturn
try { toReturn = _sass.renderSync({ data: sass }).css.toString() }
catch (e) { toReturn = e.message }
event.returnValue = toReturn
return toReturn
})
ipc("RESTART_DISCORD", () => {
electron.app.relaunch()
electron.app.quit()
})
ipc("POPOUT_WINDOW", (event, { Opts = {}, Url = "https://discord.com/login", injectJs = "(() => {})()" }) => {
const win = new BrowserWindow(Opts)
win.loadURL(Url)
win.webContents.executeJavaScript(injectJs)
})
electron.app.once("ready", () => {
electron.session.defaultSession.webRequest.onHeadersReceived(function({ responseHeaders }, callback) {
for (const header in responseHeaders)
if (header.startsWith("content-security-policy") && Object.hasOwnProperty.call(responseHeaders, header))
delete responseHeaders[header]
callback({
cancel: false,
responseHeaders
})
})
installExtension(REACT_DEVELOPER_TOOLS)
})
const Electron = {
...electron, BrowserWindow
}
const electronPath = require.resolve("electron")
delete require.cache[electronPath].exports
require.cache[electronPath].exports = Electron
// Dont start discord if 'app-old' exists, so we let that mod do it's thing unless its DrDiscord
const appOld = join(process.resourcesPath, "app-old")
if (fs.existsSync(appOld)) {
if (fs.existsSync(join(appOld, "index.js"))) {
const js = fs.readFileSync(join(appOld, "index.js"), "utf8")
if (js.startsWith(`require("${join(__dirname).replace(/(\/|\\)/g, "/")}")`)) LoadDiscord()
else require(join(process.resourcesPath, "app-old"))
}
else require(appOld)
}
else LoadDiscord()