mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
refactor: make sendMsg
(WithOb11UniqueId
) an instance method
This commit is contained in:
@@ -2,7 +2,6 @@ import BaseAction from '../BaseAction';
|
|||||||
import { ActionName } from '../types';
|
import { ActionName } from '../types';
|
||||||
import { ChatType } from '@/core/entities';
|
import { ChatType } from '@/core/entities';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import { sendMsg } from '@/onebot/action/msg/SendMsg';
|
|
||||||
import { uri2local } from '@/common/utils/file';
|
import { uri2local } from '@/common/utils/file';
|
||||||
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
||||||
|
|
||||||
@@ -34,7 +33,7 @@ export default class GoCQHTTPUploadGroupFile extends BaseAction<Payload, null> {
|
|||||||
throw new Error(downloadResult.errMsg);
|
throw new Error(downloadResult.errMsg);
|
||||||
}
|
}
|
||||||
const sendFileEle = await this.core.apis.FileApi.createValidSendFileElement(downloadResult.path, payload.name, payload.folder_id);
|
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,
|
chatType: ChatType.KCHATTYPEGROUP,
|
||||||
peerUid: payload.group_id.toString(),
|
peerUid: payload.group_id.toString(),
|
||||||
}, [sendFileEle], [], true);
|
}, [sendFileEle], [], true);
|
||||||
|
@@ -2,7 +2,6 @@ import BaseAction from '../BaseAction';
|
|||||||
import { ActionName } from '../types';
|
import { ActionName } from '../types';
|
||||||
import { ChatType, Peer, SendFileElement } from '@/core/entities';
|
import { ChatType, Peer, SendFileElement } from '@/core/entities';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import { sendMsg } from '@/onebot/action/msg/SendMsg';
|
|
||||||
import { uri2local } from '@/common/utils/file';
|
import { uri2local } from '@/common/utils/file';
|
||||||
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
||||||
|
|
||||||
@@ -37,7 +36,6 @@ export default class GoCQHTTPUploadPrivateFile extends BaseAction<Payload, null>
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _handle(payload: Payload): Promise<null> {
|
async _handle(payload: Payload): Promise<null> {
|
||||||
const peer = await this.getPeer(payload);
|
|
||||||
let file = payload.file;
|
let file = payload.file;
|
||||||
if (fs.existsSync(file)) {
|
if (fs.existsSync(file)) {
|
||||||
file = `file://${file}`;
|
file = `file://${file}`;
|
||||||
@@ -47,7 +45,7 @@ export default class GoCQHTTPUploadPrivateFile extends BaseAction<Payload, null>
|
|||||||
throw new Error(downloadResult.errMsg);
|
throw new Error(downloadResult.errMsg);
|
||||||
}
|
}
|
||||||
const sendFileEle: SendFileElement = await this.core.apis.FileApi.createValidSendFileElement(downloadResult.path, payload.name);
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,8 +6,6 @@ import {
|
|||||||
OB11PostSendMsg,
|
OB11PostSendMsg,
|
||||||
} from '@/onebot/types';
|
} from '@/onebot/types';
|
||||||
import { ActionName, BaseCheckResult } from '@/onebot/action/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 { decodeCQCode } from '@/onebot/helper/cqcode';
|
||||||
import { MessageUnique } from '@/common/utils/MessageUnique';
|
import { MessageUnique } from '@/common/utils/MessageUnique';
|
||||||
import { ChatType, ElementType, NapCatCore, Peer, RawMessage, SendMessageElement } from '@/core';
|
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];
|
) : 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<Peer> {
|
async function createContext(core: NapCatCore, payload: OB11PostSendMsg, contextMode: ContextMode): Promise<Peer> {
|
||||||
// This function determines the type of message by the existence of user_id / group_id,
|
// This function determines the type of message by the existence of user_id / group_id,
|
||||||
// not message_type.
|
// not message_type.
|
||||||
@@ -189,7 +139,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
|
|||||||
|
|
||||||
const { sendElements, deleteAfterSentFiles } = await this.obContext.apiContext.MsgApi
|
const { sendElements, deleteAfterSentFiles } = await this.obContext.apiContext.MsgApi
|
||||||
.createSendElements(messages, peer);
|
.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! };
|
return { message_id: returnMsg!.id! };
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,7 +188,7 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
|
|||||||
const AllElement: SendMessageElement[][] = [MixElement, ...SingleElement].filter(e => e !== undefined && e.length !== 0);
|
const AllElement: SendMessageElement[][] = [MixElement, ...SingleElement].filter(e => e !== undefined && e.length !== 0);
|
||||||
const MsgNodeList: Promise<RawMessage | undefined>[] = [];
|
const MsgNodeList: Promise<RawMessage | undefined>[] = [];
|
||||||
for (const sendElementsSplitElement of AllElement) {
|
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) => {
|
(await Promise.allSettled(MsgNodeList)).map((result) => {
|
||||||
if (result.status === 'fulfilled' && result.value) {
|
if (result.status === 'fulfilled' && result.value) {
|
||||||
|
@@ -12,7 +12,8 @@ import {
|
|||||||
NapCatCore,
|
NapCatCore,
|
||||||
Peer,
|
Peer,
|
||||||
RawMessage,
|
RawMessage,
|
||||||
SendMessageElement, SendTextElement,
|
SendMessageElement,
|
||||||
|
SendTextElement,
|
||||||
} from '@/core';
|
} from '@/core';
|
||||||
import faceConfig from '@/core/external/face_config.json';
|
import faceConfig from '@/core/external/face_config.json';
|
||||||
import {
|
import {
|
||||||
@@ -21,13 +22,15 @@ import {
|
|||||||
OB11MessageData,
|
OB11MessageData,
|
||||||
OB11MessageDataType,
|
OB11MessageDataType,
|
||||||
OB11MessageFileBase,
|
OB11MessageFileBase,
|
||||||
OB11MessageForward
|
OB11MessageForward,
|
||||||
} from '@/onebot';
|
} from '@/onebot';
|
||||||
import { OB11Constructor } from '../helper';
|
import { OB11Constructor } from '../helper';
|
||||||
import { EventType } from '@/onebot/event/OB11BaseEvent';
|
import { EventType } from '@/onebot/event/OB11BaseEvent';
|
||||||
import { encodeCQCode } from '@/onebot/helper/cqcode';
|
import { encodeCQCode } from '@/onebot/helper/cqcode';
|
||||||
import { uri2local } from '@/common/utils/file';
|
import { uri2local } from '@/common/utils/file';
|
||||||
import { RequestUtil } from '@/common/utils/request';
|
import { RequestUtil } from '@/common/utils/request';
|
||||||
|
import fs from 'node:fs';
|
||||||
|
import fsPromise from 'node:fs/promises';
|
||||||
|
|
||||||
type RawToOb11Converters = {
|
type RawToOb11Converters = {
|
||||||
[Key in keyof MessageElement as Key extends `${string}Element` ? Key : never]: (
|
[Key in keyof MessageElement as Key extends `${string}Element` ? Key : never]: (
|
||||||
@@ -756,6 +759,52 @@ export class OneBotMsgApi {
|
|||||||
return { sendElements, deleteAfterSentFiles };
|
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(
|
private async handleOb11FileLikeMessage(
|
||||||
{ data: inputdata }: OB11MessageFileBase,
|
{ data: inputdata }: OB11MessageFileBase,
|
||||||
{ deleteAfterSentFiles }: MessageContext,
|
{ deleteAfterSentFiles }: MessageContext,
|
||||||
|
@@ -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 { OB11FriendRequestEvent } from '../event/request/OB11FriendRequest';
|
||||||
import { OB11GroupRequestEvent } from '../event/request/OB11GroupRequest';
|
import { OB11GroupRequestEvent } from '../event/request/OB11GroupRequest';
|
||||||
import {
|
import {
|
||||||
@@ -13,7 +13,7 @@ import {
|
|||||||
QuickActionGroupRequest,
|
QuickActionGroupRequest,
|
||||||
} from '../types';
|
} from '../types';
|
||||||
import { isNull } from '@/common/utils/helper';
|
import { isNull } from '@/common/utils/helper';
|
||||||
import { normalize, sendMsg } from '../action/msg/SendMsg';
|
import { normalize } from '../action/msg/SendMsg';
|
||||||
import { NapCatOneBot11Adapter } from '..';
|
import { NapCatOneBot11Adapter } from '..';
|
||||||
|
|
||||||
async function handleMsg(core: NapCatCore, obContext: NapCatOneBot11Adapter, msg: OB11Message, quickAction: QuickAction) {
|
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();
|
peer.peerUid = msg.group_id!.toString();
|
||||||
}
|
}
|
||||||
if (reply) {
|
if (reply) {
|
||||||
let group: Group | undefined;
|
// let group: Group | undefined;
|
||||||
let replyMessage: OB11MessageData[] = [];
|
let replyMessage: OB11MessageData[] = [];
|
||||||
|
|
||||||
if (msg.message_type == 'group') {
|
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({
|
replyMessage.push({
|
||||||
type: 'reply',
|
type: 'reply',
|
||||||
data: {
|
data: {
|
||||||
@@ -54,7 +54,7 @@ async function handleMsg(core: NapCatCore, obContext: NapCatOneBot11Adapter, msg
|
|||||||
}
|
}
|
||||||
replyMessage = replyMessage.concat(normalize(reply, quickAction.auto_escape));
|
replyMessage = replyMessage.concat(normalize(reply, quickAction.auto_escape));
|
||||||
const { sendElements, deleteAfterSentFiles } = await obContext.apiContext.MsgApi.createSendElements(replyMessage, peer);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user