2019-10-07 05:06:55 +00:00
|
|
|
// Modules to control application life and create native browser window
|
2019-10-20 03:38:47 +00:00
|
|
|
const { app, BrowserWindow, ipcMain} = require('electron')
|
2019-10-12 01:51:13 +00:00
|
|
|
const path = require('path')
|
2019-10-14 21:07:19 +00:00
|
|
|
const ioHook = require('iohook')
|
2019-10-20 03:38:47 +00:00
|
|
|
const URL = require('url').URL
|
2019-10-07 05:06:55 +00:00
|
|
|
|
|
|
|
// Keep a global reference of the window object, if you don't, the window will
|
|
|
|
// be closed automatically when the JavaScript object is garbage collected.
|
2019-10-12 01:51:13 +00:00
|
|
|
let mainWindow
|
2019-10-07 05:06:55 +00:00
|
|
|
|
2019-10-15 00:35:25 +00:00
|
|
|
let devMode = false
|
|
|
|
|
2019-10-07 05:06:55 +00:00
|
|
|
function createWindow () {
|
|
|
|
// Create the browser window.
|
2019-10-12 01:51:13 +00:00
|
|
|
mainWindow = new BrowserWindow({
|
2019-10-16 04:07:17 +00:00
|
|
|
width: 1230,
|
2019-10-20 03:38:47 +00:00
|
|
|
height: 800,
|
2019-10-12 23:49:31 +00:00
|
|
|
icon: './assets/icon.ico',
|
2019-10-12 01:51:13 +00:00
|
|
|
webPreferences: {
|
|
|
|
preload: path.join(__dirname, 'preload.js'),
|
2019-10-20 03:38:47 +00:00
|
|
|
nodeIntegration: false, // https://electronjs.org/docs/tutorial/security#2-do-not-enable-nodejs-integration-for-remote-content
|
|
|
|
enableRemoteModule: false, // https://electronjs.org/docs/tutorial/security#15-disable-the-remote-module
|
2019-10-21 00:24:24 +00:00
|
|
|
partition: 'persist:discord', // Kind of weird to me that you can grab the shared partition from main
|
2019-10-12 01:51:13 +00:00
|
|
|
webviewTag: true
|
|
|
|
}
|
|
|
|
})
|
2019-10-20 03:38:47 +00:00
|
|
|
|
|
|
|
// Set Dev mode
|
2019-10-15 00:35:25 +00:00
|
|
|
if (process.argv.length === 3) {
|
|
|
|
if (process.argv[2] === 'dev'){
|
|
|
|
devMode = true
|
|
|
|
}
|
|
|
|
}
|
2019-10-14 21:07:19 +00:00
|
|
|
|
2019-10-15 00:35:25 +00:00
|
|
|
if (devMode === false){
|
|
|
|
mainWindow.setMenu(null)
|
|
|
|
}
|
2019-10-14 21:07:19 +00:00
|
|
|
|
2019-10-07 05:06:55 +00:00
|
|
|
// and load the index.html of the app.
|
|
|
|
mainWindow.loadFile('index.html')
|
|
|
|
|
|
|
|
// Open the DevTools.
|
|
|
|
// mainWindow.webContents.openDevTools()
|
|
|
|
|
|
|
|
// Emitted when the window is closed.
|
2019-10-12 01:51:13 +00:00
|
|
|
mainWindow.on('closed', function () {
|
2019-10-07 05:06:55 +00:00
|
|
|
// Dereference the window object, usually you would store windows
|
|
|
|
// in an array if your app supports multi windows, this is the time
|
|
|
|
// when you should delete the corresponding element.
|
|
|
|
mainWindow = null
|
|
|
|
})
|
2019-10-21 00:24:24 +00:00
|
|
|
|
2019-10-07 05:06:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// This method will be called when Electron has finished
|
|
|
|
// initialization and is ready to create browser windows.
|
|
|
|
// Some APIs can only be used after this event occurs.
|
|
|
|
app.on('ready', createWindow)
|
|
|
|
|
|
|
|
// Quit when all windows are closed.
|
2019-10-12 01:51:13 +00:00
|
|
|
app.on('window-all-closed', function () {
|
|
|
|
// On macOS it is common for applications and their menu bar
|
2019-10-07 05:06:55 +00:00
|
|
|
// to stay active until the user quits explicitly with Cmd + Q
|
2019-10-12 01:51:13 +00:00
|
|
|
if (process.platform !== 'darwin') app.quit()
|
2019-10-07 05:06:55 +00:00
|
|
|
})
|
|
|
|
|
2019-10-12 01:51:13 +00:00
|
|
|
app.on('activate', function () {
|
|
|
|
// On macOS it's common to re-create a window in the app when the
|
2019-10-07 05:06:55 +00:00
|
|
|
// dock icon is clicked and there are no other windows open.
|
2019-10-12 01:51:13 +00:00
|
|
|
if (mainWindow === null) createWindow()
|
2019-10-07 05:06:55 +00:00
|
|
|
})
|
|
|
|
|
2019-10-20 03:38:47 +00:00
|
|
|
/* Security Stuff */
|
|
|
|
// https://electronjs.org/docs/tutorial/security#11-verify-webview-options-before-creation
|
|
|
|
app.on('web-contents-created', (event, contents) => {
|
|
|
|
contents.on('will-attach-webview', (event, webPreferences, params) => {
|
|
|
|
// Strip away preload scripts if unused or verify their location is legitimate
|
|
|
|
delete webPreferences.preload
|
|
|
|
delete webPreferences.preloadURL
|
|
|
|
|
|
|
|
// Disable Node.js integration
|
|
|
|
webPreferences.nodeIntegration = false
|
|
|
|
|
|
|
|
// Verify discordapp.com is being loaded
|
|
|
|
if (!params.src.startsWith('https://discordapp.com/')) {
|
|
|
|
event.preventDefault()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
// https://electronjs.org/docs/tutorial/security#12-disable-or-limit-navigation
|
|
|
|
app.on('web-contents-created', (event, contents) => {
|
|
|
|
contents.on('will-navigate', (event, navigationUrl) => {
|
|
|
|
const parsedUrl = new URL(navigationUrl)
|
|
|
|
|
|
|
|
if (parsedUrl.origin !== 'https://discordapp.com/') { // Limit navigation to discordapp.com; not really relevant
|
|
|
|
event.preventDefault()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
// https://electronjs.org/docs/tutorial/security#13-disable-or-limit-creation-of-new-windows
|
|
|
|
app.on('web-contents-created', (event, contents) => {
|
|
|
|
contents.on('new-window', async (event, navigationUrl) => {
|
2019-10-24 01:27:57 +00:00
|
|
|
event.preventDefault() // Prevents external links from opening
|
2019-10-20 03:38:47 +00:00
|
|
|
})
|
|
|
|
})
|
|
|
|
/* ---- */
|
2019-10-07 05:06:55 +00:00
|
|
|
|
2019-10-12 01:51:13 +00:00
|
|
|
'use strict';
|
2019-10-19 19:46:52 +00:00
|
|
|
let selfMute = false
|
2019-10-14 19:59:30 +00:00
|
|
|
let isConnected = false
|
2019-10-21 00:24:24 +00:00
|
|
|
let webViewSession = null
|
|
|
|
|
|
|
|
app.on('ready', () => {
|
|
|
|
// Handle permission requests
|
|
|
|
webViewSession = mainWindow.webContents.session
|
|
|
|
webViewSession.setPermissionRequestHandler((webContents, permission, callback) => { // deny all permissions
|
|
|
|
const url = webContents.getURL()
|
|
|
|
if (url.startsWith('https://discordapp.com/')) {
|
2019-10-24 01:27:57 +00:00
|
|
|
if (permission === 'media' && isConnected === true) { // if user is connected to Discord voice then enable microphone
|
2019-10-21 00:24:24 +00:00
|
|
|
console.log("User connected to Discord VOIP server. Granted permission for microphone")
|
|
|
|
return callback(true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
console.log("Denied permission: ", permission)
|
|
|
|
return callback(false)
|
|
|
|
})
|
|
|
|
})
|
2019-10-13 05:09:37 +00:00
|
|
|
|
|
|
|
function unmuteMic() {
|
2019-10-19 19:46:52 +00:00
|
|
|
if (isConnected === true && selfMute === false) {
|
|
|
|
console.log("Talking")
|
|
|
|
mainWindow.webContents.send('micOpen', 'mic-open')
|
|
|
|
mainWindow.setTitle("MIC OPEN")
|
2019-10-14 19:59:30 +00:00
|
|
|
}
|
2019-10-13 04:07:50 +00:00
|
|
|
}
|
|
|
|
|
2019-10-20 03:38:47 +00:00
|
|
|
function muteMic() {
|
2019-10-25 03:18:02 +00:00
|
|
|
if (isConnected === true && selfMute === false) {
|
|
|
|
console.log("Muted")
|
|
|
|
mainWindow.webContents.send('micClose', 'mic-closed')
|
|
|
|
mainWindow.setTitle("MUTED")
|
|
|
|
}
|
2019-10-20 03:38:47 +00:00
|
|
|
}
|
|
|
|
|
2019-10-13 04:07:50 +00:00
|
|
|
app.on('ready', event => {
|
|
|
|
ioHook.start();
|
2019-10-15 00:35:25 +00:00
|
|
|
console.log(`Dev Mode: ${devMode}`)
|
2019-10-13 04:07:50 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
ioHook.on('mousedown', event => {
|
2019-10-12 02:52:09 +00:00
|
|
|
if (event.button == '4') {
|
2019-10-13 05:09:37 +00:00
|
|
|
unmuteMic()
|
2019-10-12 02:52:09 +00:00
|
|
|
}
|
2019-10-07 05:06:55 +00:00
|
|
|
})
|
2019-10-12 01:51:13 +00:00
|
|
|
|
2019-10-13 04:07:50 +00:00
|
|
|
ioHook.on('mouseup', event => {
|
|
|
|
if (event.button == '4') {
|
2019-10-13 05:09:37 +00:00
|
|
|
muteMic()
|
2019-10-13 04:07:50 +00:00
|
|
|
}
|
2019-10-14 19:59:30 +00:00
|
|
|
})
|
|
|
|
|
2019-10-15 00:35:25 +00:00
|
|
|
ipcMain.on('asynchronous-message', (event, msg) => {
|
|
|
|
if (msg === 'connected') {
|
2019-10-20 03:38:47 +00:00
|
|
|
console.log("User connected to Discord VOIP server")
|
2019-10-14 19:59:30 +00:00
|
|
|
isConnected = true
|
2019-10-19 04:30:26 +00:00
|
|
|
muteMic()
|
2019-10-14 19:59:30 +00:00
|
|
|
}
|
|
|
|
|
2019-10-15 00:35:25 +00:00
|
|
|
if (msg === 'disconnected') {
|
2019-10-20 03:38:47 +00:00
|
|
|
console.log("User disconnected to Discord VOIP server")
|
2019-10-14 19:59:30 +00:00
|
|
|
isConnected = false
|
|
|
|
}
|
2019-10-15 00:35:25 +00:00
|
|
|
|
2019-10-19 04:30:26 +00:00
|
|
|
if (msg === 'self-muted') {
|
2019-10-20 03:38:47 +00:00
|
|
|
console.log("User self-muted")
|
2019-10-24 01:27:57 +00:00
|
|
|
webViewSession.setPermissionRequestHandler(null)
|
2019-10-19 19:46:52 +00:00
|
|
|
selfMute = true
|
2019-10-19 04:30:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (msg === 'self-unmuted') {
|
2019-10-20 03:38:47 +00:00
|
|
|
console.log("User self-unmuted")
|
2019-10-19 19:46:52 +00:00
|
|
|
selfMute = false
|
2019-10-19 04:30:26 +00:00
|
|
|
}
|
|
|
|
|
2019-10-15 00:35:25 +00:00
|
|
|
if (msg === 'DOMready') {
|
2019-10-19 19:46:52 +00:00
|
|
|
mainWindow.webContents.send('devMode', devMode)
|
2019-10-15 00:35:25 +00:00
|
|
|
}
|
2019-10-14 19:59:30 +00:00
|
|
|
})
|