diff --git a/src/onebot/main.ts b/src/onebot/main.ts index 9c01793e..56e295de 100644 --- a/src/onebot/main.ts +++ b/src/onebot/main.ts @@ -69,7 +69,7 @@ export class NapCatOneBot11Adapter { } if (ob11Config.ws.enable) { OB11NetworkManagerWrap.registerAdapter(new OB11PassiveWebSocketAdapter( - ob11Config.ws.host, ob11Config.ws.port, ob11Config.heartInterval, ob11Config.token + ob11Config.ws.host, ob11Config.ws.port, ob11Config.heartInterval, ob11Config.token, this.core, this )); } if (ob11Config.reverseWs.enable) { diff --git a/src/onebot/network/passive-websocket.ts b/src/onebot/network/passive-websocket.ts index 5e2e9934..632b1b3c 100644 --- a/src/onebot/network/passive-websocket.ts +++ b/src/onebot/network/passive-websocket.ts @@ -3,6 +3,11 @@ import { OB11BaseEvent } from '@/onebot/event/OB11BaseEvent'; import BaseAction from '@/onebot/action/BaseAction'; import { WebSocket, WebSocketServer } from 'ws'; import { Mutex } from 'async-mutex'; +import { OB11Response } from '../action/OB11Response'; +import { ActionName } from '../action/types'; +import { NapCatCore } from '@/core'; +import { NapCatOneBot11Adapter } from '..'; +import { LogWrapper } from '@/common/utils/log'; export class OB11PassiveWebSocketAdapter implements IOB11NetworkAdapter { wsServer: WebSocketServer; @@ -12,8 +17,15 @@ export class OB11PassiveWebSocketAdapter implements IOB11NetworkAdapter { hasBeenClosed: boolean = false; heartbeatInterval: number = 0; private actionMap: Map> = new Map(); + onebotContext: NapCatOneBot11Adapter; + coreContext: NapCatCore; + logger: LogWrapper; + + constructor(ip: string, port: number, heartbeatInterval: number, token: string, coreContext: NapCatCore, onebotContext: NapCatOneBot11Adapter) { + this.coreContext = coreContext; + this.onebotContext = onebotContext; + this.logger = coreContext.context.logger; - constructor(ip: string, port: number, heartbeatInterval: number, token: string) { this.heartbeatInterval = heartbeatInterval; this.wsServer = new WebSocketServer({ port: port, host: ip }); this.wsServer.on('connection', async (wsClient) => { @@ -29,7 +41,7 @@ export class OB11PassiveWebSocketAdapter implements IOB11NetworkAdapter { } } wsClient.on('message', (message) => { - this.handleMessage(message); + this.handleMessage(wsClient, message); }); wsClient.once('close', () => { this.wsClientsMutex.runExclusive(async () => { @@ -74,7 +86,8 @@ export class OB11PassiveWebSocketAdapter implements IOB11NetworkAdapter { open() { if (this.hasBeenClosed) { - throw new Error('Cannot open a closed WebSocket server'); + // throw new Error('Cannot open a closed WebSocket server'); + this.logger.logError('Cannot open a closed WebSocket server'); } this.isOpen = true; } @@ -84,16 +97,34 @@ export class OB11PassiveWebSocketAdapter implements IOB11NetworkAdapter { this.hasBeenClosed = true; this.wsServer.close(); } - - private handleMessage(message: any) { + async WsReplyAll(data: T) { + this.wsClientsMutex.runExclusive(async () => { + this.wsClients.forEach((wsClient) => { + if (wsClient.readyState === WebSocket.OPEN) { + wsClient.send(JSON.stringify(data)); + } + }); + }); + } + async WsReply(data: T, wsClient: WebSocket) { + if (wsClient.readyState === WebSocket.OPEN) { + wsClient.send(JSON.stringify(data)); + } + } + private handleMessage(wsClient: WebSocket, message: any) { + let receiveData: { action: ActionName, params?: any, echo?: any } = { action: ActionName.Unknown, params: {} }; + let echo = null; try { - const parsedMessage = JSON.parse(message); - const action = this.actionMap.get(parsedMessage.actionName); - if (action) { - action.handle(parsedMessage.payload); + try { + receiveData = JSON.parse(message.toString()); + echo = receiveData.echo; + this.logger.logDebug('收到正向Websocket消息', receiveData); + } catch (e) { + this.WsReply(OB11Response.error('json解析失败,请检查数据格式', 1400, echo),wsClient); } + receiveData.params = (receiveData?.params) ? receiveData.params : {};//兼容类型验证 } catch (e) { - console.error('Failed to handle message:', e); + this.WsReply(OB11Response.error('不支持的api ' + receiveData.action, 1404, echo),wsClient); } }