From 71aedca4c65f4240537a48111f5c287249b469c8 Mon Sep 17 00:00:00 2001
From: idranme <96647698+idranme@users.noreply.github.com>
Date: Fri, 2 Aug 2024 10:23:48 +0000
Subject: [PATCH 1/4] feat: the name attribute of the at message segment

---
 src/onebot11/constructor.ts | 39 +++++++++++++++++++++++--------------
 src/onebot11/cqcode.ts      | 10 +++++-----
 src/onebot11/types.ts       | 17 ++++++++++++++++
 3 files changed, 46 insertions(+), 20 deletions(-)

diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts
index addc4fb..544f657 100644
--- a/src/onebot11/constructor.ts
+++ b/src/onebot11/constructor.ts
@@ -109,33 +109,42 @@ export class OB11Constructor {
     }
 
     for (let element of msg.elements) {
-      let message_data: OB11MessageData | any = {
-        data: {},
-        type: 'unknown',
+      let message_data: OB11MessageData = {
+        data: {} as any,
+        type: 'unknown' as any,
       }
       if (element.textElement && element.textElement?.atType !== AtType.notAt) {
-        message_data['type'] = OB11MessageDataType.at
+        let qq: string
+        let name: string | undefined
         if (element.textElement.atType == AtType.atAll) {
           // message_data["data"]["mention"] = "all"
-          message_data['data']['qq'] = 'all'
+          qq = 'all'
         }
         else {
-          let atUid = element.textElement.atNtUid
+          const { atNtUid, content } = element.textElement
           let atQQ = element.textElement.atUid
           if (!atQQ || atQQ === '0') {
-            const atMember = await getGroupMember(msg.peerUin, atUid)
+            const atMember = await getGroupMember(msg.peerUin, atNtUid)
             if (atMember) {
               atQQ = atMember.uin
             }
           }
           if (atQQ) {
             // message_data["data"]["mention"] = atQQ
-            message_data['data']['qq'] = atQQ
+            qq = atQQ
+            name = content.replace('@', '')
+          }
+        }
+        message_data = {
+          type: OB11MessageDataType.at,
+          data: {
+            qq,
+            name
           }
         }
       }
       else if (element.textElement) {
-        message_data['type'] = 'text'
+        message_data['type'] = OB11MessageDataType.text
         let text = element.textElement.content
         if (!text.trim()) {
           continue
@@ -143,7 +152,7 @@ export class OB11Constructor {
         message_data['data']['text'] = text
       }
       else if (element.replyElement) {
-        message_data['type'] = 'reply'
+        message_data['type'] = OB11MessageDataType.reply
         // log("收到回复消息", element.replyElement.replayMsgSeq)
         try {
           const replyMsg = await dbUtil.getMsgBySeqId(element.replyElement.replayMsgSeq)
@@ -159,7 +168,7 @@ export class OB11Constructor {
         }
       }
       else if (element.picElement) {
-        message_data['type'] = 'image'
+        message_data['type'] = OB11MessageDataType.image
         // message_data["data"]["file"] = element.picElement.sourcePath
         let fileName = element.picElement.fileName
         const sourcePath = element.picElement.sourcePath
@@ -204,9 +213,9 @@ export class OB11Constructor {
         message_data['data']['file_size'] = videoOrFileElement.fileSize
         if (element.videoElement) {
           message_data['data']['url'] = await NTQQFileApi.getVideoUrl({
-              chatType: msg.chatType,
-              peerUid: msg.peerUid,
-            }, msg.msgId, element.elementId,
+            chatType: msg.chatType,
+            peerUid: msg.peerUid,
+          }, msg.msgId, element.elementId,
           )
         }
         dbUtil
@@ -296,7 +305,7 @@ export class OB11Constructor {
         message_data['type'] = OB11MessageDataType.forward
         message_data['data']['id'] = msg.msgId
       }
-      if (message_data.type !== 'unknown' && message_data.data) {
+      if ((message_data.type as string) !== 'unknown' && message_data.data) {
         const cqCode = encodeCQCode(message_data)
         if (messagePostFormat === 'string') {
           (resMsg.message as string) += cqCode
diff --git a/src/onebot11/cqcode.ts b/src/onebot11/cqcode.ts
index 6b61160..3e9bfc5 100644
--- a/src/onebot11/cqcode.ts
+++ b/src/onebot11/cqcode.ts
@@ -61,15 +61,15 @@ export function encodeCQCode(data: OB11MessageData) {
   let result = '[CQ:' + data.type
   for (const name in data.data) {
     const value = data.data[name]
+    if (value === undefined) {
+      continue
+    }
     try {
-      // Check if the value can be converted to a string
-      value.toString();
+      result += `,${name}=${CQCodeEscape(value)}`
     } catch (error) {
       // If it can't be converted, skip this name-value pair
-      // console.warn(`Skipping problematic name-value pair. Name: ${name}, Value: ${value}`);
-      continue;
+      continue
     }
-    result += `,${name}=${CQCodeEscape(value)}`
   }
   result += ']'
   return result
diff --git a/src/onebot11/types.ts b/src/onebot11/types.ts
index de9c2ed..90a9f3c 100644
--- a/src/onebot11/types.ts
+++ b/src/onebot11/types.ts
@@ -195,6 +195,7 @@ export interface OB11MessageAt {
   type: OB11MessageDataType.at
   data: {
     qq: string | 'all'
+    name?: string
   }
 }
 
@@ -241,6 +242,20 @@ export interface OB11MessageJson {
   data: { data: string /* , config: { token: string } */ }
 }
 
+export interface OB11MessageMarkdown {
+  type: OB11MessageDataType.markdown
+  data: {
+    data: string
+  }
+}
+
+export interface OB11MessageForward {
+  type: OB11MessageDataType.forward
+  data: {
+    id: string
+  }
+}
+
 export type OB11MessageData =
   | OB11MessageText
   | OB11MessageFace
@@ -258,6 +273,8 @@ export type OB11MessageData =
   | OB11MessagePoke
   | OB11MessageDice
   | OB11MessageRPS
+  | OB11MessageMarkdown
+  | OB11MessageForward
 
 export interface OB11PostSendMsg {
   message_type?: 'private' | 'group'

From 6e8389e833ded6e2d5c5a549981dbfc6aaf8b345 Mon Sep 17 00:00:00 2001
From: idranme <96647698+idranme@users.noreply.github.com>
Date: Fri, 2 Aug 2024 10:26:18 +0000
Subject: [PATCH 2/4] chore

---
 src/onebot11/constructor.ts | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts
index 544f657..59f2c93 100644
--- a/src/onebot11/constructor.ts
+++ b/src/onebot11/constructor.ts
@@ -117,7 +117,6 @@ export class OB11Constructor {
         let qq: string
         let name: string | undefined
         if (element.textElement.atType == AtType.atAll) {
-          // message_data["data"]["mention"] = "all"
           qq = 'all'
         }
         else {
@@ -130,7 +129,6 @@ export class OB11Constructor {
             }
           }
           if (atQQ) {
-            // message_data["data"]["mention"] = atQQ
             qq = atQQ
             name = content.replace('@', '')
           }

From 3f5ca8ebfab58d3585c4516a5156e1a73e73f073 Mon Sep 17 00:00:00 2001
From: idranme <96647698+idranme@users.noreply.github.com>
Date: Fri, 2 Aug 2024 10:31:37 +0000
Subject: [PATCH 3/4] chore

---
 src/onebot11/cqcode.ts | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/onebot11/cqcode.ts b/src/onebot11/cqcode.ts
index 3e9bfc5..1cfdd04 100644
--- a/src/onebot11/cqcode.ts
+++ b/src/onebot11/cqcode.ts
@@ -68,7 +68,6 @@ export function encodeCQCode(data: OB11MessageData) {
       result += `,${name}=${CQCodeEscape(value)}`
     } catch (error) {
       // If it can't be converted, skip this name-value pair
-      continue
     }
   }
   result += ']'

From 406e3c7e6b0c1b8555727b4f2598156d89aee076 Mon Sep 17 00:00:00 2001
From: idranme <96647698+idranme@users.noreply.github.com>
Date: Fri, 2 Aug 2024 10:49:30 +0000
Subject: [PATCH 4/4] opt

---
 src/onebot11/cqcode.ts | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/onebot11/cqcode.ts b/src/onebot11/cqcode.ts
index 1cfdd04..6ffcddb 100644
--- a/src/onebot11/cqcode.ts
+++ b/src/onebot11/cqcode.ts
@@ -50,7 +50,6 @@ export function encodeCQCode(data: OB11MessageData) {
   }
 
   const CQCodeEscape = (text: string) => {
-    text = text.toString()
     return text.replace(/\&/g, '&amp;').replace(/\[/g, '&#91;').replace(/\]/g, '&#93;').replace(/,/g, '&#44;')
   }
 
@@ -65,7 +64,8 @@ export function encodeCQCode(data: OB11MessageData) {
       continue
     }
     try {
-      result += `,${name}=${CQCodeEscape(value)}`
+      const text = value.toString()
+      result += `,${name}=${CQCodeEscape(text)}`
     } catch (error) {
       // If it can't be converted, skip this name-value pair
     }