refactor: predict time

This commit is contained in:
手瓜一十雪
2024-12-05 14:42:45 +08:00
parent 82afb88e53
commit 7cf3be8333

View File

@@ -891,49 +891,53 @@ 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;