mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
fix: #538
This commit is contained in:
@@ -11,6 +11,9 @@
|
|||||||
<t-form-item label="启用本地文件到URL" name="enableLocalFile2Url" class="form-item">
|
<t-form-item label="启用本地文件到URL" name="enableLocalFile2Url" class="form-item">
|
||||||
<t-switch v-model="otherConfig.enableLocalFile2Url" />
|
<t-switch v-model="otherConfig.enableLocalFile2Url" />
|
||||||
</t-form-item>
|
</t-form-item>
|
||||||
|
<t-form-item label="启用上报解析合并消息" name="parseMultMsg" class="form-item">
|
||||||
|
<t-switch v-model="otherConfig.parseMultMsg" />
|
||||||
|
</t-form-item>
|
||||||
</t-form>
|
</t-form>
|
||||||
<div class="button-container">
|
<div class="button-container">
|
||||||
<t-button @click="saveConfig">保存</t-button>
|
<t-button @click="saveConfig">保存</t-button>
|
||||||
@@ -28,6 +31,7 @@ import { QQLoginManager } from '@/backend/shell';
|
|||||||
const otherConfig = ref<Partial<OneBotConfig>>({
|
const otherConfig = ref<Partial<OneBotConfig>>({
|
||||||
musicSignUrl: '',
|
musicSignUrl: '',
|
||||||
enableLocalFile2Url: false,
|
enableLocalFile2Url: false,
|
||||||
|
parseMultMsg: true
|
||||||
});
|
});
|
||||||
|
|
||||||
const getOB11Config = async (): Promise<OneBotConfig | undefined> => {
|
const getOB11Config = async (): Promise<OneBotConfig | undefined> => {
|
||||||
@@ -68,6 +72,7 @@ const saveConfig = async () => {
|
|||||||
if (userConfig) {
|
if (userConfig) {
|
||||||
userConfig.musicSignUrl = otherConfig.value.musicSignUrl || '';
|
userConfig.musicSignUrl = otherConfig.value.musicSignUrl || '';
|
||||||
userConfig.enableLocalFile2Url = otherConfig.value.enableLocalFile2Url ?? false;
|
userConfig.enableLocalFile2Url = otherConfig.value.enableLocalFile2Url ?? false;
|
||||||
|
userConfig.parseMultMsg = otherConfig.value.parseMultMsg ?? true;
|
||||||
const success = await setOB11Config(userConfig);
|
const success = await setOB11Config(userConfig);
|
||||||
if (success) {
|
if (success) {
|
||||||
MessagePlugin.success('配置保存成功');
|
MessagePlugin.success('配置保存成功');
|
||||||
|
@@ -19,7 +19,7 @@ import {
|
|||||||
FaceType,
|
FaceType,
|
||||||
} from '@/core';
|
} from '@/core';
|
||||||
import faceConfig from '@/core/external/face_config.json';
|
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 { OB11Construct } from '@/onebot/helper/data';
|
||||||
import { EventType } from '@/onebot/event/OneBotEvent';
|
import { EventType } from '@/onebot/event/OneBotEvent';
|
||||||
import { encodeCQCode } from '@/onebot/helper/cqcode';
|
import { encodeCQCode } from '@/onebot/helper/cqcode';
|
||||||
@@ -37,21 +37,26 @@ type RawToOb11Converters = {
|
|||||||
element: Exclude<MessageElement[Key], null | undefined>,
|
element: Exclude<MessageElement[Key], null | undefined>,
|
||||||
msg: RawMessage,
|
msg: RawMessage,
|
||||||
elementWrapper: MessageElement,
|
elementWrapper: MessageElement,
|
||||||
|
context: RecvMessageContext
|
||||||
) => PromiseLike<OB11MessageData | null>
|
) => PromiseLike<OB11MessageData | null>
|
||||||
}
|
}
|
||||||
|
|
||||||
type Ob11ToRawConverters = {
|
type Ob11ToRawConverters = {
|
||||||
[Key in OB11MessageDataType]: (
|
[Key in OB11MessageDataType]: (
|
||||||
sendMsg: Extract<OB11MessageData, { type: Key }>,
|
sendMsg: Extract<OB11MessageData, { type: Key }>,
|
||||||
context: MessageContext,
|
context: SendMessageContext,
|
||||||
) => Promise<SendMessageElement | undefined>
|
) => Promise<SendMessageElement | undefined>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type MessageContext = {
|
export type SendMessageContext = {
|
||||||
deleteAfterSentFiles: string[],
|
deleteAfterSentFiles: string[],
|
||||||
peer: Peer
|
peer: Peer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type RecvMessageContext = {
|
||||||
|
parseMultMsg: boolean
|
||||||
|
}
|
||||||
|
|
||||||
function keyCanBeParsed(key: string, parser: RawToOb11Converters): key is keyof RawToOb11Converters {
|
function keyCanBeParsed(key: string, parser: RawToOb11Converters): key is keyof RawToOb11Converters {
|
||||||
return key in parser;
|
return key in parser;
|
||||||
}
|
}
|
||||||
@@ -338,12 +343,7 @@ export class OneBotMsgApi {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
multiForwardMsgElement: async (_, msg) => {
|
multiForwardMsgElement: async (_, msg, wrapper, context) => {
|
||||||
// const message_data: OB11MessageForward = {
|
|
||||||
// data: {} as any,
|
|
||||||
// type: OB11MessageDataType.forward,
|
|
||||||
// };
|
|
||||||
// message_data.data.id = msg.msgId;
|
|
||||||
const parentMsgPeer = msg.parentMsgPeer ?? {
|
const parentMsgPeer = msg.parentMsgPeer ?? {
|
||||||
chatType: msg.chatType,
|
chatType: msg.chatType,
|
||||||
guildId: '',
|
guildId: '',
|
||||||
@@ -359,21 +359,23 @@ export class OneBotMsgApi {
|
|||||||
//拉取下级消息
|
//拉取下级消息
|
||||||
if (!multiMsgs) return null;
|
if (!multiMsgs) return null;
|
||||||
//拉取失败则跳过
|
//拉取失败则跳过
|
||||||
|
let ret = {
|
||||||
return {
|
|
||||||
type: OB11MessageDataType.forward,
|
type: OB11MessageDataType.forward,
|
||||||
data: {
|
data: {
|
||||||
id: msg.msgId,
|
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),
|
|
||||||
},
|
},
|
||||||
};
|
} 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) => {
|
arkElement: async (element) => {
|
||||||
@@ -695,15 +697,17 @@ export class OneBotMsgApi {
|
|||||||
async parseMessage(
|
async parseMessage(
|
||||||
msg: RawMessage,
|
msg: RawMessage,
|
||||||
messagePostFormat: string,
|
messagePostFormat: string,
|
||||||
|
parseMultMsg: boolean = true
|
||||||
) {
|
) {
|
||||||
if (messagePostFormat === 'string') {
|
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(
|
async parseMessageV2(
|
||||||
msg: RawMessage,
|
msg: RawMessage,
|
||||||
|
parseMultMsg: boolean = true
|
||||||
) {
|
) {
|
||||||
if (msg.senderUin == '0' || msg.senderUin == '') return;
|
if (msg.senderUin == '0' || msg.senderUin == '') return;
|
||||||
if (msg.peerUin == '0' || msg.peerUin == '') return;
|
if (msg.peerUin == '0' || msg.peerUin == '') return;
|
||||||
@@ -767,11 +771,15 @@ export class OneBotMsgApi {
|
|||||||
element: Exclude<MessageElement[keyof RawToOb11Converters], null | undefined>,
|
element: Exclude<MessageElement[keyof RawToOb11Converters], null | undefined>,
|
||||||
msg: RawMessage,
|
msg: RawMessage,
|
||||||
elementWrapper: MessageElement,
|
elementWrapper: MessageElement,
|
||||||
|
context: RecvMessageContext
|
||||||
) => PromiseLike<OB11MessageData | null>;
|
) => PromiseLike<OB11MessageData | null>;
|
||||||
const parsedElement = await converters?.(
|
const parsedElement = await converters?.(
|
||||||
element[key],
|
element[key],
|
||||||
msg,
|
msg,
|
||||||
element,
|
element,
|
||||||
|
{
|
||||||
|
parseMultMsg: parseMultMsg
|
||||||
|
}
|
||||||
);
|
);
|
||||||
// 对于 face 类型的消息,检查是否存在
|
// 对于 face 类型的消息,检查是否存在
|
||||||
if (key === 'faceElement' && !parsedElement) {
|
if (key === 'faceElement' && !parsedElement) {
|
||||||
@@ -819,7 +827,7 @@ export class OneBotMsgApi {
|
|||||||
}
|
}
|
||||||
const converter = this.ob11ToRawConverters[sendMsg.type] as (
|
const converter = this.ob11ToRawConverters[sendMsg.type] as (
|
||||||
sendMsg: Extract<OB11MessageData, { type: OB11MessageData['type'] }>,
|
sendMsg: Extract<OB11MessageData, { type: OB11MessageData['type'] }>,
|
||||||
context: MessageContext,
|
context: SendMessageContext,
|
||||||
) => Promise<SendMessageElement | undefined>;
|
) => Promise<SendMessageElement | undefined>;
|
||||||
const callResult = converter(
|
const callResult = converter(
|
||||||
sendMsg,
|
sendMsg,
|
||||||
@@ -878,7 +886,7 @@ export class OneBotMsgApi {
|
|||||||
|
|
||||||
private async handleOb11FileLikeMessage(
|
private async handleOb11FileLikeMessage(
|
||||||
{ data: inputdata }: OB11MessageFileBase,
|
{ data: inputdata }: OB11MessageFileBase,
|
||||||
{ deleteAfterSentFiles }: MessageContext,
|
{ deleteAfterSentFiles }: SendMessageContext,
|
||||||
) {
|
) {
|
||||||
const realUri = inputdata.url || inputdata.file || inputdata.path || '';
|
const realUri = inputdata.url || inputdata.file || inputdata.path || '';
|
||||||
if (realUri.length === 0) {
|
if (realUri.length === 0) {
|
||||||
|
@@ -103,6 +103,7 @@ export interface OneBotConfig {
|
|||||||
network: NetworkConfig; // 网络配置
|
network: NetworkConfig; // 网络配置
|
||||||
musicSignUrl: string; // 音乐签名地址
|
musicSignUrl: string; // 音乐签名地址
|
||||||
enableLocalFile2Url: boolean;
|
enableLocalFile2Url: boolean;
|
||||||
|
parseMultMsg: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const createDefaultConfig = <T>(config: T): T => config;
|
const createDefaultConfig = <T>(config: T): T => config;
|
||||||
@@ -116,6 +117,7 @@ export const defaultOneBotConfigs = createDefaultConfig<OneBotConfig>({
|
|||||||
},
|
},
|
||||||
musicSignUrl: '',
|
musicSignUrl: '',
|
||||||
enableLocalFile2Url: false,
|
enableLocalFile2Url: false,
|
||||||
|
parseMultMsg: true
|
||||||
});
|
});
|
||||||
|
|
||||||
export const mergeNetworkDefaultConfig = {
|
export const mergeNetworkDefaultConfig = {
|
||||||
@@ -149,9 +151,12 @@ export function mergeOneBotConfigs(
|
|||||||
if (userConfig.musicSignUrl !== undefined) {
|
if (userConfig.musicSignUrl !== undefined) {
|
||||||
mergedConfig.musicSignUrl = userConfig.musicSignUrl;
|
mergedConfig.musicSignUrl = userConfig.musicSignUrl;
|
||||||
}
|
}
|
||||||
if(userConfig.enableLocalFile2Url !== undefined) {
|
if (userConfig.enableLocalFile2Url !== undefined) {
|
||||||
mergedConfig.enableLocalFile2Url = userConfig.enableLocalFile2Url;
|
mergedConfig.enableLocalFile2Url = userConfig.enableLocalFile2Url;
|
||||||
}
|
}
|
||||||
|
if (userConfig.enableLocalFile2Url !== undefined) {
|
||||||
|
mergedConfig.enableLocalFile2Url = true;
|
||||||
|
}
|
||||||
return mergedConfig;
|
return mergedConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -551,7 +551,7 @@ export class NapCatOneBot11Adapter {
|
|||||||
}
|
}
|
||||||
private async handleMsg(message: RawMessage, network: Array<AdapterConfigWrap>) {
|
private async handleMsg(message: RawMessage, network: Array<AdapterConfigWrap>) {
|
||||||
try {
|
try {
|
||||||
const ob11Msg = await this.apis.MsgApi.parseMessageV2(message);
|
const ob11Msg = await this.apis.MsgApi.parseMessageV2(message, this.configLoader.configData.parseMultMsg);
|
||||||
if (ob11Msg) {
|
if (ob11Msg) {
|
||||||
const isSelfMsg = this.isSelfMessage(ob11Msg);
|
const isSelfMsg = this.isSelfMessage(ob11Msg);
|
||||||
this.context.logger.logDebug('转化为 OB11Message', ob11Msg);
|
this.context.logger.logDebug('转化为 OB11Message', ob11Msg);
|
||||||
|
@@ -236,7 +236,7 @@ export interface OB11MessageForward {
|
|||||||
type: OB11MessageDataType.forward;
|
type: OB11MessageDataType.forward;
|
||||||
data: {
|
data: {
|
||||||
id: string;
|
id: string;
|
||||||
content: OB11Message[];
|
content?: OB11Message[];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user