[add] 設定env

This commit is contained in:
2024-08-30 15:37:33 +08:00
parent acd1cb7337
commit 84bba89e7e
22 changed files with 249 additions and 550 deletions

12
src/Utils/tools.ts Normal file
View File

@@ -0,0 +1,12 @@
import { app } from 'electron';
import path from 'path';
export function getExternalJsonPath(filename: string): string {
if (process.env.NODE_ENV === 'dev') {
// 开发模式下使用相对路径
return path.join(__dirname, '../../shared/jsons', filename);
} else {
// 生产模式下使用外部路径
return path.join(app.getPath('userData'), 'jsons', filename);
}
}

View File

@@ -3,7 +3,6 @@ import { INetResponse } from "../../script/Engine/CatanEngine/NetManagerV2/Core/
import { ClientData } from "../../shared/protocols/define/interface";
import { RpcSlotInRequest, RpcSlotInResponse } from "../../shared/protocols/SlotRequest";
export default abstract class SlotInBase {
protected ver: string = "";
protected abstract db: number;
@@ -12,8 +11,8 @@ export default abstract class SlotInBase {
public *in(clientData: ClientData, req: INetRequest<RpcSlotInRequest>): IterableIterator<any> {
const data: RpcSlotInRequest = req.Data;
const { id } = data;
const { ver, db, br, jp } = this;
const response: INetResponse<RpcSlotInResponse> = {
Status: 0,
Method: req.Method,

View File

@@ -1,9 +1,10 @@
import * as fs from 'fs';
import { INetRequest } from "../../script/Engine/CatanEngine/NetManagerV2/Core/INetRequest";
import { INetResponse } from "../../script/Engine/CatanEngine/NetManagerV2/Core/INetResponse";
import { ClientData } from "../../shared/protocols/define/interface";
import { RpcSlot1SpinRequest, RpcSlot1SpinResponse } from "../../shared/protocols/Slot1Request";
import { RandomEx } from "../../Utils/Number/RandomEx";
import { getExternalJsonPath } from "../../Utils/tools";
export default abstract class SlotSpinBase {
protected abstract ID: number;
@@ -11,14 +12,30 @@ export default abstract class SlotSpinBase {
protected IsHaveReSpin: boolean = false;
protected IsHaveRetriggerFreeSpin: boolean = false;
protected FreeMax: number = 50;
protected abstract Temps: string[];
protected abstract FreeTemps: string[];
protected JsonData: any;
protected get Temps(): string[] { return this.JsonData.slotData };
protected get FreeTemps(): string[] { return this.JsonData.slotFreeData };
public *spin(clientData: ClientData, req: INetRequest<RpcSlot1SpinRequest>): IterableIterator<any> {
const self = this;
const data: RpcSlot1SpinRequest = req.Data
if (!clientData.jsons[this.ID]) {
let slotData: any;
let AsyncFunction = async function () {
slotData = await self.GetTemps();
};
AsyncFunction();
while (!slotData) {
yield;
}
clientData.jsons[this.ID] = slotData;
}
this.JsonData = clientData.jsons[this.ID];
clientData.free = null;
const slotData: any = JSON.parse(this.Temps[RandomEx.GetInt(0, this.Temps.length)]);
const slotData: any = this.Temps[RandomEx.GetInt(0, this.Temps.length)];
let totalGet: number = 0;
if (slotData.line) {
@@ -57,7 +74,7 @@ export default abstract class SlotSpinBase {
let freeData = [];
let totalFreeGet = 0;
for (let i: number = 0; i < count; i++) {
const slotData: any = JSON.parse(this.FreeTemps[RandomEx.GetInt(0, this.FreeTemps.length)]);
const slotData: any = this.FreeTemps[RandomEx.GetInt(0, this.FreeTemps.length)];
freeData.push(slotData);
if (slotData.line) {
totalFreeGet += this.getLineGet(slotData.line);
@@ -90,6 +107,14 @@ export default abstract class SlotSpinBase {
let totalGet: number = scatter[0][1];
return totalGet;
}
protected async GetTemps(): Promise<any> {
const filePath = getExternalJsonPath(`slot${this.ID}.json`);
console.log('filePath', filePath);
const data = await fs.promises.readFile(filePath, 'utf-8');
const jsonData = JSON.parse(data);
return jsonData;
}
}

View File

@@ -1,32 +1,7 @@
import SlotSpinBase from "../slot/spin";
import SlotSpinBase from "../slot/SlotSpinBase";
export default class SlotSpin1 extends SlotSpinBase {
protected ID: number = 1;
protected IsHaveFreeSpin: boolean = true;
protected IsHaveRetriggerFreeSpin: boolean = true;
protected Temps: string[] = [
`{"slot":[11,4,8,9,5,2,13,10,7,9,10,6,6,12,4],"line":[[[5,11,12],161,200]]}`,
`{"slot":[9,6,2,5,4,14,10,9,13,10,4,5,5,2,2]}`,
`{"slot":[4,3,3,3,9,10,14,14,9,4,7,8,8,5,10],"free":[[1,2,3],3],"scatter":[[[1,2,3],300]]}`,
`{"slot":[1,2,4,5,6,7,3,3,3,8,9,10,11,12,13],"free":[[6,7,8],10],"scatter":[[[6,7,8],300]]}`,
];
protected FreeTemps: string[] = [
`{"slot":[9,9,10,13,4,5,4,3,4,11,10,14,14,14,5]}`,
`{"slot":[12,6,8,12,11,7,12,11,5,5,11,5,3,10,9]}`,
`{"slot":[4,6,11,13,8,12,12,3,4,10,7,5,14,14,4]}`,
`{"slot":[12,11,9,14,6,7,2,3,8,8,11,10,10,7,14]}`,
`{"slot":[9,14,13,4,11,4,7,6,14,6,12,13,9,12,12]}`,
`{"slot":[10,3,12,13,5,6,4,8,4,9,13,14,11,14,4]}`,
`{"slot":[11,13,9,8,5,8,5,5,13,9,14,9,12,4,7]}`,
// `{"slot":[10,14,13,9,8,6,6,6,4,13,13,12,9,14,4],"line":[[[5,6,7],122,300]]}`,
// `{"slot":[13,9,5,14,4,9,4,12,12,11,4,14,8,7,6],"line":[[[10,6],195,300],[[10,6],213,300]]}`,
// `{"slot":[5,9,9,3,11,10,4,5,12,5,4,14,12,5,9],"line":[[[10,6],195,300],[[10,6],213,300]]}`,
// `{"slot":[2,8,13,2,10,9,12,5,11,4,5,2,12,5,8],"line":[[[0,6,12],49,150],[[0,11,2],61,150],[[0,11,7,13],70,3000],[[0,11,12],79,150],[[10,11,7,13],234,3000]]}`,
// `{"slot":[5,12,13,3,4,10,2,5,8,8,2,9,12,10,9],"line":[[[10,1,12],183,150],[[10,6,2],195,150],[[10,6,12],213,150]]}`,
`{"slot":[14,4,10,3,11,5,14,3,12,6,10,6,14,5,12],"line":[[[0,6,12],49,750]],"scatter":[[[3,7],300]]}`,
`{"slot":[6,3,12,4,8,14,10,3,7,9,10,4,10,6,7],"line":[[[10,6,12],213,75]],"scatter":[[[1,7],300]]}`,
`{"slot":[9,12,3,7,2,6,13,11,3,11,13,3,8,6,6],"free":[[2,8,11],10],"scatter":[[[2,8,11],900]]}`,
];
}

View File

@@ -19,6 +19,7 @@
<input type="number" id="port" value="8080">
<button id="startBtn">啟動</button>
<button id="stopBtn">關閉</button>
<button id="jsonReload">重載Json</button>
<button id="devToolsBtn">DevTools</button>
<p id="status">Status: Waiting for actions...</p>
</div>

View File

@@ -7,6 +7,7 @@ import "module-alias/register";
import dotenv from 'dotenv';
import { app, BrowserWindow, ipcMain } from 'electron';
import fs from 'fs';
import * as path from 'path';
import { WebSocketServer } from 'ws';
import { BaseEnumerator } from "../CatanEngine/CoroutineV2/Core/BaseEnumerator";
@@ -16,8 +17,15 @@ onload();
function onload() {
BaseEnumerator.Init();
setLog();
// Load environment variables from .env file
dotenv.config();
const filePath = ".env.dev";
// 检查文件是否存在
if (fs.existsSync(filePath)) {
dotenv.config({ path: `.env.dev` });
} else {
dotenv.config({ path: path.resolve(__dirname, `../../.env.prod`) });
}
}
let server: WebSocketServer | null = null;
@@ -61,38 +69,39 @@ app.on('window-all-closed', () => {
});
// 启动 WebSocket 服务器
ipcMain.on('start-websocket', (event, portNumber: number) => {
ipcMain.on('start-websocket', (event: Electron.IpcMainEvent, portNumber: number) => {
if (server) {
server.close();
closeServer(event);
}
port = portNumber || 8080;
server = new WebSocketServer({ port: port });
server = new WebSocketServer({ 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) => {
ipcMain.on('stop-websocket', (event: Electron.IpcMainEvent) => {
closeServer(event);
});
// 打开开发者工具
ipcMain.on('json-reload', () => {
NetConnector.clients.forEach(client => {
client.jsons = {};
});
console.log(`重載成功`);
});
// 打开开发者工具
ipcMain.on('open-devtools', () => {
mainWindow.webContents.openDevTools();
});
function closeServer(event: Electron.IpcMainEvent) {
if (server) {
server.clients.forEach(client => {
if (client.readyState === 1) {
@@ -102,51 +111,47 @@ ipcMain.on('stop-websocket', (event) => {
server.close((err) => {
if (err) {
event.reply('websocket-status', 'Failed to stop WebSocket server');
} else {
event.reply('websocket-status', 'WebSocket server stopped');
}
});
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"); // 發送訊息到渲染進程
}
};
function setLog() {
// 重寫 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.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"); // 發送訊息到渲染進程
}
};
// 重写 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"); // 發送訊息到渲染進程
}
};
}

View File

@@ -5,6 +5,7 @@ import { contextBridge, ipcRenderer } from 'electron';
contextBridge.exposeInMainWorld('electron', {
startWebSocket: (port: number) => ipcRenderer.send('start-websocket', port),
stopWebSocket: () => ipcRenderer.send('stop-websocket'),
jsonReload: () => ipcRenderer.send('json-reload'),
openDevTools: () => ipcRenderer.send('open-devtools'),
onWebSocketStatus: (callback: (message: string) => void) => ipcRenderer.on('websocket-status', (event, message) => callback(message)),
onLogMessage: (callback: (message: string, color: string) => void) => ipcRenderer.on('log-message', (event, [message, color]) => callback(message, color)),

View File

@@ -56,6 +56,10 @@ document.getElementById('stopBtn')?.addEventListener('click', () => {
window.electron.stopWebSocket();
});
document.getElementById('jsonReload')?.addEventListener('click', () => {
window.electron.jsonReload();
});
document.getElementById('devToolsBtn')?.addEventListener('click', () => {
window.electron.openDevTools();
});

1
src/global.d.ts vendored
View File

@@ -3,6 +3,7 @@ interface Window {
electron: {
startWebSocket: (port: number) => void;
stopWebSocket: () => void;
jsonReload: () => void;
openDevTools: () => void;
onWebSocketStatus: (callback: (message: string) => void) => void;
onLogMessage: (callback: (message: string, color: string) => void) => void; // 添加這行以處理日誌消息

View File

@@ -16,7 +16,7 @@ ws://127.0.0.1:9005
*/
const port: number = process.env.PORT ? parseInt(process.env.PORT, 10) : 8080; // 默认端口为 8080
const server = new WebSocketServer({ port: 8080 });
const server = new WebSocketServer({ port });
// server.on('connection', (socket: WebSocket) => {
// console.log('客户端已连接');

View File

@@ -19,7 +19,7 @@ export class NetConnector {
const ip = request.socket.remoteAddress.replace("::ffff:", "") || 'Unknown IP';
console.log(`Client connected from IP: ${ip}`);
NetConnector.clients.set(socket, { socket, id: id, name: "", money: 0 });
NetConnector.clients.set(socket, { socket, id: id, name: "", money: 0, jsons: {} });
id++;
socket.on('message', (message: Buffer) => NetConnector.OnWebSocketMessage(socket, message));

View File

@@ -6,5 +6,6 @@ export interface ClientData {
id: number;
name: string;
money: number;
jsons: { [key: number]: any; };
free?: { count: number, freeData: any[] };
}