refatcor: sendmsg

This commit is contained in:
手瓜一十雪 2024-07-31 01:12:46 +08:00
parent 8ca0d40f05
commit b783d6f928
4 changed files with 58 additions and 21 deletions

View File

@ -163,11 +163,14 @@ export class NTEventWrapper {
resolve([retEvent as Awaited<ReturnType<EventType>>, ...retData!]); resolve([retEvent as Awaited<ReturnType<EventType>>, ...retData!]);
} }
}; };
const Timeouter = setTimeout(databack, timeout);
const ListenerNameList = ListenerName.split('/'); const ListenerNameList = ListenerName.split('/');
const ListenerMainName = ListenerNameList[0]; const ListenerMainName = ListenerNameList[0];
const ListenerSubName = ListenerNameList[1]; const ListenerSubName = ListenerNameList[1];
const Timeouter = setTimeout(databack, timeout);
const eventCallbak = { const eventCallbak = {
timeout: timeout, timeout: timeout,
createtime: Date.now(), createtime: Date.now(),
@ -191,7 +194,6 @@ export class NTEventWrapper {
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.set(id, eventCallbak); this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.set(id, eventCallbak);
this.CreatListenerFunction(ListenerMainName); this.CreatListenerFunction(ListenerMainName);
const EventFunc = this.CreatEventFunction<EventType>(EventName); const EventFunc = this.CreatEventFunction<EventType>(EventName);
//console.log("测试打点", args);
retEvent = await EventFunc!(...(args as any[])); retEvent = await EventFunc!(...(args as any[]));
}); });
} }

View File

@ -3,10 +3,11 @@ import { friends, groups, selfInfo } from '@/core/data';
import { log, logWarn } from '@/common/utils/log'; import { log, logWarn } from '@/common/utils/log';
import { sleep } from '@/common/utils/helper'; import { sleep } from '@/common/utils/helper';
import { napCatCore, NodeIKernelMsgService, NTQQUserApi } from '@/core'; import { napCatCore, NodeIKernelMsgService, NTQQUserApi } from '@/core';
import { onGroupFileInfoUpdateParamType } from '@/core/listeners'; import { NodeIKernelMsgListener, onGroupFileInfoUpdateParamType } from '@/core/listeners';
import { GeneralCallResult } from '@/core/services/common'; import { GeneralCallResult } from '@/core/services/common';
import { MessageUnique } from '../../../common/utils/MessageUnique'; import { MessageUnique } from '../../../common/utils/MessageUnique';
import { NTEventDispatch } from '@/common/utils/EventTask'; import { NTEventDispatch } from '@/common/utils/EventTask';
let MsgSendMode = 0;
async function LoadMessageIdList(Peer: Peer, msgId: string) { async function LoadMessageIdList(Peer: Peer, msgId: string) {
let msgList = await NTQQMsgApi.getMsgHistory(Peer, msgId, 50); let msgList = await NTQQMsgApi.getMsgHistory(Peer, msgId, 50);
for (let j = 0; j < msgList.msgList.length; j++) { 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) { static async getMsgsBySeqAndCount(peer: Peer, seq: string, count: number, desc: boolean, z: boolean) {
return await napCatCore.session.getMsgService().getMsgsBySeqAndCount(peer, seq, count, desc, z); return await napCatCore.session.getMsgService().getMsgsBySeqAndCount(peer, seq, count, desc, z);
}
static async testMode() {
} }
static async setMsgRead(peer: Peer) { static async setMsgRead(peer: Peer) {
return napCatCore.session.getMsgService().setMsgRead(peer); return napCatCore.session.getMsgService().setMsgRead(peer);
@ -149,21 +153,17 @@ export class NTQQMsgApi {
peerUid: peer.peerUid peerUid: peer.peerUid
}, msgIds); }, 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()); 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< let data = await NTEventDispatch.CallNormalEvent<
(msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map<any, any>) => Promise<unknown>, (msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map<any, any>) => Promise<unknown>,
(msgList: RawMessage[]) => void (msgList: RawMessage[]) => void
@ -192,6 +192,41 @@ export class NTQQMsgApi {
}); });
return retMsg; 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']>('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']>('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']>('NodeIKernelMsgService/sendMsg', timeout, "0", peer, msgElements, new Map());
await EventListener;
if (rawMsg) {
return rawMsg;
}
throw new Error('发送消息超时');
}
static async getMsgUniqueEx() { static async getMsgUniqueEx() {
let msgId = await NTQQMsgApi.getMsgUnique(await NTQQMsgApi.getServerTime()); let msgId = await NTQQMsgApi.getMsgUnique(await NTQQMsgApi.getServerTime());
return msgId; return msgId;

View File

@ -226,7 +226,7 @@ export interface IKernelMsgListener {
} }
export interface NodeIKernelMsgListener { export interface NodeIKernelMsgListener extends IKernelMsgListener {
// eslint-disable-next-line @typescript-eslint/no-misused-new // eslint-disable-next-line @typescript-eslint/no-misused-new
new(listener: IKernelMsgListener): NodeIKernelMsgListener; new(listener: IKernelMsgListener): NodeIKernelMsgListener;
} }

View File

@ -40,7 +40,7 @@ export async function sendMsg(peer: Peer, sendElements: SendMessageElement[], de
throw ('消息体无法解析, 请检查是否发送了不支持的消息类型'); throw ('消息体无法解析, 请检查是否发送了不支持的消息类型');
} }
let totalSize = 0; let totalSize = 0;
let timeout = 5000; let timeout = 10000;
try { try {
for (const fileElement of sendElements) { for (const fileElement of sendElements) {
if (fileElement.elementType === ElementType.PTT) { if (fileElement.elementType === ElementType.PTT) {
@ -59,7 +59,7 @@ export async function sendMsg(peer: Peer, sendElements: SendMessageElement[], de
//且 PredictTime ((totalSize / 1024 / 512) * 1000)不等于Nan //且 PredictTime ((totalSize / 1024 / 512) * 1000)不等于Nan
const PredictTime = totalSize / 1024 / 256 * 1000; const PredictTime = totalSize / 1024 / 256 * 1000;
if (!Number.isNaN(PredictTime)) { 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) { } catch (e) {
logError('发送消息计算预计时间异常', e); logError('发送消息计算预计时间异常', e);
@ -170,7 +170,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
// log("send msg:", peer, sendElements) // log("send msg:", peer, sendElements)
const { sendElements, deleteAfterSentFiles } = await createSendElements(messages, group); 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); const returnMsg = await sendMsg(peer, sendElements, deleteAfterSentFiles);
return { message_id: returnMsg!.id! }; return { message_id: returnMsg!.id! };
} }