diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index 41cde7d7..7fa05c62 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -2,7 +2,6 @@ import BaseAction from '../BaseAction'; import { ActionName } from '../types'; import { ChatType } from '@/core/entities'; import fs from 'fs'; -import { sendMsg } from '@/onebot/action/msg/SendMsg'; import { uri2local } from '@/common/utils/file'; import { FromSchema, JSONSchema } from 'json-schema-to-ts'; @@ -34,7 +33,7 @@ export default class GoCQHTTPUploadGroupFile extends BaseAction { throw new Error(downloadResult.errMsg); } const sendFileEle = await this.core.apis.FileApi.createValidSendFileElement(downloadResult.path, payload.name, payload.folder_id); - await sendMsg(this.core, { + await this.obContext.apiContext.MsgApi.sendMsgWithOb11UniqueId({ chatType: ChatType.KCHATTYPEGROUP, peerUid: payload.group_id.toString(), }, [sendFileEle], [], true); diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index f2e7b34f..1d283c83 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -2,7 +2,6 @@ import BaseAction from '../BaseAction'; import { ActionName } from '../types'; import { ChatType, Peer, SendFileElement } from '@/core/entities'; import fs from 'fs'; -import { sendMsg } from '@/onebot/action/msg/SendMsg'; import { uri2local } from '@/common/utils/file'; import { FromSchema, JSONSchema } from 'json-schema-to-ts'; @@ -37,7 +36,6 @@ export default class GoCQHTTPUploadPrivateFile extends BaseAction } async _handle(payload: Payload): Promise { - const peer = await this.getPeer(payload); let file = payload.file; if (fs.existsSync(file)) { file = `file://${file}`; @@ -47,7 +45,7 @@ export default class GoCQHTTPUploadPrivateFile extends BaseAction throw new Error(downloadResult.errMsg); } const sendFileEle: SendFileElement = await this.core.apis.FileApi.createValidSendFileElement(downloadResult.path, payload.name); - await sendMsg(this.core, peer, [sendFileEle], [], true); + await this.obContext.apiContext.MsgApi.sendMsgWithOb11UniqueId(await this.getPeer(payload), [sendFileEle], [], true); return null; } } diff --git a/src/onebot/action/msg/SendMsg.ts b/src/onebot/action/msg/SendMsg.ts index 701376bc..618b1287 100644 --- a/src/onebot/action/msg/SendMsg.ts +++ b/src/onebot/action/msg/SendMsg.ts @@ -6,8 +6,6 @@ import { OB11PostSendMsg, } from '@/onebot/types'; import { ActionName, BaseCheckResult } from '@/onebot/action/types'; -import fs from 'node:fs'; -import fsPromise from 'node:fs/promises'; import { decodeCQCode } from '@/onebot/helper/cqcode'; import { MessageUnique } from '@/common/utils/MessageUnique'; import { ChatType, ElementType, NapCatCore, Peer, RawMessage, SendMessageElement } from '@/core'; @@ -32,54 +30,6 @@ export function normalize(message: OB11MessageMixType, autoEscape = false): OB11 ) : Array.isArray(message) ? message : [message]; } -export async function sendMsg(core: NapCatCore, peer: Peer, sendElements: SendMessageElement[], deleteAfterSentFiles: string[], waitComplete = true) { - const NTQQMsgApi = core.apis.MsgApi; - const logger = core.context.logger; - if (!sendElements.length) { - throw new Error('消息体无法解析, 请检查是否发送了不支持的消息类型'); - } - let totalSize = 0; - let timeout = 10000; - try { - for (const fileElement of sendElements) { - if (fileElement.elementType === ElementType.PTT) { - totalSize += fs.statSync(fileElement.pttElement.filePath).size; - } - if (fileElement.elementType === ElementType.FILE) { - totalSize += fs.statSync(fileElement.fileElement.filePath).size; - } - if (fileElement.elementType === ElementType.VIDEO) { - totalSize += fs.statSync(fileElement.videoElement.filePath).size; - } - if (fileElement.elementType === ElementType.PIC) { - totalSize += fs.statSync(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) { - logger.logError('发送消息计算预计时间异常', e); - } - const returnMsg = await NTQQMsgApi.sendMsg(peer, sendElements, waitComplete, timeout); - try { - returnMsg!.id = MessageUnique.createMsg({ - chatType: peer.chatType, - guildId: '', - peerUid: peer.peerUid, - }, returnMsg!.msgId); - } catch (e: any) { - logger.logDebug('发送消息id获取失败', e); - returnMsg!.id = 0; - } - deleteAfterSentFiles.map((f) => { - fsPromise.unlink(f).then().catch(e => logger.logError('发送消息删除文件失败', e)); - }); - return returnMsg; -} - async function createContext(core: NapCatCore, payload: OB11PostSendMsg, contextMode: ContextMode): Promise { // This function determines the type of message by the existence of user_id / group_id, // not message_type. @@ -189,7 +139,7 @@ export class SendMsg extends BaseAction { const { sendElements, deleteAfterSentFiles } = await this.obContext.apiContext.MsgApi .createSendElements(messages, peer); - const returnMsg = await sendMsg(this.core, peer, sendElements, deleteAfterSentFiles); + const returnMsg = await this.obContext.apiContext.MsgApi.sendMsgWithOb11UniqueId(peer, sendElements, deleteAfterSentFiles); return { message_id: returnMsg!.id! }; } @@ -238,7 +188,7 @@ export class SendMsg extends BaseAction { const AllElement: SendMessageElement[][] = [MixElement, ...SingleElement].filter(e => e !== undefined && e.length !== 0); const MsgNodeList: Promise[] = []; for (const sendElementsSplitElement of AllElement) { - MsgNodeList.push(sendMsg(this.core, selfPeer, sendElementsSplitElement, [], true).catch(_ => undefined)); + MsgNodeList.push(this.obContext.apiContext.MsgApi.sendMsgWithOb11UniqueId(selfPeer, sendElementsSplitElement, [], true).catch(_ => undefined)); } (await Promise.allSettled(MsgNodeList)).map((result) => { if (result.status === 'fulfilled' && result.value) { diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index cf96ce2b..b15843bc 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -12,7 +12,8 @@ import { NapCatCore, Peer, RawMessage, - SendMessageElement, SendTextElement, + SendMessageElement, + SendTextElement, } from '@/core'; import faceConfig from '@/core/external/face_config.json'; import { @@ -21,13 +22,15 @@ import { OB11MessageData, OB11MessageDataType, OB11MessageFileBase, - OB11MessageForward + OB11MessageForward, } from '@/onebot'; import { OB11Constructor } from '../helper'; import { EventType } from '@/onebot/event/OB11BaseEvent'; import { encodeCQCode } from '@/onebot/helper/cqcode'; import { uri2local } from '@/common/utils/file'; import { RequestUtil } from '@/common/utils/request'; +import fs from 'node:fs'; +import fsPromise from 'node:fs/promises'; type RawToOb11Converters = { [Key in keyof MessageElement as Key extends `${string}Element` ? Key : never]: ( @@ -756,6 +759,52 @@ export class OneBotMsgApi { return { sendElements, deleteAfterSentFiles }; } + async sendMsgWithOb11UniqueId(peer: Peer, sendElements: SendMessageElement[], deleteAfterSentFiles: string[], waitComplete = true) { + if (!sendElements.length) { + throw new Error('消息体无法解析, 请检查是否发送了不支持的消息类型'); + } + let totalSize = 0; + let timeout = 10000; + try { + for (const fileElement of sendElements) { + if (fileElement.elementType === ElementType.PTT) { + totalSize += fs.statSync(fileElement.pttElement.filePath).size; + } + if (fileElement.elementType === ElementType.FILE) { + totalSize += fs.statSync(fileElement.fileElement.filePath).size; + } + if (fileElement.elementType === ElementType.VIDEO) { + totalSize += fs.statSync(fileElement.videoElement.filePath).size; + } + if (fileElement.elementType === ElementType.PIC) { + totalSize += fs.statSync(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); + } + const returnMsg = await this.core.apis.MsgApi.sendMsg(peer, sendElements, waitComplete, timeout); + try { + returnMsg!.id = MessageUnique.createMsg({ + chatType: peer.chatType, + guildId: '', + peerUid: peer.peerUid, + }, returnMsg!.msgId); + } catch (e: any) { + this.core.context.logger.logDebug('发送消息id获取失败', e); + returnMsg!.id = 0; + } + deleteAfterSentFiles.forEach(file => { + fsPromise.unlink(file).then().catch(e => this.core.context.logger.logError('发送消息删除文件失败', e)); + }); + return returnMsg; + } + private async handleOb11FileLikeMessage( { data: inputdata }: OB11MessageFileBase, { deleteAfterSentFiles }: MessageContext, diff --git a/src/onebot/helper/quick.ts b/src/onebot/helper/quick.ts index 6981f969..027b4251 100644 --- a/src/onebot/helper/quick.ts +++ b/src/onebot/helper/quick.ts @@ -1,4 +1,4 @@ -import { ChatType, Group, GroupRequestOperateTypes, NapCatCore, Peer } from '@/core'; +import { ChatType, GroupRequestOperateTypes, NapCatCore, Peer } from '@/core'; import { OB11FriendRequestEvent } from '../event/request/OB11FriendRequest'; import { OB11GroupRequestEvent } from '../event/request/OB11GroupRequest'; import { @@ -13,7 +13,7 @@ import { QuickActionGroupRequest, } from '../types'; import { isNull } from '@/common/utils/helper'; -import { normalize, sendMsg } from '../action/msg/SendMsg'; +import { normalize } from '../action/msg/SendMsg'; import { NapCatOneBot11Adapter } from '..'; async function handleMsg(core: NapCatCore, obContext: NapCatOneBot11Adapter, msg: OB11Message, quickAction: QuickAction) { @@ -32,11 +32,11 @@ async function handleMsg(core: NapCatCore, obContext: NapCatOneBot11Adapter, msg peer.peerUid = msg.group_id!.toString(); } if (reply) { - let group: Group | undefined; + // let group: Group | undefined; let replyMessage: OB11MessageData[] = []; if (msg.message_type == 'group') { - group = await core.apis.GroupApi.getGroup(msg.group_id!.toString()); + // group = await core.apis.GroupApi.getGroup(msg.group_id!.toString()); replyMessage.push({ type: 'reply', data: { @@ -54,7 +54,7 @@ async function handleMsg(core: NapCatCore, obContext: NapCatOneBot11Adapter, msg } replyMessage = replyMessage.concat(normalize(reply, quickAction.auto_escape)); const { sendElements, deleteAfterSentFiles } = await obContext.apiContext.MsgApi.createSendElements(replyMessage, peer); - sendMsg(core, peer, sendElements, deleteAfterSentFiles, false).then().catch(core.context.logger.logError); + obContext.apiContext.MsgApi.sendMsgWithOb11UniqueId(peer, sendElements, deleteAfterSentFiles, false).then().catch(core.context.logger.logError); } }