From fbe2d78331353d44efdda60f785e45e8f504adf7 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?=
 <nanaeonn@outlook.com>
Date: Fri, 9 Aug 2024 18:06:11 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A4=A7=E9=83=A8=E5=88=86=E5=BC=82?=
 =?UTF-8?q?=E5=B8=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/onebot/action/go-cqhttp/GetForwardMsg.ts  |  4 +-
 .../action/go-cqhttp/GetGroupMsgHistory.ts    |  2 +-
 src/onebot/helper/data.ts                     | 98 ++++++++++---------
 src/onebot/helper/msg.ts                      | 40 ++++++--
 4 files changed, 86 insertions(+), 58 deletions(-)

diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts
index a5c37150..b1b5057c 100644
--- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts
+++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts
@@ -40,8 +40,8 @@ export class GoCQHTTPGetForwardMsgAction extends BaseAction<Payload, any> {
     }
     const msgList = data.msgList;
     const messages = await Promise.all(msgList.map(async msg => {
-      const resMsg = await OB11Constructor.message(msg);
-      resMsg.message_id = MessageUnique.createMsg({ guildId:'',chatType:msg.chatType,peerUid:msg.peerUid },msg.msgId)!;
+      const resMsg = await OB11Constructor.message(this.CoreContext, msg, "array");
+      resMsg.message_id = MessageUnique.createMsg({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId)!;
       return resMsg;
     }));
     messages.map(msg => {
diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts
index fb6af824..f8ced55b 100644
--- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts
+++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts
@@ -46,7 +46,7 @@ export default class GoCQHTTPGetGroupMsgHistory extends BaseAction<Payload, Resp
     }));
 
     //转换消息
-    const ob11MsgList = await Promise.all(msgList.map(msg => OB11Constructor.message(msg)));
+    const ob11MsgList = await Promise.all(msgList.map(msg => OB11Constructor.message(this.CoreContext, msg, "array")));
     return { 'messages': ob11MsgList };
   }
 }
diff --git a/src/onebot/helper/data.ts b/src/onebot/helper/data.ts
index 8bfcf45d..8324d149 100644
--- a/src/onebot/helper/data.ts
+++ b/src/onebot/helper/data.ts
@@ -44,14 +44,20 @@ import { OB11FriendAddNoticeEvent } from '../event/notice/OB11FriendAddNoticeEve
 import { OB11BaseNoticeEvent } from '../event/notice/OB11BaseNoticeEvent';
 import { OB11GroupEssenceEvent } from '../event/notice/OB11GroupEssenceEvent';
 import { MessageUnique } from '@/common/utils/MessageUnique';
