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'