diff --git a/README.md b/README.md index efca330b..9ffafc61 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ json 配置内容参数解释: ```json5 { - // 是否启用http服务,如果启用,可以通过http接口发送消息 + // 是否启用http服务, true为启动,false为禁用,如果启用,可以通过http接口发送消息 "enableHttp": false, // http服务端口 "httpPort": 3000, @@ -44,6 +44,8 @@ json 配置内容参数解释: "enableHttpPost": false, // http上报地址, 如["http://127.0.0.1:8080/onebot/v11/http"] "httpPostUrls": [], + // 是否启用http心跳 + "enableHttpHeart": false, // http上报密钥,可为空 "httpSecret": "", // 消息上报格式,array为消息组,string为cq码字符串 diff --git a/src/onebot11/config.ts b/src/onebot11/config.ts index f523d09e..2457724a 100644 --- a/src/onebot11/config.ts +++ b/src/onebot11/config.ts @@ -9,6 +9,7 @@ export interface OB11Config { wsPort: number; wsReverseUrls: string[]; enableHttp: boolean; + enableHttpHeart: boolean; enableHttpPost: boolean; enableWs: boolean; enableWsReverse: boolean; @@ -35,6 +36,7 @@ class Config implements OB11Config { wsReverseUrls: string[] = []; enableHttp = false; enableHttpPost = false; + enableHttpHeart = false; enableWs = false; enableWsReverse = false; messagePostFormat: 'array' | 'string' = 'array'; diff --git a/src/onebot11/main.ts b/src/onebot11/main.ts index e66edc47..de889420 100644 --- a/src/onebot11/main.ts +++ b/src/onebot11/main.ts @@ -12,7 +12,7 @@ import { RawMessage } from '@/core/qqnt/entities'; import { ob11Config } from '@/onebot11/config'; -import { ob11HTTPServer } from '@/onebot11/server/http'; +import { httpHeart, ob11HTTPServer } from '@/onebot11/server/http'; import { ob11WebsocketServer } from '@/onebot11/server/ws/WebsocketServer'; import { ob11ReverseWebsockets } from '@/onebot11/server/ws/ReverseWebsocket'; import { friendRequests, getFriend, getGroup, getGroupMember, groupNotifies, selfInfo } from '@/common/data'; @@ -49,6 +49,10 @@ export class NapCatOnebot11 { if (ob11Config.enableWsReverse) { ob11ReverseWebsockets.start(); } + if (ob11Config.enableHttpHeart){ + // 启动http心跳 + httpHeart.start(); + } // MsgListener const msgListener = new MsgListener(); msgListener.onRecvSysMsg = (protobuf: number[]) => { diff --git a/src/onebot11/onebot11.json b/src/onebot11/onebot11.json index 3c0f7eec..3e542f10 100644 --- a/src/onebot11/onebot11.json +++ b/src/onebot11/onebot11.json @@ -7,6 +7,7 @@ "wsReverseUrls": [], "enableHttpPost": false, "httpPostUrls": [], + "enableHttpHeart": false, "httpSecret": "", "messagePostFormat": "array", "reportSelfMessage": false, diff --git a/src/onebot11/server/http.ts b/src/onebot11/server/http.ts index d972f6d5..41db866d 100644 --- a/src/onebot11/server/http.ts +++ b/src/onebot11/server/http.ts @@ -3,6 +3,10 @@ import { OB11Response } from '../action/OB11Response'; import { HttpServerBase } from '@/common/server/http'; import { actionHandlers, actionMap } from '../action'; import { ob11Config } from '@/onebot11/config'; +import { selfInfo } from '@/common/data'; +import { OB11HeartbeatEvent } from '@/onebot11/event/meta/OB11HeartbeatEvent'; +import { postOB11Event } from '@/onebot11/server/postOB11Event'; +import { napCatCore } from '@/core'; class OB11HTTPServer extends HttpServerBase { name = 'OneBot V11 server'; @@ -29,3 +33,26 @@ setTimeout(() => { } } }, 0); + + +class HTTPHeart{ + intervalId: NodeJS.Timeout | null = null; + start(){ + const { heartInterval, } = ob11Config; + if (this.intervalId) { + clearInterval(this.intervalId); + } + this.intervalId = setInterval(() => { + // ws的心跳是ws自己维护的 + postOB11Event(new OB11HeartbeatEvent(!!selfInfo.online, true, heartInterval), false, false); + }, heartInterval); + } + + stop(){ + if (this.intervalId){ + clearInterval(this.intervalId); + } + } +} + +export const httpHeart = new HTTPHeart(); diff --git a/src/onebot11/server/postOB11Event.ts b/src/onebot11/server/postOB11Event.ts index b4fde434..8fb8219a 100644 --- a/src/onebot11/server/postOB11Event.ts +++ b/src/onebot11/server/postOB11Event.ts @@ -69,7 +69,7 @@ export function postWsEvent(event: PostEventType) { } } -export function postOB11Event(msg: PostEventType, reportSelf = false) { +export function postOB11Event(msg: PostEventType, reportSelf = false, postWs= true) { const config = ob11Config; // 判断msg是否是event if (!config.reportSelfMessage && !reportSelf) { @@ -181,5 +181,7 @@ export function postOB11Event(msg: PostEventType, reportSelf = false) { }); } } - postWsEvent(msg); + if (postWs){ + postWsEvent(msg); + } }