import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { ChatType, Peer, SendFileElement, ElementType } from 'napcat-core/types'; import fs from 'fs'; import { uriToLocalFile } from 'napcat-common/src/file'; import { SendMessageContext } from '@/napcat-onebot/api'; import { ContextMode, createContext } from '@/napcat-onebot/action/msg/SendMsg'; import { Static, Type } from '@sinclair/typebox'; import { GoCQHTTPActionsExamples } from '../example/GoCQHTTPActionsExamples'; export const GoCQHTTPUploadPrivateFilePayloadSchema = Type.Object({ user_id: Type.String({ description: '用户 QQ' }), file: Type.String({ description: '资源路径或URL' }), name: Type.String({ description: '文件名' }), upload_file: Type.Boolean({ default: true, description: '是否执行上传' }), }); export type GoCQHTTPUploadPrivateFilePayload = Static; export const GoCQHTTPUploadPrivateFileReturnSchema = Type.Object({ file_id: Type.Union([Type.String(), Type.Null()], { description: '文件 ID' }), }); export type GoCQHTTPUploadPrivateFileResponse = Static; export default class GoCQHTTPUploadPrivateFile extends OneBotAction { override actionName = ActionName.GOCQHTTP_UploadPrivateFile; override payloadSchema = GoCQHTTPUploadPrivateFilePayloadSchema; override returnSchema = GoCQHTTPUploadPrivateFileReturnSchema; override actionSummary = '上传私聊文件'; override actionDescription = '上传本地文件到指定私聊会话中'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.UploadPrivateFile.payload; override returnExample = GoCQHTTPActionsExamples.UploadPrivateFile.response; async getPeer (payload: GoCQHTTPUploadPrivateFilePayload): Promise { if (payload.user_id) { const peerUid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!peerUid) { throw new Error(`私聊${payload.user_id}不存在`); } const isBuddy = await this.core.apis.FriendApi.isBuddy(peerUid); return { chatType: isBuddy ? ChatType.KCHATTYPEC2C : ChatType.KCHATTYPETEMPC2CFROMGROUP, peerUid }; } throw new Error('缺少参数 user_id'); } async _handle (payload: GoCQHTTPUploadPrivateFilePayload): Promise { let file = payload.file; if (fs.existsSync(file)) { file = `file://${file}`; } const downloadResult = await uriToLocalFile(this.core.NapCatTempPath, file); if (!downloadResult.success) { throw new Error(downloadResult.errMsg); } const msgContext: SendMessageContext = { peer: await createContext(this.core, { user_id: payload.user_id.toString(), }, ContextMode.Private), deleteAfterSentFiles: [], }; const sendFileEle: SendFileElement = await this.obContext.apis.FileApi.createValidSendFileElement(msgContext, downloadResult.path, payload.name, '', payload.upload_file); msgContext.deleteAfterSentFiles.push(downloadResult.path); const returnMsg = await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(await this.getPeer(payload), [sendFileEle], msgContext.deleteAfterSentFiles); const fileElement = returnMsg.elements.find(ele => ele.elementType === ElementType.FILE); return { file_id: fileElement?.fileElement?.fileUuid || null, }; } }