+import { NapCatCore } from '@/core';
 
 
 export class OB11Constructor {
-  static async message(msg: RawMessage): Promise<OB11Message> {
-    const { messagePostFormat } = ob11Config;
+  static async message(coreContext: NapCatCore, msg: RawMessage, messagePostFormat: any): Promise<OB11Message> {
+    const NTQQGroupApi = coreContext.getApiContext().GroupApi;
+    const NTQQUserApi = coreContext.getApiContext().UserApi;
+    const NTQQFileApi = coreContext.getApiContext().FileApi;
+    const NTQQMsgApi = coreContext.getApiContext().MsgApi;
+    const NTQQFriendApi = coreContext.getApiContext().FriendApi;
+    const logger = coreContext.context.logger;
     const message_type = msg.chatType == ChatType.group ? 'group' : 'private';
     const resMsg: OB11Message = {
-      self_id: parseInt(selfInfo.uin),
+      self_id: parseInt(coreContext.selfInfo.uin),
       user_id: parseInt(msg.senderUin!),
       time: parseInt(msg.msgTime) || Date.now(),
       message_id: msg.id!,
@@ -68,17 +74,14 @@ export class OB11Constructor {
       sub_type: 'friend',
       message: messagePostFormat === 'string' ? '' : [],
       message_format: messagePostFormat === 'string' ? 'string' : 'array',
-      post_type: selfInfo.uin == msg.senderUin ? EventType.MESSAGE_SENT : EventType.MESSAGE,
+      post_type: coreContext.selfInfo.uin == msg.senderUin ? EventType.MESSAGE_SENT : EventType.MESSAGE,
     };
     if (msg.chatType == ChatType.group) {
       resMsg.sub_type = 'normal'; // 这里go-cqhttp是group,而onebot11标准是normal, 蛋疼
       resMsg.group_id = parseInt(msg.peerUin);
-      let member = await getGroupMember(msg.peerUin, msg.senderUin!);
-      if (!member) {
-        //直接去QQNative取
-        const memberList = await NTQQGroupApi.getGroupMembers(msg.peerUin);
-        member = memberList.get(msg.senderUin!);
-      }
+      //直接去QQNative取
+      const memberList = await NTQQGroupApi.getGroupMembers(msg.peerUin);
+      let member = memberList.get(msg.senderUin!);
       if (member) {
         resMsg.sender.role = OB11Constructor.groupMemberRole(member.role);
         resMsg.sender.nickname = member.nick;
@@ -92,10 +95,6 @@ export class OB11Constructor {
     }
     else if (msg.chatType == ChatType.temp) {
       resMsg.sub_type = 'group';
-      const tempGroupCode = tempGroupCodeMap[msg.peerUin];
-      if (tempGroupCode) {
-        resMsg.group_id = parseInt(tempGroupCode);
-      }
     }
     for (const element of msg.elements) {
       let message_data: OB11MessageData = {
@@ -112,10 +111,7 @@ export class OB11Constructor {
           const { atNtUid, content } = element.textElement;
           let atQQ = element.textElement.atUid;
           if (!atQQ || atQQ === '0') {
-            const atMember = await getGroupMember(msg.peerUin, atNtUid);
-            if (atMember) {
-              atQQ = atMember.uin;
-            }
+            atQQ = await NTQQUserApi.getUinByUid(atNtUid);
           }
           if (atQQ) {
             qq = atQQ as `${number}`;
@@ -170,7 +166,7 @@ export class OB11Constructor {
         } catch (e: any) {
           message_data['type'] = 'unknown' as any;
           message_data['data'] = undefined;
-          logError('获取不到引用的消息', e.stack, element.replyElement.replayMsgSeq);
+          logger.logError('获取不到引用的消息', e.stack, element.replyElement.replayMsgSeq);
         }
 
       }
@@ -185,7 +181,7 @@ export class OB11Constructor {
         try {
           message_data['data']['url'] = await NTQQFileApi.getImageUrl(element.picElement);
         } catch (e: any) {
-          logError('获取图片url失败', e.stack);
+          logger.logError('获取图片url失败', e.stack);
         }
         //console.log(message_data['data']['url'])
         // message_data["data"]["file_id"] = element.picElement.fileUuid
@@ -318,7 +314,7 @@ export class OB11Constructor {
         message_data['data']['emoji_id'] = element.marketFaceElement.emojiId;
         message_data['data']['emoji_package_id'] = String(element.marketFaceElement.emojiPackageId);
         message_data['data']['key'] = element.marketFaceElement.key;
-        mFaceCache.set(md5, element.marketFaceElement.faceName);
+        //mFaceCache.set(md5, element.marketFaceElement.faceName);
       }
       else if (element.markdownElement) {
         message_data['type'] = OB11MessageDataType.markdown;
@@ -344,7 +340,7 @@ export class OB11Constructor {
           MultiMsg.parentMsgPeer = ParentMsgPeer;
           MultiMsg.parentMsgIdList = msg.parentMsgIdList;
           MultiMsg.id = MessageUnique.createMsg(ParentMsgPeer, MultiMsg.msgId);//该ID仅用查看 无法调用
-          let msgList = await OB11Constructor.message(MultiMsg);
+          let msgList = await OB11Constructor.message(coreContext, MultiMsg, "array");
           message_data['data']['content'].push(msgList);
           //console.log("合并消息", msgList);
         }
@@ -363,7 +359,13 @@ export class OB11Constructor {
     resMsg.raw_message = resMsg.raw_message.trim();
     return resMsg;
   }
-  static async PrivateEvent(msg: RawMessage): Promise<OB11BaseNoticeEvent | undefined> {
+  static async PrivateEvent(coreContext: NapCatCore, msg: RawMessage): Promise<OB11BaseNoticeEvent | undefined> {
+    const NTQQGroupApi = coreContext.getApiContext().GroupApi;
+    const NTQQUserApi = coreContext.getApiContext().UserApi;
+    const NTQQFileApi = coreContext.getApiContext().FileApi;
+    const NTQQMsgApi = coreContext.getApiContext().MsgApi;
+    const NTQQFriendApi = coreContext.getApiContext().FriendApi;
+    const logger = coreContext.context.logger;
     if (msg.chatType !== ChatType.friend) {
       return;
     }
@@ -394,20 +396,27 @@ export class OB11Constructor {
       }
     }
   }
-  static async GroupEvent(msg: RawMessage): Promise<OB11GroupNoticeEvent | undefined> {
+  static async GroupEvent(coreContext:NapCatCore,msg: RawMessage): Promise<OB11GroupNoticeEvent | undefined> {
+    const NTQQGroupApi = coreContext.getApiContext().GroupApi;
+    const NTQQUserApi = coreContext.getApiContext().UserApi;
+    const NTQQFileApi = coreContext.getApiContext().FileApi;
+    const NTQQMsgApi = coreContext.getApiContext().MsgApi;
+    const NTQQFriendApi = coreContext.getApiContext().FriendApi;
+    const logger = coreContext.context.logger;
     if (msg.chatType !== ChatType.group) {
       return;
     }
     //log("group msg", msg);
-    if (msg.senderUin && msg.senderUin !== '0') {
-      const member = await getGroupMember(msg.peerUid, msg.senderUin);
-      if (member && member.cardName !== msg.sendMemberName) {
-        const newCardName = msg.sendMemberName || '';
-        const event = new OB11GroupCardEvent(parseInt(msg.peerUid), parseInt(msg.senderUin), newCardName, member.cardName);
-        member.cardName = newCardName;
-        return event;
-      }
-    }
+    // Mlikiowa V2.0.0 Refactor Todo
+    // if (msg.senderUin && msg.senderUin !== '0') {
+    //   const member = await getGroupMember(msg.peerUid, msg.senderUin);
+    //   if (member && member.cardName !== msg.sendMemberName) {
+    //     const newCardName = msg.sendMemberName || '';
+    //     const event = new OB11GroupCardEvent(parseInt(msg.peerUid), parseInt(msg.senderUin), newCardName, member.cardName);
+    //     member.cardName = newCardName;
+    //     return event;
+    //   }
+    // }
 
     for (const element of msg.elements) {
       const grayTipElement = element.grayTipElement;
@@ -415,7 +424,7 @@ export class OB11Constructor {
       if (groupElement) {
         // log("收到群提示消息", groupElement)
         if (groupElement.type == TipGroupElementType.memberIncrease) {
-          logDebug('收到群成员增加消息', groupElement);
+          logger.logDebug('收到群成员增加消息', groupElement);
           await sleep(1000);
           const member = await getGroupMember(msg.peerUid, groupElement.memberUid);
           const memberUin = member?.uin;
@@ -433,7 +442,7 @@ export class OB11Constructor {
           }
         }
         else if (groupElement.type === TipGroupElementType.ban) {
-          logDebug('收到群群员禁言提示', groupElement);
+          logger.logDebug('收到群群员禁言提示', groupElement);
           const memberUid = groupElement.shutUp!.member.uid;
           const adminUid = groupElement.shutUp!.admin.uid;
           let memberUin: string = '';
@@ -457,16 +466,15 @@ export class OB11Constructor {
           }
         }
         else if (groupElement.type == TipGroupElementType.kicked) {
-          logDebug(`收到我被踢出或退群提示, 群${msg.peerUid}`, groupElement);
-          deleteGroup(msg.peerUid);
+          logger.logDebug(`收到我被踢出或退群提示, 群${msg.peerUid}`, groupElement);
           NTQQGroupApi.quitGroup(msg.peerUid).then();
           try {
             const adminUin = (await getGroupMember(msg.peerUid, groupElement.adminUid))?.uin || (await NTQQUserApi.getUidByUin(groupElement.adminUid));
             if (adminUin) {
-              return new OB11GroupDecreaseEvent(parseInt(msg.peerUid), parseInt(selfInfo.uin), parseInt(adminUin), 'kick_me');
+              return new OB11GroupDecreaseEvent(parseInt(msg.peerUid), parseInt(coreContext.selfInfo.uin), parseInt(adminUin), 'kick_me');
             }
           } catch (e) {
-            return new OB11GroupDecreaseEvent(parseInt(msg.peerUid), parseInt(selfInfo.uin), 0, 'leave');
+            return new OB11GroupDecreaseEvent(parseInt(msg.peerUid), parseInt(coreContext.selfInfo.uin), 0, 'leave');
           }
         }
       }
@@ -485,7 +493,7 @@ export class OB11Constructor {
             ignoreAttributes: false,
             attributeNamePrefix: ''
           }).parse(grayTipElement.xmlElement.content);
-          logDebug('收到表情回应我的消息', emojiLikeData);
+          logger.logDebug('收到表情回应我的消息', emojiLikeData);
           try {
             const senderUin = emojiLikeData.gtip.qq.jp;
             const msgSeq = emojiLikeData.gtip.url.msgseq;
@@ -502,11 +510,11 @@ export class OB11Constructor {
               count: 1
             }]);
           } catch (e: any) {
-            logError('解析表情回应消息失败', e.stack);
+            logger.logError('解析表情回应消息失败', e.stack);
           }
         }
         if (grayTipElement.subElementType == GrayTipElementSubType.INVITE_NEW_MEMBER) {
-          logDebug('收到新人被邀请进群消息', grayTipElement);
+          logger.logDebug('收到新人被邀请进群消息', grayTipElement);
           const xmlElement = grayTipElement.xmlElement;
           if (xmlElement?.content) {
             const regex = /jp="(\d+)"/g;
@@ -555,7 +563,7 @@ export class OB11Constructor {
             //下面得改 上面也是错的grayTipElement.subElementType == GrayTipElementSubType.MEMBER_NEW_TITLE
             const memberUin = json.items[1].param[0];
             const title = json.items[3].txt;
-            logDebug('收到群成员新头衔消息', json);
+            logger.logDebug('收到群成员新头衔消息', json);
             return new OB11GroupTitleEvent(parseInt(msg.peerUid), parseInt(memberUin), title);
           }
         }
@@ -659,10 +667,6 @@ export class OB11Constructor {
     };
   }
 
-  static groupMembers(group: Group): OB11GroupMember[] {
-    //logDebug('construct ob11 group members', group);
-    return Array.from(groupMembers.get(group.groupCode)?.values() || []).map(m => OB11Constructor.groupMember(group.groupCode, m));
-  }
 
   static group(group: Group): OB11Group {
     return {
diff --git a/src/onebot/helper/msg.ts b/src/onebot/helper/msg.ts
index f0e1a757..8a0c7012 100644
--- a/src/onebot/helper/msg.ts
+++ b/src/onebot/helper/msg.ts
@@ -74,7 +74,13 @@ export class SendMsgElementConstructor {
     };
   }
 
-  static async pic(CoreContext: NapCatCore, picPath: string, summary: string = '', subType: 0 | 1 = 0): Promise<SendPicElement> {
+  static async pic(coreContext: NapCatCore, picPath: string, summary: string = '', subType: 0 | 1 = 0): Promise<SendPicElement> {
+    const NTQQGroupApi = coreContext.getApiContext().GroupApi;
+    const NTQQUserApi = coreContext.getApiContext().UserApi;
+    const NTQQFileApi = coreContext.getApiContext().FileApi;
+    const NTQQMsgApi = coreContext.getApiContext().MsgApi;
+    const NTQQFriendApi = coreContext.getApiContext().FriendApi;
+    const logger = coreContext.context.logger;
     const { md5, fileName, path, fileSize } = await NTQQFileApi.uploadFile(picPath, ElementType.PIC, subType);
     if (fileSize === 0) {
       throw '文件异常,大小为0';
@@ -103,7 +109,13 @@ export class SendMsgElementConstructor {
     };
   }
 
-  static async file(CoreContext: NapCatCore, filePath: string, fileName: string = '', folderId: string = ''): Promise<SendFileElement> {
+  static async file(coreContext: NapCatCore, filePath: string, fileName: string = '', folderId: string = ''): Promise<SendFileElement> {
+    const NTQQGroupApi = coreContext.getApiContext().GroupApi;
+    const NTQQUserApi = coreContext.getApiContext().UserApi;
+    const NTQQFileApi = coreContext.getApiContext().FileApi;
+    const NTQQMsgApi = coreContext.getApiContext().MsgApi;
+    const NTQQFriendApi = coreContext.getApiContext().FriendApi;
+    const logger = coreContext.context.logger;
     const { md5, fileName: _fileName, path, fileSize } = await NTQQFileApi.uploadFile(filePath, ElementType.FILE);
     if (fileSize === 0) {
       throw '文件异常,大小为0';
@@ -122,7 +134,13 @@ export class SendMsgElementConstructor {
     return element;
   }
 
-  static async video(CoreContext: NapCatCore, filePath: string, fileName: string = '', diyThumbPath: string = '', videotype: viedo_type = viedo_type.VIDEO_FORMAT_MP4): Promise<SendVideoElement> {
+  static async video(coreContext: NapCatCore, filePath: string, fileName: string = '', diyThumbPath: string = '', videotype: viedo_type = viedo_type.VIDEO_FORMAT_MP4): Promise<SendVideoElement> {
+    const NTQQGroupApi = coreContext.getApiContext().GroupApi;
+    const NTQQUserApi = coreContext.getApiContext().UserApi;
+    const NTQQFileApi = coreContext.getApiContext().FileApi;
+    const NTQQMsgApi = coreContext.getApiContext().MsgApi;
+    const NTQQFriendApi = coreContext.getApiContext().FriendApi;
+    const logger = coreContext.context.logger;
     const { fileName: _fileName, path, fileSize, md5 } = await NTQQFileApi.uploadFile(filePath, ElementType.VIDEO);
     if (fileSize === 0) {
       throw '文件异常,大小为0';
@@ -138,10 +156,10 @@ export class SendMsgElementConstructor {
       filePath
     };
     try {
-      videoInfo = await getVideoInfo(path);
+      videoInfo = await getVideoInfo(path, logger);
       //logDebug('视频信息', videoInfo);
     } catch (e) {
-      logError('获取视频信息失败', e);
+      logger.logError('获取视频信息失败', e);
     }
     const createThumb = new Promise<string>((resolve, reject) => {
       const thumbFileName = `${md5}_0.png`;
@@ -150,7 +168,7 @@ export class SendMsgElementConstructor {
         .on('end', () => {
         })
         .on('error', (err) => {
-          logDebug('获取视频封面失败,使用默认封面', err);
+          logger.logDebug('获取视频封面失败,使用默认封面', err);
           if (diyThumbPath) {
             fs.copyFile(diyThumbPath, thumbPath).then(() => {
               resolve(thumbPath);
@@ -206,8 +224,14 @@ export class SendMsgElementConstructor {
     return element;
   }
 
-  static async ptt(CoreContext: NapCatCore, pttPath: string): Promise<SendPttElement> {
-    const { converted, path: silkPath, duration } = await encodeSilk(pttPath);
+  static async ptt(coreContext: NapCatCore, pttPath: string): Promise<SendPttElement> {
+    const NTQQGroupApi = coreContext.getApiContext().GroupApi;
+    const NTQQUserApi = coreContext.getApiContext().UserApi;
+    const NTQQFileApi = coreContext.getApiContext().FileApi;
+    const NTQQMsgApi = coreContext.getApiContext().MsgApi;
+    const NTQQFriendApi = coreContext.getApiContext().FriendApi;
+    const logger = coreContext.context.logger;
+    const { converted, path: silkPath, duration } = await encodeSilk(pttPath, coreContext.NapCatTempPath, coreContext.context.logger);
     // log("生成语音", silkPath, duration);
     if (!silkPath) {
       throw '语音转换失败, 请检查语音文件是否正常';