// src/electron/main.ts // 需要先載入 import "module-alias/register"; // // 必載入 // import "../Utils/catan.ts"; import dotenv from 'dotenv'; import { app, BrowserWindow, ipcMain } from 'electron'; import * as path from 'path'; import { WebSocketServer } from 'ws'; import { BaseEnumerator } from "../CatanEngine/CoroutineV2/Core/BaseEnumerator"; import { NetConnector } from "../script/Engine/CatanEngine/NetManagerV2/NetConnector"; onload(); function onload() { BaseEnumerator.Init(); // Load environment variables from .env file dotenv.config(); } let server: WebSocketServer | null = null; let port: number = process.env.PORT ? parseInt(process.env.PORT, 10) : 8080; // 默认端口为 8080 function createWindow() { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__dirname, 'preload.js'), contextIsolation: true, nodeIntegration: false, // contextIsolation: false, // 使渲染進程能夠使用 Node.js // nodeIntegration: true, // 使渲染進程可以使用 Node.js 模組 }, }); win.loadFile(path.join(__dirname, 'index.html')); // win.webContents.openDevTools(); return win; } let mainWindow: BrowserWindow | null = null; app.whenReady().then(() => { mainWindow = createWindow(); app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } }); }); app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); // 启动 WebSocket 服务器 ipcMain.on('start-websocket', (event, portNumber: number) => { if (server) { server.close(); } port = portNumber || 8080; server = new WebSocketServer({ port: port }); server.on('connection', NetConnector.OnWebSocketConnection); // server.on('connection', (socket, request) => { // const ip = request.socket.remoteAddress.replace("::ffff:", "") || 'Unknown IP'; // console.log(`Client connected from IP: ${ip}`); // socket.send('Welcome to the WebSocket server'); // socket.on('message', (message: string) => { // console.log(`[RPC] 收到client呼叫: ${message}`); // socket.send(`Server received your message: ${message}`); // console.log(`[RPC] 回傳client呼叫: ${message}`); // }); // socket.on('close', () => { // console.log('Client disconnected'); // }); // }); event.reply('websocket-status', `WebSocket server started on port ${port}`); }); // 关闭 WebSocket 服务器 ipcMain.on('stop-websocket', (event) => { if (server) { server.clients.forEach(client => { if (client.readyState === 1) { client.close(); } }); server.close((err) => { if (err) { event.reply('websocket-status', 'Failed to stop WebSocket server'); } else { event.reply('websocket-status', 'WebSocket server stopped'); } }); } else { event.reply('websocket-status', 'No WebSocket server is running'); } }); // 打开开发者工具 ipcMain.on('open-devtools', () => { mainWindow.webContents.openDevTools(); }); // Create a function to send log messages to the renderer function sendLogToRenderer(window: BrowserWindow, message: string, color: string) { window.webContents.send('log-message', [message, color]); } // 重寫 console.log 方法以便將訊息發送到渲染進程 const originalConsoleLog = console.log; console.log = (...args: any[]) => { const message = args.join(' '); originalConsoleLog(message); // 保留原始行為 if (BrowserWindow.getAllWindows().length > 0) { sendLogToRenderer(BrowserWindow.getAllWindows()[0], message, "green"); // 發送訊息到渲染進程 } }; // 重写 console.warn const originalConsoleWarn = console.warn; console.warn = (...args: any[]) => { const message = args.join(' '); originalConsoleWarn(message); if (BrowserWindow.getAllWindows().length > 0) { sendLogToRenderer(BrowserWindow.getAllWindows()[0], message, "yellow"); // 發送訊息到渲染進程 } }; // 重写 console.error const originalConsoleError = console.error; console.error = (...args: any[]) => { const message = args.join(' '); originalConsoleError(message); if (BrowserWindow.getAllWindows().length > 0) { sendLogToRenderer(BrowserWindow.getAllWindows()[0], message, "red"); // 發送訊息到渲染進程 } };