From 68f5deedff6cbbc0f02439542c1a38f5a469d6b4 Mon Sep 17 00:00:00 2001 From: Clansty Date: Tue, 8 Apr 2025 02:48:48 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E7=A7=BB=E5=8A=A8=E7=BE=A4?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/packet/context/operationContext.ts | 7 ++++ .../transformer/action/MoveGroupFile.ts | 35 +++++++++++++++++++ src/core/packet/transformer/action/index.ts | 1 + src/onebot/action/extends/MoveGroupFile.ts | 32 +++++++++++++++++ src/onebot/action/index.ts | 2 ++ src/onebot/action/router.ts | 1 + 6 files changed, 78 insertions(+) create mode 100644 src/core/packet/transformer/action/MoveGroupFile.ts create mode 100644 src/onebot/action/extends/MoveGroupFile.ts 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', From 4180c2d754952d115dba121b4fe3124e5d8cde56 Mon Sep 17 00:00:00 2001 From: Clansty Date: Tue, 8 Apr 2025 04:40:34 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E7=BE=A4=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=BD=AC=E5=AD=98=E6=B0=B8=E4=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/group.ts | 4 +++ .../services/NodeIKernelRichMediaService.ts | 12 ++++++- src/onebot/action/extends/MoveGroupFile.ts | 2 +- src/onebot/action/extends/TransGroupFile.ts | 34 +++++++++++++++++++ src/onebot/action/index.ts | 2 ++ src/onebot/action/router.ts | 4 ++- 6 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/onebot/action/extends/TransGroupFile.ts diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 80555d98..423e1e2d 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -218,6 +218,10 @@ export class NTQQGroupApi { return this.context.session.getRichMediaService().deleteGroupFolder(groupCode, folderId); } + async transGroupFile(groupCode: string, fileId: string) { + return this.context.session.getRichMediaService().transGroupFile(groupCode, fileId); + } + async addGroupEssence(groupCode: string, msgId: string) { const MsgData = await this.context.session.getMsgService().getMsgsIncludeSelf({ chatType: 2, diff --git a/src/core/services/NodeIKernelRichMediaService.ts b/src/core/services/NodeIKernelRichMediaService.ts index 83ebeaf8..684ea9ab 100644 --- a/src/core/services/NodeIKernelRichMediaService.ts +++ b/src/core/services/NodeIKernelRichMediaService.ts @@ -200,7 +200,17 @@ export interface NodeIKernelRichMediaService { moveGroupFile(arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown, arg5: unknown): unknown; - transGroupFile(arg1: unknown, arg2: unknown): unknown; + transGroupFile(groupCode: string, fileId: string): Promise; searchGroupFile( keywords: Array, diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index af71b339..8de368d0 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -17,7 +17,7 @@ interface MoveGroupFileResponse { } export class MoveGroupFile extends GetPacketStatusDepends { - override actionName = ActionName.GOCQHTTP_MoveGroupFile; + override actionName = ActionName.MoveGroupFile; override payloadSchema = SchemaData; async _handle(payload: Payload) { diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts new file mode 100644 index 00000000..35b3275a --- /dev/null +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -0,0 +1,34 @@ +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(), +}); + +type Payload = Static; + +interface TransGroupFileResponse { + ok: boolean; +} + +export class TransGroupFile extends GetPacketStatusDepends { + override actionName = ActionName.TransGroupFile; + override payloadSchema = SchemaData; + + async _handle(payload: Payload) { + const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file_id) || FileNapCatOneBotUUID.decodeModelId(payload.file_id); + if (contextMsgFile?.fileUUID) { + const result = await this.core.apis.GroupApi.transGroupFile(payload.group_id.toString(), contextMsgFile.fileUUID); + if (result.transGroupFileResult.result.retCode === 0) { + return { + ok: true + }; + } + throw new Error(result.transGroupFileResult.result.retMsg); + } + throw new Error('real fileUUID not found!'); + } +} diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index 67fce31d..b5e1e09d 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -110,6 +110,7 @@ import { GetPrivateFileUrl } from './file/GetPrivateFileUrl'; import { GetUnidirectionalFriendList } from './extends/GetUnidirectionalFriendList'; import SetGroupRemark from './extends/SetGroupRemark'; import { MoveGroupFile } from './extends/MoveGroupFile'; +import { TransGroupFile } from './extends/TransGroupFile'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -134,6 +135,7 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new SendGroupSign(obContext, core), new GetClientkey(obContext, core), new MoveGroupFile(obContext, core), + new TransGroupFile(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 88329e75..200fe84e 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -85,7 +85,6 @@ 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', @@ -131,6 +130,9 @@ export const ActionName = { GetRkey: 'nc_get_rkey', GetGroupShutList: 'get_group_shut_list', + MoveGroupFile: 'move_group_file', + TransGroupFile: 'trans_group_file', + GetGuildList: 'get_guild_list', GetGuildProfile: 'get_guild_service_profile', From 31eb09edeff81efe226fc17d9cc823783e91e6ea Mon Sep 17 00:00:00 2001 From: Clansty Date: Tue, 8 Apr 2025 05:14:53 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E7=BE=A4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/packet/context/operationContext.ts | 7 ++++ .../transformer/action/RenameGroupFile.ts | 34 +++++++++++++++++++ src/core/packet/transformer/action/index.ts | 1 + src/onebot/action/extends/MoveGroupFile.ts | 5 +-- src/onebot/action/extends/RenameGroupFile.ts | 33 ++++++++++++++++++ src/onebot/action/index.ts | 2 ++ src/onebot/action/router.ts | 1 + 7 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 src/core/packet/transformer/action/RenameGroupFile.ts create mode 100644 src/onebot/action/extends/RenameGroupFile.ts diff --git a/src/core/packet/context/operationContext.ts b/src/core/packet/context/operationContext.ts index 9e32daaa..0e558058 100644 --- a/src/core/packet/context/operationContext.ts +++ b/src/core/packet/context/operationContext.ts @@ -161,6 +161,13 @@ export class PacketOperationContext { return res.move.retCode; } + async RenameGroupFile(groupUin: number, fileUUID: string, currentParentDirectory: string, newName: string) { + const req = trans.RenameGroupFile.build(groupUin, fileUUID, currentParentDirectory, newName); + const resp = await this.context.client.sendOidbPacket(req, true); + const res = trans.RenameGroupFile.parse(resp); + return res.rename.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/RenameGroupFile.ts b/src/core/packet/transformer/action/RenameGroupFile.ts new file mode 100644 index 00000000..2cbaeacd --- /dev/null +++ b/src/core/packet/transformer/action/RenameGroupFile.ts @@ -0,0 +1,34 @@ +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 RenameGroupFile extends PacketTransformer { + constructor() { + super(); + } + + build(groupUin: number, fileUUID: string, currentParentDirectory: string, newName: string): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ + rename: { + groupUin: groupUin, + busId: 102, + fileId: fileUUID, + parentFolder: currentParentDirectory, + newFileName: newName, + } + }); + return OidbBase.build(0x6D6, 4, body, true, false); + } + + parse(data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); + if (res.rename.retCode !== 0) { + throw new Error(`sendGroupFileRenameReq error: ${res.rename.clientWording} (code=${res.rename.retCode})`); + } + return res; + } +} + +export default new RenameGroupFile(); diff --git a/src/core/packet/transformer/action/index.ts b/src/core/packet/transformer/action/index.ts index 317b7167..03af3f35 100644 --- a/src/core/packet/transformer/action/index.ts +++ b/src/core/packet/transformer/action/index.ts @@ -7,3 +7,4 @@ export { default as SendPoke } from './SendPoke'; export { default as SetSpecialTitle } from './SetSpecialTitle'; export { default as ImageOCR } from './ImageOCR'; export { default as MoveGroupFile } from './MoveGroupFile'; +export { default as RenameGroupFile } from './RenameGroupFile'; diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index 8de368d0..110551bc 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -13,7 +13,7 @@ const SchemaData = Type.Object({ type Payload = Static; interface MoveGroupFileResponse { - retcode: number; + ok: boolean; } export class MoveGroupFile extends GetPacketStatusDepends { @@ -23,8 +23,9 @@ export class MoveGroupFile extends GetPacketStatusDepends; + +interface RenameGroupFileResponse { + ok: boolean; +} + +export class RenameGroupFile extends GetPacketStatusDepends { + override actionName = ActionName.RenameGroupFile; + override payloadSchema = SchemaData; + + async _handle(payload: Payload) { + const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file_id) || FileNapCatOneBotUUID.decodeModelId(payload.file_id); + if (contextMsgFile?.fileUUID) { + await this.core.apis.PacketApi.pkt.operation.RenameGroupFile(+payload.group_id, contextMsgFile.fileUUID, payload.current_parent_directory, payload.new_name); + return { + ok: true, + }; + } + throw new Error('real fileUUID not found!'); + } +} diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index b5e1e09d..86f4f08a 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -111,6 +111,7 @@ import { GetUnidirectionalFriendList } from './extends/GetUnidirectionalFriendLi import SetGroupRemark from './extends/SetGroupRemark'; import { MoveGroupFile } from './extends/MoveGroupFile'; import { TransGroupFile } from './extends/TransGroupFile'; +import { RenameGroupFile } from './extends/RenameGroupFile'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -135,6 +136,7 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new SendGroupSign(obContext, core), new GetClientkey(obContext, core), new MoveGroupFile(obContext, core), + new RenameGroupFile(obContext, core), new TransGroupFile(obContext, core), // onebot11 new SendLike(obContext, core), diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index 200fe84e..2c41ffb3 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -132,6 +132,7 @@ export const ActionName = { MoveGroupFile: 'move_group_file', TransGroupFile: 'trans_group_file', + RenameGroupFile: 'rename_group_file', GetGuildList: 'get_guild_list', GetGuildProfile: 'get_guild_service_profile',