mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
refactor: predict time
This commit is contained in:
@@ -891,51 +891,55 @@ export class OneBotMsgApi {
|
|||||||
if (!sendElements.length) {
|
if (!sendElements.length) {
|
||||||
throw new Error('消息体无法解析, 请检查是否发送了不支持的消息类型');
|
throw new Error('消息体无法解析, 请检查是否发送了不支持的消息类型');
|
||||||
}
|
}
|
||||||
let totalSize = 0;
|
|
||||||
let timeout = 10000;
|
const calculateTotalSize = async (elements: SendMessageElement[]): Promise<number> => {
|
||||||
try {
|
const sizePromises = elements.map(async element => {
|
||||||
for (const fileElement of sendElements) {
|
switch (element.elementType) {
|
||||||
if (fileElement.elementType === ElementType.PTT) {
|
case ElementType.PTT:
|
||||||
totalSize += (await fsPromise.stat(fileElement.pttElement.filePath)).size;
|
return (await fsPromise.stat(element.pttElement.filePath)).size;
|
||||||
|
case ElementType.FILE:
|
||||||
|
return (await fsPromise.stat(element.fileElement.filePath)).size;
|
||||||
|
case ElementType.VIDEO:
|
||||||
|
return (await fsPromise.stat(element.videoElement.filePath)).size;
|
||||||
|
case ElementType.PIC:
|
||||||
|
return (await fsPromise.stat(element.picElement.sourcePath)).size;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
if (fileElement.elementType === ElementType.FILE) {
|
});
|
||||||
totalSize += (await fsPromise.stat(fileElement.fileElement.filePath)).size;
|
const sizes = await Promise.all(sizePromises);
|
||||||
}
|
return sizes.reduce((total, size) => total + size, 0);
|
||||||
if (fileElement.elementType === ElementType.VIDEO) {
|
};
|
||||||
totalSize += (await fsPromise.stat(fileElement.videoElement.filePath)).size;
|
|
||||||
}
|
const totalSize = await calculateTotalSize(sendElements).catch(e => {
|
||||||
if (fileElement.elementType === ElementType.PIC) {
|
|
||||||
totalSize += (await fsPromise.stat(fileElement.picElement.sourcePath)).size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//且 PredictTime ((totalSize / 1024 / 512) * 1000)不等于Nan
|
|
||||||
const PredictTime = totalSize / 1024 / 256 * 1000;
|
|
||||||
if (!Number.isNaN(PredictTime)) {
|
|
||||||
timeout += PredictTime;// 10S Basic Timeout + PredictTime( For File 512kb/s )
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
this.core.context.logger.logError('发送消息计算预计时间异常', e);
|
this.core.context.logger.logError('发送消息计算预计时间异常', e);
|
||||||
}
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
const timeout = 10000 + (totalSize / 1024 / 256 * 1000);
|
||||||
|
|
||||||
const returnMsg = await this.core.apis.MsgApi.sendMsg(peer, sendElements, waitComplete, timeout);
|
const returnMsg = await this.core.apis.MsgApi.sendMsg(peer, sendElements, waitComplete, timeout);
|
||||||
if (!returnMsg) throw new Error('发送消息失败');
|
if (!returnMsg) throw new Error('发送消息失败');
|
||||||
|
|
||||||
returnMsg.id = MessageUnique.createUniqueMsgId({
|
returnMsg.id = MessageUnique.createUniqueMsgId({
|
||||||
chatType: peer.chatType,
|
chatType: peer.chatType,
|
||||||
guildId: '',
|
guildId: '',
|
||||||
peerUid: peer.peerUid,
|
peerUid: peer.peerUid,
|
||||||
}, returnMsg.msgId);
|
}, returnMsg.msgId);
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(async () => {
|
||||||
deleteAfterSentFiles.forEach(async file => {
|
const deletePromises = deleteAfterSentFiles.map(async file => {
|
||||||
try {
|
try {
|
||||||
if (await fsPromise.access(file, constants.W_OK).then(() => true).catch(() => false)) {
|
if (await fsPromise.access(file, constants.W_OK).then(() => true).catch(() => false)) {
|
||||||
fsPromise.unlink(file).then().catch(e => this.core.context.logger.logError('发送消息删除文件失败', e));
|
await fsPromise.unlink(file);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (e) {
|
||||||
this.core.context.logger.logError('发送消息删除文件失败', (error as Error).message);
|
this.core.context.logger.logError('发送消息删除文件失败', e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
await Promise.all(deletePromises);
|
||||||
}, 60000);
|
}, 60000);
|
||||||
|
|
||||||
return returnMsg;
|
return returnMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user