forked from OctoWoW/OctoLauncher
108 lines
2.9 KiB
TypeScript
108 lines
2.9 KiB
TypeScript
import { join } from 'path';
|
|
|
|
import { app, shell, BrowserWindow } from 'electron';
|
|
import { electronApp, optimizer, is } from '@electron-toolkit/utils';
|
|
import { createIPCHandler } from 'electron-trpc/main';
|
|
import Logger from 'electron-log/main';
|
|
|
|
import icon from '~build/icon.png?asset';
|
|
|
|
import { appRouter } from './api/root';
|
|
import Preferences from './modules/preferences';
|
|
import Updater from './modules/updater';
|
|
import Addons from './modules/addons';
|
|
import Mods from './modules/mods';
|
|
import { initSelfUpdater } from './modules/selfUpdater';
|
|
|
|
Logger.initialize();
|
|
Logger.errorHandler.startCatching();
|
|
Logger.info('Launcher starting...');
|
|
|
|
app.disableHardwareAcceleration();
|
|
|
|
export let mainWindow: BrowserWindow | null = null;
|
|
|
|
const createWindow = async () => {
|
|
const position = Preferences.data.rememberPosition
|
|
? Preferences.data.windowPosition
|
|
: { width: 1000, height: 700 };
|
|
|
|
mainWindow = new BrowserWindow({
|
|
...position,
|
|
minWidth: 1000,
|
|
minHeight: 700,
|
|
icon,
|
|
frame: false,
|
|
maximizable: false,
|
|
fullscreenable: false,
|
|
webPreferences: {
|
|
preload: join(__dirname, '../preload/index.js'),
|
|
contextIsolation: true,
|
|
sandbox: false,
|
|
devTools: true
|
|
}
|
|
});
|
|
|
|
mainWindow.webContents.on('render-process-gone', (_e, details) => {
|
|
Logger.error('Renderer process gone:', details);
|
|
});
|
|
mainWindow.webContents.on('unresponsive', () => {
|
|
Logger.error('Renderer unresponsive');
|
|
});
|
|
|
|
mainWindow.webContents.on('console-message', (_e, level, message, line, sourceId) => {
|
|
const lvl = level === 3 ? 'error' : level === 2 ? 'warn' : 'info';
|
|
Logger[lvl](`[renderer:${lvl}] ${message} (${sourceId}:${line})`);
|
|
});
|
|
|
|
mainWindow.webContents.on('before-input-event', (_e, input) => {
|
|
if (input.type !== 'keyDown') return;
|
|
if (input.key === 'F12') {
|
|
mainWindow?.webContents.toggleDevTools();
|
|
}
|
|
});
|
|
|
|
createIPCHandler({ router: appRouter, windows: [mainWindow] });
|
|
|
|
mainWindow.on('ready-to-show', () => {
|
|
mainWindow?.show();
|
|
});
|
|
mainWindow.webContents.setWindowOpenHandler(details => {
|
|
shell.openExternal(details.url);
|
|
return { action: 'deny' };
|
|
});
|
|
mainWindow.on('close', () => {
|
|
if (!mainWindow) return;
|
|
const [x = 0, y = 0] = mainWindow.getPosition();
|
|
const [width = 0, height = 0] = mainWindow.getSize();
|
|
Preferences.data = { windowPosition: { x, y, width, height } };
|
|
});
|
|
|
|
if (is.dev && process.env.ELECTRON_RENDERER_URL) {
|
|
mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL);
|
|
} else {
|
|
mainWindow.loadFile(join(__dirname, '../renderer/index.html'));
|
|
}
|
|
};
|
|
|
|
app.whenReady().then(async () => {
|
|
Preferences.data = await Preferences.load();
|
|
|
|
Addons.verify();
|
|
Updater.verify();
|
|
Mods.verify();
|
|
initSelfUpdater();
|
|
|
|
electronApp.setAppUserModelId('com.electron');
|
|
|
|
app.on('browser-window-created', (_, window) => {
|
|
optimizer.watchWindowShortcuts(window);
|
|
});
|
|
|
|
await createWindow();
|
|
});
|
|
|
|
app.on('window-all-closed', async () => {
|
|
app.quit();
|
|
});
|