From 3024316b5b36e425e0754bf83c0faea4e2b4dff2 Mon Sep 17 00:00:00 2001
From: linyuchen <lin.yu.chen@hotmail.com>
Date: Fri, 24 May 2024 08:11:38 +0800
Subject: [PATCH 1/3] feat: #232 /get_msg, /get_group_msg_history add raw
 message

---
 src/main/main.ts            | 32 ++++++++++++++++++--------------
 src/onebot11/constructor.ts |  8 ++++++--
 2 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/src/main/main.ts b/src/main/main.ts
index a167e39..0b4108d 100644
--- a/src/main/main.ts
+++ b/src/main/main.ts
@@ -142,7 +142,8 @@ function onLoad() {
             .catch((e) => {
               log('保存设置失败', e.stack)
             })
-        } else {
+        }
+        else {
         }
       })
       .catch((err) => {
@@ -169,12 +170,8 @@ function onLoad() {
 
       OB11Constructor.message(message)
         .then((msg) => {
-          if (debug) {
-            msg.raw = message
-          } else {
-            if (msg.message.length === 0) {
-              return
-            }
+          if (!debug && msg.message.length === 0) {
+            return
           }
           const isSelfMsg = msg.user_id.toString() == selfInfo.uin
           if (isSelfMsg && !reportSelfMessage) {
@@ -210,7 +207,8 @@ function onLoad() {
         let pokeEvent: OB11FriendPokeEvent | OB11GroupPokeEvent
         if (isGroup) {
           pokeEvent = new OB11GroupPokeEvent(parseInt(id))
-        } else {
+        }
+        else {
           pokeEvent = new OB11FriendPokeEvent(parseInt(id))
         }
         postOb11Event(pokeEvent)
@@ -323,10 +321,12 @@ function onLoad() {
                   : 'set'
                 // member1.role = notify.type == GroupNotifyTypes.ADMIN_SET ? GroupMemberRole.admin : GroupMemberRole.normal;
                 postOb11Event(groupAdminNoticeEvent, true)
-              } else {
+              }
+              else {
                 log('获取群通知的成员信息失败', notify, getGroup(notify.group.groupCode))
               }
-            } else if (notify.type == GroupNotifyTypes.MEMBER_EXIT || notify.type == GroupNotifyTypes.KICK_MEMBER) {
+            }
+            else if (notify.type == GroupNotifyTypes.MEMBER_EXIT || notify.type == GroupNotifyTypes.KICK_MEMBER) {
               log('有成员退出通知', notify)
               try {
                 const member1 = await NTQQUserApi.getUserDetailInfo(notify.user1.uid)
@@ -348,7 +348,8 @@ function onLoad() {
               } catch (e) {
                 log('获取群通知的成员信息失败', notify, e.stack.toString())
               }
-            } else if ([GroupNotifyTypes.JOIN_REQUEST].includes(notify.type)) {
+            }
+            else if ([GroupNotifyTypes.JOIN_REQUEST].includes(notify.type)) {
               log('有加群请求')
               let groupRequestEvent = new OB11GroupRequestEvent()
               groupRequestEvent.group_id = parseInt(notify.group.groupCode)
@@ -363,7 +364,8 @@ function onLoad() {
               groupRequestEvent.comment = notify.postscript
               groupRequestEvent.flag = notify.seq
               postOb11Event(groupRequestEvent)
-            } else if (notify.type == GroupNotifyTypes.INVITE_ME) {
+            }
+            else if (notify.type == GroupNotifyTypes.INVITE_ME) {
               log('收到邀请我加群通知')
               let groupInviteEvent = new OB11GroupRequestEvent()
               groupInviteEvent.group_id = parseInt(notify.group.groupCode)
@@ -380,7 +382,8 @@ function onLoad() {
             log('解析群通知失败', e.stack.toString())
           }
         }
-      } else if (payload.doubt) {
+      }
+      else if (payload.doubt) {
         // 可能有群管理员变动
       }
     })
@@ -473,7 +476,8 @@ function onLoad() {
 
       getUserNick().then()
       start().then()
-    } else {
+    }
+    else {
       setTimeout(init, 1000)
     }
   }
diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts
index aff880d..2d32c1f 100644
--- a/src/onebot11/constructor.ts
+++ b/src/onebot11/constructor.ts
@@ -55,10 +55,11 @@ export class OB11Constructor {
     let config = getConfigUtil().getConfig()
     const {
       enableLocalFile2Url,
+      debug,
       ob11: { messagePostFormat },
     } = config
     const message_type = msg.chatType == ChatType.group ? 'group' : 'private'
-    const resMsg: OB11Message = {
+    let resMsg: OB11Message = {
       self_id: parseInt(selfInfo.uin),
       user_id: parseInt(msg.senderUin),
       time: parseInt(msg.msgTime) || Date.now(),
@@ -78,8 +79,11 @@ export class OB11Constructor {
       message_format: messagePostFormat === 'string' ? 'string' : 'array',
       post_type: selfInfo.uin == msg.senderUin ? EventType.MESSAGE_SENT : EventType.MESSAGE,
     }
+    if (debug){
+      resMsg.raw = msg
+    }
     if (msg.chatType == ChatType.group) {
-      resMsg.sub_type = 'normal' // 这里go-cqhttp是group,而onebot11标准是normal, 蛋疼
+      resMsg.sub_type = 'normal'
       resMsg.group_id = parseInt(msg.peerUin)
       const member = await getGroupMember(msg.peerUin, msg.senderUin)
       if (member) {

From 1765ffff7b4f30aeab08210b208e4093663b6dd6 Mon Sep 17 00:00:00 2001
From: linyuchen <lin.yu.chen@hotmail.com>
Date: Fri, 24 May 2024 08:15:08 +0800
Subject: [PATCH 2/3] style: format

---
 src/onebot11/constructor.ts | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts
index 2d32c1f..e179f01 100644
--- a/src/onebot11/constructor.ts
+++ b/src/onebot11/constructor.ts
@@ -59,7 +59,7 @@ export class OB11Constructor {
       ob11: { messagePostFormat },
     } = config
     const message_type = msg.chatType == ChatType.group ? 'group' : 'private'
-    let resMsg: OB11Message = {
+    const resMsg: OB11Message = {
       self_id: parseInt(selfInfo.uin),
       user_id: parseInt(msg.senderUin),
       time: parseInt(msg.msgTime) || Date.now(),
@@ -79,7 +79,7 @@ export class OB11Constructor {
       message_format: messagePostFormat === 'string' ? 'string' : 'array',
       post_type: selfInfo.uin == msg.senderUin ? EventType.MESSAGE_SENT : EventType.MESSAGE,
     }
-    if (debug){
+    if (debug) {
       resMsg.raw = msg
     }
     if (msg.chatType == ChatType.group) {
@@ -159,16 +159,16 @@ export class OB11Constructor {
       else if (element.picElement) {
         message_data['type'] = 'image'
         // message_data["data"]["file"] = element.picElement.sourcePath
-        let fileName = element.picElement.fileName;
-        const sourcePath = element.picElement.sourcePath;
-        if (element.picElement.picType === PicType.gif && !fileName.endsWith('.gif')){
-          fileName += ".gif";
+        let fileName = element.picElement.fileName
+        const sourcePath = element.picElement.sourcePath
+        if (element.picElement.picType === PicType.gif && !fileName.endsWith('.gif')) {
+          fileName += '.gif'
         }
         message_data['data']['file'] = fileName
         // message_data["data"]["path"] = element.picElement.sourcePath
         // let currentRKey = "CAQSKAB6JWENi5LMk0kc62l8Pm3Jn1dsLZHyRLAnNmHGoZ3y_gDZPqZt-64"
 
-        message_data['data']['url'] = await NTQQFileApi.getImageUrl(element.picElement, msg.chatType);
+        message_data['data']['url'] = await NTQQFileApi.getImageUrl(element.picElement, msg.chatType)
         // message_data["data"]["file_id"] = element.picElement.fileUuid
         message_data['data']['file_size'] = element.picElement.fileSize
         dbUtil

From 92b49015b07ff9c3f575eecc241d11dc2a8d0d17 Mon Sep 17 00:00:00 2001
From: linyuchen <lin.yu.chen@hotmail.com>
Date: Fri, 24 May 2024 08:36:42 +0800
Subject: [PATCH 3/3] feat: Forward single msg return message_id

---
 src/ntqqapi/api/msg.ts                      | 103 ++++++++++----------
 src/onebot11/action/msg/ForwardSingleMsg.ts |  13 ++-
 2 files changed, 63 insertions(+), 53 deletions(-)

diff --git a/src/ntqqapi/api/msg.ts b/src/ntqqapi/api/msg.ts
index 0daa919..0b9f76b 100644
--- a/src/ntqqapi/api/msg.ts
+++ b/src/ntqqapi/api/msg.ts
@@ -15,6 +15,54 @@ export interface Peer {
   guildId?: ''
 }
 
+async function sendWaiter(peer: Peer, waitComplete = true, timeout: number = 10000) {
+  // 等待上一个相同的peer发送完
+  const peerUid = peer.peerUid
+  let checkLastSendUsingTime = 0
+  const waitLastSend = async () => {
+    if (checkLastSendUsingTime > timeout) {
+      throw '发送超时'
+    }
+    let lastSending = sendMessagePool[peer.peerUid]
+    if (lastSending) {
+      // log("有正在发送的消息,等待中...")
+      await sleep(500)
+      checkLastSendUsingTime += 500
+      return await waitLastSend()
+    } else {
+      return
+    }
+  }
+  await waitLastSend()
+
+  let sentMessage: RawMessage = null
+  sendMessagePool[peerUid] = async (rawMessage: RawMessage) => {
+    delete sendMessagePool[peerUid]
+    sentMessage = rawMessage
+  }
+
+  let checkSendCompleteUsingTime = 0
+  const checkSendComplete = async (): Promise<RawMessage> => {
+    if (sentMessage) {
+      if (waitComplete) {
+        if ((await dbUtil.getMsgByLongId(sentMessage.msgId)).sendStatus == 2) {
+          return sentMessage
+        }
+      } else {
+        return sentMessage
+      }
+      // log(`给${peerUid}发送消息成功`)
+    }
+    checkSendCompleteUsingTime += 500
+    if (checkSendCompleteUsingTime > timeout) {
+      throw '发送超时'
+    }
+    await sleep(500)
+    return await checkSendComplete()
+  }
+  return checkSendComplete();
+}
+
 export class NTQQMsgApi {
   static async setEmojiLike(peer: Peer, msgSeq: string, emojiId: string, set: boolean = true) {
     // nt_qq//global//nt_data//Emoji//emoji-resource//sysface_res/apng/ 下可以看到所有QQ表情预览
@@ -116,52 +164,7 @@ export class NTQQMsgApi {
   }
 
   static async sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000) {
-    const peerUid = peer.peerUid
-
-    // 等待上一个相同的peer发送完
-    let checkLastSendUsingTime = 0
-    const waitLastSend = async () => {
-      if (checkLastSendUsingTime > timeout) {
-        throw '发送超时'
-      }
-      let lastSending = sendMessagePool[peer.peerUid]
-      if (lastSending) {
-        // log("有正在发送的消息,等待中...")
-        await sleep(500)
-        checkLastSendUsingTime += 500
-        return await waitLastSend()
-      } else {
-        return
-      }
-    }
-    await waitLastSend()
-
-    let sentMessage: RawMessage = null
-    sendMessagePool[peerUid] = async (rawMessage: RawMessage) => {
-      delete sendMessagePool[peerUid]
-      sentMessage = rawMessage
-    }
-
-    let checkSendCompleteUsingTime = 0
-    const checkSendComplete = async (): Promise<RawMessage> => {
-      if (sentMessage) {
-        if (waitComplete) {
-          if ((await dbUtil.getMsgByLongId(sentMessage.msgId)).sendStatus == 2) {
-            return sentMessage
-          }
-        } else {
-          return sentMessage
-        }
-        // log(`给${peerUid}发送消息成功`)
-      }
-      checkSendCompleteUsingTime += 500
-      if (checkSendCompleteUsingTime > timeout) {
-        throw '发送超时'
-      }
-      await sleep(500)
-      return await checkSendComplete()
-    }
-
+    const waiter = sendWaiter(peer, waitComplete, timeout);
     callNTQQApi({
       methodName: NTQQApiMethod.SEND_MSG,
       args: [
@@ -174,11 +177,12 @@ export class NTQQMsgApi {
         null,
       ],
     }).then()
-    return await checkSendComplete()
+    return await waiter;
   }
 
   static async forwardMsg(srcPeer: Peer, destPeer: Peer, msgIds: string[]) {
-    return await callNTQQApi<GeneralCallResult>({
+    const waiter = sendWaiter(destPeer, true, 10000);
+    callNTQQApi<GeneralCallResult>({
       methodName: NTQQApiMethod.FORWARD_MSG,
       args: [
         {
@@ -190,7 +194,8 @@ export class NTQQMsgApi {
         },
         null,
       ],
-    })
+    }).then().catch(log)
+    return await waiter;
   }
 
   static async multiForwardMsg(srcPeer: Peer, destPeer: Peer, msgIds: string[]) {
diff --git a/src/onebot11/action/msg/ForwardSingleMsg.ts b/src/onebot11/action/msg/ForwardSingleMsg.ts
index b08a093..d3d5d6a 100644
--- a/src/onebot11/action/msg/ForwardSingleMsg.ts
+++ b/src/onebot11/action/msg/ForwardSingleMsg.ts
@@ -11,7 +11,11 @@ interface Payload {
   user_id?: number
 }
 
-class ForwardSingleMsg extends BaseAction<Payload, null> {
+interface Response {
+  message_id: number
+}
+
+class ForwardSingleMsg extends BaseAction<Payload, Response> {
   protected async getTargetPeer(payload: Payload): Promise<Peer> {
     if (payload.user_id) {
       return { chatType: ChatType.friend, peerUid: getUidByUin(payload.user_id.toString()) }
@@ -19,10 +23,10 @@ class ForwardSingleMsg extends BaseAction<Payload, null> {
     return { chatType: ChatType.group, peerUid: payload.group_id.toString() }
   }
 
-  protected async _handle(payload: Payload): Promise<null> {
+  protected async _handle(payload: Payload): Promise<Response> {
     const msg = await dbUtil.getMsgByShortId(payload.message_id)
     const peer = await this.getTargetPeer(payload)
-    await NTQQMsgApi.forwardMsg(
+    const sentMsg = await NTQQMsgApi.forwardMsg(
       {
         chatType: msg.chatType,
         peerUid: msg.peerUid,
@@ -30,7 +34,8 @@ class ForwardSingleMsg extends BaseAction<Payload, null> {
       peer,
       [msg.msgId],
     )
-    return null
+    const ob11MsgId = await dbUtil.addMsg(sentMsg)
+    return {message_id: ob11MsgId}
   }
 }