[add] 設定env
This commit is contained in:
12
src/Utils/tools.ts
Normal file
12
src/Utils/tools.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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]]}`,
|
||||
];
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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"); // 發送訊息到渲染進程
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -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)),
|
||||
|
||||
@@ -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
1
src/global.d.ts
vendored
@@ -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; // 添加這行以處理日誌消息
|
||||
|
||||
@@ -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('客户端已连接');
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -6,5 +6,6 @@ export interface ClientData {
|
||||
id: number;
|
||||
name: string;
|
||||
money: number;
|
||||
jsons: { [key: number]: any; };
|
||||
free?: { count: number, freeData: any[] };
|
||||
}
|
||||
Reference in New Issue
Block a user