From d4427cfff42d2d0df7eb7dfcd3b1b916ab61d000 Mon Sep 17 00:00:00 2001 From: linyuchen Date: Sat, 18 May 2024 11:45:42 +0800 Subject: [PATCH] feat: .handle_quick_operation of websocket --- src/main/main.ts | 22 +-- src/ntqqapi/constructor.ts | 6 + src/ntqqapi/hook.ts | 6 +- .../action/go-cqhttp/QuickOperation.ts | 17 ++ src/onebot11/action/index.ts | 2 + src/onebot11/action/types.ts | 1 + src/onebot11/server/http.ts | 4 +- src/onebot11/server/post-ob11-event.ts | 88 +++++++++ src/onebot11/server/postOB11Event.ts | 185 ------------------ src/onebot11/server/quick-operation.ts | 139 +++++++++++++ src/onebot11/server/ws/ReverseWebsocket.ts | 2 +- src/onebot11/server/ws/WebsocketServer.ts | 2 +- src/onebot11/server/ws/reply.ts | 2 +- 13 files changed, 272 insertions(+), 204 deletions(-) create mode 100644 src/onebot11/action/go-cqhttp/QuickOperation.ts create mode 100644 src/onebot11/server/post-ob11-event.ts delete mode 100644 src/onebot11/server/postOB11Event.ts create mode 100644 src/onebot11/server/quick-operation.ts diff --git a/src/main/main.ts b/src/main/main.ts index 5d96f3f..a167e39 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -38,7 +38,7 @@ import { import { httpHeart, ob11HTTPServer } from '../onebot11/server/http' import { OB11FriendRecallNoticeEvent } from '../onebot11/event/notice/OB11FriendRecallNoticeEvent' import { OB11GroupRecallNoticeEvent } from '../onebot11/event/notice/OB11GroupRecallNoticeEvent' -import { postOB11Event } from '../onebot11/server/postOB11Event' +import { postOb11Event } from '../onebot11/server/post-ob11-event' import { ob11ReverseWebsockets } from '../onebot11/server/ws/ReverseWebsocket' import { OB11GroupAdminNoticeEvent } from '../onebot11/event/notice/OB11GroupAdminNoticeEvent' import { OB11GroupRequestEvent } from '../onebot11/event/request/OB11GroupRequest' @@ -183,20 +183,20 @@ function onLoad() { if (isSelfMsg) { msg.target_id = parseInt(message.peerUin) } - postOB11Event(msg) + postOb11Event(msg) // log("post msg", msg) }) .catch((e) => log('constructMessage error: ', e.stack.toString())) OB11Constructor.GroupEvent(message).then((groupEvent) => { if (groupEvent) { // log("post group event", groupEvent); - postOB11Event(groupEvent) + postOb11Event(groupEvent) } }) OB11Constructor.FriendAddEvent(message).then((friendAddEvent) => { if (friendAddEvent) { // log("post friend add event", friendAddEvent); - postOB11Event(friendAddEvent) + postOb11Event(friendAddEvent) } }) } @@ -213,7 +213,7 @@ function onLoad() { } else { pokeEvent = new OB11FriendPokeEvent(parseInt(id)) } - postOB11Event(pokeEvent) + postOb11Event(pokeEvent) }) } registerReceiveHook<{ @@ -244,7 +244,7 @@ function onLoad() { OB11Constructor.RecallEvent(message).then((recallEvent) => { if (recallEvent) { log('post recall event', recallEvent) - postOB11Event(recallEvent) + postOb11Event(recallEvent) } }) // 不让入库覆盖原来消息,不然就获取不到撤回的消息内容了 @@ -322,7 +322,7 @@ function onLoad() { ? 'unset' : 'set' // member1.role = notify.type == GroupNotifyTypes.ADMIN_SET ? GroupMemberRole.admin : GroupMemberRole.normal; - postOB11Event(groupAdminNoticeEvent, true) + postOb11Event(groupAdminNoticeEvent, true) } else { log('获取群通知的成员信息失败', notify, getGroup(notify.group.groupCode)) } @@ -344,7 +344,7 @@ function onLoad() { parseInt(operatorId), subType, ) - postOB11Event(groupDecreaseEvent, true) + postOb11Event(groupDecreaseEvent, true) } catch (e) { log('获取群通知的成员信息失败', notify, e.stack.toString()) } @@ -362,7 +362,7 @@ function onLoad() { groupRequestEvent.sub_type = 'add' groupRequestEvent.comment = notify.postscript groupRequestEvent.flag = notify.seq - postOB11Event(groupRequestEvent) + postOb11Event(groupRequestEvent) } else if (notify.type == GroupNotifyTypes.INVITE_ME) { log('收到邀请我加群通知') let groupInviteEvent = new OB11GroupRequestEvent() @@ -374,7 +374,7 @@ function onLoad() { groupInviteEvent.user_id = parseInt(user_id) groupInviteEvent.sub_type = 'invite' groupInviteEvent.flag = notify.seq - postOB11Event(groupInviteEvent) + postOb11Event(groupInviteEvent) } } catch (e) { log('解析群通知失败', e.stack.toString()) @@ -400,7 +400,7 @@ function onLoad() { } friendRequestEvent.flag = flag friendRequestEvent.comment = req.extWords - postOB11Event(friendRequestEvent) + postOb11Event(friendRequestEvent) } } }) diff --git a/src/ntqqapi/constructor.ts b/src/ntqqapi/constructor.ts index e55faa7..969f6ca 100644 --- a/src/ntqqapi/constructor.ts +++ b/src/ntqqapi/constructor.ts @@ -76,6 +76,9 @@ export class SendMsgElementConstructor { if (fileSize === 0) { throw '文件异常,大小为0' } + if (fileSize > 1000 * 1000 * 7){ // todo: 没有采用1024计算,因为具体上限数值未知,大概是7MB + throw `图片过大,最大支持7MB,当前文件大小${fileSize}B` + } const imageSize = await NTQQFileApi.getImageSize(picPath) const picElement = { md5HexStr: md5, @@ -131,6 +134,9 @@ export class SendMsgElementConstructor { if (fileSize === 0) { throw '文件异常,大小为0' } + if (fileSize > 1000 * 1000 * 100) { // todo: 没有采用1024计算,因为具体上限数值未知,大概是100MB + throw `视频过大,最大支持100MB,当前文件大小${fileSize}B` + } const pathLib = require('path') let thumbDir = path.replace(`${pathLib.sep}Ori${pathLib.sep}`, `${pathLib.sep}Thumb${pathLib.sep}`) thumbDir = pathLib.dirname(thumbDir) diff --git a/src/ntqqapi/hook.ts b/src/ntqqapi/hook.ts index 09002aa..168519d 100644 --- a/src/ntqqapi/hook.ts +++ b/src/ntqqapi/hook.ts @@ -14,7 +14,7 @@ import { } from '../common/data' import { OB11GroupDecreaseEvent } from '../onebot11/event/notice/OB11GroupDecreaseEvent' import { v4 as uuidv4 } from 'uuid' -import { postOB11Event } from '../onebot11/server/postOB11Event' +import { postOb11Event } from '../onebot11/server/post-ob11-event' import { getConfigUtil, HOOK_LOG } from '../common/config' import fs from 'fs' import { dbUtil } from '../common/db' @@ -299,7 +299,7 @@ async function processGroupEvent(payload: { groupList: Group[] }) { } for (const member of oldMembers) { if (!newMembersSet.has(member.uin) && member.uin != selfInfo.uin) { - postOB11Event( + postOb11Event( new OB11GroupDecreaseEvent( parseInt(group.groupCode), parseInt(member.uin), @@ -497,7 +497,7 @@ registerReceiveHook<{ let lastTempMsg = msgList.pop() log('激活窗口之前的第一条临时会话消息:', lastTempMsg) if (Date.now() / 1000 - parseInt(lastTempMsg.msgTime) < 5) { - OB11Constructor.message(lastTempMsg).then((r) => postOB11Event(r)) + OB11Constructor.message(lastTempMsg).then((r) => postOb11Event(r)) } }) }) diff --git a/src/onebot11/action/go-cqhttp/QuickOperation.ts b/src/onebot11/action/go-cqhttp/QuickOperation.ts new file mode 100644 index 0000000..376d084 --- /dev/null +++ b/src/onebot11/action/go-cqhttp/QuickOperation.ts @@ -0,0 +1,17 @@ +import BaseAction from '../BaseAction' +import { handleQuickOperation, QuickOperation, QuickOperationEvent } from '../../server/quick-operation' +import { log } from '@/common/utils' +import { ActionName } from '../types' + +interface Payload{ + context: QuickOperationEvent, + operation: QuickOperation +} + +export class GoCQHTTHandleQuickOperation extends BaseAction{ + actionName = ActionName.GoCQHTTP_HandleQuickOperation + protected async _handle(payload: Payload): Promise { + handleQuickOperation(payload.context, payload.operation).then().catch(log); + return null + } +} \ No newline at end of file diff --git a/src/onebot11/action/index.ts b/src/onebot11/action/index.ts index adc8edc..9f140a1 100644 --- a/src/onebot11/action/index.ts +++ b/src/onebot11/action/index.ts @@ -49,6 +49,7 @@ import { SetMsgEmojiLike } from './msg/SetMsgEmojiLike' import { ForwardFriendSingleMsg, ForwardSingleGroupMsg } from './msg/ForwardSingleMsg' import { GetGroupEssence } from './group/GetGroupEssence' import { GetGroupHonorInfo } from './group/GetGroupHonorInfo' +import { GoCQHTTHandleQuickOperation } from './go-cqhttp/QuickOperation' export const actionHandlers = [ new GetFile(), @@ -104,6 +105,7 @@ export const actionHandlers = [ new GoCQHTTPUploadPrivateFile(), new GoCQHTTPGetGroupMsgHistory(), new GoCQHTTGetForwardMsgAction(), + new GoCQHTTHandleQuickOperation() ] function initActionMap() { diff --git a/src/onebot11/action/types.ts b/src/onebot11/action/types.ts index 5d15705..1f8c57f 100644 --- a/src/onebot11/action/types.ts +++ b/src/onebot11/action/types.ts @@ -67,5 +67,6 @@ export enum ActionName { GoCQHTTP_GetGroupMsgHistory = 'get_group_msg_history', GoCQHTTP_GetForwardMsg = 'get_forward_msg', GoCQHTTP_GetEssenceMsg = "get_essence_msg_list", + GoCQHTTP_HandleQuickOperation = ".handle_quick_operation", GetGroupHonorInfo = "get_group_honor_info", } diff --git a/src/onebot11/server/http.ts b/src/onebot11/server/http.ts index 5efe086..9c2aab8 100644 --- a/src/onebot11/server/http.ts +++ b/src/onebot11/server/http.ts @@ -3,7 +3,7 @@ import { OB11Response } from '../action/OB11Response' import { HttpServerBase } from '@/common/server/http' import { actionHandlers, actionMap } from '../action' import { getConfigUtil } from '@/common/config' -import { postOB11Event } from './postOB11Event' +import { postOb11Event } from './post-ob11-event' import { OB11HeartbeatEvent } from '../event/meta/OB11HeartbeatEvent' import { selfInfo } from '@/common/data' @@ -40,7 +40,7 @@ class HTTPHeart { } this.intervalId = setInterval(() => { // ws的心跳是ws自己维护的 - postOB11Event(new OB11HeartbeatEvent(selfInfo.online, true, heartInterval), false, false) + postOb11Event(new OB11HeartbeatEvent(selfInfo.online, true, heartInterval), false, false) }, heartInterval) } diff --git a/src/onebot11/server/post-ob11-event.ts b/src/onebot11/server/post-ob11-event.ts new file mode 100644 index 0000000..9365a41 --- /dev/null +++ b/src/onebot11/server/post-ob11-event.ts @@ -0,0 +1,88 @@ +import { OB11Message, OB11MessageAt, OB11MessageData } from '../types' +import { getFriend, getGroup, getUidByUin, selfInfo } from '../../common/data' +import { OB11BaseMetaEvent } from '../event/meta/OB11BaseMetaEvent' +import { OB11BaseNoticeEvent } from '../event/notice/OB11BaseNoticeEvent' +import { WebSocket as WebSocketClass } from 'ws' +import { wsReply } from './ws/reply' +import { log } from '../../common/utils/log' +import { getConfigUtil } from '../../common/config' +import crypto from 'crypto' +import { NTQQFriendApi, NTQQGroupApi, NTQQMsgApi, Peer } from '../../ntqqapi/api' +import { ChatType, Group, GroupRequestOperateTypes } from '../../ntqqapi/types' +import { convertMessage2List, createSendElements, sendMsg } from '../action/msg/SendMsg' +import { dbUtil } from '../../common/db' +import { OB11FriendRequestEvent } from '../event/request/OB11FriendRequest' +import { OB11GroupRequestEvent } from '../event/request/OB11GroupRequest' +import { isNull } from '../../common/utils' +import { handleQuickOperation, QuickOperationEvent } from './quick-operation' + +export type PostEventType = OB11Message | OB11BaseMetaEvent | OB11BaseNoticeEvent + +const eventWSList: WebSocketClass[] = [] + +export function registerWsEventSender(ws: WebSocketClass) { + eventWSList.push(ws) +} + +export function unregisterWsEventSender(ws: WebSocketClass) { + let index = eventWSList.indexOf(ws) + if (index !== -1) { + eventWSList.splice(index, 1) + } +} + +export function postWsEvent(event: PostEventType) { + for (const ws of eventWSList) { + new Promise(() => { + wsReply(ws, event) + }).then() + } +} + +export function postOb11Event(msg: PostEventType, reportSelf = false, postWs = true) { + const config = getConfigUtil().getConfig() + // 判断msg是否是event + if (!config.reportSelfMessage && !reportSelf) { + if (msg.post_type === 'message' && (msg as OB11Message).user_id.toString() == selfInfo.uin) { + return + } + } + if (config.ob11.enableHttpPost) { + const msgStr = JSON.stringify(msg) + const hmac = crypto.createHmac('sha1', config.ob11.httpSecret) + hmac.update(msgStr) + const sig = hmac.digest('hex') + let headers = { + 'Content-Type': 'application/json', + 'x-self-id': selfInfo.uin, + } + if (config.ob11.httpSecret) { + headers['x-signature'] = 'sha1=' + sig + } + for (const host of config.ob11.httpHosts) { + fetch(host, { + method: 'POST', + headers, + body: msgStr, + }).then( + async (res) => { + log(`新消息事件HTTP上报成功: ${host} `, msgStr) + try { + const resJson = await res.json() + log(`新消息事件HTTP上报返回快速操作: `, JSON.stringify(resJson)) + handleQuickOperation(msg as QuickOperationEvent, resJson).then().catch(log); + } catch (e) { + log(`新消息事件HTTP上报没有返回快速操作,不需要处理`) + return + } + }, + (err: any) => { + log(`新消息事件HTTP上报失败: ${host} `, err, msg) + }, + ) + } + } + if (postWs) { + postWsEvent(msg) + } +} diff --git a/src/onebot11/server/postOB11Event.ts b/src/onebot11/server/postOB11Event.ts deleted file mode 100644 index eea11ab..0000000 --- a/src/onebot11/server/postOB11Event.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { OB11Message, OB11MessageAt, OB11MessageData } from '../types' -import { getFriend, getGroup, getUidByUin, selfInfo } from '../../common/data' -import { OB11BaseMetaEvent } from '../event/meta/OB11BaseMetaEvent' -import { OB11BaseNoticeEvent } from '../event/notice/OB11BaseNoticeEvent' -import { WebSocket as WebSocketClass } from 'ws' -import { wsReply } from './ws/reply' -import { log } from '../../common/utils/log' -import { getConfigUtil } from '../../common/config' -import crypto from 'crypto' -import { NTQQFriendApi, NTQQGroupApi, NTQQMsgApi, Peer } from '../../ntqqapi/api' -import { ChatType, Group, GroupRequestOperateTypes } from '../../ntqqapi/types' -import { convertMessage2List, createSendElements, sendMsg } from '../action/msg/SendMsg' -import { dbUtil } from '../../common/db' -import { OB11FriendRequestEvent } from '../event/request/OB11FriendRequest' -import { OB11GroupRequestEvent } from '../event/request/OB11GroupRequest' -import { isNull } from '../../common/utils' - -export type PostEventType = OB11Message | OB11BaseMetaEvent | OB11BaseNoticeEvent - -interface QuickActionPrivateMessage { - reply?: string - auto_escape?: boolean -} - -interface QuickActionGroupMessage extends QuickActionPrivateMessage { - // 回复群消息 - at_sender?: boolean - delete?: boolean - kick?: boolean - ban?: boolean - ban_duration?: number - // -} - -interface QuickActionFriendRequest { - approve?: boolean - remark?: string -} - -interface QuickActionGroupRequest { - approve?: boolean - reason?: string -} - -type QuickAction = QuickActionPrivateMessage & - QuickActionGroupMessage & - QuickActionFriendRequest & - QuickActionGroupRequest - -const eventWSList: WebSocketClass[] = [] - -export function registerWsEventSender(ws: WebSocketClass) { - eventWSList.push(ws) -} - -export function unregisterWsEventSender(ws: WebSocketClass) { - let index = eventWSList.indexOf(ws) - if (index !== -1) { - eventWSList.splice(index, 1) - } -} - -export function postWsEvent(event: PostEventType) { - for (const ws of eventWSList) { - new Promise(() => { - wsReply(ws, event) - }).then() - } -} - -export function postOB11Event(msg: PostEventType, reportSelf = false, postWs = true) { - const config = getConfigUtil().getConfig() - // 判断msg是否是event - if (!config.reportSelfMessage && !reportSelf) { - if (msg.post_type === 'message' && (msg as OB11Message).user_id.toString() == selfInfo.uin) { - return - } - } - if (config.ob11.enableHttpPost) { - const msgStr = JSON.stringify(msg) - const hmac = crypto.createHmac('sha1', config.ob11.httpSecret) - hmac.update(msgStr) - const sig = hmac.digest('hex') - let headers = { - 'Content-Type': 'application/json', - 'x-self-id': selfInfo.uin, - } - if (config.ob11.httpSecret) { - headers['x-signature'] = 'sha1=' + sig - } - for (const host of config.ob11.httpHosts) { - fetch(host, { - method: 'POST', - headers, - body: msgStr, - }).then( - async (res) => { - log(`新消息事件HTTP上报成功: ${host} `, msgStr) - // todo: 处理不够优雅,应该使用高级泛型进行QuickAction类型识别 - let resJson: QuickAction - try { - resJson = await res.json() - log(`新消息事件HTTP上报返回快速操作: `, JSON.stringify(resJson)) - } catch (e) { - log(`新消息事件HTTP上报没有返回快速操作,不需要处理`) - return - } - if (msg.post_type === 'message') { - msg = msg as OB11Message - const rawMessage = await dbUtil.getMsgByShortId(msg.message_id) - resJson = resJson as QuickActionPrivateMessage | QuickActionGroupMessage - const reply = resJson.reply - let peer: Peer = { - chatType: ChatType.friend, - peerUid: msg.user_id.toString(), - } - if (msg.message_type == 'private') { - peer.peerUid = getUidByUin(msg.user_id.toString()) - if (msg.sub_type === 'group') { - peer.chatType = ChatType.temp - } - } else { - peer.chatType = ChatType.group - peer.peerUid = msg.group_id.toString() - } - if (reply) { - let group: Group = null - let replyMessage: OB11MessageData[] = [] - - if (msg.message_type == 'group') { - group = await getGroup(msg.group_id.toString()) - if ((resJson as QuickActionGroupMessage).at_sender) { - replyMessage.push({ - type: 'at', - data: { - qq: msg.user_id.toString(), - }, - } as OB11MessageAt) - } - } - replyMessage = replyMessage.concat(convertMessage2List(reply, resJson.auto_escape)) - const { sendElements, deleteAfterSentFiles } = await createSendElements(replyMessage, group) - log(`发送消息给`, peer, sendElements) - sendMsg(peer, sendElements, deleteAfterSentFiles, false).then() - } else if (resJson.delete) { - NTQQMsgApi.recallMsg(peer, [rawMessage.msgId]).then() - } else if (resJson.kick) { - NTQQGroupApi.kickMember(peer.peerUid, [rawMessage.senderUid]).then() - } else if (resJson.ban) { - NTQQGroupApi.banMember(peer.peerUid, [ - { - uid: rawMessage.senderUid, - timeStamp: resJson.ban_duration || 60 * 30, - }, - ]).then() - } - } else if (msg.post_type === 'request') { - if ((msg as OB11FriendRequestEvent).request_type === 'friend') { - resJson = resJson as QuickActionFriendRequest - if (!isNull(resJson.approve)) { - // todo: set remark - NTQQFriendApi.handleFriendRequest((msg as OB11FriendRequestEvent).flag, resJson.approve).then() - } - } else if ((msg as OB11GroupRequestEvent).request_type === 'group') { - resJson = resJson as QuickActionGroupRequest - if (!isNull(resJson.approve)) { - NTQQGroupApi.handleGroupRequest( - (msg as OB11FriendRequestEvent).flag, - resJson.approve ? GroupRequestOperateTypes.approve : GroupRequestOperateTypes.reject, - resJson.reason, - ).then() - } - } - } - }, - (err: any) => { - log(`新消息事件HTTP上报失败: ${host} `, err, msg) - }, - ) - } - } - if (postWs) { - postWsEvent(msg) - } -} diff --git a/src/onebot11/server/quick-operation.ts b/src/onebot11/server/quick-operation.ts new file mode 100644 index 0000000..44ccbff --- /dev/null +++ b/src/onebot11/server/quick-operation.ts @@ -0,0 +1,139 @@ +// handle quick action, create at 2024-5-18 10:54:39 by linyuchen + + +import { OB11Message, OB11MessageAt, OB11MessageData } from '../types' +import { OB11FriendRequestEvent } from '../event/request/OB11FriendRequest' +import { OB11GroupRequestEvent } from '../event/request/OB11GroupRequest' +import { dbUtil } from '@/common/db' +import { NTQQFriendApi, NTQQGroupApi, NTQQMsgApi, Peer } from '@/ntqqapi/api' +import { ChatType, Group, GroupRequestOperateTypes } from '@/ntqqapi/types' +import { getGroup, getUidByUin } from '@/common/data' +import { convertMessage2List, createSendElements, sendMsg } from '../action/msg/SendMsg' +import { isNull, log } from '@/common/utils' + + +interface QuickOperationPrivateMessage { + reply?: string + auto_escape?: boolean +} + +interface QuickOperationGroupMessage extends QuickOperationPrivateMessage { + // 回复群消息 + at_sender?: boolean + delete?: boolean + kick?: boolean + ban?: boolean + ban_duration?: number + // +} + +interface QuickOperationFriendRequest { + approve?: boolean + remark?: string +} + +interface QuickOperationGroupRequest { + approve?: boolean + reason?: string +} + +export type QuickOperation = QuickOperationPrivateMessage & + QuickOperationGroupMessage & + QuickOperationFriendRequest & + QuickOperationGroupRequest + +export type QuickOperationEvent = OB11Message | OB11FriendRequestEvent | OB11GroupRequestEvent; + +export async function handleQuickOperation(context: QuickOperationEvent, quickAction: QuickOperation) { + if (context.post_type === 'message') { + handleMsg(context as OB11Message, quickAction).then().catch(log) + } + if (context.post_type === 'request') { + const friendRequest = context as OB11FriendRequestEvent; + const groupRequest = context as OB11GroupRequestEvent; + if ((friendRequest).request_type === 'friend') { + handleFriendRequest(friendRequest, quickAction).then().catch(log) + } + else if (groupRequest.request_type === 'group') { + handleGroupRequest(groupRequest, quickAction).then().catch(log) + } + } +} + +async function handleMsg(msg: OB11Message, quickAction: QuickOperationPrivateMessage | QuickOperationGroupMessage) { + msg = msg as OB11Message + const rawMessage = await dbUtil.getMsgByShortId(msg.message_id) + const reply = quickAction.reply + let peer: Peer = { + chatType: ChatType.friend, + peerUid: msg.user_id.toString(), + } + if (msg.message_type == 'private') { + peer.peerUid = getUidByUin(msg.user_id.toString()) + if (msg.sub_type === 'group') { + peer.chatType = ChatType.temp + } + } + else { + peer.chatType = ChatType.group + peer.peerUid = msg.group_id.toString() + } + if (reply) { + let group: Group = null + let replyMessage: OB11MessageData[] = [] + + if (msg.message_type == 'group') { + group = await getGroup(msg.group_id.toString()) + if ((quickAction as QuickOperationGroupMessage).at_sender) { + replyMessage.push({ + type: 'at', + data: { + qq: msg.user_id.toString(), + }, + } as OB11MessageAt) + } + } + replyMessage = replyMessage.concat(convertMessage2List(reply, quickAction.auto_escape)) + const { sendElements, deleteAfterSentFiles } = await createSendElements(replyMessage, group) + log(`发送消息给`, peer, sendElements) + sendMsg(peer, sendElements, deleteAfterSentFiles, false).then().catch(log) + } + if (msg.message_type === 'group') { + const groupMsgQuickAction = quickAction as QuickOperationGroupMessage + // handle group msg + if (groupMsgQuickAction.delete) { + NTQQMsgApi.recallMsg(peer, [rawMessage.msgId]).then().catch(log) + } + if (groupMsgQuickAction.kick) { + NTQQGroupApi.kickMember(peer.peerUid, [rawMessage.senderUid]).then().catch(log) + } + if (groupMsgQuickAction.ban) { + NTQQGroupApi.banMember(peer.peerUid, [ + { + uid: rawMessage.senderUid, + timeStamp: groupMsgQuickAction.ban_duration || 60 * 30, + }, + ]).then().catch(log) + } + } +} + +async function handleFriendRequest(request: OB11FriendRequestEvent, + quickAction: QuickOperationFriendRequest) { + if (!isNull(quickAction.approve)) { + // todo: set remark + NTQQFriendApi.handleFriendRequest(request.flag, quickAction.approve).then().catch(log) + } +} + + +async function handleGroupRequest(request: OB11GroupRequestEvent, + quickAction: QuickOperationGroupRequest) { + if (!isNull(quickAction.approve)) { + NTQQGroupApi.handleGroupRequest( + request.flag, + quickAction.approve ? GroupRequestOperateTypes.approve : GroupRequestOperateTypes.reject, + quickAction.reason, + ).then().catch(log) + } +} \ No newline at end of file diff --git a/src/onebot11/server/ws/ReverseWebsocket.ts b/src/onebot11/server/ws/ReverseWebsocket.ts index 5bbcb1b..5ebb568 100644 --- a/src/onebot11/server/ws/ReverseWebsocket.ts +++ b/src/onebot11/server/ws/ReverseWebsocket.ts @@ -4,7 +4,7 @@ import { ActionName } from '../../action/types' import { OB11Response } from '../../action/OB11Response' import BaseAction from '../../action/BaseAction' import { actionMap } from '../../action' -import { postWsEvent, registerWsEventSender, unregisterWsEventSender } from '../postOB11Event' +import { postWsEvent, registerWsEventSender, unregisterWsEventSender } from '../post-ob11-event' import { wsReply } from './reply' import { WebSocket as WebSocketClass } from 'ws' import { OB11HeartbeatEvent } from '../../event/meta/OB11HeartbeatEvent' diff --git a/src/onebot11/server/ws/WebsocketServer.ts b/src/onebot11/server/ws/WebsocketServer.ts index 2a5ccf4..5d77c2b 100644 --- a/src/onebot11/server/ws/WebsocketServer.ts +++ b/src/onebot11/server/ws/WebsocketServer.ts @@ -1,7 +1,7 @@ import { WebSocket } from 'ws' import { actionMap } from '../../action' import { OB11Response } from '../../action/OB11Response' -import { postWsEvent, registerWsEventSender, unregisterWsEventSender } from '../postOB11Event' +import { postWsEvent, registerWsEventSender, unregisterWsEventSender } from '../post-ob11-event' import { ActionName } from '../../action/types' import BaseAction from '../../action/BaseAction' import { LifeCycleSubType, OB11LifeCycleEvent } from '../../event/meta/OB11LifeCycleEvent' diff --git a/src/onebot11/server/ws/reply.ts b/src/onebot11/server/ws/reply.ts index c29562a..cde3e05 100644 --- a/src/onebot11/server/ws/reply.ts +++ b/src/onebot11/server/ws/reply.ts @@ -1,6 +1,6 @@ import { WebSocket as WebSocketClass } from 'ws' import { OB11Response } from '../../action/OB11Response' -import { PostEventType } from '../postOB11Event' +import { PostEventType } from '../post-ob11-event' import { log } from '../../../common/utils/log' import { isNull } from '../../../common/utils/helper'