Initial commit

This commit is contained in:
2026-05-08 00:00:00 +00:00
commit 530ec7a144
110 changed files with 18537 additions and 0 deletions
+107
View File
@@ -0,0 +1,107 @@
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();
});