diff --git a/src/common/utils/EventTask.ts b/src/common/utils/EventTask.ts index 95193a6e..cf497015 100644 --- a/src/common/utils/EventTask.ts +++ b/src/common/utils/EventTask.ts @@ -163,11 +163,14 @@ export class NTEventWrapper { resolve([retEvent as Awaited>, ...retData!]); } }; - const Timeouter = setTimeout(databack, timeout); + const ListenerNameList = ListenerName.split('/'); const ListenerMainName = ListenerNameList[0]; const ListenerSubName = ListenerNameList[1]; + + const Timeouter = setTimeout(databack, timeout); + const eventCallbak = { timeout: timeout, createtime: Date.now(), @@ -191,7 +194,6 @@ export class NTEventWrapper { this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.set(id, eventCallbak); this.CreatListenerFunction(ListenerMainName); const EventFunc = this.CreatEventFunction(EventName); - //console.log("测试打点", args); retEvent = await EventFunc!(...(args as any[])); }); } diff --git a/src/core/src/apis/msg.ts b/src/core/src/apis/msg.ts index ff143eb9..fb722b17 100644 --- a/src/core/src/apis/msg.ts +++ b/src/core/src/apis/msg.ts @@ -3,10 +3,11 @@ import { friends, groups, selfInfo } from '@/core/data'; import { log, logWarn } from '@/common/utils/log'; import { sleep } from '@/common/utils/helper'; import { napCatCore, NodeIKernelMsgService, NTQQUserApi } from '@/core'; -import { onGroupFileInfoUpdateParamType } from '@/core/listeners'; +import { NodeIKernelMsgListener, onGroupFileInfoUpdateParamType } from '@/core/listeners'; import { GeneralCallResult } from '@/core/services/common'; import { MessageUnique } from '../../../common/utils/MessageUnique'; import { NTEventDispatch } from '@/common/utils/EventTask'; +let MsgSendMode = 0; async function LoadMessageIdList(Peer: Peer, msgId: string) { let msgList = await NTQQMsgApi.getMsgHistory(Peer, msgId, 50); for (let j = 0; j < msgList.msgList.length; j++) { @@ -118,6 +119,9 @@ export class NTQQMsgApi { } static async getMsgsBySeqAndCount(peer: Peer, seq: string, count: number, desc: boolean, z: boolean) { return await napCatCore.session.getMsgService().getMsgsBySeqAndCount(peer, seq, count, desc, z); + } + static async testMode() { + } static async setMsgRead(peer: Peer) { return napCatCore.session.getMsgService().setMsgRead(peer); @@ -149,21 +153,17 @@ export class NTQQMsgApi { peerUid: peer.peerUid }, msgIds); } - static async sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000) { + static async sendMsgV2(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000) { + // 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; + // } let msgId = await NTQQMsgApi.getMsgUnique(await NTQQMsgApi.getServerTime()); - //为MsgId兜底的算法 - if (!msgId || msgId.length == 0) { - 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; - } - msgId = generateMsgId(); - } let data = await NTEventDispatch.CallNormalEvent< (msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map) => Promise, (msgList: RawMessage[]) => void @@ -192,6 +192,41 @@ export class NTQQMsgApi { }); return retMsg; } + static async sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000) { + //实时结算不进行等待 + let msgList = await NTQQMsgApi.getLastestMsgByUids(peer); + let msgSeq = 0; + if (msgList.msgList.length > 0) { + msgSeq = parseInt(msgList.msgList[0].msgSeq); + //console.log(JSON.stringify(msgList.msgList[0], null, 4)); + } + let SendDate = Math.floor(Date.now() / 1000); + let rawMsg: RawMessage | undefined; + let EventListener = NTEventDispatch.RegisterListen('NodeIKernelMsgListener/onAddSendMsg', 1, timeout, (msg: RawMessage) => { + //console.log(JSON.stringify(msg, null, 4)); + if (parseInt(msg.msgTime) < SendDate + timeout / 1000 && msg.peerUid == peer.peerUid && (msgList.msgList[0].msgSeq == msgSeq.toString() || msgSeq == 0)) { + rawMsg = msg; + return true; + } + return false; + }).catch(); + // let EventListener2 = NTEventDispatch.RegisterListen('NodeIKernelMsgListener/onMsgInfoListUpdate', 1, timeout, + // (msgList: RawMessage[]) => { + // for (let msg of msgList) { + // if (msg.peerUid == peer.peerUid && rawMsg && rawMsg.msgId == msg.msgId && msg.sendStatus == 2) { + // rawMsg = msg; + // return true; + // } + // } + // return false; + // }) + await NTEventDispatch.CallNoListenerEvent('NodeIKernelMsgService/sendMsg', timeout, "0", peer, msgElements, new Map()); + await EventListener; + if (rawMsg) { + return rawMsg; + } + throw new Error('发送消息超时'); + } static async getMsgUniqueEx() { let msgId = await NTQQMsgApi.getMsgUnique(await NTQQMsgApi.getServerTime()); return msgId; diff --git a/src/core/src/listeners/NodeIKernelMsgListener.ts b/src/core/src/listeners/NodeIKernelMsgListener.ts index df2ecd69..31e962f1 100644 --- a/src/core/src/listeners/NodeIKernelMsgListener.ts +++ b/src/core/src/listeners/NodeIKernelMsgListener.ts @@ -226,7 +226,7 @@ export interface IKernelMsgListener { } -export interface NodeIKernelMsgListener { +export interface NodeIKernelMsgListener extends IKernelMsgListener { // eslint-disable-next-line @typescript-eslint/no-misused-new new(listener: IKernelMsgListener): NodeIKernelMsgListener; } diff --git a/src/onebot11/action/msg/SendMsg/index.ts b/src/onebot11/action/msg/SendMsg/index.ts index 91a75eb0..ced34a79 100644 --- a/src/onebot11/action/msg/SendMsg/index.ts +++ b/src/onebot11/action/msg/SendMsg/index.ts @@ -40,7 +40,7 @@ export async function sendMsg(peer: Peer, sendElements: SendMessageElement[], de throw ('消息体无法解析, 请检查是否发送了不支持的消息类型'); } let totalSize = 0; - let timeout = 5000; + let timeout = 10000; try { for (const fileElement of sendElements) { if (fileElement.elementType === ElementType.PTT) { @@ -59,7 +59,7 @@ export async function sendMsg(peer: Peer, sendElements: SendMessageElement[], de //且 PredictTime ((totalSize / 1024 / 512) * 1000)不等于Nan const PredictTime = totalSize / 1024 / 256 * 1000; if (!Number.isNaN(PredictTime)) { - timeout += PredictTime;// 5S Basic Timeout + PredictTime( For File 512kb/s ) + timeout += PredictTime;// 10S Basic Timeout + PredictTime( For File 512kb/s ) } } catch (e) { logError('发送消息计算预计时间异常', e); @@ -170,7 +170,7 @@ export class SendMsg extends BaseAction { // log("send msg:", peer, sendElements) const { sendElements, deleteAfterSentFiles } = await createSendElements(messages, group); - console.log(peer, JSON.stringify(sendElements,null,2)); + //console.log(peer, JSON.stringify(sendElements,null,2)); const returnMsg = await sendMsg(peer, sendElements, deleteAfterSentFiles); return { message_id: returnMsg!.id! }; }