fix: 大部分异常

This commit is contained in:
手瓜一十雪 2024-08-09 18:06:11 +08:00
parent e5fd9c6366
commit fbe2d78331
4 changed files with 86 additions and 58 deletions

View File

@ -40,7 +40,7 @@ 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 OB11Constructor.message(msg); const resMsg = await OB11Constructor.message(this.CoreContext, msg, "array");
resMsg.message_id = MessageUnique.createMsg({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId)!; resMsg.message_id = MessageUnique.createMsg({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId)!;
return resMsg; return resMsg;
})); }));

View File

@ -46,7 +46,7 @@ export default class GoCQHTTPGetGroupMsgHistory extends BaseAction<Payload, Resp
})); }));
//转换消息 //转换消息
const ob11MsgList = await Promise.all(msgList.map(msg => OB11Constructor.message(msg))); const ob11MsgList = await Promise.all(msgList.map(msg => OB11Constructor.message(this.CoreContext, msg, "array")));
return { 'messages': ob11MsgList }; return { 'messages': ob11MsgList };
} }
} }

View File

@ -44,14 +44,20 @@ import { OB11FriendAddNoticeEvent } from '../event/notice/OB11FriendAddNoticeEve
import { OB11BaseNoticeEvent } from '../event/notice/OB11BaseNoticeEvent'; import { OB11BaseNoticeEvent } from '../event/notice/OB11BaseNoticeEvent';
import { OB11GroupEssenceEvent } from '../event/notice/OB11GroupEssenceEvent'; import { OB11GroupEssenceEvent } from '../event/notice/OB11GroupEssenceEvent';
import { MessageUnique } from '@/common/utils/MessageUnique'; import { MessageUnique } from '@/common/utils/MessageUnique';
import { NapCatCore } from '@/core';
export class OB11Constructor { export class OB11Constructor {
static async message(msg: RawMessage): Promise<OB11Message> { static async message(coreContext: NapCatCore, msg: RawMessage, messagePostFormat: any): Promise<OB11Message> {
const { messagePostFormat } = ob11Config; const NTQQGroupApi = coreContext.getApiContext().GroupApi;
const NTQQUserApi = coreContext.getApiContext().UserApi;
const NTQQFileApi = coreContext.getApiContext().FileApi;
const NTQQMsgApi = coreContext.getApiContext().MsgApi;
const NTQQFriendApi = coreContext.getApiContext().FriendApi;
const logger = coreContext.context.logger;
const message_type = msg.chatType == ChatType.group ? 'group' : 'private'; const message_type = msg.chatType == ChatType.group ? 'group' : 'private';
const resMsg: OB11Message = { const resMsg: OB11Message = {
self_id: parseInt(selfInfo.uin), self_id: parseInt(coreContext.selfInfo.uin),
user_id: parseInt(msg.senderUin!), user_id: parseInt(msg.senderUin!),
time: parseInt(msg.msgTime) || Date.now(), time: parseInt(msg.msgTime) || Date.now(),
message_id: msg.id!, message_id: msg.id!,
@ -68,17 +74,14 @@ export class OB11Constructor {
sub_type: 'friend', sub_type: 'friend',
message: messagePostFormat === 'string' ? '' : [], message: messagePostFormat === 'string' ? '' : [],
message_format: messagePostFormat === 'string' ? 'string' : 'array', message_format: messagePostFormat === 'string' ? 'string' : 'array',
post_type: selfInfo.uin == msg.senderUin ? EventType.MESSAGE_SENT : EventType.MESSAGE, post_type: coreContext.selfInfo.uin == msg.senderUin ? EventType.MESSAGE_SENT : EventType.MESSAGE,
}; };
if (msg.chatType == ChatType.group) { if (msg.chatType == ChatType.group) {
resMsg.sub_type = 'normal'; // 这里go-cqhttp是group而onebot11标准是normal, 蛋疼 resMsg.sub_type = 'normal'; // 这里go-cqhttp是group而onebot11标准是normal, 蛋疼
resMsg.group_id = parseInt(msg.peerUin); resMsg.group_id = parseInt(msg.peerUin);
let member = await getGroupMember(msg.peerUin, msg.senderUin!);
if (!member) {
//直接去QQNative取 //直接去QQNative取
const memberList = await NTQQGroupApi.getGroupMembers(msg.peerUin); const memberList = await NTQQGroupApi.getGroupMembers(msg.peerUin);
member = memberList.get(msg.senderUin!); let member = memberList.get(msg.senderUin!);
}
if (member) { if (member) {
resMsg.sender.role = OB11Constructor.groupMemberRole(member.role); resMsg.sender.role = OB11Constructor.groupMemberRole(member.role);
resMsg.sender.nickname = member.nick; resMsg.sender.nickname = member.nick;
@ -92,10 +95,6 @@ export class OB11Constructor {
} }
else if (msg.chatType == ChatType.temp) { else if (msg.chatType == ChatType.temp) {
resMsg.sub_type = 'group'; resMsg.sub_type = 'group';
const tempGroupCode = tempGroupCodeMap[msg.peerUin];
if (tempGroupCode) {
resMsg.group_id = parseInt(tempGroupCode);
}
} }
for (const element of msg.elements) { for (const element of msg.elements) {
let message_data: OB11MessageData = { let message_data: OB11MessageData = {
@ -112,10 +111,7 @@ export class OB11Constructor {
const { atNtUid, content } = element.textElement; const { atNtUid, content } = element.textElement;
let atQQ = element.textElement.atUid; let atQQ = element.textElement.atUid;
if (!atQQ || atQQ === '0') { if (!atQQ || atQQ === '0') {
const atMember = await getGroupMember(msg.peerUin, atNtUid); atQQ = await NTQQUserApi.getUinByUid(atNtUid);
if (atMember) {
atQQ = atMember.uin;
}
} }
if (atQQ) { if (atQQ) {
qq = atQQ as `${number}`; qq = atQQ as `${number}`;
@ -170,7 +166,7 @@ export class OB11Constructor {
} catch (e: any) { } catch (e: any) {
message_data['type'] = 'unknown' as any; message_data['type'] = 'unknown' as any;
message_data['data'] = undefined; message_data['data'] = undefined;
logError('获取不到引用的消息', e.stack, element.replyElement.replayMsgSeq); logger.logError('获取不到引用的消息', e.stack, element.replyElement.replayMsgSeq);
} }
} }
@ -185,7 +181,7 @@ export class OB11Constructor {
try { try {
message_data['data']['url'] = await NTQQFileApi.getImageUrl(element.picElement); message_data['data']['url'] = await NTQQFileApi.getImageUrl(element.picElement);
} catch (e: any) { } catch (e: any) {
logError('获取图片url失败', e.stack); logger.logError('获取图片url失败', e.stack);
} }
//console.log(message_data['data']['url']) //console.log(message_data['data']['url'])
// message_data["data"]["file_id"] = element.picElement.fileUuid // message_data["data"]["file_id"] = element.picElement.fileUuid
@ -318,7 +314,7 @@ export class OB11Constructor {
message_data['data']['emoji_id'] = element.marketFaceElement.emojiId; message_data['data']['emoji_id'] = element.marketFaceElement.emojiId;
message_data['data']['emoji_package_id'] = String(element.marketFaceElement.emojiPackageId); message_data['data']['emoji_package_id'] = String(element.marketFaceElement.emojiPackageId);
message_data['data']['key'] = element.marketFaceElement.key; message_data['data']['key'] = element.marketFaceElement.key;
mFaceCache.set(md5, element.marketFaceElement.faceName); //mFaceCache.set(md5, element.marketFaceElement.faceName);
} }
else if (element.markdownElement) { else if (element.markdownElement) {
message_data['type'] = OB11MessageDataType.markdown; message_data['type'] = OB11MessageDataType.markdown;
@ -344,7 +340,7 @@ export class OB11Constructor {
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仅用查看 无法调用
let msgList = await OB11Constructor.message(MultiMsg); let msgList = await OB11Constructor.message(coreContext, MultiMsg, "array");
message_data['data']['content'].push(msgList); message_data['data']['content'].push(msgList);
//console.log("合并消息", msgList); //console.log("合并消息", msgList);
} }
@ -363,7 +359,13 @@ export class OB11Constructor {
resMsg.raw_message = resMsg.raw_message.trim(); resMsg.raw_message = resMsg.raw_message.trim();
return resMsg; return resMsg;
} }
static async PrivateEvent(msg: RawMessage): Promise<OB11BaseNoticeEvent | undefined> { static async PrivateEvent(coreContext: NapCatCore, msg: RawMessage): Promise<OB11BaseNoticeEvent | undefined> {
const NTQQGroupApi = coreContext.getApiContext().GroupApi;
const NTQQUserApi = coreContext.getApiContext().UserApi;
const NTQQFileApi = coreContext.getApiContext().FileApi;
const NTQQMsgApi = coreContext.getApiContext().MsgApi;
const NTQQFriendApi = coreContext.getApiContext().FriendApi;
const logger = coreContext.context.logger;
if (msg.chatType !== ChatType.friend) { if (msg.chatType !== ChatType.friend) {
return; return;
} }
@ -394,20 +396,27 @@ export class OB11Constructor {
} }
} }
} }
static async GroupEvent(msg: RawMessage): Promise<OB11GroupNoticeEvent | undefined> { static async GroupEvent(coreContext:NapCatCore,msg: RawMessage): Promise<OB11GroupNoticeEvent | undefined> {
const NTQQGroupApi = coreContext.getApiContext().GroupApi;
const NTQQUserApi = coreContext.getApiContext().UserApi;
const NTQQFileApi = coreContext.getApiContext().FileApi;
const NTQQMsgApi = coreContext.getApiContext().MsgApi;
const NTQQFriendApi = coreContext.getApiContext().FriendApi;
const logger = coreContext.context.logger;
if (msg.chatType !== ChatType.group) { if (msg.chatType !== ChatType.group) {
return; return;
} }
//log("group msg", msg); //log("group msg", msg);
if (msg.senderUin && msg.senderUin !== '0') { // Mlikiowa V2.0.0 Refactor Todo
const member = await getGroupMember(msg.peerUid, msg.senderUin); // if (msg.senderUin && msg.senderUin !== '0') {
if (member && member.cardName !== msg.sendMemberName) { // const member = await getGroupMember(msg.peerUid, msg.senderUin);
const newCardName = msg.sendMemberName || ''; // if (member && member.cardName !== msg.sendMemberName) {
const event = new OB11GroupCardEvent(parseInt(msg.peerUid), parseInt(msg.senderUin), newCardName, member.cardName); // const newCardName = msg.sendMemberName || '';
member.cardName = newCardName; // const event = new OB11GroupCardEvent(parseInt(msg.peerUid), parseInt(msg.senderUin), newCardName, member.cardName);
return event; // member.cardName = newCardName;
} // return event;
} // }
// }
for (const element of msg.elements) { for (const element of msg.elements) {
const grayTipElement = element.grayTipElement; const grayTipElement = element.grayTipElement;
@ -415,7 +424,7 @@ export class OB11Constructor {
if (groupElement) { if (groupElement) {
// log("收到群提示消息", groupElement) // log("收到群提示消息", groupElement)
if (groupElement.type == TipGroupElementType.memberIncrease) { if (groupElement.type == TipGroupElementType.memberIncrease) {
logDebug('收到群成员增加消息', groupElement); logger.logDebug('收到群成员增加消息', groupElement);
await sleep(1000); await sleep(1000);
const member = await getGroupMember(msg.peerUid, groupElement.memberUid); const member = await getGroupMember(msg.peerUid, groupElement.memberUid);
const memberUin = member?.uin; const memberUin = member?.uin;
@ -433,7 +442,7 @@ export class OB11Constructor {
} }
} }
else if (groupElement.type === TipGroupElementType.ban) { else if (groupElement.type === TipGroupElementType.ban) {
logDebug('收到群群员禁言提示', groupElement); logger.logDebug('收到群群员禁言提示', groupElement);
const memberUid = groupElement.shutUp!.member.uid; const memberUid = groupElement.shutUp!.member.uid;
const adminUid = groupElement.shutUp!.admin.uid; const adminUid = groupElement.shutUp!.admin.uid;
let memberUin: string = ''; let memberUin: string = '';
@ -457,16 +466,15 @@ export class OB11Constructor {
} }
} }
else if (groupElement.type == TipGroupElementType.kicked) { else if (groupElement.type == TipGroupElementType.kicked) {
logDebug(`收到我被踢出或退群提示, 群${msg.peerUid}`, groupElement); logger.logDebug(`收到我被踢出或退群提示, 群${msg.peerUid}`, groupElement);
deleteGroup(msg.peerUid);
NTQQGroupApi.quitGroup(msg.peerUid).then(); NTQQGroupApi.quitGroup(msg.peerUid).then();
try { try {
const adminUin = (await getGroupMember(msg.peerUid, groupElement.adminUid))?.uin || (await NTQQUserApi.getUidByUin(groupElement.adminUid)); const adminUin = (await getGroupMember(msg.peerUid, groupElement.adminUid))?.uin || (await NTQQUserApi.getUidByUin(groupElement.adminUid));
if (adminUin) { if (adminUin) {
return new OB11GroupDecreaseEvent(parseInt(msg.peerUid), parseInt(selfInfo.uin), parseInt(adminUin), 'kick_me'); return new OB11GroupDecreaseEvent(parseInt(msg.peerUid), parseInt(coreContext.selfInfo.uin), parseInt(adminUin), 'kick_me');
} }
} catch (e) { } catch (e) {
return new OB11GroupDecreaseEvent(parseInt(msg.peerUid), parseInt(selfInfo.uin), 0, 'leave'); return new OB11GroupDecreaseEvent(parseInt(msg.peerUid), parseInt(coreContext.selfInfo.uin), 0, 'leave');
} }
} }
} }
@ -485,7 +493,7 @@ export class OB11Constructor {
ignoreAttributes: false, ignoreAttributes: false,
attributeNamePrefix: '' attributeNamePrefix: ''
}).parse(grayTipElement.xmlElement.content); }).parse(grayTipElement.xmlElement.content);
logDebug('收到表情回应我的消息', emojiLikeData); logger.logDebug('收到表情回应我的消息', emojiLikeData);
try { try {
const senderUin = emojiLikeData.gtip.qq.jp; const senderUin = emojiLikeData.gtip.qq.jp;
const msgSeq = emojiLikeData.gtip.url.msgseq; const msgSeq = emojiLikeData.gtip.url.msgseq;
@ -502,11 +510,11 @@ export class OB11Constructor {
count: 1 count: 1
}]); }]);
} catch (e: any) { } catch (e: any) {
logError('解析表情回应消息失败', e.stack); logger.logError('解析表情回应消息失败', e.stack);
} }
} }
if (grayTipElement.subElementType == GrayTipElementSubType.INVITE_NEW_MEMBER) { if (grayTipElement.subElementType == GrayTipElementSubType.INVITE_NEW_MEMBER) {
logDebug('收到新人被邀请进群消息', grayTipElement); logger.logDebug('收到新人被邀请进群消息', grayTipElement);
const xmlElement = grayTipElement.xmlElement; const xmlElement = grayTipElement.xmlElement;
if (xmlElement?.content) { if (xmlElement?.content) {
const regex = /jp="(\d+)"/g; const regex = /jp="(\d+)"/g;
@ -555,7 +563,7 @@ export class OB11Constructor {
//下面得改 上面也是错的grayTipElement.subElementType == GrayTipElementSubType.MEMBER_NEW_TITLE //下面得改 上面也是错的grayTipElement.subElementType == GrayTipElementSubType.MEMBER_NEW_TITLE
const memberUin = json.items[1].param[0]; const memberUin = json.items[1].param[0];
const title = json.items[3].txt; const title = json.items[3].txt;
logDebug('收到群成员新头衔消息', json); logger.logDebug('收到群成员新头衔消息', json);
return new OB11GroupTitleEvent(parseInt(msg.peerUid), parseInt(memberUin), title); return new OB11GroupTitleEvent(parseInt(msg.peerUid), parseInt(memberUin), title);
} }
} }
@ -659,10 +667,6 @@ export class OB11Constructor {
}; };
} }
static groupMembers(group: Group): OB11GroupMember[] {
//logDebug('construct ob11 group members', group);
return Array.from(groupMembers.get(group.groupCode)?.values() || []).map(m => OB11Constructor.groupMember(group.groupCode, m));
}
static group(group: Group): OB11Group { static group(group: Group): OB11Group {
return { return {

View File

@ -74,7 +74,13 @@ export class SendMsgElementConstructor {
}; };
} }
static async pic(CoreContext: NapCatCore, picPath: string, summary: string = '', subType: 0 | 1 = 0): Promise<SendPicElement> { static async pic(coreContext: NapCatCore, picPath: string, summary: string = '', subType: 0 | 1 = 0): Promise<SendPicElement> {
const NTQQGroupApi = coreContext.getApiContext().GroupApi;
const NTQQUserApi = coreContext.getApiContext().UserApi;
const NTQQFileApi = coreContext.getApiContext().FileApi;
const NTQQMsgApi = coreContext.getApiContext().MsgApi;
const NTQQFriendApi = coreContext.getApiContext().FriendApi;
const logger = coreContext.context.logger;
const { md5, fileName, path, fileSize } = await NTQQFileApi.uploadFile(picPath, ElementType.PIC, subType); const { md5, fileName, path, fileSize } = await NTQQFileApi.uploadFile(picPath, ElementType.PIC, subType);
if (fileSize === 0) { if (fileSize === 0) {
throw '文件异常大小为0'; throw '文件异常大小为0';
@ -103,7 +109,13 @@ export class SendMsgElementConstructor {
}; };
} }
static async file(CoreContext: NapCatCore, filePath: string, fileName: string = '', folderId: string = ''): Promise<SendFileElement> { static async file(coreContext: NapCatCore, filePath: string, fileName: string = '', folderId: string = ''): Promise<SendFileElement> {
const NTQQGroupApi = coreContext.getApiContext().GroupApi;
const NTQQUserApi = coreContext.getApiContext().UserApi;
const NTQQFileApi = coreContext.getApiContext().FileApi;
const NTQQMsgApi = coreContext.getApiContext().MsgApi;
const NTQQFriendApi = coreContext.getApiContext().FriendApi;
const logger = coreContext.context.logger;
const { md5, fileName: _fileName, path, fileSize } = await NTQQFileApi.uploadFile(filePath, ElementType.FILE); const { md5, fileName: _fileName, path, fileSize } = await NTQQFileApi.uploadFile(filePath, ElementType.FILE);
if (fileSize === 0) { if (fileSize === 0) {
throw '文件异常大小为0'; throw '文件异常大小为0';
@ -122,7 +134,13 @@ export class SendMsgElementConstructor {
return element; return element;
} }
static async video(CoreContext: NapCatCore, filePath: string, fileName: string = '', diyThumbPath: string = '', videotype: viedo_type = viedo_type.VIDEO_FORMAT_MP4): Promise<SendVideoElement> { static async video(coreContext: NapCatCore, filePath: string, fileName: string = '', diyThumbPath: string = '', videotype: viedo_type = viedo_type.VIDEO_FORMAT_MP4): Promise<SendVideoElement> {
const NTQQGroupApi = coreContext.getApiContext().GroupApi;
const NTQQUserApi = coreContext.getApiContext().UserApi;
const NTQQFileApi = coreContext.getApiContext().FileApi;
const NTQQMsgApi = coreContext.getApiContext().MsgApi;
const NTQQFriendApi = coreContext.getApiContext().FriendApi;
const logger = coreContext.context.logger;
const { fileName: _fileName, path, fileSize, md5 } = await NTQQFileApi.uploadFile(filePath, ElementType.VIDEO); const { fileName: _fileName, path, fileSize, md5 } = await NTQQFileApi.uploadFile(filePath, ElementType.VIDEO);
if (fileSize === 0) { if (fileSize === 0) {
throw '文件异常大小为0'; throw '文件异常大小为0';
@ -138,10 +156,10 @@ export class SendMsgElementConstructor {
filePath filePath
}; };
try { try {
videoInfo = await getVideoInfo(path); videoInfo = await getVideoInfo(path, logger);
//logDebug('视频信息', videoInfo); //logDebug('视频信息', videoInfo);
} catch (e) { } catch (e) {
logError('获取视频信息失败', e); logger.logError('获取视频信息失败', e);
} }
const createThumb = new Promise<string>((resolve, reject) => { const createThumb = new Promise<string>((resolve, reject) => {
const thumbFileName = `${md5}_0.png`; const thumbFileName = `${md5}_0.png`;
@ -150,7 +168,7 @@ export class SendMsgElementConstructor {
.on('end', () => { .on('end', () => {
}) })
.on('error', (err) => { .on('error', (err) => {
logDebug('获取视频封面失败,使用默认封面', err); logger.logDebug('获取视频封面失败,使用默认封面', err);
if (diyThumbPath) { if (diyThumbPath) {
fs.copyFile(diyThumbPath, thumbPath).then(() => { fs.copyFile(diyThumbPath, thumbPath).then(() => {
resolve(thumbPath); resolve(thumbPath);
@ -206,8 +224,14 @@ export class SendMsgElementConstructor {
return element; return element;
} }
static async ptt(CoreContext: NapCatCore, pttPath: string): Promise<SendPttElement> { static async ptt(coreContext: NapCatCore, pttPath: string): Promise<SendPttElement> {
const { converted, path: silkPath, duration } = await encodeSilk(pttPath); const NTQQGroupApi = coreContext.getApiContext().GroupApi;
const NTQQUserApi = coreContext.getApiContext().UserApi;
const NTQQFileApi = coreContext.getApiContext().FileApi;
const NTQQMsgApi = coreContext.getApiContext().MsgApi;
const NTQQFriendApi = coreContext.getApiContext().FriendApi;
const logger = coreContext.context.logger;
const { converted, path: silkPath, duration } = await encodeSilk(pttPath, coreContext.NapCatTempPath, coreContext.context.logger);
// log("生成语音", silkPath, duration); // log("生成语音", silkPath, duration);
if (!silkPath) { if (!silkPath) {
throw '语音转换失败, 请检查语音文件是否正常'; throw '语音转换失败, 请检查语音文件是否正常';