refactor: make parseMessage an instance method

This commit is contained in:
Seijo Cecilia
2024-08-25 10:12:36 +08:00
parent 684a702638
commit 106fbaf086
9 changed files with 158 additions and 174 deletions

View File

@@ -1,10 +1,8 @@
import BaseAction from '../BaseAction'; import BaseAction from '../BaseAction';
import { OB11ForwardMessage, OB11Message, OB11MessageData } from '../../types'; import { OB11ForwardMessage, OB11Message, OB11MessageData } from '@/onebot';
import { OB11Constructor } from '@/onebot/helper/converter';
import { ActionName } from '../types'; import { ActionName } from '../types';
import { FromSchema, JSONSchema } from 'json-schema-to-ts'; import { FromSchema, JSONSchema } from 'json-schema-to-ts';
import { MessageUnique } from '@/common/utils/MessageUnique'; import { MessageUnique } from '@/common/utils/MessageUnique';
import { RawNTMsg2Onebot } from '@/onebot/helper';
const SchemaData = { const SchemaData = {
type: 'object', type: 'object',
@@ -41,7 +39,8 @@ export class GoCQHTTPGetForwardMsgAction extends BaseAction<Payload, any> {
} }
const msgList = data.msgList; const msgList = data.msgList;
const messages = (await Promise.all(msgList.map(async msg => { const messages = (await Promise.all(msgList.map(async msg => {
const resMsg = await RawNTMsg2Onebot(this.CoreContext, this.OneBotContext, msg); const resMsg = await this.OneBotContext.apiContext.MsgApi
.parseMessage(msg);
if (!resMsg) return; if (!resMsg) return;
resMsg.message_id = MessageUnique.createMsg({ resMsg.message_id = MessageUnique.createMsg({
guildId: '', guildId: '',

View File

@@ -1,11 +1,9 @@
import BaseAction from '../BaseAction'; import BaseAction from '../BaseAction';
import { OB11Message } from '../../types'; import { OB11Message } from '@/onebot';
import { ActionName } from '../types'; import { ActionName } from '../types';
import { ChatType, RawMessage } from '@/core/entities'; import { ChatType, RawMessage } from '@/core/entities';
import { OB11Constructor } from '@/onebot/helper/converter';
import { FromSchema, JSONSchema } from 'json-schema-to-ts'; import { FromSchema, JSONSchema } from 'json-schema-to-ts';
import { MessageUnique } from '@/common/utils/MessageUnique'; import { MessageUnique } from '@/common/utils/MessageUnique';
import { RawNTMsg2Onebot } from '@/onebot/helper';
interface Response { interface Response {
messages: OB11Message[]; messages: OB11Message[];
@@ -54,7 +52,9 @@ export default class GetFriendMsgHistory extends BaseAction<Payload, Response> {
msg.id = MessageUnique.createMsg({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId); msg.id = MessageUnique.createMsg({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId);
})); }));
//转换消息 //转换消息
const ob11MsgList = (await Promise.all(msgList.map(msg => RawNTMsg2Onebot(this.CoreContext, this.OneBotContext, msg)))).filter(msg => !!msg); const ob11MsgList = (await Promise.all(
msgList.map(msg => this.OneBotContext.apiContext.MsgApi.parseMessage(msg)))
).filter(msg => msg !== undefined);
return { 'messages': ob11MsgList }; return { 'messages': ob11MsgList };
} }
} }

View File

@@ -1,11 +1,9 @@
import BaseAction from '../BaseAction'; import BaseAction from '../BaseAction';
import { OB11Message } from '../../types'; import { OB11Message } from '@/onebot';
import { ActionName } from '../types'; import { ActionName } from '../types';
import { ChatType, Peer, RawMessage } from '@/core/entities'; import { ChatType, Peer, RawMessage } from '@/core/entities';
import { OB11Constructor } from '@/onebot/helper/converter';
import { FromSchema, JSONSchema } from 'json-schema-to-ts'; import { FromSchema, JSONSchema } from 'json-schema-to-ts';
import { MessageUnique } from '@/common/utils/MessageUnique'; import { MessageUnique } from '@/common/utils/MessageUnique';
import { RawNTMsg2Onebot } from '@/onebot/helper';
interface Response { interface Response {
messages: OB11Message[]; messages: OB11Message[];
@@ -49,7 +47,9 @@ export default class GoCQHTTPGetGroupMsgHistory extends BaseAction<Payload, Resp
})); }));
//转换消息 //转换消息
const ob11MsgList = (await Promise.all(msgList.map(msg => RawNTMsg2Onebot(this.CoreContext, this.OneBotContext, msg)))).filter(msg => !!msg); const ob11MsgList = (await Promise.all(
msgList.map(msg => this.OneBotContext.apiContext.MsgApi.parseMessage(msg)))
).filter(msg => msg !== undefined);
return { 'messages': ob11MsgList }; return { 'messages': ob11MsgList };
} }
} }

