From 7a33a36f443bd64545afb633dc2d88f37e9ebc29 Mon Sep 17 00:00:00 2001 From: super1207 Date: Sat, 20 Jul 2024 17:58:00 +0800 Subject: [PATCH] add get_event api --- src/onebot11/action/index.ts | 2 + src/onebot11/action/llonebot/GetEvent.ts | 23 ++++++++ src/onebot11/action/types.ts | 1 + src/onebot11/server/event-for-http.ts | 68 ++++++++++++++++++++++++ src/onebot11/server/post-ob11-event.ts | 6 +++ 5 files changed, 100 insertions(+) create mode 100644 src/onebot11/action/llonebot/GetEvent.ts create mode 100644 src/onebot11/server/event-for-http.ts diff --git a/src/onebot11/action/index.ts b/src/onebot11/action/index.ts index 3785082..ad57dc1 100644 --- a/src/onebot11/action/index.ts +++ b/src/onebot11/action/index.ts @@ -50,6 +50,7 @@ import { ForwardFriendSingleMsg, ForwardGroupSingleMsg } from './msg/ForwardSing import { GetGroupEssence } from './group/GetGroupEssence' import { GetGroupHonorInfo } from './group/GetGroupHonorInfo' import { GoCQHTTHandleQuickOperation } from './go-cqhttp/QuickOperation' +import GetEvent from './llonebot/GetEvent' export const actionHandlers = [ new GetFile(), @@ -59,6 +60,7 @@ export const actionHandlers = [ new GetGroupAddRequest(), new SetQQAvatar(), new GetFriendWithCategory(), + new GetEvent(), // onebot11 new SendLike(), new GetMsg(), diff --git a/src/onebot11/action/llonebot/GetEvent.ts b/src/onebot11/action/llonebot/GetEvent.ts new file mode 100644 index 0000000..09827b1 --- /dev/null +++ b/src/onebot11/action/llonebot/GetEvent.ts @@ -0,0 +1,23 @@ +import BaseAction from '../BaseAction' +import { ActionName } from '../types' +import { getHttpEvent } from '../../server/event-for-http' +import { PostEventType } from '../../server/post-ob11-event' +// import { log } from "../../../common/utils"; + +interface Payload { + key: string + timeout: number +} + +export default class GetEvent extends BaseAction { + actionName = ActionName.GetEvent + protected async _handle(payload: Payload): Promise { + let key = '' + if (payload.key) { + key = payload.key; + } + let timeout = parseInt(payload.timeout?.toString()) || 0; + let evts = await getHttpEvent(key,timeout); + return evts; + } +} diff --git a/src/onebot11/action/types.ts b/src/onebot11/action/types.ts index 1b61ecc..f5b1abb 100644 --- a/src/onebot11/action/types.ts +++ b/src/onebot11/action/types.ts @@ -22,6 +22,7 @@ export enum ActionName { Debug = 'llonebot_debug', GetFile = 'get_file', GetFriendsWithCategory = 'get_friends_with_category', + GetEvent = 'get_event', // onebot 11 SendLike = 'send_like', GetLoginInfo = 'get_login_info', diff --git a/src/onebot11/server/event-for-http.ts b/src/onebot11/server/event-for-http.ts new file mode 100644 index 0000000..086aa2a --- /dev/null +++ b/src/onebot11/server/event-for-http.ts @@ -0,0 +1,68 @@ +import { PostEventType } from "./post-ob11-event" + + +interface HttpEventType { + seq: number + event: PostEventType +} + +interface HttpUserType { + lastAccessTime: number + userSeq: number +} + +let curentSeq:number = 0; +let eventList:HttpEventType[] = []; +let httpUser:Record = {}; + + +export function postHttpEvent(event: PostEventType) { + curentSeq += 1; + eventList.push({ + seq: curentSeq, + event: event + }); + while(eventList.length > 100) { + eventList.shift(); + } +} + + +export async function getHttpEvent(userKey:string,timeout = 0) { + let toRetEvent = []; + + // 清除过时的user,5分钟没访问过的user将被删除 + let now = Date.now(); + for(let key in httpUser) { + let user = httpUser[key]; + if(now - user.lastAccessTime > 1000 * 60 * 5) { + delete httpUser[key]; + } + } + + // 增加新的user + if(!httpUser[userKey] ) { + httpUser[userKey] = { + lastAccessTime: now, + userSeq: curentSeq + } + } + + let user = httpUser[userKey]; + // 等待数据到来,暂时先这么写吧...... + while(curentSeq == user.userSeq && Date.now() - now < timeout) { + await new Promise( resolve => setTimeout(resolve, 10) ); + } + // 取数据 + for(let i = 0; i < eventList.length; i++) { + let evt = eventList[i]; + if(evt.seq > user.userSeq) { + toRetEvent.push(evt.event); + } + } + + // 更新user数据 + user.lastAccessTime = Date.now(); + user.userSeq = curentSeq; + return toRetEvent; +} diff --git a/src/onebot11/server/post-ob11-event.ts b/src/onebot11/server/post-ob11-event.ts index d78f130..c781ea6 100644 --- a/src/onebot11/server/post-ob11-event.ts +++ b/src/onebot11/server/post-ob11-event.ts @@ -8,6 +8,7 @@ import { log } from '@/common/utils' import { getConfigUtil } from '@/common/config' import crypto from 'crypto' import { handleQuickOperation, QuickOperationEvent } from '../action/quick-operation' +import { postHttpEvent } from './event-for-http' export type PostEventType = OB11Message | OB11BaseMetaEvent | OB11BaseNoticeEvent @@ -78,4 +79,9 @@ export function postOb11Event(msg: PostEventType, reportSelf = false, postWs = t if (postWs) { postWsEvent(msg) } + if(!(msg.post_type == 'meta_event' && (msg as OB11BaseMetaEvent).meta_event_type == 'heartbeat')) { + // 不上报心跳 + postHttpEvent(msg) + } + }