diff --git a/src/core/src/apis/msg.ts b/src/core/src/apis/msg.ts index 594602bd..681ac6f9 100644 --- a/src/core/src/apis/msg.ts +++ b/src/core/src/apis/msg.ts @@ -1,8 +1,8 @@ -import { ChatType2, GetFileListParam, Peer, RawMessage, SendMessageElement, SendMsgElementConstructor } from '@/core/entities'; -import { friends, groups, selfInfo } from '@/core/data'; +import { ChatType, ChatType2, GetFileListParam, Peer, RawMessage, SendMessageElement, SendMsgElementConstructor } from '@/core/entities'; +import { friends, getGroupMember, groups, selfInfo } from '@/core/data'; import { log, logWarn } from '@/common/utils/log'; import { sleep } from '@/common/utils/helper'; -import { napCatCore, NTQQUserApi } from '@/core'; +import { napCatCore, NTQQGroupApi, NTQQUserApi } from '@/core'; import { onGroupFileInfoUpdateParamType } from '@/core/listeners'; import { GeneralCallResult } from '@/core/services/common'; import { MessageUnique } from '../../../common/utils/MessageUnique'; @@ -71,6 +71,9 @@ export class NTQQMsgApi { static async FetchLongMsg(peer: Peer, msgId: string) { return napCatCore.session.getMsgService().fetchLongMsg(peer, msgId); } + static async getTempChatInfo(chatType: ChatType2, peerUid: string) { + return napCatCore.session.getMsgService().getTempChatInfo(chatType, peerUid); + } static async PrepareTempChat(toUserUid: string, GroupCode: string, nickname: string) { //By Jadx/Ida Mlikiowa let TempGameSession = { @@ -80,7 +83,7 @@ export class NTQQMsgApi { peerRoleId: "", peerOpenId: "", }; - await napCatCore.session.getMsgService().prepareTempChat({ + return napCatCore.session.getMsgService().prepareTempChat({ chatType: ChatType2.KCHATTYPETEMPC2CFROMGROUP, peerUid: toUserUid, peerNickname: nickname, @@ -202,6 +205,9 @@ export class NTQQMsgApi { }, msgIds); } static async sendMsgV2(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000) { + if (peer.chatType === ChatType.temp) { + //await NTQQMsgApi.PrepareTempChat().then().catch(); + } function generateMsgId() { const timestamp = Math.floor(Date.now() / 1000); const random = Math.floor(Math.random() * Math.pow(2, 32)); @@ -255,7 +261,32 @@ export class NTQQMsgApi { } static async sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000) { //唉? !我有个想法 - let msgId = await NTQQMsgApi.getMsgUnique(peer.chatType, await NTQQMsgApi.getServerTime()); + function generateMsgId() { + const timestamp = Math.floor(Date.now() / 1000); + const random = Math.floor(Math.random() * Math.pow(2, 32)); + const buffer = Buffer.alloc(8); + buffer.writeUInt32BE(timestamp, 0); + buffer.writeUInt32BE(random, 4); + const msgId = BigInt("0x" + buffer.toString('hex')).toString(); + return msgId; + } + // 此处有采用Hack方法 利用数据返回正确得到对应消息 + // 与之前 Peer队列 MsgSeq队列 真正的MsgId并发不同 + // 谨慎采用 目前测试暂无问题 Developer.Mlikiowa + let msgId: string; + try { + msgId = await NTQQMsgApi.getMsgUnique(peer.chatType, await NTQQMsgApi.getServerTime()); + } catch (error) { + //if (!napCatCore.session.getMsgService()['generateMsgUniqueId']) + //兜底识别策略V2 + msgId = generateMsgId(); + } + if (peer.chatType === ChatType.temp && peer.guildId && peer.guildId !== '') { + let member = await getGroupMember(peer.guildId, peer.peerUid!); + if(member){ + await NTQQMsgApi.PrepareTempChat(peer.peerUid,peer.guildId,member.nick); + } + } peer.guildId = msgId; let data = await NTEventDispatch.CallNormalEvent< (msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map) => Promise, diff --git a/src/core/src/data.ts b/src/core/src/data.ts index edeb662d..f0d2351e 100644 --- a/src/core/src/data.ts +++ b/src/core/src/data.ts @@ -80,9 +80,6 @@ export async function getGroupMember(groupQQ: string | number, memberUinOrUid: s } return member; } -// 考虑优化 移入QQ缓存或使用Api直接获取 -export const tempGroupCodeMap: Record = {}; // peerUid => 群号 - // 保留 需要频繁读写 export const stat = { packet_received: 0, diff --git a/src/core/src/services/NodeIKernelMsgService.ts b/src/core/src/services/NodeIKernelMsgService.ts index b1ed8203..fdc42d44 100644 --- a/src/core/src/services/NodeIKernelMsgService.ts +++ b/src/core/src/services/NodeIKernelMsgService.ts @@ -12,6 +12,21 @@ export interface QueryMsgsParams { isReverseOrder: boolean, isIncludeCurrent: boolean } +export interface TmpChatInfoApi { + errMsg: string; + result: number; + tmpChatInfo?: TmpChatInfo; +} + +export interface TmpChatInfo { + chatType: number; + fromNick: string; + groupCode: string; + peerUid: string; + sessionType: number; + sig: string; +} + export interface NodeIKernelMsgService { generateMsgUniqueId(chatType: number, time: string): string; @@ -609,7 +624,7 @@ export interface NodeIKernelMsgService { sendSsoCmdReqByContend(cmd: string, param: string): Promise; //chattype,uid->Promise - getTempChatInfo(ChatType: number, Uid: string): unknown; + getTempChatInfo(ChatType: number, Uid: string): Promise; setContactLocalTop(...args: unknown[]): unknown; diff --git a/src/onebot11/action/msg/SendMsg/index.ts b/src/onebot11/action/msg/SendMsg/index.ts index 94255d01..fdf2f600 100644 --- a/src/onebot11/action/msg/SendMsg/index.ts +++ b/src/onebot11/action/msg/SendMsg/index.ts @@ -67,7 +67,7 @@ export async function sendMsg(peer: Peer, sendElements: SendMessageElement[], de } const returnMsg = await NTQQMsgApi.sendMsg(peer, sendElements, waitComplete, timeout); try { - returnMsg!.id = await MessageUnique.createMsg({ chatType: peer.chatType, guildId: '', peerUid: peer.peerUid }, returnMsg!.msgId); + returnMsg!.id = MessageUnique.createMsg({ chatType: peer.chatType, guildId: '', peerUid: peer.peerUid }, returnMsg!.msgId); } catch (e: any) { logDebug('发送消息id获取失败', e); returnMsg!.id = 0; @@ -94,7 +94,8 @@ async function createContext(payload: OB11PostSendMsg, contextMode: ContextMode) //console.log("[调试代码] UIN:", payload.user_id, " UID:", Uid, " IsBuddy:", isBuddy); return { chatType: isBuddy ? ChatType.friend : ChatType.temp, - peerUid: Uid! + peerUid: Uid!, + guildId: payload.group_id || ''//临时主动发起时需要传入群号 }; } throw '请指定 group_id 或 user_id'; diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts index 353e69e4..263cfc9f 100644 --- a/src/onebot11/constructor.ts +++ b/src/onebot11/constructor.ts @@ -12,6 +12,7 @@ import { import { AtType, ChatType, + ChatType2, FaceIndex, Friend, FriendV2, @@ -42,7 +43,7 @@ import { OB11GroupTitleEvent } from './event/notice/OB11GroupTitleEvent'; import { OB11GroupCardEvent } from './event/notice/OB11GroupCardEvent'; import { OB11GroupDecreaseEvent } from './event/notice/OB11GroupDecreaseEvent'; import { ob11Config } from '@/onebot11/config'; -import { deleteGroup, getGroupMember, groupMembers, selfInfo, tempGroupCodeMap } from '@/core/data'; +import { deleteGroup, getGroupMember, groupMembers, selfInfo } from '@/core/data'; import { NTQQFileApi, NTQQGroupApi, NTQQMsgApi, NTQQUserApi } from '@/core/apis'; import { OB11GroupMsgEmojiLikeEvent } from '@/onebot11/event/notice/OB11MsgEmojiLikeEvent'; import { OB11FriendPokeEvent, OB11GroupPokeEvent } from './event/notice/OB11PokeEvent'; @@ -96,11 +97,15 @@ export class OB11Constructor { //const user = await NTQQUserApi.getUserDetailInfoByUin(msg.senderUin!); //resMsg.sender.nickname = user.info.nick; } - else if (msg.chatType == ChatType.temp) { + else if (msg.chatType as unknown as ChatType2 == ChatType2.KCHATTYPETEMPC2CFROMGROUP) { resMsg.sub_type = 'group'; - const tempGroupCode = tempGroupCodeMap[msg.peerUin]; - if (tempGroupCode) { - resMsg.group_id = parseInt(tempGroupCode); + let ret = await NTQQMsgApi.getTempChatInfo(ChatType2.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) { @@ -210,13 +215,13 @@ export class OB11Constructor { chatType: msg.chatType, guildId: '', }, - msg.msgId, - msg.msgSeq, - msg.senderUid, - element.elementId, - element.elementType.toString(), - FileElement.fileSize, - FileElement.fileName + msg.msgId, + msg.msgSeq, + msg.senderUid, + element.elementId, + element.elementType.toString(), + FileElement.fileSize, + FileElement.fileName ); } else if (element.videoElement) { @@ -227,7 +232,7 @@ export class OB11Constructor { //合并消息内部 应该进行特殊处理 可能需要重写peer 待测试与研究 Mlikiowa Taged TODO } try { - + videoUrl = await NTQQFileApi.getVideoUrl({ chatType: msg.chatType, peerUid: msg.peerUid, @@ -261,13 +266,13 @@ export class OB11Constructor { chatType: msg.chatType, guildId: '', }, - msg.msgId, - msg.msgSeq, - msg.senderUid, - element.elementId, - element.elementType.toString(), - videoElement.fileSize || '0', - videoElement.fileName + msg.msgId, + msg.msgSeq, + msg.senderUid, + element.elementId, + element.elementType.toString(), + videoElement.fileSize || '0', + videoElement.fileName ); } else if (element.pttElement) { @@ -282,13 +287,13 @@ export class OB11Constructor { chatType: msg.chatType, guildId: '', }, - msg.msgId, - msg.msgSeq, - msg.senderUid, - element.elementId, - element.elementType.toString(), - element.pttElement.fileSize || '0', - element.pttElement.fileUuid || '' + msg.msgId, + msg.msgSeq, + msg.senderUid, + element.elementId, + element.elementType.toString(), + element.pttElement.fileSize || '0', + element.pttElement.fileUuid || '' ); //以uuid作为文件名 } diff --git a/src/onebot11/main.ts b/src/onebot11/main.ts index 7fa9b584..4fd75b8f 100644 --- a/src/onebot11/main.ts +++ b/src/onebot11/main.ts @@ -19,7 +19,7 @@ import { OB11Config, ob11Config } from '@/onebot11/config'; import { httpHeart, ob11HTTPServer } from '@/onebot11/server/http'; import { ob11WebsocketServer } from '@/onebot11/server/ws/WebsocketServer'; import { ob11ReverseWebsockets } from '@/onebot11/server/ws/ReverseWebsocket'; -import { getGroup, getGroupMember, groupMembers, selfInfo, tempGroupCodeMap } from '@/core/data'; +import { getGroup, getGroupMember, groupMembers, selfInfo } from '@/core/data'; import { BuddyListener, GroupListener, NodeIKernelBuddyListener } from '@/core/listeners'; import { OB11FriendRequestEvent } from '@/onebot11/event/request/OB11FriendRequest'; import { NTQQGroupApi, NTQQUserApi, WebApi } from '@/core/apis'; @@ -222,9 +222,9 @@ export class NapCatOnebot11 { selfInfo.online = false; }; msgListener.onTempChatInfoUpdate = (tempChatInfo: TempOnRecvParams) => { - if (tempChatInfo.sessionType == 1 && tempChatInfo.chatType == ChatType.temp) { - tempGroupCodeMap[tempChatInfo.peerUid] = tempChatInfo.groupCode; - } + // if (tempChatInfo.sessionType == 1 && tempChatInfo.chatType == ChatType.temp) { + // tempGroupCodeMap[tempChatInfo.peerUid] = tempChatInfo.groupCode; + // } // 临时会话更新 tempGroupCodeMap uid -> source/GroupCode }; msgListener.onRecvMsg = async (msg) => {