mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-02-06 13:05:09 +00:00
fix: #538
This commit is contained in:
@@ -19,7 +19,7 @@ import {
|
||||
FaceType,
|
||||
} from '@/core';
|
||||
import faceConfig from '@/core/external/face_config.json';
|
||||
import { NapCatOneBot11Adapter, OB11Message, OB11MessageData, OB11MessageDataType, OB11MessageFileBase, } from '@/onebot';
|
||||
import { NapCatOneBot11Adapter, OB11Message, OB11MessageData, OB11MessageDataType, OB11MessageFileBase, OB11MessageForward, } from '@/onebot';
|
||||
import { OB11Construct } from '@/onebot/helper/data';
|
||||
import { EventType } from '@/onebot/event/OneBotEvent';
|
||||
import { encodeCQCode } from '@/onebot/helper/cqcode';
|
||||
@@ -37,21 +37,26 @@ type RawToOb11Converters = {
|
||||
element: Exclude<MessageElement[Key], null | undefined>,
|
||||
msg: RawMessage,
|
||||
elementWrapper: MessageElement,
|
||||
context: RecvMessageContext
|
||||
) => PromiseLike<OB11MessageData | null>
|
||||
}
|
||||
|
||||
type Ob11ToRawConverters = {
|
||||
[Key in OB11MessageDataType]: (
|
||||
sendMsg: Extract<OB11MessageData, { type: Key }>,
|
||||
context: MessageContext,
|
||||
context: SendMessageContext,
|
||||
) => Promise<SendMessageElement | undefined>
|
||||
}
|
||||
|
||||
export type MessageContext = {
|
||||
export type SendMessageContext = {
|
||||
deleteAfterSentFiles: string[],
|
||||
peer: Peer
|
||||
}
|
||||
|
||||
export type RecvMessageContext = {
|
||||
parseMultMsg: boolean
|
||||
}
|
||||
|
||||
function keyCanBeParsed(key: string, parser: RawToOb11Converters): key is keyof RawToOb11Converters {
|
||||
return key in parser;
|
||||
}
|
||||
@@ -338,12 +343,7 @@ export class OneBotMsgApi {
|
||||
};
|
||||
},
|
||||
|
||||
multiForwardMsgElement: async (_, msg) => {
|
||||
// const message_data: OB11MessageForward = {
|
||||
// data: {} as any,
|
||||
// type: OB11MessageDataType.forward,
|
||||
// };
|
||||
// message_data.data.id = msg.msgId;
|
||||
multiForwardMsgElement: async (_, msg, wrapper, context) => {
|
||||
const parentMsgPeer = msg.parentMsgPeer ?? {
|
||||
chatType: msg.chatType,
|
||||
guildId: '',
|
||||
@@ -359,21 +359,23 @@ export class OneBotMsgApi {
|
||||
//拉取下级消息
|
||||
if (!multiMsgs) return null;
|
||||
//拉取失败则跳过
|
||||
|
||||
return {
|
||||
let ret = {
|
||||
type: OB11MessageDataType.forward,
|
||||
data: {
|
||||
id: msg.msgId,
|
||||
content: (await Promise.all(multiMsgs.map(
|
||||
async multiMsgItem => {
|
||||
multiMsgItem.parentMsgPeer = parentMsgPeer;
|
||||
multiMsgItem.parentMsgIdList = msg.parentMsgIdList;
|
||||
multiMsgItem.id = MessageUnique.createUniqueMsgId(parentMsgPeer, multiMsgItem.msgId); //该ID仅用查看 无法调用
|
||||
return await this.parseMessage(multiMsgItem, 'array');
|
||||
},
|
||||
))).filter(item => item !== undefined),
|
||||
id: msg.msgId
|
||||
},
|
||||
};
|
||||
} as OB11MessageForward;
|
||||
if (context.parseMultMsg) {
|
||||
ret.data.content = (await Promise.all(multiMsgs.map(
|
||||
async multiMsgItem => {
|
||||
multiMsgItem.parentMsgPeer = parentMsgPeer;
|
||||
multiMsgItem.parentMsgIdList = msg.parentMsgIdList;
|
||||
multiMsgItem.id = MessageUnique.createUniqueMsgId(parentMsgPeer, multiMsgItem.msgId); //该ID仅用查看 无法调用
|
||||
return await this.parseMessage(multiMsgItem, 'array', context.parseMultMsg);
|
||||
},
|
||||
))).filter(item => item !== undefined)
|
||||
}
|
||||
return ret;
|
||||
},
|
||||
|
||||
arkElement: async (element) => {
|
||||
@@ -695,15 +697,17 @@ export class OneBotMsgApi {
|
||||
async parseMessage(
|
||||
msg: RawMessage,
|
||||
messagePostFormat: string,
|
||||
parseMultMsg: boolean = true
|
||||
) {
|
||||
if (messagePostFormat === 'string') {
|
||||
return (await this.parseMessageV2(msg))?.stringMsg;
|
||||
return (await this.parseMessageV2(msg, parseMultMsg))?.stringMsg;
|
||||
}
|
||||
return (await this.parseMessageV2(msg))?.arrayMsg;
|
||||
return (await this.parseMessageV2(msg, parseMultMsg))?.arrayMsg;
|
||||
}
|
||||
|
||||
async parseMessageV2(
|
||||
msg: RawMessage,
|
||||
parseMultMsg: boolean = true
|
||||
) {
|
||||
if (msg.senderUin == '0' || msg.senderUin == '') return;
|
||||
if (msg.peerUin == '0' || msg.peerUin == '') return;
|
||||
@@ -767,11 +771,15 @@ export class OneBotMsgApi {
|
||||
element: Exclude<MessageElement[keyof RawToOb11Converters], null | undefined>,
|
||||
msg: RawMessage,
|
||||
elementWrapper: MessageElement,
|
||||
context: RecvMessageContext
|
||||
) => PromiseLike<OB11MessageData | null>;
|
||||
const parsedElement = await converters?.(
|
||||
element[key],
|
||||
msg,
|
||||
element,
|
||||
{
|
||||
parseMultMsg: parseMultMsg
|
||||
}
|
||||
);
|
||||
// 对于 face 类型的消息,检查是否存在
|
||||
if (key === 'faceElement' && !parsedElement) {
|
||||
@@ -819,7 +827,7 @@ export class OneBotMsgApi {
|
||||
}
|
||||
const converter = this.ob11ToRawConverters[sendMsg.type] as (
|
||||
sendMsg: Extract<OB11MessageData, { type: OB11MessageData['type'] }>,
|
||||
context: MessageContext,
|
||||
context: SendMessageContext,
|
||||
) => Promise<SendMessageElement | undefined>;
|
||||
const callResult = converter(
|
||||
sendMsg,
|
||||
@@ -878,7 +886,7 @@ export class OneBotMsgApi {
|
||||
|
||||
private async handleOb11FileLikeMessage(
|
||||
{ data: inputdata }: OB11MessageFileBase,
|
||||
{ deleteAfterSentFiles }: MessageContext,
|
||||
{ deleteAfterSentFiles }: SendMessageContext,
|
||||
) {
|
||||
const realUri = inputdata.url || inputdata.file || inputdata.path || '';
|
||||
if (realUri.length === 0) {
|
||||
|
||||
Reference in New Issue
Block a user