| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- import { AppKernel } from '../../app/AppKernel';
- import { APP_SERVER } from '../../define/Define';
- import { ColyseusRoomClient } from '../../network/colyseus/ColyseusRoomClient';
- const CASH_BASE = 100;
- export interface HallMessage {
- cmd?: string;
- data?: Record<string, unknown>;
- [key: string]: unknown;
- }
- export interface HallPayFinishMessage extends HallMessage {
- cmd: 'pay_finish';
- data?: {
- Golds?: number | string;
- PayNum?: number | string;
- event?: string;
- params?: unknown;
- [key: string]: unknown;
- };
- }
- export interface HallCallClientMessage extends HallMessage {
- cmd: 'call_client';
- data?: {
- type?: 'track' | 'refresh_mail' | 'start_change' | string;
- Golds?: number | string;
- event?: string;
- params?: unknown;
- [key: string]: unknown;
- };
- }
- class HallService {
- private client: ColyseusRoomClient | null = null;
- private serverUrl = '';
- async connect(serverUrl?: string): Promise<boolean> {
- const mainStore = AppKernel.stores.mainStore;
- if (!mainStore.isLogin || mainStore.userID <= 0) return false;
- const nextUrl = serverUrl || mainStore.hallServerUrl || APP_SERVER.SERVER_URL;
- console.log('[HallService] endpoint:', JSON.stringify(nextUrl));
- if (!nextUrl) {
- console.warn('[HallService] Hall server URL is empty');
- return false;
- }
- if (!this.client || this.serverUrl !== nextUrl) {
- if (this.client) await this.client.disconnect();
- this.serverUrl = nextUrl;
- this.client = this.createClient(nextUrl);
- }
- return this.client.connect();
- }
- async disconnect(): Promise<void> {
- const client = this.client;
- this.client = null;
- this.serverUrl = '';
- if (client) await client.disconnect();
- }
- sendChat(message: unknown): boolean {
- return this.send('chat', message);
- }
- sendRegistration(): boolean {
- const user = AppKernel.stores.mainStore.userInfo;
- if (!user) return false;
- const { UserID, GlobalUID, FaceID, NickName } = user;
- return this.send('id', { UserID, GlobalUID, FaceID, NickName });
- }
- sendState(): boolean {
- return this.send('state', { in_game: AppKernel.stores.mainStore.gameID });
- }
- private createClient(serverUrl: string): ColyseusRoomClient {
- return new ColyseusRoomClient(APP_SERVER.ROOM_HALL, serverUrl, {
- onConnected: () => {
- AppKernel.stores.mainStore.setServerKick(false);
- AppKernel.events.emit('hall:connected');
- this.sendRegistration();
- },
- onDisconnected: (code) => AppKernel.events.emit('hall:disconnected', { code }),
- onTimeout: () => AppKernel.events.emit('hall:timeout'),
- onMessage: (type, message) => this.onMessage(type, message),
- });
- }
- private send(type: string, message: unknown = ''): boolean {
- return this.client?.send(type, message) ?? false;
- }
- private onMessage(type: string, rawMessage: unknown): void {
- const message = this.asMessage(rawMessage);
- AppKernel.events.emit('hall:message', { type, message });
- switch (type) {
- case 'operate':
- this.handleOperate(message);
- break;
- case 'roger':
- this.handleRoger(message);
- break;
- }
- }
- private handleOperate(message: HallMessage): void {
- switch (message.cmd) {
- case 'id':
- this.sendState();
- break;
- case 'kick':
- AppKernel.stores.mainStore.setServerKick(true);
- AppKernel.events.emit('hall:kicked', message);
- break;
- }
- }
- private handleRoger(message: HallMessage): void {
- switch (message.cmd) {
- case 'pay_finish': {
- const payMessage = message as HallPayFinishMessage;
- this.updateBalance(payMessage.data?.Golds);
- AppKernel.events.emit('hall:pay-finished', payMessage);
- break;
- }
- case 'call_client': {
- const callMessage = message as HallCallClientMessage;
- if (callMessage.data?.type === 'start_change') {
- this.updateBalance(callMessage.data.Golds);
- }
- AppKernel.events.emit('hall:call-client', callMessage);
- break;
- }
- }
- }
- private updateBalance(rawGolds: number | string | undefined): void {
- if (rawGolds === undefined || rawGolds === null || rawGolds === '') return;
- const balance = Number(rawGolds) / CASH_BASE;
- AppKernel.stores.mainStore.updateHallBalance(balance);
- }
- private asMessage(message: unknown): HallMessage {
- if (message && typeof message === 'object') return message as HallMessage;
- return { data: { value: message } };
- }
- }
- export const hallService = new HallService();
|