View File

@@ -1,10 +1,8 @@
import { OB11Message } from '../../types'; import { OB11Message } from '@/onebot';
import { OB11Constructor } from '@/onebot/helper/converter';
import BaseAction from '../BaseAction'; import BaseAction from '../BaseAction';
import { ActionName } from '../types'; import { ActionName } from '../types';
import { FromSchema, JSONSchema } from 'json-schema-to-ts'; import { FromSchema, JSONSchema } from 'json-schema-to-ts';
import { MessageUnique } from '@/common/utils/MessageUnique'; import { MessageUnique } from '@/common/utils/MessageUnique';
import { RawNTMsg2Onebot } from '@/onebot/helper';
export type ReturnDataType = OB11Message export type ReturnDataType = OB11Message
@@ -38,13 +36,14 @@ class GetMsg extends BaseAction<Payload, OB11Message> {
const msg = await NTQQMsgApi.getMsgsByMsgId( const msg = await NTQQMsgApi.getMsgsByMsgId(
peer, peer,
[msgIdWithPeer?.MsgId || payload.message_id.toString()]); [msgIdWithPeer?.MsgId || payload.message_id.toString()]);
const retMsg = await RawNTMsg2Onebot(this.CoreContext, this.OneBotContext, msg.msgList[0], 'array'); const retMsg = await this.OneBotContext.apiContext.MsgApi.parseMessage(msg.msgList[0], 'array');
if (!retMsg) throw Error('消息为空'); if (!retMsg) throw Error('消息为空');
try { try {
retMsg.message_id = MessageUnique.createMsg(peer, msg.msgList[0].msgId)!; retMsg.message_id = MessageUnique.createMsg(peer, msg.msgList[0].msgId)!;
retMsg.message_seq = retMsg.message_id; retMsg.message_seq = retMsg.message_id;
retMsg.real_id = retMsg.message_id; retMsg.real_id = retMsg.message_id;
} catch (e) { } catch (e) {
// ignored
} }
return retMsg; return retMsg;
} }

View File

