From bf0c12f1c44ee5d30a4b01fa9f77666759ae1f2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Fri, 6 Dec 2024 10:39:49 +0800 Subject: [PATCH] fix: #605 --- .../transformer/proto/message/message.ts | 10 ++- src/onebot/api/msg.ts | 61 ++++++++++--------- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/src/core/packet/transformer/proto/message/message.ts b/src/core/packet/transformer/proto/message/message.ts index 5453749f..66eaa63c 100644 --- a/src/core/packet/transformer/proto/message/message.ts +++ b/src/core/packet/transformer/proto/message/message.ts @@ -54,12 +54,20 @@ export const PushMsg = { generalFlag: ProtoField(9, ScalarType.INT32, true), }; +export const GroupChangeInfo = { + operator: ProtoField(1, () => GroupChangeOperator, true), +}; + +export const GroupChangeOperator = { + operatorUid: ProtoField(1, ScalarType.STRING, true), +}; + export const GroupChange = { groupUin: ProtoField(1, ScalarType.UINT32), flag: ProtoField(2, ScalarType.UINT32), memberUid: ProtoField(3, ScalarType.STRING, true), decreaseType: ProtoField(4, ScalarType.UINT32), - operatorUid: ProtoField(5, ScalarType.STRING, true), + operatorInfo: ProtoField(5, ScalarType.BYTES, true), increaseType: ProtoField(6, ScalarType.UINT32), field7: ProtoField(7, ScalarType.BYTES, true), }; diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 09564992..f951b2e2 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -28,12 +28,12 @@ import { RequestUtil } from '@/common/request'; import fsPromise, { constants } from 'node:fs/promises'; import { OB11FriendAddNoticeEvent } from '@/onebot/event/notice/OB11FriendAddNoticeEvent'; import { ForwardMsgBuilder } from "@/common/forward-msg-builder"; -import { GroupChange, PushMsgBody } from "@/core/packet/transformer/proto"; import { NapProtoMsg } from '@napneko/nap-proto-core'; import { OB11GroupIncreaseEvent } from '../event/notice/OB11GroupIncreaseEvent'; import { OB11GroupDecreaseEvent, GroupDecreaseSubType } from '../event/notice/OB11GroupDecreaseEvent'; import { GroupAdmin } from '@/core/packet/transformer/proto/message/groupAdmin'; import { OB11GroupAdminNoticeEvent } from '../event/notice/OB11GroupAdminNoticeEvent'; +import { GroupChange, GroupChangeInfo, PushMsgBody } from '@/core/packet/transformer/proto'; type RawToOb11Converters = { [Key in keyof MessageElement as Key extends `${string}Element` ? Key : never]: ( @@ -891,42 +891,42 @@ export class OneBotMsgApi { if (!sendElements.length) { throw new Error('消息体无法解析, 请检查是否发送了不支持的消息类型'); } - + const calculateTotalSize = async (elements: SendMessageElement[]): Promise => { const sizePromises = elements.map(async element => { switch (element.elementType) { - case ElementType.PTT: - return (await fsPromise.stat(element.pttElement.filePath)).size; - case ElementType.FILE: - return (await fsPromise.stat(element.fileElement.filePath)).size; - case ElementType.VIDEO: - return (await fsPromise.stat(element.videoElement.filePath)).size; - case ElementType.PIC: - return (await fsPromise.stat(element.picElement.sourcePath)).size; - default: - return 0; + case ElementType.PTT: + return (await fsPromise.stat(element.pttElement.filePath)).size; + case ElementType.FILE: + return (await fsPromise.stat(element.fileElement.filePath)).size; + case ElementType.VIDEO: + return (await fsPromise.stat(element.videoElement.filePath)).size; + case ElementType.PIC: + return (await fsPromise.stat(element.picElement.sourcePath)).size; + default: + return 0; } }); const sizes = await Promise.all(sizePromises); return sizes.reduce((total, size) => total + size, 0); }; - + const totalSize = await calculateTotalSize(sendElements).catch(e => { this.core.context.logger.logError('发送消息计算预计时间异常', e); return 0; }); - + const timeout = 10000 + (totalSize / 1024 / 256 * 1000); - + const returnMsg = await this.core.apis.MsgApi.sendMsg(peer, sendElements, waitComplete, timeout); if (!returnMsg) throw new Error('发送消息失败'); - + returnMsg.id = MessageUnique.createUniqueMsgId({ chatType: peer.chatType, guildId: '', peerUid: peer.peerUid, }, returnMsg.msgId); - + setTimeout(async () => { const deletePromises = deleteAfterSentFiles.map(async file => { try { @@ -939,7 +939,7 @@ export class OneBotMsgApi { }); await Promise.all(deletePromises); }, 60000); - + return returnMsg; } @@ -970,14 +970,14 @@ export class OneBotMsgApi { } groupChangDecreseType2String(type: number): GroupDecreaseSubType { switch (type) { - case 130: - return 'leave'; - case 131: - return 'kick'; - case 3: - return 'kick_me'; - default: - return 'kick'; + case 130: + return 'leave'; + case 131: + return 'kick'; + case 3: + return 'kick_me'; + default: + return 'kick'; } } @@ -986,15 +986,20 @@ export class OneBotMsgApi { if (SysMessage.contentHead.type == 33 && SysMessage.body?.msgContent) { const groupChange = new NapProtoMsg(GroupChange).decode(SysMessage.body.msgContent); this.core.apis.GroupApi.refreshGroupMemberCache(groupChange.groupUin.toString()).then().catch(); + const operatorUid = groupChange.operatorInfo?.toString(); return new OB11GroupIncreaseEvent( this.core, groupChange.groupUin, groupChange.memberUid ? +await this.core.apis.UserApi.getUinByUidV2(groupChange.memberUid) : 0, - groupChange.operatorUid ? +await this.core.apis.UserApi.getUinByUidV2(groupChange.operatorUid) : 0, + operatorUid ? +await this.core.apis.UserApi.getUinByUidV2(operatorUid) : 0, groupChange.decreaseType == 131 ? 'invite' : 'approve', ); } else if (SysMessage.contentHead.type == 34 && SysMessage.body?.msgContent) { const groupChange = new NapProtoMsg(GroupChange).decode(SysMessage.body.msgContent); + // 自身被踢出时operatorInfo会是一个protobuf 否则大多数情况为一个string + const operatorUid = groupChange.decreaseType === 3 && groupChange.operatorInfo ? + new NapProtoMsg(GroupChangeInfo).decode(groupChange.operatorInfo).operator?.operatorUid : + groupChange.operatorInfo?.toString(); if (groupChange.memberUid === this.core.selfInfo.uid) { setTimeout(() => { this.core.apis.GroupApi.groupMemberCache.delete(groupChange.groupUin.toString()); @@ -1007,7 +1012,7 @@ export class OneBotMsgApi { this.core, groupChange.groupUin, groupChange.memberUid ? +await this.core.apis.UserApi.getUinByUidV2(groupChange.memberUid) : 0, - groupChange.operatorUid ? +await this.core.apis.UserApi.getUinByUidV2(groupChange.operatorUid) : 0, + operatorUid ? +await this.core.apis.UserApi.getUinByUidV2(operatorUid) : 0, this.groupChangDecreseType2String(groupChange.decreaseType), ); } else if (SysMessage.contentHead.type == 44 && SysMessage.body?.msgContent) {