2022-01-30 19:48:32 +00:00
// To allow seamless switching between custom titlebar and native os titlebar,
// I had to add most of the window creation code here to split both into seperete functions
// WHY? Because I can't use the same code for both due to annoying bug with value `frame` not responding to variables
// I'm sorry for this mess but I'm not sure how to fix it.
2022-04-18 10:05:06 +00:00
import { BrowserWindow , shell , app , ipcMain , dialog } from "electron" ;
2022-01-30 19:48:32 +00:00
import path from "path" ;
2022-04-18 11:03:26 +00:00
import { checkIfConfigIsBroken , firstRun , getConfig , contentPath } from "./utils" ;
2022-03-04 17:53:18 +00:00
import { registerIpc } from "./ipc" ;
2022-04-19 13:56:04 +00:00
import startServer from "./socket"
2022-02-26 21:26:16 +00:00
import contextMenu from "electron-context-menu" ;
2022-01-30 19:48:32 +00:00
export let mainWindow : BrowserWindow ;
2022-04-19 13:56:04 +00:00
export let inviteWindow : BrowserWindow ;
2022-03-04 17:53:18 +00:00
let guestWindows : BrowserWindow [ ] = [ ] ;
2022-02-26 21:26:16 +00:00
contextMenu ( {
2022-03-04 17:53:18 +00:00
showSaveImageAs : true ,
showCopyImageAddress : true ,
showSearchWithGoogle : true
2022-02-26 21:26:16 +00:00
} ) ;
2022-01-30 19:48:32 +00:00
2022-04-19 17:59:52 +00:00
async function doAfterDefiningTheWindow() {
2022-04-18 10:06:17 +00:00
checkIfConfigIsBroken ( ) ;
2022-03-04 17:53:18 +00:00
registerIpc ( ) ;
mainWindow . webContents . userAgent =
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36" ; //fake useragent for screenshare to work
mainWindow . webContents . setWindowOpenHandler ( ( { url } ) = > {
shell . openExternal ( url ) ;
return { action : "deny" } ;
} ) ;
mainWindow . webContents . session . webRequest . onBeforeRequest ( ( details , callback ) = > {
if ( /api\/v\d\/science$/g . test ( details . url ) ) return callback ( { cancel : true } ) ;
return callback ( { } ) ;
} ) ;
mainWindow . on ( "close" , async ( e ) = > {
2022-04-18 10:25:10 +00:00
if ( await getConfig ( "minimizeToTray" ) ) {
2022-03-04 17:53:18 +00:00
e . preventDefault ( ) ;
mainWindow . hide ( ) ;
2022-04-18 10:25:10 +00:00
} else if ( ! ( await getConfig ( "minimizeToTray" ) ) ) {
2022-03-04 17:53:18 +00:00
e . preventDefault ( ) ;
app . quit ( ) ;
}
} ) ;
console . log ( contentPath ) ;
2022-04-19 17:59:52 +00:00
if ( await getConfig ( "inviteWebsocket" ) == true ) {
startServer ( )
}
2022-03-04 17:53:18 +00:00
try {
mainWindow . loadFile ( contentPath ) ;
} catch ( e ) {
console . log (
"Major error detected while starting up. User is most likely on Windows platform. Fallback to alternative startup."
) ;
console . log ( process . platform ) ;
if ( process . platform === "win32" ) {
if ( firstRun ) {
mainWindow . loadURL ( ` file:// ${ __dirname } /content/setup.html ` ) ;
} else {
mainWindow . loadURL ( ` file:// ${ __dirname } /content/splash.html ` ) ;
}
} else {
if ( firstRun ) {
mainWindow . loadURL ( ` file:// ${ __dirname } /ts-out/content/setup.html ` ) ;
} else {
mainWindow . loadURL ( ` file:// ${ __dirname } /ts-out/content/splash.html ` ) ;
}
}
2022-01-30 19:48:32 +00:00
}
}
export function createCustomWindow() {
2022-03-04 17:53:18 +00:00
mainWindow = new BrowserWindow ( {
width : 300 ,
height : 350 ,
title : "ArmCord" ,
darkTheme : true ,
icon : path.join ( __dirname , "/assets/icon_transparent.png" ) ,
frame : false ,
autoHideMenuBar : true ,
webPreferences : {
preload : path.join ( __dirname , "preload/preload.js" ) ,
spellcheck : true
}
} ) ;
doAfterDefiningTheWindow ( ) ;
2022-01-30 19:48:32 +00:00
}
export function createNativeWindow() {
2022-03-04 17:53:18 +00:00
mainWindow = new BrowserWindow ( {
width : 300 ,
height : 350 ,
title : "ArmCord" ,
darkTheme : true ,
icon : path.join ( __dirname , "/assets/icon_transparent.png" ) ,
frame : true ,
autoHideMenuBar : true ,
webPreferences : {
preload : path.join ( __dirname , "preload/preload.js" ) ,
spellcheck : true
}
} ) ;
doAfterDefiningTheWindow ( ) ;
2022-02-26 21:26:16 +00:00
}
export function createTabsHost() {
2022-04-18 10:05:06 +00:00
dialog . showErrorBox (
"READ THIS BEFORE USING THE APP" ,
"ArmCord Tabs are highly experimental and should be only used for strict testing purposes. Please don't ask for support, however you can still report bugs!"
) ;
2022-03-04 17:53:18 +00:00
guestWindows [ 1 ] = mainWindow ;
mainWindow = new BrowserWindow ( {
width : 300 ,
height : 350 ,
title : "ArmCord" ,
darkTheme : true ,
icon : path.join ( __dirname , "/assets/icon_transparent.png" ) ,
frame : true ,
autoHideMenuBar : true ,
webPreferences : {
preload : path.join ( __dirname , "preload/preload.js" )
}
} ) ;
doAfterDefiningTheWindow ( ) ;
2022-02-26 21:26:16 +00:00
}
export function createTabsGuest ( number : number ) {
2022-03-04 17:53:18 +00:00
console . log ( guestWindows ) ;
if ( guestWindows [ number ] !== undefined || null ) {
try {
console . log ( "Showing Guest Window " + number ) ;
mainWindow . hide ( ) ;
guestWindows [ number ] . show ( ) ;
mainWindow = guestWindows [ number ] ;
} catch ( e ) {
console . error ( e ) ;
}
} else {
console . log ( "Creating Guest Window " + number ) ;
mainWindow . hide ( ) ;
guestWindows [ number ] = new BrowserWindow ( {
width : 800 ,
height : 600 ,
title : "ArmCord Guest Window " + number ,
darkTheme : true ,
icon : path.join ( __dirname , "/assets/icon_transparent.png" ) ,
frame : true ,
autoHideMenuBar : true ,
webPreferences : {
preload : path.join ( __dirname , "preload/preload.js" )
}
} ) ;
mainWindow = guestWindows [ number ] ;
ipcMain . on ( "tab" + number , ( event ) = > {
event . returnValue = true ; //return true so we know the tab exists
} ) ;
guestWindows [ number ] . webContents . userAgent =
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36" ; //fake useragent for screenshare to work
2022-02-26 21:26:16 +00:00
2022-03-04 17:53:18 +00:00
guestWindows [ number ] . webContents . setWindowOpenHandler ( ( { url } ) = > {
shell . openExternal ( url ) ;
return { action : "deny" } ;
} ) ;
guestWindows [ number ] . webContents . session . webRequest . onBeforeRequest (
( details : { url : string } , callback : ( arg0 : { cancel? : boolean } ) = > any ) = > {
if ( /api\/v\d\/science$/g . test ( details . url ) ) return callback ( { cancel : true } ) ;
return callback ( { } ) ;
}
) ;
guestWindows [ number ] . loadURL ( "https://discord.com/app" ) ;
2022-02-26 21:26:16 +00:00
}
2022-03-04 17:53:18 +00:00
}
2022-04-19 13:56:04 +00:00
export function createInviteWindow() {
inviteWindow = new BrowserWindow ( {
width : 800 ,
height : 600 ,
title : "ArmCord Invite Manager" ,
darkTheme : true ,
icon : path.join ( __dirname , "/assets/icon_transparent.png" ) ,
frame : true ,
autoHideMenuBar : true ,
webPreferences : {
spellcheck : true
}
} ) ;
inviteWindow . hide ( )
}