diff --git a/src/core/packet/context/operationContext.ts b/src/core/packet/context/operationContext.ts index 4b11a155..9e32daaa 100644 --- a/src/core/packet/context/operationContext.ts +++ b/src/core/packet/context/operationContext.ts @@ -154,6 +154,13 @@ export class PacketOperationContext { return res.result.resId; } + async MoveGroupFile(groupUin: number, fileUUID: string, currentParentDirectory: string, targetParentDirectory: string) { + const req = trans.MoveGroupFile.build(groupUin, fileUUID, currentParentDirectory, targetParentDirectory); + const resp = await this.context.client.sendOidbPacket(req, true); + const res = trans.MoveGroupFile.parse(resp); + return res.move.retCode; + } + async GetGroupFileUrl(groupUin: number, fileUUID: string) { const req = trans.DownloadGroupFile.build(groupUin, fileUUID); const resp = await this.context.client.sendOidbPacket(req, true); diff --git a/src/core/packet/transformer/action/MoveGroupFile.ts b/src/core/packet/transformer/action/MoveGroupFile.ts new file mode 100644 index 00000000..47e1ec47 --- /dev/null +++ b/src/core/packet/transformer/action/MoveGroupFile.ts @@ -0,0 +1,35 @@ +import * as proto from '@/core/packet/transformer/proto'; +import { NapProtoMsg } from '@napneko/nap-proto-core'; +import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base'; +import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; + +class MoveGroupFile extends PacketTransformer { + constructor() { + super(); + } + + build(groupUin: number, fileUUID: string, currentParentDirectory: string, targetParentDirectory: string): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ + move: { + groupUin: groupUin, + appId: 5, + busId: 102, + fileId: fileUUID, + parentDirectory: currentParentDirectory, + targetDirectory: targetParentDirectory, + } + }); + return OidbBase.build(0x6D6, 5, body, true, false); + } + + parse(data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); + if (res.move.retCode !== 0) { + throw new Error(`sendGroupFileMoveReq error: ${res.move.clientWording} (code=${res.move.retCode})`); + } + return res; + } +} + +export default new MoveGroupFile(); diff --git a/src/core/packet/transformer/action/index.ts b/src/core/packet/transformer/action/index.ts index 7f0987d6..317b7167 100644 --- a/src/core/packet/transformer/action/index.ts +++ b/src/core/packet/transformer/action/index.ts @@ -6,3 +6,4 @@ export { default as GetStrangerInfo } from './GetStrangerInfo'; export { default as SendPoke } from './SendPoke'; export { default as SetSpecialTitle } from './SetSpecialTitle'; export { default as ImageOCR } from './ImageOCR'; +export { default as MoveGroupFile } from './MoveGroupFile'; diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts new file mode 100644 index 00000000..af71b339 --- /dev/null +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -0,0 +1,32 @@ +import { ActionName } from '@/onebot/action/router'; +import { FileNapCatOneBotUUID } from '@/common/file-uuid'; +import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; +import { Static, Type } from '@sinclair/typebox'; + +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + file_id: Type.String(), + current_parent_directory: Type.String(), + target_parent_directory: Type.String(), +}); + +type Payload = Static; + +interface MoveGroupFileResponse { + retcode: number; +} + +export class MoveGroupFile extends GetPacketStatusDepends { + override actionName = ActionName.GOCQHTTP_MoveGroupFile; + override payloadSchema = SchemaData; + + async _handle(payload: Payload) { + const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file_id) || FileNapCatOneBotUUID.decodeModelId(payload.file_id); + if (contextMsgFile?.fileUUID) { + return { + retcode: await this.core.apis.PacketApi.pkt.operation.MoveGroupFile(+payload.group_id, contextMsgFile.fileUUID, payload.current_parent_directory, payload.target_parent_directory) + }; + } + throw new Error('real fileUUID not found!'); + } +} diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index f053d5a2..67fce31d 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -109,6 +109,7 @@ import { ClickInlineKeyboardButton } from './extends/ClickInlineKeyboardButton'; import { GetPrivateFileUrl } from './file/GetPrivateFileUrl'; import { GetUnidirectionalFriendList } from './extends/GetUnidirectionalFriendList'; import SetGroupRemark from './extends/SetGroupRemark'; +import { MoveGroupFile } from './extends/MoveGroupFile'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -132,6 +133,7 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new SetGroupSign(obContext, core), new SendGroupSign(obContext, core), new GetClientkey(obContext, core), + new MoveGroupFile(obContext, core), // onebot11 new SendLike(obContext, core), new GetMsg(obContext, core), diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index dc580600..88329e75 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -85,6 +85,7 @@ export const ActionName = { GoCQHTTP_GetGroupRootFiles: 'get_group_root_files', GoCQHTTP_GetGroupFilesByFolder: 'get_group_files_by_folder', GOCQHTTP_GetGroupFileUrl: 'get_group_file_url', + GOCQHTTP_MoveGroupFile: 'move_group_file', GOCQHTTP_UploadPrivateFile: 'upload_private_file', // GOCQHTTP_ReloadEventFilter : 'reload_event_filter', GoCQHTTP_DownloadFile: 'download_file',