@@ -1,8 +1,6 @@
import { FromSchema, JSONSchema } from 'json-schema-to-ts'; import { FromSchema, JSONSchema } from 'json-schema-to-ts';
import BaseAction from '../BaseAction'; import BaseAction from '../BaseAction';
import { ActionName } from '../types'; import { ActionName } from '../types';
import { OB11Constructor } from '@/onebot/helper/converter';
import { RawNTMsg2Onebot } from '@/onebot/helper';
const SchemaData = { const SchemaData = {
type: 'object', type: 'object',
@@ -21,11 +19,11 @@ export default class GetRecentContact extends BaseAction<Payload, any> {
const NTQQUserApi = this.CoreContext.apis.UserApi; const NTQQUserApi = this.CoreContext.apis.UserApi;
const NTQQMsgApi = this.CoreContext.apis.MsgApi; const NTQQMsgApi = this.CoreContext.apis.MsgApi;
const ret = await NTQQUserApi.getRecentContactListSnapShot(parseInt((payload.count || 10).toString())); const ret = await NTQQUserApi.getRecentContactListSnapShot(parseInt((payload.count || 10).toString()));
const data = await Promise.all(ret.info.changedList.map(async (t) => { return await Promise.all(ret.info.changedList.map(async (t) => {
const FastMsg = await NTQQMsgApi.getMsgsByMsgId({ chatType: t.chatType, peerUid: t.peerUid }, [t.msgId]); const FastMsg = await NTQQMsgApi.getMsgsByMsgId({ chatType: t.chatType, peerUid: t.peerUid }, [t.msgId]);
if (FastMsg.msgList.length > 0) { if (FastMsg.msgList.length > 0) {
//扩展ret.info.changedList //扩展ret.info.changedList
const lastestMsg = await RawNTMsg2Onebot(this.CoreContext, this.OneBotContext,FastMsg.msgList[0], 'array'); const lastestMsg = await this.OneBotContext.apiContext.MsgApi.parseMessage(FastMsg.msgList[0], 'array');
return { return {
lastestMsg: lastestMsg, lastestMsg: lastestMsg,
peerUin: t.peerUin, peerUin: t.peerUin,
@@ -49,6 +47,5 @@ export default class GetRecentContact extends BaseAction<Payload, any> {
peerName: t.peerName, peerName: t.peerName,
}; };
})); }));
return data;
} }
} }

View File

@@ -1,8 +1,10 @@
import { UUIDConverter } from '@/common/utils/helper'; import { UUIDConverter } from '@/common/utils/helper';
import { MessageUnique } from '@/common/utils/MessageUnique'; import { MessageUnique } from '@/common/utils/MessageUnique';
import { AtType, FaceIndex, MessageElement, NapCatCore, RawMessage } from '@/core'; import { AtType, ChatType, FaceIndex, MessageElement, NapCatCore, RawMessage } from '@/core';
import { NapCatOneBot11Adapter, OB11MessageData, OB11MessageDataType } from '@/onebot'; import { NapCatOneBot11Adapter, OB11Message, OB11MessageData, OB11MessageDataType } from '@/onebot';
import { RawNTMsg2Onebot } from '../helper'; import { OB11Constructor } from '../helper';
import { EventType } from '@/onebot/event/OB11BaseEvent';
import { encodeCQCode } from '@/onebot/helper/cqcode';
export class OneBotMsgApi { export class OneBotMsgApi {
obContext: NapCatOneBot11Adapter; obContext: NapCatOneBot11Adapter;
@@ -12,11 +14,121 @@ export class OneBotMsgApi {
this.obContext = obContext; this.obContext = obContext;
this.coreContext = coreContext; this.coreContext = coreContext;
} }
async parseMessage(
msg: RawMessage,
messagePostFormat: string = this.obContext.configLoader.configData.messagePostFormat
) {
if (msg.senderUin == "0" || msg.senderUin == "") return;
if (msg.peerUin == "0" || msg.peerUin == "") return;
//跳过空消息
const NTQQGroupApi = this.coreContext.apis.GroupApi;
const NTQQUserApi = this.coreContext.apis.UserApi;
const NTQQMsgApi = this.coreContext.apis.MsgApi;
const resMsg: OB11Message = {
self_id: parseInt(this.coreContext.selfInfo.uin),
user_id: parseInt(msg.senderUin!),
time: parseInt(msg.msgTime) || Date.now(),
message_id: msg.id!,
message_seq: msg.id!,
real_id: msg.id!,
message_type: msg.chatType == ChatType.KCHATTYPEGROUP ? 'group' : 'private',
sender: {
user_id: parseInt(msg.senderUin || '0'),
nickname: msg.sendNickName,
card: msg.sendMemberName || '',
},
raw_message: '',
font: 14,
sub_type: 'friend',
message: messagePostFormat === 'string' ? '' : [],
message_format: messagePostFormat === 'string' ? 'string' : 'array',
post_type: this.coreContext.selfInfo.uin == msg.senderUin ? EventType.MESSAGE_SENT : EventType.MESSAGE,
};
if (msg.chatType == ChatType.KCHATTYPEGROUP) {
resMsg.sub_type = 'normal'; // 这里go-cqhttp是group而onebot11标准是normal, 蛋疼
resMsg.group_id = parseInt(msg.peerUin);
let member = await NTQQGroupApi.getGroupMember(msg.peerUin, msg.senderUin);
if (!member) member = await NTQQGroupApi.getGroupMember(msg.peerUin, msg.senderUin);
if (member) {
resMsg.sender.role = OB11Constructor.groupMemberRole(member.role);
resMsg.sender.nickname = member.nick;
}
} else if (msg.chatType == ChatType.KCHATTYPEC2C) {
resMsg.sub_type = 'friend';
resMsg.sender.nickname = (await NTQQUserApi.getUserDetailInfo(msg.senderUid)).nick;
} else if (msg.chatType == ChatType.KCHATTYPETEMPC2CFROMGROUP) {
resMsg.sub_type = 'group';
const ret = await NTQQMsgApi.getTempChatInfo(ChatType.KCHATTYPETEMPC2CFROMGROUP, msg.senderUid);
if (ret.result === 0) {
resMsg.group_id = parseInt(ret.tmpChatInfo!.groupCode);
resMsg.sender.nickname = ret.tmpChatInfo!.fromNick;
} else {
resMsg.group_id = 284840486; //兜底数据
resMsg.sender.nickname = "临时会话";
}
}
for (const element of msg.elements) {
let message_data: OB11MessageData = {
data: {} as any,
type: 'unknown' as any,
};
if (element.textElement && element.textElement?.atType !== AtType.notAt) {
const textAtMsgData = await this.obContext.apiContext.MsgApi.parseTextElemntWithAt(msg, element);
if (textAtMsgData) message_data = textAtMsgData;
} else if (element.textElement) {
const textMsgData = await this.obContext.apiContext.MsgApi.parseTextElement(msg, element);
if (textMsgData) message_data = textMsgData;
} else if (element.replyElement) {
const replyMsgData = await this.obContext.apiContext.MsgApi.parseReplyElement(msg, element);
if (replyMsgData) message_data = replyMsgData;
} else if (element.picElement) {
const PicMsgData = await this.obContext.apiContext.MsgApi.parsePicElement(msg, element);
if (PicMsgData) message_data = PicMsgData;
} else if (element.fileElement) {
const FileMsgData = await this.obContext.apiContext.MsgApi.parseFileElement(msg, element);
if (FileMsgData) message_data = FileMsgData;
} else if (element.videoElement) {
const videoMsgData = await this.obContext.apiContext.MsgApi.parseVideoElement(msg, element);
if (videoMsgData) message_data = videoMsgData;
} else if (element.pttElement) {
const pttMsgData = await this.obContext.apiContext.MsgApi.parsePTTElement(msg, element);
if (pttMsgData) message_data = pttMsgData;
} else if (element.arkElement) {
const arkMsgData = await this.obContext.apiContext.MsgApi.parseArkElement(msg, element);
if (arkMsgData) message_data = arkMsgData;
} else if (element.faceElement) {
const faceMsgData = await this.obContext.apiContext.MsgApi.parseFaceElement(msg, element);
if (faceMsgData) message_data = faceMsgData;
} else if (element.marketFaceElement) {
const marketFaceMsgData = await this.obContext.apiContext.MsgApi.parseMarketFaceElement(msg, element);
if (marketFaceMsgData) message_data = marketFaceMsgData;
} else if (element.markdownElement) {
message_data['type'] = OB11MessageDataType.markdown;
message_data['data']['data'] = element.markdownElement.content;
} else if (element.multiForwardMsgElement) {
const multiForwardMsgData = await this.obContext.apiContext.MsgApi.parseMultForwardElement(msg, element, messagePostFormat);
if (multiForwardMsgData) message_data = multiForwardMsgData;
}
if ((message_data.type as string) !== 'unknown' && message_data.data) {
const cqCode = encodeCQCode(message_data);
if (messagePostFormat === 'string') {
(resMsg.message as string) += cqCode;
} else (resMsg.message as OB11MessageData[]).push(message_data);
resMsg.raw_message += cqCode;
}
}
resMsg.raw_message = resMsg.raw_message.trim();
return resMsg;
}
async parseFileElement(msg: RawMessage, element: MessageElement) { async parseFileElement(msg: RawMessage, element: MessageElement) {
const fileElement = element.fileElement; const fileElement = element.fileElement;
if (!fileElement) return undefined; if (!fileElement) return undefined;
const NTQQFileApi = this.coreContext.apis.FileApi; const NTQQFileApi = this.coreContext.apis.FileApi;
let message_data: OB11MessageData = { const message_data: OB11MessageData = {
data: {} as any, data: {} as any,
type: 'unknown' as any, type: 'unknown' as any,
}; };
@@ -46,12 +158,8 @@ export class OneBotMsgApi {
const textElement = element.textElement; const textElement = element.textElement;
if (!textElement) return undefined; if (!textElement) return undefined;
const NTQQUserApi = this.coreContext.apis.UserApi; const NTQQUserApi = this.coreContext.apis.UserApi;
let message_data: OB11MessageData = {
data: {} as any,
type: 'unknown' as any,
};
let qq: `${number}` | 'all'; let qq: `${number}` | 'all';
let name: string | undefined; // let name: string | undefined;
if (textElement.atType == AtType.atAll) { if (textElement.atType == AtType.atAll) {
qq = 'all'; qq = 'all';
} else { } else {
@@ -62,23 +170,22 @@ export class OneBotMsgApi {
} }
if (atQQ) { if (atQQ) {
qq = atQQ as `${number}`; qq = atQQ as `${number}`;
name = content.replace('@', ''); // name = content.replace('@', '');
} }
} }
message_data = { return {
type: OB11MessageDataType.at, type: OB11MessageDataType.at,
data: { data: {
qq: qq!, qq: qq!,
//name, // name,
}, },
}; };
return message_data;
} }
async parseTextElement(msg: RawMessage, element: MessageElement) { async parseTextElement(msg: RawMessage, element: MessageElement) {
const textElement = element.textElement; const textElement = element.textElement;
if (!textElement) return undefined; if (!textElement) return undefined;
let message_data: OB11MessageData = { const message_data: OB11MessageData = {
data: {} as any, data: {} as any,
type: 'unknown' as any, type: 'unknown' as any,
}; };
@@ -99,7 +206,7 @@ export class OneBotMsgApi {
const picElement = element.picElement; const picElement = element.picElement;
if (!picElement) return undefined; if (!picElement) return undefined;
const NTQQFileApi = this.coreContext.apis.FileApi; const NTQQFileApi = this.coreContext.apis.FileApi;
let message_data: OB11MessageData = { const message_data: OB11MessageData = {
data: {} as any, data: {} as any,
type: 'unknown' as any, type: 'unknown' as any,
}; };
@@ -121,7 +228,7 @@ export class OneBotMsgApi {
} }
async parseMarketFaceElement(msg: RawMessage, element: MessageElement) { async parseMarketFaceElement(msg: RawMessage, element: MessageElement) {
const NTQQFileApi = this.coreContext.apis.FileApi; const NTQQFileApi = this.coreContext.apis.FileApi;
let message_data: OB11MessageData = { const message_data: OB11MessageData = {
data: {} as any, data: {} as any,
type: 'unknown' as any, type: 'unknown' as any,
}; };
@@ -150,7 +257,7 @@ export class OneBotMsgApi {
const replyElement = element.replyElement; const replyElement = element.replyElement;
if (!replyElement) return undefined; if (!replyElement) return undefined;
const NTQQMsgApi = this.coreContext.apis.MsgApi; const NTQQMsgApi = this.coreContext.apis.MsgApi;
let message_data: OB11MessageData = { const message_data: OB11MessageData = {
data: {} as any, data: {} as any,
type: 'unknown' as any, type: 'unknown' as any,
}; };
@@ -201,7 +308,7 @@ export class OneBotMsgApi {
const videoElement = element.videoElement; const videoElement = element.videoElement;
if (!videoElement) return undefined; if (!videoElement) return undefined;
const NTQQFileApi = this.coreContext.apis.FileApi; const NTQQFileApi = this.coreContext.apis.FileApi;
let message_data: OB11MessageData = { const message_data: OB11MessageData = {
data: {} as any, data: {} as any,
type: 'unknown' as any, type: 'unknown' as any,
}; };
@@ -262,7 +369,7 @@ export class OneBotMsgApi {
const pttElement = element.pttElement; const pttElement = element.pttElement;
if (!pttElement) return undefined; if (!pttElement) return undefined;
const NTQQFileApi = this.coreContext.apis.FileApi; const NTQQFileApi = this.coreContext.apis.FileApi;
let message_data: OB11MessageData = { const message_data: OB11MessageData = {
data: {} as any, data: {} as any,
type: 'unknown' as any, type: 'unknown' as any,
}; };
@@ -278,13 +385,13 @@ export class OneBotMsgApi {
chatType: msg.chatType, chatType: msg.chatType,
guildId: '', guildId: '',
}, },
msg.msgId, msg.msgId,
msg.msgSeq, msg.msgSeq,
msg.senderUid, msg.senderUid,
element.elementId, element.elementId,
element.elementType.toString(), element.elementType.toString(),
pttElement.fileSize || '0', pttElement.fileSize || '0',
pttElement.fileUuid || '' pttElement.fileUuid || ''
); );
//以uuid作为文件名 //以uuid作为文件名
return message_data; return message_data;
@@ -292,7 +399,7 @@ export class OneBotMsgApi {
async parseFaceElement(msg: RawMessage, element: MessageElement) { async parseFaceElement(msg: RawMessage, element: MessageElement) {
const faceElement = element.faceElement; const faceElement = element.faceElement;
if (!faceElement) return undefined; if (!faceElement) return undefined;
let message_data: OB11MessageData = { const message_data: OB11MessageData = {
data: {} as any, data: {} as any,
type: 'unknown' as any, type: 'unknown' as any,
}; };
@@ -313,7 +420,7 @@ export class OneBotMsgApi {
const NTQQMsgApi = this.coreContext.apis.MsgApi; const NTQQMsgApi = this.coreContext.apis.MsgApi;
const faceElement = element.multiForwardMsgElement; const faceElement = element.multiForwardMsgElement;
if (!faceElement) return undefined; if (!faceElement) return undefined;
let message_data: OB11MessageData = { const message_data: OB11MessageData = {
data: {} as any, data: {} as any,
type: 'unknown' as any, type: 'unknown' as any,
}; };
@@ -340,7 +447,7 @@ export class OneBotMsgApi {
MultiMsg.parentMsgPeer = ParentMsgPeer; MultiMsg.parentMsgPeer = ParentMsgPeer;
MultiMsg.parentMsgIdList = msg.parentMsgIdList; MultiMsg.parentMsgIdList = msg.parentMsgIdList;
MultiMsg.id = MessageUnique.createMsg(ParentMsgPeer, MultiMsg.msgId); //该ID仅用查看 无法调用 MultiMsg.id = MessageUnique.createMsg(ParentMsgPeer, MultiMsg.msgId); //该ID仅用查看 无法调用
const msgList = await RawNTMsg2Onebot(this.coreContext, this.obContext, MultiMsg, messagePostFormat); const msgList = await this.parseMessage(MultiMsg, messagePostFormat);
if (!msgList) continue; if (!msgList) continue;
message_data['data']['content'].push(msgList); message_data['data']['content'].push(msgList);
//console.log("合并消息", msgList); //console.log("合并消息", msgList);
@@ -350,7 +457,7 @@ export class OneBotMsgApi {
async parseArkElement(msg: RawMessage, element: MessageElement) { async parseArkElement(msg: RawMessage, element: MessageElement) {
const arkElement = element.arkElement; const arkElement = element.arkElement;
if (!arkElement) return undefined; if (!arkElement) return undefined;
let message_data: OB11MessageData = { const message_data: OB11MessageData = {
data: {} as any, data: {} as any,
type: 'unknown' as any, type: 'unknown' as any,
}; };

View File

@@ -1,6 +1,5 @@
export * from './config'; export * from './config';
export * from './parseMessage';
export * from './converter'; export * from './converter';
export * from './quick'; export * from './quick';
export * from './genMessage'; export * from './genMessage';
export * from './event'; export * from './event';

View File

@@ -1,117 +0,0 @@
import { NapCatOneBot11Adapter, OB11Message, OB11MessageData, OB11MessageDataType } from '..';
import { AtType, ChatType, NapCatCore, RawMessage } from '@/core';
import { EventType } from '../event/OB11BaseEvent';
import { OB11Constructor } from './converter';
import { encodeCQCode } from './cqcode';
export async function RawNTMsg2Onebot(
core: NapCatCore,
obcore: NapCatOneBot11Adapter,
msg: RawMessage,
messagePostFormat: string = obcore.configLoader.configData.messagePostFormat
): Promise<OB11Message | undefined> {
if (msg.senderUin == "0" || msg.senderUin == "") return;
if (msg.peerUin == "0" || msg.peerUin == "") return;
//跳过空消息
const NTQQGroupApi = core.apis.GroupApi;
const NTQQUserApi = core.apis.UserApi;
const NTQQMsgApi = core.apis.MsgApi;
const resMsg: OB11Message = {
self_id: parseInt(core.selfInfo.uin),
user_id: parseInt(msg.senderUin!),
time: parseInt(msg.msgTime) || Date.now(),
message_id: msg.id!,
message_seq: msg.id!,
real_id: msg.id!,
message_type: msg.chatType == ChatType.KCHATTYPEGROUP ? 'group' : 'private',
sender: {
user_id: parseInt(msg.senderUin || '0'),
nickname: msg.sendNickName,
card: msg.sendMemberName || '',
},
raw_message: '',
font: 14,
sub_type: 'friend',
message: messagePostFormat === 'string' ? '' : [],
message_format: messagePostFormat === 'string' ? 'string' : 'array',
post_type: core.selfInfo.uin == msg.senderUin ? EventType.MESSAGE_SENT : EventType.MESSAGE,
};
if (msg.chatType == ChatType.KCHATTYPEGROUP) {
resMsg.sub_type = 'normal'; // 这里go-cqhttp是group而onebot11标准是normal, 蛋疼
resMsg.group_id = parseInt(msg.peerUin);
let member = await NTQQGroupApi.getGroupMember(msg.peerUin, msg.senderUin);
if (!member) member = await NTQQGroupApi.getGroupMember(msg.peerUin, msg.senderUin);
if (member) {
resMsg.sender.role = OB11Constructor.groupMemberRole(member.role);
resMsg.sender.nickname = member.nick;
}
} else if (msg.chatType == ChatType.KCHATTYPEC2C) {
resMsg.sub_type = 'friend';
resMsg.sender.nickname = (await NTQQUserApi.getUserDetailInfo(msg.senderUid)).nick;
} else if (msg.chatType == ChatType.KCHATTYPETEMPC2CFROMGROUP) {
resMsg.sub_type = 'group';
const ret = await NTQQMsgApi.getTempChatInfo(ChatType.KCHATTYPETEMPC2CFROMGROUP, msg.senderUid);
if (ret.result === 0) {
resMsg.group_id = parseInt(ret.tmpChatInfo!.groupCode);
resMsg.sender.nickname = ret.tmpChatInfo!.fromNick;
} else {
resMsg.group_id = 284840486; //兜底数据
resMsg.sender.nickname = "临时会话";
}
}
for (const element of msg.elements) {
let message_data: OB11MessageData = {
data: {} as any,
type: 'unknown' as any,
};
if (element.textElement && element.textElement?.atType !== AtType.notAt) {
let textAtMsgData = await obcore.apiContext.MsgApi.parseTextElemntWithAt(msg, element);
if (textAtMsgData) message_data = textAtMsgData
} else if (element.textElement) {
let textMsgData = await obcore.apiContext.MsgApi.parseTextElement(msg, element);
if (textMsgData) message_data = textMsgData;
} else if (element.replyElement) {
let replyMsgData = await obcore.apiContext.MsgApi.parseReplyElement(msg, element);
if (replyMsgData) message_data = replyMsgData;
} else if (element.picElement) {
let PicMsgData = await obcore.apiContext.MsgApi.parsePicElement(msg, element);
if (PicMsgData) message_data = PicMsgData;
} else if (element.fileElement) {
let FileMsgData = await obcore.apiContext.MsgApi.parseFileElement(msg, element);
if (FileMsgData) message_data = FileMsgData;
} else if (element.videoElement) {
let videoMsgData = await obcore.apiContext.MsgApi.parseVideoElement(msg, element);
if (videoMsgData) message_data = videoMsgData;
} else if (element.pttElement) {
let pttMsgData = await obcore.apiContext.MsgApi.parsePTTElement(msg, element);
if (pttMsgData) message_data = pttMsgData;
} else if (element.arkElement) {
let arkMsgData = await obcore.apiContext.MsgApi.parseArkElement(msg, element);
if (arkMsgData) message_data = arkMsgData;
} else if (element.faceElement) {
let faceMsgData = await obcore.apiContext.MsgApi.parseFaceElement(msg, element);
if (faceMsgData) message_data = faceMsgData;
} else if (element.marketFaceElement) {
let marketFaceMsgData = await obcore.apiContext.MsgApi.parseMarketFaceElement(msg, element);
if (marketFaceMsgData) message_data = marketFaceMsgData;
} else if (element.markdownElement) {
message_data['type'] = OB11MessageDataType.markdown;
message_data['data']['data'] = element.markdownElement.content;
} else if (element.multiForwardMsgElement) {
let multiForwardMsgData = await obcore.apiContext.MsgApi.parseMultForwardElement(msg, element, messagePostFormat);
if (multiForwardMsgData) message_data = multiForwardMsgData;
}
if ((message_data.type as string) !== 'unknown' && message_data.data) {
const cqCode = encodeCQCode(message_data);
if (messagePostFormat === 'string') {
(resMsg.message as string) += cqCode;
} else (resMsg.message as OB11MessageData[]).push(message_data);
resMsg.raw_message += cqCode;
}
}
resMsg.raw_message = resMsg.raw_message.trim();
return resMsg;
}

View File

@@ -35,7 +35,7 @@ import { OB11GroupRequestEvent } from '@/onebot/event/request/OB11GroupRequest';
import { OB11FriendRecallNoticeEvent } from '@/onebot/event/notice/OB11FriendRecallNoticeEvent'; import { OB11FriendRecallNoticeEvent } from '@/onebot/event/notice/OB11FriendRecallNoticeEvent';
import { OB11GroupRecallNoticeEvent } from '@/onebot/event/notice/OB11GroupRecallNoticeEvent'; import { OB11GroupRecallNoticeEvent } from '@/onebot/event/notice/OB11GroupRecallNoticeEvent';
import { LRUCache } from '@/common/utils/LRU'; import { LRUCache } from '@/common/utils/LRU';
import { NT2GroupEvent, NT2PrivateEvent, RawNTMsg2Onebot } from './helper'; import { NT2GroupEvent, NT2PrivateEvent } from './helper';
//OneBot实现类 //OneBot实现类
export class NapCatOneBot11Adapter { export class NapCatOneBot11Adapter {
@@ -258,7 +258,7 @@ export class NapCatOneBot11Adapter {
if (msg.sendStatus == SendStatusType.KSEND_STATUS_SUCCESS && !msgIdSend.get(msg.msgId)) { if (msg.sendStatus == SendStatusType.KSEND_STATUS_SUCCESS && !msgIdSend.get(msg.msgId)) {
msgIdSend.put(msg.msgId, true); msgIdSend.put(msg.msgId, true);
// 完成后再post // 完成后再post
RawNTMsg2Onebot(this.core, this, msg) this.apiContext.MsgApi.parseMessage(msg)
.then((ob11Msg) => { .then((ob11Msg) => {
if (!ob11Msg) return; if (!ob11Msg) return;
ob11Msg.target_id = parseInt(msg.peerUin); ob11Msg.target_id = parseInt(msg.peerUin);
@@ -456,7 +456,7 @@ export class NapCatOneBot11Adapter {
private async emitMsg(message: RawMessage) { private async emitMsg(message: RawMessage) {
const { debug, reportSelfMessage, messagePostFormat } = this.configLoader.configData; const { debug, reportSelfMessage, messagePostFormat } = this.configLoader.configData;
this.context.logger.logDebug('收到新消息 RawMessage', message); this.context.logger.logDebug('收到新消息 RawMessage', message);
RawNTMsg2Onebot(this.core, this, message, messagePostFormat).then((ob11Msg) => { this.apiContext.MsgApi.parseMessage(message, messagePostFormat).then((ob11Msg) => {
if (!ob11Msg) return; if (!ob11Msg) return;
this.context.logger.logDebug('转化为 OB11Message', ob11Msg); this.context.logger.logDebug('转化为 OB11Message', ob11Msg);
if (debug) { if (debug) {
@@ -497,7 +497,7 @@ export class NapCatOneBot11Adapter {
for (const message of msgList) { for (const message of msgList) {
// log("message update", message.sendStatus, message.msgId, message.msgSeq) // log("message update", message.sendStatus, message.msgId, message.msgSeq)
if (message.recallTime != '0' && !cache.get(message.msgId)) { //todo: 这个判断方法不太好,应该使用灰色消息元素来判断? if (message.recallTime != '0' && !cache.get(message.msgId)) { //todo: 这个判断方法不太好,应该使用灰色消息元素来判断?
cache.put(message.msgId, true) cache.put(message.msgId, true);
// 撤回消息上报 // 撤回消息上报
const oriMessageId = MessageUnique.getShortIdByMsgId(message.msgId); const oriMessageId = MessageUnique.getShortIdByMsgId(message.msgId);
if (!oriMessageId) { if (!oriMessageId) {