From b69352f6a10ec4b1da26d73dfe031953a3e9723e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 14:50:58 +0800 Subject: [PATCH 01/17] Add payload and return schemas to OneBot actions Introduced explicit payloadSchema and returnSchema definitions for all OneBotAction classes using @sinclair/typebox. This improves type safety, API documentation, and validation for action payloads and return values. Also refactored method signatures and types for consistency across the codebase. --- packages/napcat-onebot/action/OneBotAction.ts | 9 +- .../napcat-onebot/action/extends/BotExit.ts | 3 + .../extends/ClickInlineKeyboardButton.ts | 25 +++--- .../action/extends/CreateCollection.ts | 19 +++-- .../action/extends/DelGroupAlbumMedia.ts | 21 +++-- .../action/extends/DoGroupAlbumComment.ts | 19 +++-- .../action/extends/FetchCustomFace.ts | 17 ++-- .../action/extends/FetchEmojiLike.ts | 40 ++++++--- .../action/extends/GetAiCharacters.ts | 39 +++++---- .../action/extends/GetClientkey.ts | 13 ++- .../action/extends/GetCollectionList.ts | 19 +++-- .../action/extends/GetEmojiLikes.ts | 1 + .../action/extends/GetFriendWithCategory.ts | 21 ++++- .../action/extends/GetGroupAddRequest.ts | 27 +++++- .../action/extends/GetGroupAlbumMediaList.ts | 21 +++-- .../action/extends/GetGroupInfoEx.ts | 17 ++-- .../action/extends/GetMiniAppArk.ts | 68 ++++++++------- .../action/extends/GetProfileLike.ts | 54 ++++++------ .../action/extends/GetQunAlbumList.ts | 17 ++-- .../napcat-onebot/action/extends/GetRkey.ts | 9 +- .../action/extends/GetRobotUinRange.ts | 9 +- .../extends/GetUnidirectionalFriendList.ts | 35 ++++---- .../action/extends/GetUserStatus.ts | 23 +++-- .../action/extends/MoveGroupFile.ts | 27 +++--- .../napcat-onebot/action/extends/OCRImage.ts | 18 ++-- .../action/extends/RenameGroupFile.ts | 27 +++--- .../action/extends/SendPacket.ts | 21 +++-- .../action/extends/SetDiyOnlineStatus.ts | 21 +++-- .../action/extends/SetGroupAddOption.ts | 23 +++-- .../action/extends/SetGroupAlbumMediaLike.ts | 25 +++--- .../action/extends/SetGroupKickMembers.ts | 21 +++-- .../action/extends/SetGroupRemark.ts | 19 +++-- .../action/extends/SetGroupRobotAddOption.ts | 21 +++-- .../action/extends/SetGroupSearch.ts | 21 +++-- .../action/extends/SetGroupSign.ts | 17 ++-- .../action/extends/SetInputStatus.ts | 19 +++-- .../action/extends/SetLongNick.ts | 17 ++-- .../action/extends/SetOnlineStatus.ts | 21 +++-- .../action/extends/SetQQAvatar.ts | 17 ++-- .../action/extends/SetSpecialTitle.ts | 21 +++-- .../action/extends/ShareContact.ts | 41 +++++---- .../action/extends/TransGroupFile.ts | 23 ++--- .../action/extends/TranslateEnWordToZn.ts | 17 ++-- .../action/extends/UploadImageToQunAlbum.ts | 23 +++-- packages/napcat-onebot/action/file/GetFile.ts | 33 ++++---- .../action/file/GetGroupFileUrl.ts | 23 ++--- .../action/file/GetPrivateFileUrl.ts | 21 +++-- .../napcat-onebot/action/file/GetRecord.ts | 20 +++-- .../action/file/flash/CreateFlashTask.ts | 20 ++--- .../action/file/flash/DownloadFileset.ts | 13 +-- .../action/file/flash/GetFilesetIdByCode.ts | 13 +-- .../action/file/flash/GetFilesetInfo.ts | 13 +-- .../action/file/flash/GetFlashFileList.ts | 13 +-- .../action/file/flash/GetFlashFileUrl.ts | 17 ++-- .../action/file/flash/GetShareLink.ts | 13 +-- .../action/file/flash/SendFlashMsg.ts | 17 ++-- .../action/file/online/CancelOnlineFile.ts | 15 ++-- .../file/online/GetOnlineFileMessages.ts | 13 +-- .../action/file/online/ReceiveOnlineFile.ts | 17 ++-- .../action/file/online/RefuseOnlineFile.ts | 17 ++-- .../action/file/online/SendOnlineFile.ts | 17 ++-- .../action/file/online/SendOnlineFolder.ts | 17 ++-- .../action/go-cqhttp/CreateGroupFileFolder.ts | 29 ++++--- .../action/go-cqhttp/DeleteGroupFile.ts | 19 +++-- .../action/go-cqhttp/DeleteGroupFileFolder.ts | 21 +++-- .../action/go-cqhttp/DownloadFile.ts | 29 ++++--- .../action/go-cqhttp/GetForwardMsg.ts | 24 ++++-- .../action/go-cqhttp/GetFriendMsgHistory.ts | 38 +++++---- .../action/go-cqhttp/GetGroupAtAllRemain.ts | 29 ++++--- .../go-cqhttp/GetGroupFileSystemInfo.ts | 27 +++--- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 29 ++++--- .../action/go-cqhttp/GetGroupHonorInfo.ts | 35 ++++---- .../action/go-cqhttp/GetGroupMsgHistory.ts | 39 +++++---- .../action/go-cqhttp/GetGroupRootFiles.ts | 26 +++--- .../action/go-cqhttp/GetOnlineClient.ts | 13 ++- .../action/go-cqhttp/GetStrangerInfo.ts | 35 ++++++-- .../go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 17 ++-- .../action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 19 +++-- .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 27 +++--- .../action/go-cqhttp/GoCQHTTPSetModelShow.ts | 4 + .../action/go-cqhttp/QuickAction.ts | 66 +++++++++++++-- .../action/go-cqhttp/SendForwardMsg.ts | 15 ++-- .../action/go-cqhttp/SendGroupNotice.ts | 27 +++--- .../action/go-cqhttp/SetGroupPortrait.ts | 15 ++-- .../action/go-cqhttp/SetQQProfile.ts | 17 ++-- .../action/go-cqhttp/UploadGroupFile.ts | 31 +++---- .../action/go-cqhttp/UploadPrivateFile.ts | 27 +++--- .../action/group/DelEssenceMsg.ts | 28 ++++--- .../action/group/DelGroupNotice.ts | 19 +++-- .../napcat-onebot/action/group/GetAiRecord.ts | 21 +++-- .../action/group/GetGroupDetailInfo.ts | 24 ++++-- .../action/group/GetGroupEssence.ts | 29 +++++-- .../action/group/GetGroupIgnoredNotifies.ts | 24 ++++-- .../action/group/GetGroupInfo.ts | 19 +++-- .../action/group/GetGroupList.ts | 19 +++-- .../action/group/GetGroupMemberInfo.ts | 25 +++--- .../action/group/GetGroupMemberList.ts | 19 +++-- .../action/group/GetGroupNotice.ts | 61 ++++++-------- .../action/group/GetGroupShutList.ts | 17 ++-- .../action/group/SendGroupAiRecord.ts | 25 +++--- .../action/group/SendGroupMsg.ts | 7 +- .../action/group/SetEssenceMsg.ts | 17 ++-- .../action/group/SetGroupAddRequest.ts | 23 +++-- .../action/group/SetGroupAdmin.ts | 21 +++-- .../napcat-onebot/action/group/SetGroupBan.ts | 21 +++-- .../action/group/SetGroupCard.ts | 21 +++-- .../action/group/SetGroupKick.ts | 21 +++-- .../action/group/SetGroupLeave.ts | 20 +++-- .../action/group/SetGroupName.ts | 19 +++-- .../action/group/SetGroupWholeBan.ts | 19 +++-- .../action/guild/GetGuildList.ts | 4 + .../action/guild/GetGuildProfile.ts | 4 + .../napcat-onebot/action/msg/DeleteMsg.ts | 18 ++-- .../action/msg/ForwardSingleMsg.ts | 26 +++--- packages/napcat-onebot/action/msg/GetMsg.ts | 39 +++++---- .../napcat-onebot/action/msg/MarkMsgAsRead.ts | 28 ++++--- packages/napcat-onebot/action/msg/SendMsg.ts | 83 +++++++++++++------ .../action/msg/SendPrivateMsg.ts | 7 +- .../action/msg/SetMsgEmojiLike.ts | 21 +++-- .../action/new/GetDoubtFriendsAddRequest.ts | 13 +-- .../action/new/SetDoubtFriendsAddRequest.ts | 15 ++-- .../action/packet/GetPacketStatus.ts | 4 +- .../napcat-onebot/action/packet/GetRkeyEx.ts | 18 +++- .../action/packet/GetRkeyServer.ts | 21 +++-- .../napcat-onebot/action/packet/SendPoke.ts | 21 ++--- .../action/packet/SetGroupTodo.ts | 23 ++--- packages/napcat-onebot/action/schemas.ts | 51 ++++++++++++ .../action/stream/CleanStreamTempFile.ts | 3 + .../action/stream/DownloadFileImageStream.ts | 17 ++-- .../action/stream/DownloadFileRecordStream.ts | 19 +++-- .../action/stream/DownloadFileStream.ts | 17 ++-- .../action/stream/TestStreamDownload.ts | 13 +-- .../action/stream/UploadFileStream.ts | 33 ++++---- .../action/system/CanSendRecord.ts | 16 ++-- .../napcat-onebot/action/system/CleanCache.ts | 3 + .../napcat-onebot/action/system/GetCSRF.ts | 11 ++- .../action/system/GetCredentials.ts | 25 +++--- .../action/system/GetLoginInfo.ts | 6 +- .../napcat-onebot/action/system/GetStatus.ts | 20 +++-- .../action/system/GetSystemMsg.ts | 39 +++++---- .../action/system/GetVersionInfo.ts | 22 +++-- .../napcat-onebot/action/system/SetRestart.ts | 3 + .../action/test/TestAutoRegister01.ts | 3 + .../action/test/TestAutoRegister02.ts | 3 + .../napcat-onebot/action/user/GetCookies.ts | 24 +++--- .../action/user/GetFriendList.ts | 19 +++-- .../action/user/GetRecentContact.ts | 31 +++++-- .../napcat-onebot/action/user/SendLike.ts | 16 ++-- .../action/user/SetFriendAddRequest.ts | 18 ++-- .../action/user/SetFriendRemark.ts | 18 ++-- 150 files changed, 2015 insertions(+), 1235 deletions(-) create mode 100644 packages/napcat-onebot/action/schemas.ts diff --git a/packages/napcat-onebot/action/OneBotAction.ts b/packages/napcat-onebot/action/OneBotAction.ts index dee915b3..ad181d4e 100644 --- a/packages/napcat-onebot/action/OneBotAction.ts +++ b/packages/napcat-onebot/action/OneBotAction.ts @@ -7,7 +7,7 @@ import { TSchema } from '@sinclair/typebox'; import { StreamPacket, StreamPacketBasic, StreamStatus } from './stream/StreamBasic'; export class OB11Response { - private static createResponse(data: T, status: string, retcode: number, message: string = '', echo: unknown = null, useStream: boolean = false): OB11Return { + private static createResponse (data: T, status: string, retcode: number, message: string = '', echo: unknown = null, useStream: boolean = false): OB11Return { return { status, retcode, @@ -19,11 +19,11 @@ export class OB11Response { }; } - static res(data: T, status: string, retcode: number, message: string = '', echo: unknown = null, useStream: boolean = false): OB11Return { + static res (data: T, status: string, retcode: number, message: string = '', echo: unknown = null, useStream: boolean = false): OB11Return { return this.createResponse(data, status, retcode, message, echo, useStream); } - static ok(data: T, echo: unknown = null, useStream: boolean = false): OB11Return { + static ok (data: T, echo: unknown = null, useStream: boolean = false): OB11Return { return this.createResponse(data, 'ok', 0, '', echo, useStream); } @@ -32,13 +32,14 @@ export class OB11Response { } } export abstract class OneBotRequestToolkit { - abstract send(packet: StreamPacket): Promise; + abstract send (packet: StreamPacket): Promise; } export abstract class OneBotAction { actionName: typeof ActionName[keyof typeof ActionName] = ActionName.Unknown; core: NapCatCore; private validate?: ValidateFunction = undefined; payloadSchema?: TSchema = undefined; + returnSchema?: TSchema = undefined; obContext: NapCatOneBot11Adapter; useStream: boolean = false; diff --git a/packages/napcat-onebot/action/extends/BotExit.ts b/packages/napcat-onebot/action/extends/BotExit.ts index e9542cfd..b5b5d9b8 100644 --- a/packages/napcat-onebot/action/extends/BotExit.ts +++ b/packages/napcat-onebot/action/extends/BotExit.ts @@ -1,8 +1,11 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { OneBotAction } from '../OneBotAction'; +import { Type } from '@sinclair/typebox'; export class BotExit extends OneBotAction { override actionName = ActionName.Exit; + override payloadSchema = Type.Void(); + override returnSchema = Type.Void(); async _handle () { process.exit(0); diff --git a/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts b/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts index 0384e2be..acafa29c 100644 --- a/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts @@ -2,21 +2,26 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { OneBotAction } from '../OneBotAction'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - bot_appid: Type.String(), - button_id: Type.String({ default: '' }), - callback_data: Type.String({ default: '' }), - msg_seq: Type.String({ default: '10086' }), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + bot_appid: Type.String({ description: '机器人AppID' }), + button_id: Type.String({ default: '', description: '按钮ID' }), + callback_data: Type.String({ default: '', description: '回调数据' }), + msg_seq: Type.String({ default: '10086', description: '消息序列号' }), }); -type Payload = Static; +type PayloadType = Static; -export class ClickInlineKeyboardButton extends OneBotAction { +const ReturnSchema = Type.Any({ description: '点击结果' }); + +type ReturnType = Static; + +export class ClickInlineKeyboardButton extends OneBotAction { override actionName = ActionName.ClickInlineKeyboardButton; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return await this.core.apis.MsgApi.clickInlineKeyboardButton({ buttonId: payload.button_id, peerId: payload.group_id.toString(), diff --git a/packages/napcat-onebot/action/extends/CreateCollection.ts b/packages/napcat-onebot/action/extends/CreateCollection.ts index 9d21edb5..fdd113a0 100644 --- a/packages/napcat-onebot/action/extends/CreateCollection.ts +++ b/packages/napcat-onebot/action/extends/CreateCollection.ts @@ -2,18 +2,23 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - rawData: Type.String(), - brief: Type.String(), +const PayloadSchema = Type.Object({ + rawData: Type.String({ description: '原始数据' }), + brief: Type.String({ description: '简要描述' }), }); -type Payload = Static; +type PayloadType = Static; -export class CreateCollection extends OneBotAction { +const ReturnSchema = Type.Any({ description: '创建结果' }); + +type ReturnType = Static; + +export class CreateCollection extends OneBotAction { override actionName = ActionName.CreateCollection; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return await this.core.apis.CollectionApi.createCollection( this.core.selfInfo.uin, this.core.selfInfo.uid, diff --git a/packages/napcat-onebot/action/extends/DelGroupAlbumMedia.ts b/packages/napcat-onebot/action/extends/DelGroupAlbumMedia.ts index ce79f7f1..6862b187 100644 --- a/packages/napcat-onebot/action/extends/DelGroupAlbumMedia.ts +++ b/packages/napcat-onebot/action/extends/DelGroupAlbumMedia.ts @@ -2,19 +2,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.String(), - album_id: Type.String(), - lloc: Type.String(), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + album_id: Type.String({ description: '相册ID' }), + lloc: Type.String({ description: '媒体ID (lloc)' }), }); -type Payload = Static; +type PayloadType = Static; -export class DelGroupAlbumMedia extends OneBotAction { +const ReturnSchema = Type.Any({ description: '删除结果' }); + +type ReturnType = Static; + +export class DelGroupAlbumMedia extends OneBotAction { override actionName = ActionName.DelGroupAlbumMedia; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return await this.core.apis.WebApi.deleteAlbumMediaByNTQQ( payload.group_id, payload.album_id, diff --git a/packages/napcat-onebot/action/extends/DoGroupAlbumComment.ts b/packages/napcat-onebot/action/extends/DoGroupAlbumComment.ts index d5ac79d2..8a2f4164 100644 --- a/packages/napcat-onebot/action/extends/DoGroupAlbumComment.ts +++ b/packages/napcat-onebot/action/extends/DoGroupAlbumComment.ts @@ -2,20 +2,21 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.String(), - album_id: Type.String(), - lloc: Type.String(), - content: Type.String(), +export const DoGroupAlbumCommentPayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + album_id: Type.String({ description: '相册 ID' }), + lloc: Type.String({ description: '图片 ID' }), + content: Type.String({ description: '评论内容' }), }); -type Payload = Static; +export type DoGroupAlbumCommentPayload = Static; -export class DoGroupAlbumComment extends OneBotAction { +export class DoGroupAlbumComment extends OneBotAction { override actionName = ActionName.DoGroupAlbumComment; - override payloadSchema = SchemaData; + override payloadSchema = DoGroupAlbumCommentPayloadSchema; + override returnSchema = Type.Any({ description: '评论结果' }); - async _handle (payload: Payload) { + async _handle (payload: DoGroupAlbumCommentPayload) { return await this.core.apis.WebApi.doAlbumMediaPlainCommentByNTQQ( payload.group_id, payload.album_id, diff --git a/packages/napcat-onebot/action/extends/FetchCustomFace.ts b/packages/napcat-onebot/action/extends/FetchCustomFace.ts index 11d5aa7d..b5ffbeb9 100644 --- a/packages/napcat-onebot/action/extends/FetchCustomFace.ts +++ b/packages/napcat-onebot/action/extends/FetchCustomFace.ts @@ -2,17 +2,22 @@ import { Type, Static } from '@sinclair/typebox'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; -const SchemaData = Type.Object({ - count: Type.Union([Type.Number(), Type.String()], { default: 48 }), +const PayloadSchema = Type.Object({ + count: Type.Union([Type.Number(), Type.String()], { default: 48, description: '获取数量' }), }); -type Payload = Static; +type PayloadType = Static; -export class FetchCustomFace extends OneBotAction { +const ReturnSchema = Type.Array(Type.String(), { description: '表情URL列表' }); + +type ReturnType = Static; + +export class FetchCustomFace extends OneBotAction { override actionName = ActionName.FetchCustomFace; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const ret = await this.core.apis.MsgApi.fetchFavEmojiList(+payload.count); return ret.emojiInfoList.map(e => e.url); } diff --git a/packages/napcat-onebot/action/extends/FetchEmojiLike.ts b/packages/napcat-onebot/action/extends/FetchEmojiLike.ts index 8b9d04c1..677e5861 100644 --- a/packages/napcat-onebot/action/extends/FetchEmojiLike.ts +++ b/packages/napcat-onebot/action/extends/FetchEmojiLike.ts @@ -2,29 +2,45 @@ import { Type, Static } from '@sinclair/typebox'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; -import { type NTQQMsgApi } from 'napcat-core/apis'; -const SchemaData = Type.Object({ - message_id: Type.Union([Type.Number(), Type.String()]), - emojiId: Type.Union([Type.Number(), Type.String()]), - emojiType: Type.Union([Type.Number(), Type.String()]), - count: Type.Union([Type.Number(), Type.String()], { default: 20 }), - cookie: Type.String({ default: '' }) +const PayloadSchema = Type.Object({ + message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), + emojiId: Type.Union([Type.Number(), Type.String()], { description: '表情ID' }), + emojiType: Type.Union([Type.Number(), Type.String()], { description: '表情类型' }), + count: Type.Union([Type.Number(), Type.String()], { default: 20, description: '获取数量' }), + cookie: Type.String({ default: '', description: '分页Cookie' }) }); -type Payload = Static; +type PayloadType = Static; -export class FetchEmojiLike extends OneBotAction>> { +const ReturnSchema = Type.Object({ + emojiLikesList: Type.Array(Type.Object({ + tinyId: Type.String({ description: 'TinyID' }), + nickName: Type.String({ description: '昵称' }), + headUrl: Type.String({ description: '头像URL' }), + }), { description: '表情回应列表' }), + cookie: Type.String({ description: '分页Cookie' }), + isLastPage: Type.Boolean({ description: '是否最后一页' }), + isFirstPage: Type.Boolean({ description: '是否第一页' }), + result: Type.Number({ description: '结果状态码' }), + errMsg: Type.String({ description: '错 误信息' }), +}, { description: '表情回应详情' }); + +type ReturnType = Static; + +export class FetchEmojiLike extends OneBotAction { override actionName = ActionName.FetchEmojiLike; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType): Promise { const msgIdPeer = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id); if (!msgIdPeer) throw new Error('消息不存在'); const msg = (await this.core.apis.MsgApi.getMsgsByMsgId(msgIdPeer.Peer, [msgIdPeer.MsgId])).msgList[0]; if (!msg) throw new Error('消息不存在'); - return await this.core.apis.MsgApi.getMsgEmojiLikesList( + const res = await this.core.apis.MsgApi.getMsgEmojiLikesList( msgIdPeer.Peer, msg.msgSeq, payload.emojiId.toString(), payload.emojiType.toString(), payload.cookie, +payload.count ); + return res; } } diff --git a/packages/napcat-onebot/action/extends/GetAiCharacters.ts b/packages/napcat-onebot/action/extends/GetAiCharacters.ts index 2a7bf779..8eb5dabf 100644 --- a/packages/napcat-onebot/action/extends/GetAiCharacters.ts +++ b/packages/napcat-onebot/action/extends/GetAiCharacters.ts @@ -3,27 +3,36 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { AIVoiceChatType } from 'napcat-core/packet/entities/aiChat'; import { Type, Static } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - chat_type: Type.Union([Type.Union([Type.Number(), Type.String()])], { default: 1 }), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + chat_type: Type.Union([Type.Number(), Type.String()], { default: 1, description: '聊天类型' }), }); -type Payload = Static; +type PayloadType = Static; -interface GetAiCharactersResponse { - type: string; - characters: { - character_id: string; - character_name: string; - preview_url: string; - }[]; -} +const ReturnSchema = Type.Array( + Type.Object({ + type: Type.String({ description: '角色类型' }), + characters: Type.Array( + Type.Object({ + character_id: Type.String({ description: '角色ID' }), + character_name: Type.String({ description: '角色名称' }), + preview_url: Type.String({ description: '预览URL' }), + }), + { description: '角色列表' } + ), + }), + { description: 'AI角色列表' } +); -export class GetAiCharacters extends GetPacketStatusDepends { +type ReturnType = Static; + +export class GetAiCharacters extends GetPacketStatusDepends { override actionName = ActionName.GetAiCharacters; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const rawList = await this.core.apis.PacketApi.pkt.operation.FetchAiVoiceList(+payload.group_id, +payload.chat_type as AIVoiceChatType); return rawList?.map((item) => ({ type: item.category, diff --git a/packages/napcat-onebot/action/extends/GetClientkey.ts b/packages/napcat-onebot/action/extends/GetClientkey.ts index a028609b..cd94d768 100644 --- a/packages/napcat-onebot/action/extends/GetClientkey.ts +++ b/packages/napcat-onebot/action/extends/GetClientkey.ts @@ -1,12 +1,17 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { OneBotAction } from '../OneBotAction'; +import { Type, Static } from '@sinclair/typebox'; -interface GetClientkeyResponse { - clientkey?: string; -} +const ReturnSchema = Type.Object({ + clientkey: Type.Optional(Type.String({ description: '客户端Key' })), +}, { description: '获取ClientKey结果' }); -export class GetClientkey extends OneBotAction { +type ReturnType = Static; + +export class GetClientkey extends OneBotAction { override actionName = ActionName.GetClientkey; + override payloadSchema = Type.Void(); + override returnSchema = ReturnSchema; async _handle () { return { clientkey: (await this.core.apis.UserApi.forceFetchClientKey()).clientKey }; diff --git a/packages/napcat-onebot/action/extends/GetCollectionList.ts b/packages/napcat-onebot/action/extends/GetCollectionList.ts index eb990860..2954498f 100644 --- a/packages/napcat-onebot/action/extends/GetCollectionList.ts +++ b/packages/napcat-onebot/action/extends/GetCollectionList.ts @@ -3,18 +3,23 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - category: Type.Union([Type.Number(), Type.String()]), - count: Type.Union([Type.Union([Type.Number(), Type.String()])], { default: 1 }), +const PayloadSchema = Type.Object({ + category: Type.Union([Type.Number(), Type.String()], { description: '分类ID' }), + count: Type.Union([Type.Number(), Type.String()], { default: 1, description: '获取数量' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetCollectionList extends OneBotAction>> { +const ReturnSchema = Type.Any({ description: '收藏列表' }); + +type ReturnType = Static; + +export class GetCollectionList extends OneBotAction { override actionName = ActionName.GetCollectionList; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return await this.core.apis.CollectionApi.getAllCollection(+payload.category, +payload.count); } } diff --git a/packages/napcat-onebot/action/extends/GetEmojiLikes.ts b/packages/napcat-onebot/action/extends/GetEmojiLikes.ts index 5eaee161..437804db 100644 --- a/packages/napcat-onebot/action/extends/GetEmojiLikes.ts +++ b/packages/napcat-onebot/action/extends/GetEmojiLikes.ts @@ -27,6 +27,7 @@ type ReturnType = Static; export class GetEmojiLikes extends OneBotAction { override actionName = ActionName.GetEmojiLikes; override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; async _handle (payload: PayloadType) { let peer: Peer; diff --git a/packages/napcat-onebot/action/extends/GetFriendWithCategory.ts b/packages/napcat-onebot/action/extends/GetFriendWithCategory.ts index 6219461e..ff0766ad 100644 --- a/packages/napcat-onebot/action/extends/GetFriendWithCategory.ts +++ b/packages/napcat-onebot/action/extends/GetFriendWithCategory.ts @@ -1,12 +1,29 @@ import { OB11Construct } from '@/napcat-onebot/helper/data'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; +import { Type, Static } from '@sinclair/typebox'; +import { OB11UserSchema } from '../schemas'; -export class GetFriendWithCategory extends OneBotAction { +const ReturnSchema = Type.Array( + Type.Object({ + categoryId: Type.Number({ description: '分组ID' }), + categoryName: Type.String({ description: '分组名称' }), + categoryMbCount: Type.Number({ description: '分组内好友数量' }), + buddyList: Type.Array(OB11UserSchema, { description: '好友列表' }), + }), + { description: '带分组的好友列表' } +); + +type ReturnType = Static; + +export class GetFriendWithCategory extends OneBotAction { override actionName = ActionName.GetFriendsWithCategory; + override payloadSchema = Type.Void(); + override returnSchema = ReturnSchema; async _handle () { - return (await this.core.apis.FriendApi.getBuddyV2ExWithCate()).map(category => ({ + const categories = await this.core.apis.FriendApi.getBuddyV2ExWithCate(); + return categories.map(category => ({ ...category, buddyList: OB11Construct.friends(category.buddyList), })); diff --git a/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts b/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts index 4dedf591..ff6bef3a 100644 --- a/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts +++ b/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts @@ -1,16 +1,35 @@ import { GroupNotifyMsgStatus } from 'napcat-core'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; -import { Notify } from '@/napcat-onebot/types'; +import { Type, Static } from '@sinclair/typebox'; -export default class GetGroupAddRequest extends OneBotAction { +const ReturnSchema = Type.Array( + Type.Object({ + request_id: Type.Number({ description: '请求ID' }), + invitor_uin: Type.Number({ description: '邀请者QQ' }), + invitor_nick: Type.Optional(Type.String({ description: '邀请者昵称' })), + group_id: Type.Number({ description: '群号' }), + message: Type.Optional(Type.String({ description: '验证信息' })), + group_name: Type.Optional(Type.String({ description: '群名称' })), + checked: Type.Boolean({ description: '是否已处理' }), + actor: Type.Number({ description: '处理者QQ' }), + requester_nick: Type.Optional(Type.String({ description: '请求者昵称' })), + }), + { description: '群通知列表' } +); + +type ReturnType = Static; + +export default class GetGroupAddRequest extends OneBotAction { override actionName = ActionName.GetGroupIgnoreAddRequest; + override payloadSchema = Type.Void(); + override returnSchema = ReturnSchema; - async _handle (): Promise { + async _handle (): Promise { const NTQQUserApi = this.core.apis.UserApi; const NTQQGroupApi = this.core.apis.GroupApi; const ignoredNotifies = await NTQQGroupApi.getSingleScreenNotifies(true, 10); - const retData: Notify[] = []; + const retData: any[] = []; const notifyPromises = ignoredNotifies .filter(notify => notify.type === 7) diff --git a/packages/napcat-onebot/action/extends/GetGroupAlbumMediaList.ts b/packages/napcat-onebot/action/extends/GetGroupAlbumMediaList.ts index 25f55534..fa64bd1c 100644 --- a/packages/napcat-onebot/action/extends/GetGroupAlbumMediaList.ts +++ b/packages/napcat-onebot/action/extends/GetGroupAlbumMediaList.ts @@ -2,19 +2,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.String(), - album_id: Type.String(), - attach_info: Type.String({ default: '' }), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + album_id: Type.String({ description: '相册ID' }), + attach_info: Type.String({ default: '', description: '附加信息(用于分页)' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetGroupAlbumMediaList extends OneBotAction { +const ReturnSchema = Type.Any({ description: '相册媒体列表' }); + +type ReturnType = Static; + +export class GetGroupAlbumMediaList extends OneBotAction { override actionName = ActionName.GetGroupAlbumMediaList; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return await this.core.apis.WebApi.getAlbumMediaListByNTQQ( payload.group_id, payload.album_id, diff --git a/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts b/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts index c05ae9d6..edb38918 100644 --- a/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts +++ b/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts @@ -1,17 +1,22 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetGroupInfoEx extends OneBotAction { +const ReturnSchema = Type.Any({ description: '群扩展信息' }); + +type ReturnType = Static; + +export class GetGroupInfoEx extends OneBotAction { override actionName = ActionName.GetGroupInfoEx; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return (await this.core.apis.GroupApi.getGroupExtFE0Info([payload.group_id.toString()])).result.groupExtInfos.get(payload.group_id.toString()); } } diff --git a/packages/napcat-onebot/action/extends/GetMiniAppArk.ts b/packages/napcat-onebot/action/extends/GetMiniAppArk.ts index f72ff005..81c206b0 100644 --- a/packages/napcat-onebot/action/extends/GetMiniAppArk.ts +++ b/packages/napcat-onebot/action/extends/GetMiniAppArk.ts @@ -4,44 +4,50 @@ import { MiniAppInfo, MiniAppInfoHelper } from 'napcat-core/packet/utils/helper/ import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from 'napcat-core/packet/entities/miniApp'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Union([ +const PayloadSchema = Type.Union([ Type.Object({ - type: Type.Union([Type.Literal('bili'), Type.Literal('weibo')]), - title: Type.String(), - desc: Type.String(), - picUrl: Type.String(), - jumpUrl: Type.String(), - webUrl: Type.Optional(Type.String()), - rawArkData: Type.Optional(Type.Union([Type.String()])), + type: Type.Union([Type.Literal('bili'), Type.Literal('weibo')], { description: '模板类型' }), + title: Type.String({ description: '标题' }), + desc: Type.String({ description: '描述' }), + picUrl: Type.String({ description: '图片URL' }), + jumpUrl: Type.String({ description: '跳转URL' }), + webUrl: Type.Optional(Type.String({ description: '网页URL' })), + rawArkData: Type.Optional(Type.Union([Type.String()], { description: '是否返回原始Ark数据' })), }), Type.Object({ - title: Type.String(), - desc: Type.String(), - picUrl: Type.String(), - jumpUrl: Type.String(), - iconUrl: Type.String(), - webUrl: Type.Optional(Type.String()), - appId: Type.String(), - scene: Type.Union([Type.Number(), Type.String()]), - templateType: Type.Union([Type.Number(), Type.String()]), - businessType: Type.Union([Type.Number(), Type.String()]), - verType: Type.Union([Type.Number(), Type.String()]), - shareType: Type.Union([Type.Number(), Type.String()]), - versionId: Type.String(), - sdkId: Type.String(), - withShareTicket: Type.Union([Type.Number(), Type.String()]), - rawArkData: Type.Optional(Type.Union([Type.String()])), + title: Type.String({ description: '标题' }), + desc: Type.String({ description: '描述' }), + picUrl: Type.String({ description: '图片URL' }), + jumpUrl: Type.String({ description: '跳转URL' }), + iconUrl: Type.String({ description: '图标URL' }), + webUrl: Type.Optional(Type.String({ description: '网页URL' })), + appId: Type.String({ description: '小程序AppID' }), + scene: Type.Union([Type.Number(), Type.String()], { description: '场景ID' }), + templateType: Type.Union([Type.Number(), Type.String()], { description: '模板类型' }), + businessType: Type.Union([Type.Number(), Type.String()], { description: '业务类型' }), + verType: Type.Union([Type.Number(), Type.String()], { description: '版本类型' }), + shareType: Type.Union([Type.Number(), Type.String()], { description: '分享类型' }), + versionId: Type.String({ description: '版本ID' }), + sdkId: Type.String({ description: 'SDK ID' }), + withShareTicket: Type.Union([Type.Number(), Type.String()], { description: '是否携带分享票据' }), + rawArkData: Type.Optional(Type.Union([Type.String()], { description: '是否返回原始Ark数据' })), }), -]); -type Payload = Static; +], { description: '小程序Ark参数' }); -export class GetMiniAppArk extends GetPacketStatusDepends { +type PayloadType = Static; + +const ReturnSchema = Type.Object({ + data: Type.Any({ description: 'Ark数据' }), +}, { description: '获取小程序Ark结果' }); + +type ReturnType = Static; + +export class GetMiniAppArk extends GetPacketStatusDepends { override actionName = ActionName.GetMiniAppArk; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { let reqParam: MiniAppReqParams; const customParams = { title: payload.title, diff --git a/packages/napcat-onebot/action/extends/GetProfileLike.ts b/packages/napcat-onebot/action/extends/GetProfileLike.ts index 0155fb64..f3b8b703 100644 --- a/packages/napcat-onebot/action/extends/GetProfileLike.ts +++ b/packages/napcat-onebot/action/extends/GetProfileLike.ts @@ -1,36 +1,40 @@ -import { NTVoteInfo } from 'napcat-core'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), - start: Type.Union([Type.Number(), Type.String()], { default: 0 }), - count: Type.Union([Type.Number(), Type.String()], { default: 10 }), +const PayloadSchema = Type.Object({ + user_id: Type.Optional(Type.String({ description: 'QQ号' })), + start: Type.Union([Type.Number(), Type.String()], { default: 0, description: '起始位置' }), + count: Type.Union([Type.Number(), Type.String()], { default: 10, description: '获取数量' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetProfileLike extends OneBotAction; - total_count: number; - last_time: number; - today_count: number; - }; - voteInfo: { - total_count: number; - new_count: number; - new_nearby_count: number; - last_visit_time: number; - userInfos: Array; - }; -}> { +const ReturnSchema = Type.Object({ + uid: Type.String({ description: '用户UID' }), + time: Type.String({ description: '时间' }), + favoriteInfo: Type.Object({ + userInfos: Type.Array(Type.Any(), { description: '点赞用户信息' }), + total_count: Type.Number({ description: '总点赞数' }), + last_time: Type.Number({ description: '最后点赞时间' }), + today_count: Type.Number({ description: '今日点赞数' }), + }), + voteInfo: Type.Object({ + total_count: Type.Number({ description: '总点赞数' }), + new_count: Type.Number({ description: '新增点赞数' }), + new_nearby_count: Type.Number({ description: '新增附近点赞数' }), + last_visit_time: Type.Number({ description: '最后访问时间' }), + userInfos: Type.Array(Type.Any(), { description: '点赞用户信息' }), + }), +}, { description: '点赞详情' }); + +type ReturnType = Static; + +export class GetProfileLike extends OneBotAction { override actionName = ActionName.GetProfileLike; - override payloadSchema = SchemaData; - async _handle (payload: Payload) { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType): Promise { const isSelf = this.core.selfInfo.uin === payload.user_id || !payload.user_id; const userUid = isSelf || !payload.user_id ? this.core.selfInfo.uid : await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); const type = isSelf ? 2 : 1; diff --git a/packages/napcat-onebot/action/extends/GetQunAlbumList.ts b/packages/napcat-onebot/action/extends/GetQunAlbumList.ts index cae53964..5a740f90 100644 --- a/packages/napcat-onebot/action/extends/GetQunAlbumList.ts +++ b/packages/napcat-onebot/action/extends/GetQunAlbumList.ts @@ -2,17 +2,22 @@ import { NTQQWebApi } from 'napcat-core/apis'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.String(), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetQunAlbumList extends OneBotAction>['response']['album_list']> { +const ReturnSchema = Type.Array(Type.Any(), { description: '群相册列表' }); + +type ReturnType = Static; + +export class GetQunAlbumList extends OneBotAction { override actionName = ActionName.GetQunAlbumList; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return (await this.core.apis.WebApi.getAlbumListByNTQQ(payload.group_id)).response.album_list; } } diff --git a/packages/napcat-onebot/action/extends/GetRkey.ts b/packages/napcat-onebot/action/extends/GetRkey.ts index 0fa087d4..2bd05e3a 100644 --- a/packages/napcat-onebot/action/extends/GetRkey.ts +++ b/packages/napcat-onebot/action/extends/GetRkey.ts @@ -1,8 +1,15 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; +import { Type, Static } from '@sinclair/typebox'; -export class GetRkey extends GetPacketStatusDepends> { +const ReturnSchema = Type.Array(Type.Any(), { description: 'Rkey列表' }); + +type ReturnType = Static; + +export class GetRkey extends GetPacketStatusDepends { override actionName = ActionName.GetRkey; + override payloadSchema = Type.Void(); + override returnSchema = ReturnSchema; async _handle () { return await this.core.apis.PacketApi.pkt.operation.FetchRkey(); diff --git a/packages/napcat-onebot/action/extends/GetRobotUinRange.ts b/packages/napcat-onebot/action/extends/GetRobotUinRange.ts index 3c7ae570..c29846f2 100644 --- a/packages/napcat-onebot/action/extends/GetRobotUinRange.ts +++ b/packages/napcat-onebot/action/extends/GetRobotUinRange.ts @@ -1,8 +1,15 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; +import { Type, Static } from '@sinclair/typebox'; -export class GetRobotUinRange extends OneBotAction> { +const ReturnSchema = Type.Array(Type.Any(), { description: '机器人Uin范围列表' }); + +type ReturnType = Static; + +export class GetRobotUinRange extends OneBotAction { override actionName = ActionName.GetRobotUinRange; + override payloadSchema = Type.Void(); + override returnSchema = ReturnSchema; async _handle () { return await this.core.apis.UserApi.getRobotUinRange(); diff --git a/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts b/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts index 5d58476f..abeb9bc9 100644 --- a/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts +++ b/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts @@ -2,26 +2,25 @@ import { PacketBuf } from 'napcat-core/packet/transformer/base'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { ProtoBuf, ProtoBufBase, PBUint32, PBString } from 'napcat.protobuf'; +import { Type, Static } from '@sinclair/typebox'; -interface Friend { - uin: number; - uid: string; - nick_name: string; - age: number; - source: string; -} +const ReturnSchema = Type.Array( + Type.Object({ + uin: Type.Number({ description: 'QQ号' }), + uid: Type.String({ description: '用户UID' }), + nick_name: Type.String({ description: '昵称' }), + age: Type.Number({ description: '年龄' }), + source: Type.String({ description: '来源' }), + }), + { description: '单向好友列表' } +); -interface Block { - str_uid: string; - bytes_source: string; - uint32_sex: number; - uint32_age: number; - bytes_nick: string; - uint64_uin: number; -} +type ReturnType = Static; -export class GetUnidirectionalFriendList extends OneBotAction { +export class GetUnidirectionalFriendList extends OneBotAction { override actionName = ActionName.GetUnidirectionalFriendList; + override payloadSchema = Type.Void(); + override returnSchema = ReturnSchema; async pack_data (data: string): Promise { return ProtoBuf(class extends ProtoBufBase { @@ -30,7 +29,7 @@ export class GetUnidirectionalFriendList extends OneBotAction { }).encode(); } - async _handle (): Promise { + async _handle (): Promise { const self_id = this.core.selfInfo.uin; const req_json = { uint64_uin: self_id, @@ -43,7 +42,7 @@ export class GetUnidirectionalFriendList extends OneBotAction { const rsq = { cmd: 'MQUpdateSvc_com_qq_ti.web.OidbSvc.0xe17_0', data: data as PacketBuf }; const rsp_data = await this.core.apis.PacketApi.pkt.operation.sendPacket(rsq, true); const block_json = ProtoBuf(class extends ProtoBufBase { data = PBString(4); }).decode(rsp_data); - const block_list: Block[] = JSON.parse(block_json.data).rpt_block_list; + const block_list: any[] = JSON.parse(block_json.data).rpt_block_list; return block_list.map((block) => ({ uin: block.uint64_uin, diff --git a/packages/napcat-onebot/action/extends/GetUserStatus.ts b/packages/napcat-onebot/action/extends/GetUserStatus.ts index fd43dcfe..49827ddd 100644 --- a/packages/napcat-onebot/action/extends/GetUserStatus.ts +++ b/packages/napcat-onebot/action/extends/GetUserStatus.ts @@ -2,17 +2,28 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()], { description: 'QQ号' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetUserStatus extends GetPacketStatusDepends { +const ReturnSchema = Type.Optional( + Type.Object({ + status: Type.Number({ description: '在线状态' }), + ext_status: Type.Number({ description: '扩展状态' }), + }), + { description: '用户状态' } +); + +type ReturnType = Static; + +export class GetUserStatus extends GetPacketStatusDepends { override actionName = ActionName.GetUserStatus; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return await this.core.apis.PacketApi.pkt.operation.GetStrangerStatus(+payload.user_id); } } diff --git a/packages/napcat-onebot/action/extends/MoveGroupFile.ts b/packages/napcat-onebot/action/extends/MoveGroupFile.ts index 80b7ab7e..0a8a86f3 100644 --- a/packages/napcat-onebot/action/extends/MoveGroupFile.ts +++ b/packages/napcat-onebot/action/extends/MoveGroupFile.ts @@ -3,24 +3,27 @@ import { FileNapCatOneBotUUID } from 'napcat-common/src/file-uuid'; import { GetPacketStatusDepends } from '@/napcat-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(), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + file_id: Type.String({ description: '文件ID' }), + current_parent_directory: Type.String({ description: '当前父目录' }), + target_parent_directory: Type.String({ description: '目标父目录' }), }); -type Payload = Static; +type PayloadType = Static; -interface MoveGroupFileResponse { - ok: boolean; -} +const ReturnSchema = Type.Object({ + ok: Type.Boolean({ description: '是否成功' }), +}, { description: '移动文件结果' }); -export class MoveGroupFile extends GetPacketStatusDepends { +type ReturnType = Static; + +export class MoveGroupFile extends GetPacketStatusDepends { override actionName = ActionName.MoveGroupFile; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file_id) || FileNapCatOneBotUUID.decodeModelId(payload.file_id); if (contextMsgFile?.fileUUID) { await this.core.apis.PacketApi.pkt.operation.MoveGroupFile(+payload.group_id, contextMsgFile.fileUUID, payload.current_parent_directory, payload.target_parent_directory); diff --git a/packages/napcat-onebot/action/extends/OCRImage.ts b/packages/napcat-onebot/action/extends/OCRImage.ts index ab3df90c..66a38198 100644 --- a/packages/napcat-onebot/action/extends/OCRImage.ts +++ b/packages/napcat-onebot/action/extends/OCRImage.ts @@ -3,18 +3,22 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { checkFileExist, uriToLocalFile } from 'napcat-common/src/file'; import fs from 'fs'; import { Static, Type } from '@sinclair/typebox'; -import { GeneralCallResultStatus } from 'napcat-core'; -const SchemaData = Type.Object({ - image: Type.String(), +const PayloadSchema = Type.Object({ + image: Type.String({ description: '图片路径、URL或Base64' }), }); -type Payload = Static; +type PayloadType = Static; -class OCRImageBase extends OneBotAction { - override payloadSchema = SchemaData; +const ReturnSchema = Type.Any({ description: 'OCR结果' }); - async _handle (payload: Payload) { +type ReturnType = Static; + +class OCRImageBase extends OneBotAction { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + + async _handle (payload: PayloadType): Promise { const { path, success } = await uriToLocalFile(this.core.NapCatTempPath, payload.image); if (!success) { throw new Error(`OCR ${payload.image}失败, image字段可能格式不正确`); diff --git a/packages/napcat-onebot/action/extends/RenameGroupFile.ts b/packages/napcat-onebot/action/extends/RenameGroupFile.ts index 44d290d9..2e987439 100644 --- a/packages/napcat-onebot/action/extends/RenameGroupFile.ts +++ b/packages/napcat-onebot/action/extends/RenameGroupFile.ts @@ -3,24 +3,27 @@ import { FileNapCatOneBotUUID } from 'napcat-common/src/file-uuid'; import { GetPacketStatusDepends } from '@/napcat-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(), - new_name: Type.String(), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + file_id: Type.String({ description: '文件ID' }), + current_parent_directory: Type.String({ description: '当前父目录' }), + new_name: Type.String({ description: '新文件名' }), }); -type Payload = Static; +type PayloadType = Static; -interface RenameGroupFileResponse { - ok: boolean; -} +const ReturnSchema = Type.Object({ + ok: Type.Boolean({ description: '是否成功' }), +}, { description: '重命名文件结果' }); -export class RenameGroupFile extends GetPacketStatusDepends { +type ReturnType = Static; + +export class RenameGroupFile extends GetPacketStatusDepends { override actionName = ActionName.RenameGroupFile; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { 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); diff --git a/packages/napcat-onebot/action/extends/SendPacket.ts b/packages/napcat-onebot/action/extends/SendPacket.ts index 2a395ece..dab19393 100644 --- a/packages/napcat-onebot/action/extends/SendPacket.ts +++ b/packages/napcat-onebot/action/extends/SendPacket.ts @@ -3,18 +3,23 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - cmd: Type.String(), - data: Type.String(), - rsp: Type.Union([Type.String(), Type.Boolean()], { default: true }), +const PayloadSchema = Type.Object({ + cmd: Type.String({ description: '命令字' }), + data: Type.String({ description: '十六进制数据' }), + rsp: Type.Union([Type.String(), Type.Boolean()], { default: true, description: '是否等待响应' }), }); -type Payload = Static; +type PayloadType = Static; -export class SendPacket extends GetPacketStatusDepends { - override payloadSchema = SchemaData; +const ReturnSchema = Type.Optional(Type.String({ description: '响应十六进制数据' }), { description: '发包结果' }); + +type ReturnType = Static; + +export class SendPacket extends GetPacketStatusDepends { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; override actionName = ActionName.SendPacket; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const rsp = typeof payload.rsp === 'boolean' ? payload.rsp : payload.rsp === 'true'; const data = await this.core.apis.PacketApi.pkt.operation.sendPacket({ cmd: payload.cmd, data: Buffer.from(payload.data, 'hex') as PacketBuf }, rsp); return typeof data === 'object' ? data.toString('hex') : undefined; diff --git a/packages/napcat-onebot/action/extends/SetDiyOnlineStatus.ts b/packages/napcat-onebot/action/extends/SetDiyOnlineStatus.ts index 8ed77387..1732bf69 100644 --- a/packages/napcat-onebot/action/extends/SetDiyOnlineStatus.ts +++ b/packages/napcat-onebot/action/extends/SetDiyOnlineStatus.ts @@ -2,19 +2,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - face_id: Type.Union([Type.Number(), Type.String()]), // 参考 face_config.json 的 QSid - face_type: Type.Union([Type.Number(), Type.String()], { default: '1' }), - wording: Type.String({ default: ' ' }), +const PayloadSchema = Type.Object({ + face_id: Type.Union([Type.Number(), Type.String()], { description: '图标ID' }), // 参考 face_config.json 的 QSid + face_type: Type.Union([Type.Number(), Type.String()], { default: '1', description: '图标类型' }), + wording: Type.String({ default: ' ', description: '状态文字内容' }), }); -type Payload = Static; +type PayloadType = Static; -export class SetDiyOnlineStatus extends OneBotAction { +const ReturnSchema = Type.String({ description: '错误信息(如果有)' }); + +type ReturnType = Static; + +export class SetDiyOnlineStatus extends OneBotAction { override actionName = ActionName.SetDiyOnlineStatus; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const ret = await this.core.apis.UserApi.setDiySelfOnlineStatus( payload.face_id.toString(), payload.wording, diff --git a/packages/napcat-onebot/action/extends/SetGroupAddOption.ts b/packages/napcat-onebot/action/extends/SetGroupAddOption.ts index dcd275c7..c3f838e5 100644 --- a/packages/napcat-onebot/action/extends/SetGroupAddOption.ts +++ b/packages/napcat-onebot/action/extends/SetGroupAddOption.ts @@ -2,19 +2,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.String(), - add_type: Type.Number(), - group_question: Type.Optional(Type.String()), - group_answer: Type.Optional(Type.String()), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + add_type: Type.Number({ description: '加群方式' }), + group_question: Type.Optional(Type.String({ description: '加群问题' })), + group_answer: Type.Optional(Type.String({ description: '加群答案' })), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupAddOption extends OneBotAction { +const ReturnSchema = Type.Null({ description: '返回结果' }); + +type ReturnType = Static; + +export default class SetGroupAddOption extends OneBotAction { override actionName = ActionName.SetGroupAddOption; - override payloadSchema = SchemaData; - async _handle (payload: Payload): Promise { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType): Promise { const ret = await this.core.apis.GroupApi.setGroupAddOption(payload.group_id, { addOption: payload.add_type, groupQuestion: payload.group_question, diff --git a/packages/napcat-onebot/action/extends/SetGroupAlbumMediaLike.ts b/packages/napcat-onebot/action/extends/SetGroupAlbumMediaLike.ts index 3edc245a..c62e0970 100644 --- a/packages/napcat-onebot/action/extends/SetGroupAlbumMediaLike.ts +++ b/packages/napcat-onebot/action/extends/SetGroupAlbumMediaLike.ts @@ -2,21 +2,26 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.String(), - album_id: Type.String(), - lloc: Type.String(), - id: Type.String(), // 421_1_0_1012959257|V61Yiali4PELg90bThrH4Bo2iI1M5Kab|V5bCgAxMDEyOTU5MjU3.PyqaPndPxg!^||^421_1_0_1012959257|V61Yiali4PELg90bThrH4Bo2iI1M5Kab|17560363448^||^1 - set: Type.Boolean({ default: true }), // true=点赞 false=取消点赞 未实现 +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + album_id: Type.String({ description: '相册ID' }), + lloc: Type.String({ description: '媒体ID (lloc)' }), + id: Type.String({ description: '点赞ID' }), // 421_1_0_1012959257|V61Yiali4PELg90bThrH4Bo2iI1M5Kab|V5bCgAxMDEyOTU5MjU3.PyqaPndPxg!^||^421_1_0_1012959257|V61Yiali4PELg90bThrH4Bo2iI1M5Kab|17560363448^||^1 + set: Type.Boolean({ default: true, description: '是否点赞' }), // true=点赞 false=取消点赞 未实现 }); -type Payload = Static; +type PayloadType = Static; -export class SetGroupAlbumMediaLike extends OneBotAction { +const ReturnSchema = Type.Any({ description: '操作结果' }); + +type ReturnType = Static; + +export class SetGroupAlbumMediaLike extends OneBotAction { override actionName = ActionName.SetGroupAlbumMediaLike; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return await this.core.apis.WebApi.doAlbumMediaLikeByNTQQ( payload.group_id, payload.album_id, diff --git a/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts b/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts index 8ed8f82d..c84a2330 100644 --- a/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts +++ b/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts @@ -2,19 +2,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.String(), - user_id: Type.Array(Type.String()), - reject_add_request: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + user_id: Type.Array(Type.String(), { description: 'QQ号列表' }), + reject_add_request: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否拒绝加群请求' })), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupKickMembers extends OneBotAction { +const ReturnSchema = Type.Null({ description: '返回结果' }); + +type ReturnType = Static; + +export default class SetGroupKickMembers extends OneBotAction { override actionName = ActionName.SetGroupKickMembers; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload): Promise { + async _handle (payload: PayloadType): Promise { const rejectReq = payload.reject_add_request?.toString() === 'true'; const uids: string[] = await Promise.all(payload.user_id.map(async uin => await this.core.apis.UserApi.getUidByUinV2(uin))); await this.core.apis.GroupApi.kickMember(payload.group_id.toString(), uids.filter(uid => !!uid), rejectReq); diff --git a/packages/napcat-onebot/action/extends/SetGroupRemark.ts b/packages/napcat-onebot/action/extends/SetGroupRemark.ts index ff2adbc9..5883aaa5 100644 --- a/packages/napcat-onebot/action/extends/SetGroupRemark.ts +++ b/packages/napcat-onebot/action/extends/SetGroupRemark.ts @@ -2,17 +2,22 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.String(), - remark: Type.String(), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + remark: Type.String({ description: '备注' }), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupRemark extends OneBotAction { +const ReturnSchema = Type.Null({ description: '返回结果' }); + +type ReturnType = Static; + +export default class SetGroupRemark extends OneBotAction { override actionName = ActionName.SetGroupRemark; - override payloadSchema = SchemaData; - async _handle (payload: Payload): Promise { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType): Promise { const ret = await this.core.apis.GroupApi.setGroupRemark(payload.group_id, payload.remark); if (ret.result !== 0) { throw new Error(`设置群备注失败, ${ret.result}:${ret.errMsg}`); diff --git a/packages/napcat-onebot/action/extends/SetGroupRobotAddOption.ts b/packages/napcat-onebot/action/extends/SetGroupRobotAddOption.ts index 72811783..38930433 100644 --- a/packages/napcat-onebot/action/extends/SetGroupRobotAddOption.ts +++ b/packages/napcat-onebot/action/extends/SetGroupRobotAddOption.ts @@ -2,18 +2,23 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.String(), - robot_member_switch: Type.Optional(Type.Number()), - robot_member_examine: Type.Optional(Type.Number()), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + robot_member_switch: Type.Optional(Type.Number({ description: '机器人成员开关' })), + robot_member_examine: Type.Optional(Type.Number({ description: '机器人成员审核' })), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupRobotAddOption extends OneBotAction { +const ReturnSchema = Type.Null({ description: '返回结果' }); + +type ReturnType = Static; + +export default class SetGroupRobotAddOption extends OneBotAction { override actionName = ActionName.SetGroupRobotAddOption; - override payloadSchema = SchemaData; - async _handle (payload: Payload): Promise { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType): Promise { const ret = await this.core.apis.GroupApi.setGroupRobotAddOption( payload.group_id, payload.robot_member_switch, diff --git a/packages/napcat-onebot/action/extends/SetGroupSearch.ts b/packages/napcat-onebot/action/extends/SetGroupSearch.ts index 9ce5ff6d..c7b4a569 100644 --- a/packages/napcat-onebot/action/extends/SetGroupSearch.ts +++ b/packages/napcat-onebot/action/extends/SetGroupSearch.ts @@ -2,18 +2,23 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.String(), - no_code_finger_open: Type.Optional(Type.Number()), - no_finger_open: Type.Optional(Type.Number()), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + no_code_finger_open: Type.Optional(Type.Number({ description: '是否开启无码指纹' })), + no_finger_open: Type.Optional(Type.Number({ description: '是否开启无指纹' })), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupSearch extends OneBotAction { +const ReturnSchema = Type.Null({ description: '返回结果' }); + +type ReturnType = Static; + +export default class SetGroupSearch extends OneBotAction { override actionName = ActionName.SetGroupSearch; - override payloadSchema = SchemaData; - async _handle (payload: Payload): Promise { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType): Promise { const ret = await this.core.apis.GroupApi.setGroupSearch(payload.group_id, { noCodeFingerOpenFlag: payload.no_code_finger_open, noFingerOpenFlag: payload.no_finger_open, diff --git a/packages/napcat-onebot/action/extends/SetGroupSign.ts b/packages/napcat-onebot/action/extends/SetGroupSign.ts index e8739ed5..2a7cd012 100644 --- a/packages/napcat-onebot/action/extends/SetGroupSign.ts +++ b/packages/napcat-onebot/action/extends/SetGroupSign.ts @@ -2,16 +2,21 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), }); -type Payload = Static; +type PayloadType = Static; -class SetGroupSignBase extends GetPacketStatusDepends { - override payloadSchema = SchemaData; +const ReturnSchema = Type.Void({ description: '打卡结果' }); - async _handle (payload: Payload) { +type ReturnType = Static; + +class SetGroupSignBase extends GetPacketStatusDepends { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + + async _handle (payload: PayloadType) { return await this.core.apis.PacketApi.pkt.operation.GroupSign(+payload.group_id); } } diff --git a/packages/napcat-onebot/action/extends/SetInputStatus.ts b/packages/napcat-onebot/action/extends/SetInputStatus.ts index d66224cd..22da88a2 100644 --- a/packages/napcat-onebot/action/extends/SetInputStatus.ts +++ b/packages/napcat-onebot/action/extends/SetInputStatus.ts @@ -3,17 +3,22 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { ChatType } from 'napcat-core'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), - event_type: Type.Number(), +const PayloadSchema = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()], { description: 'QQ号' }), + event_type: Type.Number({ description: '事件类型' }), }); -type Payload = Static; +type PayloadType = Static; -export class SetInputStatus extends OneBotAction { +const ReturnSchema = Type.Any({ description: '设置结果' }); + +type ReturnType = Static; + +export class SetInputStatus extends OneBotAction { override actionName = ActionName.SetInputStatus; - override payloadSchema = SchemaData; - async _handle (payload: Payload) { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('uid is empty'); const peer = { diff --git a/packages/napcat-onebot/action/extends/SetLongNick.ts b/packages/napcat-onebot/action/extends/SetLongNick.ts index 64868a21..a75a628e 100644 --- a/packages/napcat-onebot/action/extends/SetLongNick.ts +++ b/packages/napcat-onebot/action/extends/SetLongNick.ts @@ -2,17 +2,22 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - longNick: Type.String(), +const PayloadSchema = Type.Object({ + longNick: Type.String({ description: '签名内容' }), }); -type Payload = Static; +type PayloadType = Static; -export class SetLongNick extends OneBotAction { +const ReturnSchema = Type.Any({ description: '设置结果' }); + +type ReturnType = Static; + +export class SetLongNick extends OneBotAction { override actionName = ActionName.SetLongNick; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return await this.core.apis.UserApi.setLongNick(payload.longNick); } } diff --git a/packages/napcat-onebot/action/extends/SetOnlineStatus.ts b/packages/napcat-onebot/action/extends/SetOnlineStatus.ts index b54ed3d1..ccf69130 100644 --- a/packages/napcat-onebot/action/extends/SetOnlineStatus.ts +++ b/packages/napcat-onebot/action/extends/SetOnlineStatus.ts @@ -2,19 +2,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - status: Type.Union([Type.Number(), Type.String()]), - ext_status: Type.Union([Type.Number(), Type.String()]), - battery_status: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + status: Type.Union([Type.Number(), Type.String()], { description: '在线状态' }), + ext_status: Type.Union([Type.Number(), Type.String()], { description: '扩展状态' }), + battery_status: Type.Union([Type.Number(), Type.String()], { description: '电量状态' }), }); -type Payload = Static; +type PayloadType = Static; -export class SetOnlineStatus extends OneBotAction { +const ReturnSchema = Type.Null({ description: '设置结果' }); + +type ReturnType = Static; + +export class SetOnlineStatus extends OneBotAction { override actionName = ActionName.SetOnlineStatus; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const ret = await this.core.apis.UserApi.setSelfOnlineStatus( +payload.status, +payload.ext_status, diff --git a/packages/napcat-onebot/action/extends/SetQQAvatar.ts b/packages/napcat-onebot/action/extends/SetQQAvatar.ts index f33909f1..953841f8 100644 --- a/packages/napcat-onebot/action/extends/SetQQAvatar.ts +++ b/packages/napcat-onebot/action/extends/SetQQAvatar.ts @@ -4,16 +4,21 @@ import fs from 'node:fs/promises'; import { checkFileExist, uriToLocalFile } from 'napcat-common/src/file'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - file: Type.String(), +const PayloadSchema = Type.Object({ + file: Type.String({ description: '图片路径、URL或Base64' }), }); -type Payload = Static; +type PayloadType = Static; -export default class SetAvatar extends OneBotAction { +const ReturnSchema = Type.Null({ description: '设置结果' }); + +type ReturnType = Static; + +export default class SetAvatar extends OneBotAction { override actionName = ActionName.SetQQAvatar; - override payloadSchema = SchemaData; - async _handle (payload: Payload): Promise { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType): Promise { const { path, success } = (await uriToLocalFile(this.core.NapCatTempPath, payload.file)); if (!success) { throw new Error(`头像${payload.file}设置失败,file字段可能格式不正确`); diff --git a/packages/napcat-onebot/action/extends/SetSpecialTitle.ts b/packages/napcat-onebot/action/extends/SetSpecialTitle.ts index 06914edb..a1cbfc8f 100644 --- a/packages/napcat-onebot/action/extends/SetSpecialTitle.ts +++ b/packages/napcat-onebot/action/extends/SetSpecialTitle.ts @@ -2,19 +2,24 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - user_id: Type.Union([Type.Number(), Type.String()]), - special_title: Type.String({ default: '' }), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + user_id: Type.Union([Type.Number(), Type.String()], { description: 'QQ号' }), + special_title: Type.String({ default: '', description: '专属头衔' }), }); -type Payload = Static; +type PayloadType = Static; -export class SetSpecialTitle extends GetPacketStatusDepends { +const ReturnSchema = Type.Void({ description: '设置结果' }); + +type ReturnType = Static; + +export class SetSpecialTitle extends GetPacketStatusDepends { override actionName = ActionName.SetSpecialTitle; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('User not found'); await this.core.apis.PacketApi.pkt.operation.SetGroupSpecialTitle(+payload.group_id, uid, payload.special_title); diff --git a/packages/napcat-onebot/action/extends/ShareContact.ts b/packages/napcat-onebot/action/extends/ShareContact.ts index 63d60a67..e21d4a13 100644 --- a/packages/napcat-onebot/action/extends/ShareContact.ts +++ b/packages/napcat-onebot/action/extends/ShareContact.ts @@ -3,22 +3,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), - group_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), - phone_number: Type.String({ default: '' }), +const PayloadSchema = Type.Object({ + user_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: 'QQ号' })), + group_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '群号' })), + phone_number: Type.String({ default: '', description: '手机号' }), }); -type Payload = Static; +type PayloadType = Static; -export class SharePeerBase extends OneBotAction { +const ReturnSchema = Type.Any({ description: '分享结果' }); - override payloadSchema = SchemaData; +type ReturnType = Static; - async _handle (payload: Payload) { +export class SharePeerBase extends OneBotAction { + + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + + async _handle (payload: PayloadType) { if (payload.group_id) { return await this.core.apis.GroupApi.getGroupRecommendContactArkJson(payload.group_id.toString()); } else if (payload.user_id) { @@ -28,18 +30,23 @@ export class SharePeerBase extends OneBotAction; +type PayloadTypeGroupEx = Static; -export class ShareGroupExBase extends OneBotAction { - override payloadSchema = SchemaDataGroupEx; +const ReturnSchemaGroupEx = Type.String({ description: 'Ark Json内容' }); - async _handle (payload: PayloadGroupEx) { +type ReturnTypeGroupEx = Static; + +export class ShareGroupExBase extends OneBotAction { + override payloadSchema = PayloadSchemaGroupEx; + override returnSchema = ReturnSchemaGroupEx; + + async _handle (payload: PayloadTypeGroupEx) { return await this.core.apis.GroupApi.getArkJsonGroupShare(payload.group_id.toString()); } } diff --git a/packages/napcat-onebot/action/extends/TransGroupFile.ts b/packages/napcat-onebot/action/extends/TransGroupFile.ts index a5e42177..11338f9f 100644 --- a/packages/napcat-onebot/action/extends/TransGroupFile.ts +++ b/packages/napcat-onebot/action/extends/TransGroupFile.ts @@ -3,22 +3,25 @@ import { FileNapCatOneBotUUID } from 'napcat-common/src/file-uuid'; import { GetPacketStatusDepends } from '@/napcat-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(), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + file_id: Type.String({ description: '文件ID' }), }); -type Payload = Static; +type PayloadType = Static; -interface TransGroupFileResponse { - ok: boolean; -} +const ReturnSchema = Type.Object({ + ok: Type.Boolean({ description: '是否成功' }), +}, { description: '转发文件结果' }); -export class TransGroupFile extends GetPacketStatusDepends { +type ReturnType = Static; + +export class TransGroupFile extends GetPacketStatusDepends { override actionName = ActionName.TransGroupFile; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { 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); diff --git a/packages/napcat-onebot/action/extends/TranslateEnWordToZn.ts b/packages/napcat-onebot/action/extends/TranslateEnWordToZn.ts index 31f1ae5a..b1b285f7 100644 --- a/packages/napcat-onebot/action/extends/TranslateEnWordToZn.ts +++ b/packages/napcat-onebot/action/extends/TranslateEnWordToZn.ts @@ -2,17 +2,22 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - words: Type.Array(Type.String()), +const PayloadSchema = Type.Object({ + words: Type.Array(Type.String(), { description: '待翻译单词列表' }), }); -type Payload = Static; +type PayloadType = Static; -export class TranslateEnWordToZn extends OneBotAction | null> { +const ReturnSchema = Type.Optional(Type.Array(Type.Any()), { description: '翻译结果列表' }); + +type ReturnType = Static; + +export class TranslateEnWordToZn extends OneBotAction { override actionName = ActionName.TranslateEnWordToZn; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType): Promise { const ret = await this.core.apis.SystemApi.translateEnWordToZn(payload.words); if (ret.result !== 0) { throw new Error('翻译失败'); diff --git a/packages/napcat-onebot/action/extends/UploadImageToQunAlbum.ts b/packages/napcat-onebot/action/extends/UploadImageToQunAlbum.ts index b1e16738..3f9a6533 100644 --- a/packages/napcat-onebot/action/extends/UploadImageToQunAlbum.ts +++ b/packages/napcat-onebot/action/extends/UploadImageToQunAlbum.ts @@ -5,20 +5,25 @@ import { Static, Type } from '@sinclair/typebox'; import { existsSync } from 'node:fs'; import { unlink } from 'node:fs/promises'; -const SchemaData = Type.Object({ - group_id: Type.String(), - album_id: Type.String(), - album_name: Type.String(), - file: Type.String(), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + album_id: Type.String({ description: '相册ID' }), + album_name: Type.String({ description: '相册名称' }), + file: Type.String({ description: '图片路径、URL或Base64' }), }); -type Payload = Static; +type PayloadType = Static; -export class UploadImageToQunAlbum extends OneBotAction { +const ReturnSchema = Type.Any({ description: '上传结果' }); + +type ReturnType = Static; + +export class UploadImageToQunAlbum extends OneBotAction { override actionName = ActionName.UploadImageToQunAlbum; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const downloadResult = await uriToLocalFile(this.core.NapCatTempPath, payload.file); try { return await this.core.apis.WebApi.uploadImageToQunAlbum(payload.group_id, payload.album_id, payload.album_name, downloadResult.path); diff --git a/packages/napcat-onebot/action/file/GetFile.ts b/packages/napcat-onebot/action/file/GetFile.ts index a7ffa2b0..93ca9a72 100644 --- a/packages/napcat-onebot/action/file/GetFile.ts +++ b/packages/napcat-onebot/action/file/GetFile.ts @@ -5,23 +5,26 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { OB11MessageImage, OB11MessageVideo } from '@/napcat-onebot/types'; import { Static, Type } from '@sinclair/typebox'; -export interface GetFileResponse { - file?: string; // path - url?: string; - file_size?: string; - file_name?: string; - base64?: string; -} - -const GetFileBase_PayloadSchema = Type.Object({ - file: Type.Optional(Type.String()), - file_id: Type.Optional(Type.String()), +export const GetFilePayloadSchema = Type.Object({ + file: Type.Optional(Type.String({ description: '文件路径、URL或Base64' })), + file_id: Type.Optional(Type.String({ description: '文件ID' })), }); -export type GetFilePayload = Static; +export type GetFilePayload = Static; + +export const GetFileReturnSchema = Type.Object({ + file: Type.Optional(Type.String({ description: '本地路径' })), + url: Type.Optional(Type.String({ description: '下载URL' })), + file_size: Type.Optional(Type.String({ description: '文件大小' })), + file_name: Type.Optional(Type.String({ description: '文件名' })), + base64: Type.Optional(Type.String({ description: 'Base64编码' })), +}, { description: '文件信息' }); + +export type GetFileResponse = Static; export class GetFileBase extends OneBotAction { - override payloadSchema = GetFileBase_PayloadSchema; + override payloadSchema = GetFilePayloadSchema; + override returnSchema = GetFileReturnSchema; async _handle (payload: GetFilePayload): Promise { payload.file ||= payload.file_id || ''; @@ -40,12 +43,12 @@ export class GetFileBase extends OneBotAction { let url = ''; if (mixElement?.picElement && rawMessage) { const tempData = - await this.obContext.apis.MsgApi.rawToOb11Converters.picElement?.(mixElement?.picElement, rawMessage, mixElement, { parseMultMsg: false, disableGetUrl: false, quick_reply: true }) as OB11MessageImage | undefined; + await this.obContext.apis.MsgApi.rawToOb11Converters.picElement?.(mixElement?.picElement, rawMessage, mixElement, { parseMultMsg: false, disableGetUrl: false, quick_reply: true }) as OB11MessageImage | undefined; url = tempData?.data.url ?? ''; } if (mixElement?.videoElement && rawMessage) { const tempData = - await this.obContext.apis.MsgApi.rawToOb11Converters.videoElement?.(mixElement?.videoElement, rawMessage, mixElement, { parseMultMsg: false, disableGetUrl: false, quick_reply: true }) as OB11MessageVideo | undefined; + await this.obContext.apis.MsgApi.rawToOb11Converters.videoElement?.(mixElement?.videoElement, rawMessage, mixElement, { parseMultMsg: false, disableGetUrl: false, quick_reply: true }) as OB11MessageVideo | undefined; url = tempData?.data.url ?? ''; } const res: GetFileResponse = { diff --git a/packages/napcat-onebot/action/file/GetGroupFileUrl.ts b/packages/napcat-onebot/action/file/GetGroupFileUrl.ts index e141167d..ba857551 100644 --- a/packages/napcat-onebot/action/file/GetGroupFileUrl.ts +++ b/packages/napcat-onebot/action/file/GetGroupFileUrl.ts @@ -3,22 +3,25 @@ import { FileNapCatOneBotUUID } from 'napcat-common/src/file-uuid'; import { GetPacketStatusDepends } from '@/napcat-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(), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + file_id: Type.String({ description: '文件ID' }), }); -type Payload = Static; +type PayloadType = Static; -interface GetGroupFileUrlResponse { - url?: string; -} +const ReturnSchema = Type.Object({ + url: Type.Optional(Type.String({ description: '文件下载链接' })), +}, { description: '群文件URL信息' }); -export class GetGroupFileUrl extends GetPacketStatusDepends { +type ReturnType = Static; + +export class GetGroupFileUrl extends GetPacketStatusDepends { override actionName = ActionName.GOCQHTTP_GetGroupFileUrl; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file_id) || FileNapCatOneBotUUID.decodeModelId(payload.file_id); if (contextMsgFile?.fileUUID) { return { diff --git a/packages/napcat-onebot/action/file/GetPrivateFileUrl.ts b/packages/napcat-onebot/action/file/GetPrivateFileUrl.ts index 34ebe6da..9a76c441 100644 --- a/packages/napcat-onebot/action/file/GetPrivateFileUrl.ts +++ b/packages/napcat-onebot/action/file/GetPrivateFileUrl.ts @@ -3,21 +3,24 @@ import { FileNapCatOneBotUUID } from 'napcat-common/src/file-uuid'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - file_id: Type.String(), +const PayloadSchema = Type.Object({ + file_id: Type.String({ description: '文件ID' }), }); -type Payload = Static; +type PayloadType = Static; -interface GetPrivateFileUrlResponse { - url?: string; -} +const ReturnSchema = Type.Object({ + url: Type.Optional(Type.String({ description: '文件下载链接' })), +}, { description: '私聊文件URL信息' }); -export class GetPrivateFileUrl extends GetPacketStatusDepends { +type ReturnType = Static; + +export class GetPrivateFileUrl extends GetPacketStatusDepends { override actionName = ActionName.NapCat_GetPrivateFileUrl; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file_id); if (contextMsgFile?.fileUUID && contextMsgFile.msgId) { diff --git a/packages/napcat-onebot/action/file/GetRecord.ts b/packages/napcat-onebot/action/file/GetRecord.ts index b444f44f..556455d4 100644 --- a/packages/napcat-onebot/action/file/GetRecord.ts +++ b/packages/napcat-onebot/action/file/GetRecord.ts @@ -2,22 +2,28 @@ import { GetFileBase, GetFilePayload, GetFileResponse } from './GetFile'; import { ActionName } from '@/napcat-onebot/action/router'; import { promises as fs } from 'fs'; import { FFmpegService } from '@/napcat-core/helper/ffmpeg/ffmpeg'; +import { Static, Type } from '@sinclair/typebox'; -const out_format = ['mp3', 'amr', 'wma', 'm4a', 'spx', 'ogg', 'wav', 'flac']; +const out_format_list = ['mp3', 'amr', 'wma', 'm4a', 'spx', 'ogg', 'wav', 'flac']; -type Payload = { - out_format: string; -} & GetFilePayload; +const PayloadSchema = Type.Object({ + file: Type.Optional(Type.String({ description: '文件路径、URL或Base64' })), + file_id: Type.Optional(Type.String({ description: '文件ID' })), + out_format: Type.String({ description: '输出格式' }), +}); + +type PayloadType = Static; export default class GetRecord extends GetFileBase { override actionName = ActionName.GetRecord; + override payloadSchema = PayloadSchema; - override async _handle (payload: Payload): Promise { - const res = await super._handle(payload); + override async _handle (payload: PayloadType): Promise { + const res = await super._handle(payload as GetFilePayload); if (payload.out_format && typeof payload.out_format === 'string') { const inputFile = res.file; if (!inputFile) throw new Error('file not found'); - if (!out_format.includes(payload.out_format)) { + if (!out_format_list.includes(payload.out_format)) { throw new Error('转换失败 out_format 字段可能格式不正确'); } const outputFile = `${inputFile}.${payload.out_format}`; diff --git a/packages/napcat-onebot/action/file/flash/CreateFlashTask.ts b/packages/napcat-onebot/action/file/flash/CreateFlashTask.ts index 32ba1347..f1486e98 100644 --- a/packages/napcat-onebot/action/file/flash/CreateFlashTask.ts +++ b/packages/napcat-onebot/action/file/flash/CreateFlashTask.ts @@ -1,6 +1,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; -import { Static, Type, Optional } from '@sinclair/typebox'; +import { Static, Type } from '@sinclair/typebox'; import path from 'node:path'; const richMediaList = [ @@ -8,22 +8,22 @@ const richMediaList = [ '.png', '.gif', '.jpg', '.jpeg', '.webp', '.bmp', ]; -// 不全部使用json因为:一个文件解析Form-data会变字符串!!! 但是api文档就写List -const SchemaData = Type.Object({ +export const CreateFlashTaskPayloadSchema = Type.Object({ files: Type.Union([ Type.Array(Type.String()), Type.String(), - ]), - name: Optional(Type.String()), - thumb_path: Optional(Type.String()), + ], { description: '文件列表或单个文件路径' }), + name: Type.Optional(Type.String({ description: '任务名称' })), + thumb_path: Type.Optional(Type.String({ description: '缩略图路径' })), }); -type Payload = Static; +export type CreateFlashTaskPayload = Static; -export class CreateFlashTask extends OneBotAction { +export class CreateFlashTask extends OneBotAction { override actionName = ActionName.CreateFlashTask; - override payloadSchema = SchemaData; + override payloadSchema = CreateFlashTaskPayloadSchema; + override returnSchema = Type.Any({ description: '任务创建结果' }); - async _handle (payload: Payload) { + async _handle (payload: CreateFlashTaskPayload) { const fileList = Array.isArray(payload.files) ? payload.files : [payload.files]; let thumbPath: string = ''; diff --git a/packages/napcat-onebot/action/file/flash/DownloadFileset.ts b/packages/napcat-onebot/action/file/flash/DownloadFileset.ts index 0cb84c9f..58a2a655 100644 --- a/packages/napcat-onebot/action/file/flash/DownloadFileset.ts +++ b/packages/napcat-onebot/action/file/flash/DownloadFileset.ts @@ -2,17 +2,18 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - fileset_id: Type.String(), +export const DownloadFilesetPayloadSchema = Type.Object({ + fileset_id: Type.String({ description: '文件集 ID' }), }); -type Payload = Static; +export type DownloadFilesetPayload = Static; -export class DownloadFileset extends OneBotAction { +export class DownloadFileset extends OneBotAction { override actionName = ActionName.DownloadFileset; - override payloadSchema = SchemaData; + override payloadSchema = DownloadFilesetPayloadSchema; + override returnSchema = Type.Any({ description: '下载结果' }); - async _handle (payload: Payload) { + async _handle (payload: DownloadFilesetPayload) { // 默认路径 / fileset_id /为下载路径 return await this.core.apis.FlashApi.downloadFileSetBySetId(payload.fileset_id); } diff --git a/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts b/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts index 1662c0c2..b32c4461 100644 --- a/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts +++ b/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts @@ -2,17 +2,18 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - share_code: Type.String(), +export const GetFilesetIdPayloadSchema = Type.Object({ + share_code: Type.String({ description: '分享码或分享链接' }), }); -type Payload = Static; +export type GetFilesetIdPayload = Static; -export class GetFilesetId extends OneBotAction { +export class GetFilesetId extends OneBotAction { override actionName = ActionName.GetFilesetId; - override payloadSchema = SchemaData; + override payloadSchema = GetFilesetIdPayloadSchema; + override returnSchema = Type.Any({ description: '文件集 ID' }); - async _handle (payload: Payload) { + async _handle (payload: GetFilesetIdPayload) { // 适配share_link 防止被传 Link无法解析 const code = payload.share_code.includes('=') ? payload.share_code.split('=').slice(1).join('=') : payload.share_code; return await this.core.apis.FlashApi.fromShareLinkFindSetId(code); diff --git a/packages/napcat-onebot/action/file/flash/GetFilesetInfo.ts b/packages/napcat-onebot/action/file/flash/GetFilesetInfo.ts index 7fc77d0c..7000b604 100644 --- a/packages/napcat-onebot/action/file/flash/GetFilesetInfo.ts +++ b/packages/napcat-onebot/action/file/flash/GetFilesetInfo.ts @@ -2,17 +2,18 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - fileset_id: Type.String(), +export const GetFilesetInfoPayloadSchema = Type.Object({ + fileset_id: Type.String({ description: '文件集 ID' }), }); -type Payload = Static; +export type GetFilesetInfoPayload = Static; -export class GetFilesetInfo extends OneBotAction { +export class GetFilesetInfo extends OneBotAction { override actionName = ActionName.GetFilesetInfo; - override payloadSchema = SchemaData; + override payloadSchema = GetFilesetInfoPayloadSchema; + override returnSchema = Type.Any({ description: '文件集信息' }); - async _handle (payload: Payload) { + async _handle (payload: GetFilesetInfoPayload) { return await this.core.apis.FlashApi.getFileSetIndoBySetId(payload.fileset_id); } } diff --git a/packages/napcat-onebot/action/file/flash/GetFlashFileList.ts b/packages/napcat-onebot/action/file/flash/GetFlashFileList.ts index e8ee1ea9..aee52dcc 100644 --- a/packages/napcat-onebot/action/file/flash/GetFlashFileList.ts +++ b/packages/napcat-onebot/action/file/flash/GetFlashFileList.ts @@ -2,17 +2,18 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - fileset_id: Type.String(), +export const GetFlashFileListPayloadSchema = Type.Object({ + fileset_id: Type.String({ description: '文件集 ID' }), }); -type Payload = Static; +export type GetFlashFileListPayload = Static; -export class GetFlashFileList extends OneBotAction { +export class GetFlashFileList extends OneBotAction { override actionName = ActionName.GetFlashFileList; - override payloadSchema = SchemaData; + override payloadSchema = GetFlashFileListPayloadSchema; + override returnSchema = Type.Any({ description: '文件列表' }); - async _handle (payload: Payload) { + async _handle (payload: GetFlashFileListPayload) { return await this.core.apis.FlashApi.getFileListBySetId(payload.fileset_id); } } diff --git a/packages/napcat-onebot/action/file/flash/GetFlashFileUrl.ts b/packages/napcat-onebot/action/file/flash/GetFlashFileUrl.ts index 403ad02f..13a52338 100644 --- a/packages/napcat-onebot/action/file/flash/GetFlashFileUrl.ts +++ b/packages/napcat-onebot/action/file/flash/GetFlashFileUrl.ts @@ -2,19 +2,20 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - fileset_id: Type.String(), - file_name: Type.Optional(Type.String()), - file_index: Type.Optional(Type.Number()), +export const GetFlashFileUrlPayloadSchema = Type.Object({ + fileset_id: Type.String({ description: '文件集 ID' }), + file_name: Type.Optional(Type.String({ description: '文件名' })), + file_index: Type.Optional(Type.Number({ description: '文件索引' })), }); -type Payload = Static; +export type GetFlashFileUrlPayload = Static; -export class GetFlashFileUrl extends OneBotAction { +export class GetFlashFileUrl extends OneBotAction { override actionName = ActionName.GetFlashFileUrl; - override payloadSchema = SchemaData; + override payloadSchema = GetFlashFileUrlPayloadSchema; + override returnSchema = Type.Any({ description: '文件下载链接' }); - async _handle (payload: Payload) { + async _handle (payload: GetFlashFileUrlPayload) { // 文件的索引依旧从0开始 return await this.core.apis.FlashApi.getFileTransUrl(payload.fileset_id, { fileName: payload.file_name, diff --git a/packages/napcat-onebot/action/file/flash/GetShareLink.ts b/packages/napcat-onebot/action/file/flash/GetShareLink.ts index ea749cbd..dae7e705 100644 --- a/packages/napcat-onebot/action/file/flash/GetShareLink.ts +++ b/packages/napcat-onebot/action/file/flash/GetShareLink.ts @@ -2,17 +2,18 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - fileset_id: Type.String(), +export const GetShareLinkPayloadSchema = Type.Object({ + fileset_id: Type.String({ description: '文件集 ID' }), }); -type Payload = Static; +export type GetShareLinkPayload = Static; -export class GetShareLink extends OneBotAction { +export class GetShareLink extends OneBotAction { override actionName = ActionName.GetShareLink; - override payloadSchema = SchemaData; + override payloadSchema = GetShareLinkPayloadSchema; + override returnSchema = Type.Any({ description: '分享链接' }); - async _handle (payload: Payload) { + async _handle (payload: GetShareLinkPayload) { return await this.core.apis.FlashApi.getShareLinkBySetId(payload.fileset_id); } } diff --git a/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts b/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts index abc71cba..e350564d 100644 --- a/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts +++ b/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts @@ -3,19 +3,20 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { ChatType, Peer } from 'napcat-core/types'; -const SchemaData = Type.Object({ - fileset_id: Type.String(), - user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), - group_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), +export const SendFlashMsgPayloadSchema = Type.Object({ + fileset_id: Type.String({ description: '文件集 ID' }), + user_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' })), + group_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '群号' })), }); -type Payload = Static; +export type SendFlashMsgPayload = Static; -export class SendFlashMsg extends OneBotAction { +export class SendFlashMsg extends OneBotAction { override actionName = ActionName.SendFlashMsg; - override payloadSchema = SchemaData; + override payloadSchema = SendFlashMsgPayloadSchema; + override returnSchema = Type.Any({ description: '发送结果' }); - async _handle (payload: Payload) { + async _handle (payload: SendFlashMsgPayload) { let peer: Peer; if (payload.group_id) { diff --git a/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts b/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts index 384798f0..f11a79fe 100644 --- a/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts +++ b/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts @@ -3,18 +3,19 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), - msg_id: Type.String(), +export const CancelOnlineFilePayloadSchema = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + msg_id: Type.String({ description: '消息 ID' }), }); -type Payload = Static; +export type CancelOnlineFilePayload = Static; -export class CancelOnlineFile extends OneBotAction { +export class CancelOnlineFile extends OneBotAction { override actionName = ActionName.CancelOnlineFile; - override payloadSchema = SchemaData; + override payloadSchema = CancelOnlineFilePayloadSchema; + override returnSchema = Type.Any({ description: '取消结果' }); - async _handle (payload: Payload) { + async _handle (payload: CancelOnlineFilePayload) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('User not found'); diff --git a/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts b/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts index 0cd0a320..e62eff13 100644 --- a/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts +++ b/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts @@ -3,17 +3,18 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), +export const GetOnlineFileMessagesPayloadSchema = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), }); -type Payload = Static; +export type GetOnlineFileMessagesPayload = Static; -export class GetOnlineFileMessages extends OneBotAction { +export class GetOnlineFileMessages extends OneBotAction { override actionName = ActionName.GetOnlineFileMessages; - override payloadSchema = SchemaData; + override payloadSchema = GetOnlineFileMessagesPayloadSchema; + override returnSchema = Type.Any({ description: '在线文件消息列表' }); - async _handle (payload: Payload) { + async _handle (payload: GetOnlineFileMessagesPayload) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('User not found'); diff --git a/packages/napcat-onebot/action/file/online/ReceiveOnlineFile.ts b/packages/napcat-onebot/action/file/online/ReceiveOnlineFile.ts index 5204d1d1..c8dbf849 100644 --- a/packages/napcat-onebot/action/file/online/ReceiveOnlineFile.ts +++ b/packages/napcat-onebot/action/file/online/ReceiveOnlineFile.ts @@ -3,19 +3,20 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), - msg_id: Type.String(), - element_id: Type.String(), +export const ReceiveOnlineFilePayloadSchema = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + msg_id: Type.String({ description: '消息 ID' }), + element_id: Type.String({ description: '元素 ID' }), }); -type Payload = Static; +export type ReceiveOnlineFilePayload = Static; -export class ReceiveOnlineFile extends OneBotAction { +export class ReceiveOnlineFile extends OneBotAction { override actionName = ActionName.ReceiveOnlineFile; - override payloadSchema = SchemaData; + override payloadSchema = ReceiveOnlineFilePayloadSchema; + override returnSchema = Type.Any({ description: '接收结果' }); - async _handle (payload: Payload) { + async _handle (payload: ReceiveOnlineFilePayload) { // 默认下载路径 const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('User not found'); diff --git a/packages/napcat-onebot/action/file/online/RefuseOnlineFile.ts b/packages/napcat-onebot/action/file/online/RefuseOnlineFile.ts index 6b3ff972..af87a002 100644 --- a/packages/napcat-onebot/action/file/online/RefuseOnlineFile.ts +++ b/packages/napcat-onebot/action/file/online/RefuseOnlineFile.ts @@ -3,19 +3,20 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), - msg_id: Type.String(), - element_id: Type.String(), +export const RefuseOnlineFilePayloadSchema = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + msg_id: Type.String({ description: '消息 ID' }), + element_id: Type.String({ description: '元素 ID' }), }); -type Payload = Static; +export type RefuseOnlineFilePayload = Static; -export class RefuseOnlineFile extends OneBotAction { +export class RefuseOnlineFile extends OneBotAction { override actionName = ActionName.RefuseOnlineFile; - override payloadSchema = SchemaData; + override payloadSchema = RefuseOnlineFilePayloadSchema; + override returnSchema = Type.Any({ description: '拒绝结果' }); - async _handle (payload: Payload) { + async _handle (payload: RefuseOnlineFilePayload) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('User not found'); diff --git a/packages/napcat-onebot/action/file/online/SendOnlineFile.ts b/packages/napcat-onebot/action/file/online/SendOnlineFile.ts index b5a657a3..12d1e0d3 100644 --- a/packages/napcat-onebot/action/file/online/SendOnlineFile.ts +++ b/packages/napcat-onebot/action/file/online/SendOnlineFile.ts @@ -3,19 +3,20 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), - file_path: Type.String(), - file_name: Type.Optional(Type.String()), +export const SendOnlineFilePayloadSchema = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + file_path: Type.String({ description: '本地文件路径' }), + file_name: Type.Optional(Type.String({ description: '文件名 (可选)' })), }); -type Payload = Static; +export type SendOnlineFilePayload = Static; -export class SendOnlineFile extends OneBotAction { +export class SendOnlineFile extends OneBotAction { override actionName = ActionName.SendOnlineFile; - override payloadSchema = SchemaData; + override payloadSchema = SendOnlineFilePayloadSchema; + override returnSchema = Type.Any({ description: '发送结果' }); - async _handle (payload: Payload) { + async _handle (payload: SendOnlineFilePayload) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('User not found'); diff --git a/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts b/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts index a4da4855..7ab8e3ac 100644 --- a/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts +++ b/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts @@ -3,19 +3,20 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), - folder_path: Type.String(), - folder_name: Type.Optional(Type.String()), +export const SendOnlineFolderPayloadSchema = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + folder_path: Type.String({ description: '本地文件夹路径' }), + folder_name: Type.Optional(Type.String({ description: '文件夹名称 (可选)' })), }); -type Payload = Static; +export type SendOnlineFolderPayload = Static; -export class SendOnlineFolder extends OneBotAction { +export class SendOnlineFolder extends OneBotAction { override actionName = ActionName.SendOnlineFolder; - override payloadSchema = SchemaData; + override payloadSchema = SendOnlineFolderPayloadSchema; + override returnSchema = Type.Any({ description: '发送结果' }); - async _handle (payload: Payload) { + async _handle (payload: SendOnlineFolderPayload) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('User not found'); diff --git a/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts index c10a58f6..a3d1f370 100644 --- a/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -2,23 +2,28 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), // 兼容gocq 与name二选一 - folder_name: Type.Optional(Type.String()), + folder_name: Type.Optional(Type.String({ description: '文件夹名称' })), // 兼容gocq 与folder_name二选一 - name: Type.Optional(Type.String()), + name: Type.Optional(Type.String({ description: '文件夹名称' })), }); -type Payload = Static; -interface ResponseType { - result: unknown; - groupItem: unknown; -} -export class CreateGroupFileFolder extends OneBotAction { +type PayloadType = Static; + +const ReturnSchema = Type.Object({ + result: Type.Any({ description: '操作结果' }), + groupItem: Type.Any({ description: '群项信息' }), +}, { description: '创建文件夹结果' }); + +type ReturnType = Static; + +export class CreateGroupFileFolder extends OneBotAction { override actionName = ActionName.GoCQHTTP_CreateGroupFileFolder; - override payloadSchema = SchemaData; - async _handle (payload: Payload) { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType) { const folderName = payload.folder_name || payload.name; return (await this.core.apis.GroupApi.creatGroupFileFolder(payload.group_id.toString(), folderName!)).resultWithGroupItem; } diff --git a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts index a61fe537..6947713a 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -4,17 +4,22 @@ import { FileNapCatOneBotUUID } from 'napcat-common/src/file-uuid'; import { Static, Type } from '@sinclair/typebox'; import { NTQQGroupApi } from 'napcat-core/apis'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - file_id: Type.String(), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + file_id: Type.String({ description: '文件ID' }), }); -type Payload = Static; +type PayloadType = Static; -export class DeleteGroupFile extends OneBotAction>> { +const ReturnSchema = Type.Any({ description: '删除结果' }); + +type ReturnType = Static; + +export class DeleteGroupFile extends OneBotAction { override actionName = ActionName.GOCQHTTP_DeleteGroupFile; - override payloadSchema = SchemaData; - async _handle (payload: Payload) { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType) { const data = FileNapCatOneBotUUID.decodeModelId(payload.file_id); if (!data || !data.fileId) throw new Error('Invalid file_id'); return await this.core.apis.GroupApi.delGroupFile(payload.group_id.toString(), [data.fileId]); diff --git a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 4a96a6fc..5f15125b 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -3,18 +3,23 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { Static, Type } from '@sinclair/typebox'; import { NTQQGroupApi } from 'napcat-core/apis'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - folder_id: Type.Optional(Type.String()), - folder: Type.Optional(Type.String()), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + folder_id: Type.Optional(Type.String({ description: '文件夹ID' })), + folder: Type.Optional(Type.String({ description: '文件夹ID' })), }); -type Payload = Static; +type PayloadType = Static; -export class DeleteGroupFileFolder extends OneBotAction>['groupFileCommonResult']> { +const ReturnSchema = Type.Any({ description: '删除结果' }); + +type ReturnType = Static; + +export class DeleteGroupFileFolder extends OneBotAction { override actionName = ActionName.GoCQHTTP_DeleteGroupFileFolder; - override payloadSchema = SchemaData; - async _handle (payload: Payload) { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType) { return (await this.core.apis.GroupApi.delGroupFileFolder( payload.group_id.toString(), payload.folder ?? payload.folder_id ?? '')).groupFileCommonResult; } diff --git a/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts b/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts index 15c77500..d5a8509f 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts @@ -6,24 +6,27 @@ import { calculateFileMD5, uriToLocalFile } from 'napcat-common/src/file'; import { randomUUID } from 'crypto'; import { Static, Type } from '@sinclair/typebox'; -interface FileResponse { - file: string; -} - -const SchemaData = Type.Object({ - url: Type.Optional(Type.String()), - base64: Type.Optional(Type.String()), - name: Type.Optional(Type.String()), - headers: Type.Optional(Type.Union([Type.String(), Type.Array(Type.String())])), +const PayloadSchema = Type.Object({ + url: Type.Optional(Type.String({ description: '下载链接' })), + base64: Type.Optional(Type.String({ description: 'base64数据' })), + name: Type.Optional(Type.String({ description: '文件名' })), + headers: Type.Optional(Type.Union([Type.String(), Type.Array(Type.String())], { description: '请求头' })), }); -type Payload = Static; +type PayloadType = Static; -export default class GoCQHTTPDownloadFile extends OneBotAction { +const ReturnSchema = Type.Object({ + file: Type.String({ description: '文件路径' }), +}, { description: '下载结果' }); + +type ReturnType = Static; + +export default class GoCQHTTPDownloadFile extends OneBotAction { override actionName = ActionName.GoCQHTTP_DownloadFile; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload): Promise { + async _handle (payload: PayloadType): Promise { const isRandomName = !payload.name; const name = payload.name || randomUUID(); let result: Awaited>; diff --git a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts index e165320b..393b47a6 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts @@ -6,17 +6,23 @@ import { Static, Type } from '@sinclair/typebox'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from 'napcat-core'; import { isNumeric } from 'napcat-common/src/helper'; -const SchemaData = Type.Object({ - message_id: Type.Optional(Type.String()), - id: Type.Optional(Type.String()), +const PayloadSchema = Type.Object({ + message_id: Type.Optional(Type.String({ description: '消息ID' })), + id: Type.Optional(Type.String({ description: '消息ID' })), }); -type Payload = Static; -export class GoCQHTTPGetForwardMsgAction extends OneBotAction { +type PayloadType = Static; + +const ReturnSchema = Type.Object({ + messages: Type.Optional(Type.Array(Type.Any(), { description: '消息列表' })), +}, { description: '合并转发消息' }); + +type ReturnType = Static; + +export class GoCQHTTPGetForwardMsgAction extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetForwardMsg; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; private createTemplateNode (message: OB11Message): OB11MessageNode { return { @@ -52,7 +58,7 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction; +type PayloadType = Static; -export default class GetFriendMsgHistory extends OneBotAction { +const ReturnSchema = Type.Object({ + messages: Type.Array(Type.Any(), { description: '消息列表' }), +}, { description: '好友历史消息' }); + +type ReturnType = Static; + +export default class GetFriendMsgHistory extends OneBotAction { override actionName = ActionName.GetFriendMsgHistory; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload, _adapter: string, config: NetworkAdapterConfig): Promise { + async _handle (payload: PayloadType, _adapter: string, config: NetworkAdapterConfig): Promise { // 处理参数 const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error(`记录${payload.user_id}不存在`); @@ -47,6 +51,6 @@ export default class GetFriendMsgHistory extends OneBotAction const ob11MsgList = (await Promise.all( msgList.map(msg => this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat, payload.parse_mult_msg, payload.disable_get_url))) ).filter(msg => msg !== undefined); - return { messages: ob11MsgList }; + return { messages: ob11MsgList as OB11Message[] }; } } diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 207c5efc..2fcced56 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -2,21 +2,26 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), }); -type Payload = Static; -interface ResponseType { - can_at_all: boolean; - remain_at_all_count_for_group: number; - remain_at_all_count_for_uin: number; -} -export class GoCQHTTPGetGroupAtAllRemain extends OneBotAction { - override actionName = ActionName.GoCQHTTP_GetGroupAtAllRemain; - override payloadSchema = SchemaData; +type PayloadType = Static; - async _handle (payload: Payload) { +const ReturnSchema = Type.Object({ + can_at_all: Type.Boolean({ description: '是否可以艾特全体' }), + remain_at_all_count_for_group: Type.Number({ description: '群艾特全体剩余次数' }), + remain_at_all_count_for_uin: Type.Number({ description: '个人艾特全体剩余次数' }), +}, { description: '群艾特全体剩余次数' }); + +type ReturnType = Static; + +export class GoCQHTTPGetGroupAtAllRemain extends OneBotAction { + override actionName = ActionName.GoCQHTTP_GetGroupAtAllRemain; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + + async _handle (payload: PayloadType) { const ret = await this.core.apis.GroupApi.getGroupRemainAtTimes(payload.group_id.toString()); const data = { can_at_all: ret.atInfo.canAtAll, diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 1f23d383..59bbe7cb 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -2,22 +2,27 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetGroupFileSystemInfo extends OneBotAction { +const ReturnSchema = Type.Object({ + file_count: Type.Number({ description: '文件总数' }), + limit_count: Type.Number({ description: '文件上限' }), + used_space: Type.Number({ description: '已使用空间' }), + total_space: Type.Number({ description: '总空间' }), +}, { description: '群文件系统信息' }); + +type ReturnType = Static; + +export class GetGroupFileSystemInfo extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetGroupFileSystemInfo; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const groupFileCount = (await this.core.apis.GroupApi.getGroupFileCount([payload.group_id.toString()])).groupFileCounts[0]; if (!groupFileCount) { throw new Error('Group not found'); diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index 51875a91..34e52c81 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -3,22 +3,27 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { OB11Construct } from '@/napcat-onebot/helper/data'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - folder_id: Type.Optional(Type.String()), - folder: Type.Optional(Type.String()), - file_count: Type.Union([Type.Number(), Type.String()], { default: 50 }), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + folder_id: Type.Optional(Type.String({ description: '文件夹ID' })), + folder: Type.Optional(Type.String({ description: '文件夹ID' })), + file_count: Type.Union([Type.Number(), Type.String()], { default: 50, description: '文件数量' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetGroupFilesByFolder extends OneBotAction[], - folders: never[], -}> { +const ReturnSchema = Type.Object({ + files: Type.Array(Type.Any(), { description: '文件列表' }), + folders: Type.Array(Type.Any(), { description: '文件夹列表' }), +}, { description: '群文件夹文件列表' }); + +type ReturnType = Static; + +export class GetGroupFilesByFolder extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetGroupFilesByFolder; - override payloadSchema = SchemaData; - async _handle (payload: Payload) { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType) { const ret = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), { sortType: 1, fileCount: +payload.file_count, diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts index 233df28f..46157b10 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -3,28 +3,31 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { WebHonorType } from 'napcat-core/types'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - type: Type.Optional(Type.Enum(WebHonorType)), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + type: Type.Optional(Type.Enum(WebHonorType, { description: '荣誉类型' })), }); -type Payload = Static; +type PayloadType = Static; -interface HonorInfo { - group_id: number; - current_talkative: Record; - talkative_list: unknown[]; - performer_list: unknown[]; - legend_list: unknown[]; - emotion_list: unknown[]; - strong_newbie_list: unknown[]; -} +const ReturnSchema = Type.Object({ + group_id: Type.Number({ description: '群号' }), + current_talkative: Type.Record(Type.String(), Type.Unknown(), { description: '当前龙王' }), + talkative_list: Type.Array(Type.Unknown(), { description: '龙王列表' }), + performer_list: Type.Array(Type.Unknown(), { description: '群聊之火列表' }), + legend_list: Type.Array(Type.Unknown(), { description: '群聊炽热列表' }), + emotion_list: Type.Array(Type.Unknown(), { description: '快乐源泉列表' }), + strong_newbie_list: Type.Array(Type.Unknown(), { description: '冒尖小春笋列表' }), +}, { description: '群荣誉信息' }); -export class GetGroupHonorInfo extends OneBotAction { +type ReturnType = Static; + +export class GetGroupHonorInfo extends OneBotAction { override actionName = ActionName.GetGroupHonorInfo; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType): Promise { if (!payload.type) { payload.type = WebHonorType.ALL; } diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts index 47407b3d..fbd6a8d1 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -6,28 +6,31 @@ import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; -interface Response { - messages: OB11Message[]; -} - -const SchemaData = Type.Object({ - group_id: Type.String(), - message_seq: Type.Optional(Type.String()), - count: Type.Number({ default: 20 }), - reverse_order: Type.Boolean({ default: false }), - disable_get_url: Type.Boolean({ default: false }), - parse_mult_msg: Type.Boolean({ default: true }), - quick_reply: Type.Boolean({ default: false }), - reverseOrder: Type.Boolean({ default: false }),// @deprecated 兼容旧版本 +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + message_seq: Type.Optional(Type.String({ description: '起始消息序号' })), + count: Type.Number({ default: 20, description: '获取消息数量' }), + reverse_order: Type.Boolean({ default: false, description: '是否反向排序' }), + disable_get_url: Type.Boolean({ default: false, description: '是否禁用获取URL' }), + parse_mult_msg: Type.Boolean({ default: true, description: '是否解析合并消息' }), + quick_reply: Type.Boolean({ default: false, description: '是否快速回复' }), + reverseOrder: Type.Boolean({ default: false, description: '是否反向排序(旧版本兼容)' }), }); -type Payload = Static; +type PayloadType = Static; -export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction { +const ReturnSchema = Type.Object({ + messages: Type.Array(Type.Any(), { description: '消息列表' }), +}, { description: '群历史消息' }); + +type ReturnType = Static; + +export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetGroupMsgHistory; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload, _adapter: string, config: NetworkAdapterConfig): Promise { + async _handle (payload: PayloadType, _adapter: string, config: NetworkAdapterConfig): Promise { const peer: Peer = { chatType: ChatType.KCHATTYPEGROUP, peerUid: payload.group_id.toString() }; const hasMessageSeq = !payload.message_seq ? !!payload.message_seq : !(payload.message_seq?.toString() === '' || payload.message_seq?.toString() === '0'); // 拉取消息 @@ -44,6 +47,6 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat, payload.parse_mult_msg, payload.disable_get_url, payload.quick_reply))) ).filter(msg => msg !== undefined); - return { messages: ob11MsgList }; + return { messages: ob11MsgList as OB11Message[] }; } } diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts index a0737471..f5e53b48 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -1,23 +1,27 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; -import { OB11GroupFile, OB11GroupFileFolder } from '@/napcat-onebot/index'; import { OB11Construct } from '@/napcat-onebot/helper/data'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - file_count: Type.Union([Type.Number(), Type.String()], { default: 50 }), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + file_count: Type.Union([Type.Number(), Type.String()], { default: 50, description: '文件数量' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetGroupRootFiles extends OneBotAction { +const ReturnSchema = Type.Object({ + files: Type.Array(Type.Any(), { description: '文件列表' }), + folders: Type.Array(Type.Any(), { description: '文件夹列表' }), +}, { description: '群根目录文件列表' }); + +type ReturnType = Static; + +export class GetGroupRootFiles extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetGroupRootFiles; - override payloadSchema = SchemaData; - async _handle (payload: Payload) { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType) { const ret = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), { sortType: 1, fileCount: +payload.file_count, diff --git a/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts b/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts index 57b748db..5790d3a9 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts @@ -2,8 +2,19 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { sleep } from 'napcat-common/src/helper'; -export class GetOnlineClient extends OneBotAction> { +const PayloadSchema = Type.Object({}, { description: '在线客户端负载' }); + +type PayloadType = Static; + +const ReturnSchema = Type.Array(Type.Any(), { description: '在线客户端列表' }); + +type ReturnType = Static; + +export class GetOnlineClient extends OneBotAction { override actionName = ActionName.GetOnlineClient; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle () { // 注册监听 this.core.apis.SystemApi.getOnlineDev(); diff --git a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts index 0c9d9ff7..6b47ce49 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -5,17 +5,38 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { calcQQLevel } from 'napcat-common/src/helper'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), - no_cache: Type.Union([Type.Boolean(), Type.String()], { default: false }), +const PayloadSchema = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()], { description: '用户QQ' }), + no_cache: Type.Union([Type.Boolean(), Type.String()], { default: false, description: '是否不使用缓存' }), }); -type Payload = Static; +type PayloadType = Static; -export default class GoCQHTTPGetStrangerInfo extends OneBotAction { +const ReturnSchema = Type.Object({ + user_id: Type.Number({ description: '用户QQ' }), + uid: Type.String({ description: 'UID' }), + nickname: Type.String({ description: '昵称' }), + age: Type.Number({ description: '年龄' }), + qid: Type.String({ description: 'QID' }), + qqLevel: Type.Number({ description: 'QQ等级' }), + sex: Type.String({ description: '性别' }), + long_nick: Type.String({ description: '个性签名' }), + reg_time: Type.Number({ description: '注册时间' }), + is_vip: Type.Boolean({ description: '是否VIP' }), + is_years_vip: Type.Boolean({ description: '是否年费VIP' }), + vip_level: Type.Number({ description: 'VIP等级' }), + remark: Type.String({ description: '备注' }), + status: Type.Number({ description: '状态' }), + login_days: Type.Number({ description: '登录天数' }), +}, { description: '陌生人信息' }); + +type ReturnType = Static; + +export default class GoCQHTTPGetStrangerInfo extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetStrangerInfo; - override payloadSchema = SchemaData; - async _handle (payload: Payload) { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType): Promise { const user_id = payload.user_id.toString(); const isNocache = typeof payload.no_cache === 'string' ? payload.no_cache === 'true' : !!payload.no_cache; const extendData = await this.core.apis.UserApi.getUserDetailInfoByUin(user_id); diff --git a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index 86207cc2..808d8120 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -2,15 +2,22 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - url: Type.String(), +export const GoCQHTTPCheckUrlSafelyPayloadSchema = Type.Object({ + url: Type.String({ description: '要检查的 URL' }), }); -type Payload = Static; +export type GoCQHTTPCheckUrlSafelyPayload = Static; -export class GoCQHTTPCheckUrlSafely extends OneBotAction { +export const GoCQHTTPCheckUrlSafelyReturnSchema = Type.Object({ + level: Type.Number({ description: '安全等级 (1: 安全, 2: 未知, 3: 危险)' }), +}); + +export type GoCQHTTPCheckUrlSafelyReturn = Static; + +export class GoCQHTTPCheckUrlSafely extends OneBotAction { override actionName = ActionName.GoCQHTTP_CheckUrlSafely; - override payloadSchema = SchemaData; + override payloadSchema = GoCQHTTPCheckUrlSafelyPayloadSchema; + override returnSchema = GoCQHTTPCheckUrlSafelyReturnSchema; async _handle () { return { level: 1 }; diff --git a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index ee9fc07f..d6359d3e 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -2,20 +2,21 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - friend_id: Type.Optional(Type.Union([Type.String(), Type.Number()])), - user_id: Type.Optional(Type.Union([Type.String(), Type.Number()])), - temp_block: Type.Optional(Type.Boolean()), - temp_both_del: Type.Optional(Type.Boolean()), +export const GoCQHTTPDeleteFriendPayloadSchema = Type.Object({ + friend_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '好友 QQ 号' })), + user_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '用户 QQ 号' })), + temp_block: Type.Optional(Type.Boolean({ description: '是否加入黑名单' })), + temp_both_del: Type.Optional(Type.Boolean({ description: '是否双向删除' })), }); -type Payload = Static; +export type GoCQHTTPDeleteFriendPayload = Static; -export class GoCQHTTPDeleteFriend extends OneBotAction { +export class GoCQHTTPDeleteFriend extends OneBotAction { override actionName = ActionName.GoCQHTTP_DeleteFriend; - override payloadSchema = SchemaData; + override payloadSchema = GoCQHTTPDeleteFriendPayloadSchema; + override returnSchema = Type.Any(); - async _handle (payload: Payload) { + async _handle (payload: GoCQHTTPDeleteFriendPayload) { const uin = payload.friend_id ?? payload.user_id ?? ''; const uid = await this.core.apis.UserApi.getUidByUinV2(uin.toString()); diff --git a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index d8123af4..9e5d4fa4 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -2,22 +2,27 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - model: Type.Optional(Type.String()), +export const GoCQHTTPGetModelShowPayloadSchema = Type.Object({ + model: Type.Optional(Type.String({ description: '模型名称' })), }); -type Payload = Static; +export type GoCQHTTPGetModelShowPayload = Static; -export class GoCQHTTPGetModelShow extends OneBotAction> { +export const GoCQHTTPGetModelShowReturnSchema = Type.Array(Type.Object({ + variants: Type.Object({ + model_show: Type.String({ description: '显示名称' }), + need_pay: Type.Boolean({ description: '是否需要付费' }), + }), +}), { description: '模型显示列表' }); + +export type GoCQHTTPGetModelShowReturn = Static; + +export class GoCQHTTPGetModelShow extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetModelShow; - override payloadSchema = SchemaData; + override payloadSchema = GoCQHTTPGetModelShowPayloadSchema; + override returnSchema = GoCQHTTPGetModelShowReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: GoCQHTTPGetModelShowPayload) { if (!payload.model) { payload.model = 'napcat'; } diff --git a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPSetModelShow.ts b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPSetModelShow.ts index a104f897..17fe6b96 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPSetModelShow.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPSetModelShow.ts @@ -1,8 +1,12 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; +import { Type } from '@sinclair/typebox'; + // 兼容性代码 export class GoCQHTTPSetModelShow extends OneBotAction { override actionName = ActionName.GoCQHTTP_SetModelShow; + override payloadSchema = Type.Object({}); + override returnSchema = Type.Null(); async _handle () { diff --git a/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts b/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts index 1e9f1558..f0a2ea23 100644 --- a/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts +++ b/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts @@ -1,19 +1,71 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { QuickAction, QuickActionEvent } from '@/napcat-onebot/types'; +import { Static, Type } from '@sinclair/typebox'; -interface Payload { - context: QuickActionEvent, - operation: QuickAction -} +const SenderSchema = Type.Object({ + user_id: Type.Number({ description: '用户ID' }), + nickname: Type.String({ description: '昵称' }), + sex: Type.Optional(Type.String({ description: '性别' })), + age: Type.Optional(Type.Number({ description: '年龄' })), + card: Type.Optional(Type.String({ description: '群名片' })), + level: Type.Optional(Type.String({ description: '群等级' })), + role: Type.Optional(Type.String({ description: '群角色' })), +}); -export class GoCQHTTPHandleQuickAction extends OneBotAction { +// 定义 QuickAction 的详细 Schema +const QuickActionSchema = Type.Object({ + reply: Type.Optional(Type.String({ description: '回复内容' })), + auto_escape: Type.Optional(Type.Boolean({ description: '是否作为纯文本发送' })), + at_sender: Type.Optional(Type.Boolean({ description: '是否 @ 发送者' })), + delete: Type.Optional(Type.Boolean({ description: '是否撤回该消息' })), + kick: Type.Optional(Type.Boolean({ description: '是否踢出发送者' })), + ban: Type.Optional(Type.Boolean({ description: '是否禁言发送者' })), + ban_duration: Type.Optional(Type.Number({ description: '禁言时长' })), + approve: Type.Optional(Type.Boolean({ description: '是否同意请求/加群' })), + remark: Type.Optional(Type.String({ description: '好友备注' })), + reason: Type.Optional(Type.String({ description: '拒绝理由' })), +}, { description: '快速操作内容' }); + +// 定义 QuickActionEvent 的详细 Schema +const QuickActionEventSchema = Type.Object({ + time: Type.Number({ description: '事件发生时间' }), + self_id: Type.Number({ description: '收到事件的机器人 QQ 号' }), + post_type: Type.String({ description: '上报类型' }), + message_type: Type.Optional(Type.String({ description: '消息类型' })), + sub_type: Type.Optional(Type.String({ description: '消息子类型' })), + user_id: Type.Union([Type.Number(), Type.String()], { description: '发送者 QQ 号' }), + group_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '群号' })), + message_id: Type.Optional(Type.Number({ description: '消息 ID' })), + message_seq: Type.Optional(Type.Number({ description: '消息序列号' })), + real_id: Type.Optional(Type.Number({ description: '真实消息 ID' })), + sender: Type.Optional(SenderSchema), + message: Type.Optional(Type.Any({ description: '消息内容' })), + message_format: Type.Optional(Type.String({ description: '消息格式' })), + raw_message: Type.Optional(Type.String({ description: '原始消息内容' })), + font: Type.Optional(Type.Number({ description: '字体' })), + notice_type: Type.Optional(Type.String({ description: '通知类型' })), + meta_event_type: Type.Optional(Type.String({ description: '元事件类型' })), +}, { description: '事件上下文' }); + +export const GoCQHTTPHandleQuickActionPayloadSchema = Type.Object({ + context: QuickActionEventSchema, + operation: QuickActionSchema, +}); + +export type GoCQHTTPHandleQuickActionPayload = { + context: QuickActionEvent; + operation: QuickAction; +} & Static; + +export class GoCQHTTPHandleQuickAction extends OneBotAction { override actionName = ActionName.GoCQHTTP_HandleQuickAction; + override payloadSchema = GoCQHTTPHandleQuickActionPayloadSchema; + override returnSchema = Type.Null(); - async _handle (payload: Payload): Promise { + async _handle (payload: GoCQHTTPHandleQuickActionPayload): Promise { this.obContext.apis.QuickActionApi .handleQuickOperation(payload.context, payload.operation) .catch(e => this.core.context.logger.logError(e)); - return null; } } diff --git a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts index 1a2e7f4a..415a1751 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts @@ -1,32 +1,31 @@ -import { ContextMode, normalize, ReturnDataType, SendMsgBase } from '@/napcat-onebot/action/msg/SendMsg'; -import { OB11PostSendMsg } from '@/napcat-onebot/types'; +import { ContextMode, normalize, ReturnDataType, SendMsgBase, SendMsgPayload } from '@/napcat-onebot/action/msg/SendMsg'; import { ActionName } from '@/napcat-onebot/action/router'; // 未验证 export class GoCQHTTPSendForwardMsgBase extends SendMsgBase { - protected override async check (payload: OB11PostSendMsg) { - if (payload.messages) payload.message = normalize(payload.messages); + protected override async check (payload: SendMsgPayload) { + if ((payload as any).messages) payload.message = normalize((payload as any).messages); return super.check(payload); } } export class GoCQHTTPSendForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendForwardMsg; - protected override async check (payload: OB11PostSendMsg) { - if (payload.messages) payload.message = normalize(payload.messages); + protected override async check (payload: SendMsgPayload) { + if ((payload as any).messages) payload.message = normalize((payload as any).messages); return super.check(payload); } } export class GoCQHTTPSendPrivateForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendPrivateForwardMsg; - override async _handle (payload: OB11PostSendMsg): Promise { + override async _handle (payload: SendMsgPayload): Promise { return this.base_handle(payload, ContextMode.Private); } } export class GoCQHTTPSendGroupForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendGroupForwardMsg; - override async _handle (payload: OB11PostSendMsg): Promise { + override async _handle (payload: SendMsgPayload): Promise { return this.base_handle(payload, ContextMode.Group); } } diff --git a/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts b/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts index 13ca961f..c78a03a4 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts @@ -4,23 +4,24 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { unlink } from 'node:fs/promises'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - content: Type.String(), - image: Type.Optional(Type.String()), - pinned: Type.Union([Type.Number(), Type.String()], { default: 0 }), - type: Type.Union([Type.Number(), Type.String()], { default: 1 }), - confirm_required: Type.Union([Type.Number(), Type.String()], { default: 1 }), - is_show_edit_card: Type.Union([Type.Number(), Type.String()], { default: 0 }), - tip_window_type: Type.Union([Type.Number(), Type.String()], { default: 0 }), +export const SendGroupNoticePayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + content: Type.String({ description: '公告内容' }), + image: Type.Optional(Type.String({ description: '公告图片路径或 URL' })), + pinned: Type.Union([Type.Number(), Type.String()], { default: 0, description: '是否置顶 (0/1)' }), + type: Type.Union([Type.Number(), Type.String()], { default: 1, description: '类型 (默认为 1)' }), + confirm_required: Type.Union([Type.Number(), Type.String()], { default: 1, description: '是否需要确认 (0/1)' }), + is_show_edit_card: Type.Union([Type.Number(), Type.String()], { default: 0, description: '是否显示修改群名片引导 (0/1)' }), + tip_window_type: Type.Union([Type.Number(), Type.String()], { default: 0, description: '弹窗类型 (默认为 0)' }), }); -type Payload = Static; +export type SendGroupNoticePayload = Static; -export class SendGroupNotice extends OneBotAction { +export class SendGroupNotice extends OneBotAction { override actionName = ActionName.GoCQHTTP_SendGroupNotice; - override payloadSchema = SchemaData; - async _handle (payload: Payload) { + override payloadSchema = SendGroupNoticePayloadSchema; + override returnSchema = Type.Null(); + async _handle (payload: SendGroupNoticePayload) { let UploadImage: { id: string, width: number, height: number; } | undefined; if (payload.image) { // 公告图逻辑 diff --git a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts index c81e9344..45e1401a 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -4,18 +4,19 @@ import { checkFileExistV2, uriToLocalFile } from 'napcat-common/src/file'; import { Static, Type } from '@sinclair/typebox'; import fs from 'node:fs/promises'; import { GeneralCallResult } from 'napcat-core'; -const SchemaData = Type.Object({ - file: Type.String(), - group_id: Type.Union([Type.Number(), Type.String()]), +export const SetGroupPortraitPayloadSchema = Type.Object({ + file: Type.String({ description: '头像文件路径或 URL' }), + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), }); -type Payload = Static; +export type SetGroupPortraitPayload = Static; -export default class SetGroupPortrait extends OneBotAction { +export default class SetGroupPortrait extends OneBotAction { override actionName = ActionName.SetGroupPortrait; - override payloadSchema = SchemaData; + override payloadSchema = SetGroupPortraitPayloadSchema; + override returnSchema = Type.Any({ description: '设置结果' }); - async _handle (payload: Payload): Promise { + async _handle (payload: SetGroupPortraitPayload): Promise { const { path, success } = (await uriToLocalFile(this.core.NapCatTempPath, payload.file)); if (!success) { throw new Error(`头像${payload.file}设置失败,file字段可能格式不正确`); diff --git a/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts b/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts index 2d23286b..d8364f8f 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts @@ -3,18 +3,19 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - nickname: Type.String(), - personal_note: Type.Optional(Type.String()), - sex: Type.Optional(Type.Union([Type.Number(), Type.String()])), // 传Sex值?建议传0 +export const SetQQProfilePayloadSchema = Type.Object({ + nickname: Type.String({ description: '昵称' }), + personal_note: Type.Optional(Type.String({ description: '个性签名' })), + sex: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '性别 (0: 未知, 1: 男, 2: 女)' })), // 传Sex值?建议传0 }); -type Payload = Static; -export class SetQQProfile extends OneBotAction> | null> { +export type SetQQProfilePayload = Static; +export class SetQQProfile extends OneBotAction { override actionName = ActionName.SetQQProfile; - override payloadSchema = SchemaData; + override payloadSchema = SetQQProfilePayloadSchema; + override returnSchema = Type.Any({ description: '设置结果' }); - async _handle (payload: Payload) { + async _handle (payload: SetQQProfilePayload) { const self = this.core.selfInfo; const OldProfile = await this.core.apis.UserApi.getUserDetailInfo(self.uid); return await this.core.apis.UserApi.modifySelfProfile({ diff --git a/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts b/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts index 11bfe4b9..c5379700 100644 --- a/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts @@ -6,26 +6,29 @@ import { uriToLocalFile } from 'napcat-common/src/file'; import { SendMessageContext } from '@/napcat-onebot/api'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - file: Type.String(), - name: Type.String(), - folder: Type.Optional(Type.String()), - folder_id: Type.Optional(Type.String()), // 临时扩展 - upload_file: Type.Boolean({ default: true }), +export const GoCQHTTPUploadGroupFilePayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + file: Type.String({ description: '本地文件路径' }), + name: Type.String({ description: '文件名' }), + folder: Type.Optional(Type.String({ description: '父目录 ID' })), + folder_id: Type.Optional(Type.String({ description: '父目录 ID (兼容性字段)' })), // 临时扩展 + upload_file: Type.Boolean({ default: true, description: '是否执行上传' }), }); -type Payload = Static; +export type GoCQHTTPUploadGroupFilePayload = Static; -interface UploadGroupFileResponse { - file_id: string | null; -} +export const GoCQHTTPUploadGroupFileReturnSchema = Type.Object({ + file_id: Type.Union([Type.String(), Type.Null()], { description: '文件 ID' }), +}); -export default class GoCQHTTPUploadGroupFile extends OneBotAction { +export type GoCQHTTPUploadGroupFileResponse = Static; + +export default class GoCQHTTPUploadGroupFile extends OneBotAction { override actionName = ActionName.GoCQHTTP_UploadGroupFile; - override payloadSchema = SchemaData; + override payloadSchema = GoCQHTTPUploadGroupFilePayloadSchema; + override returnSchema = GoCQHTTPUploadGroupFileReturnSchema; - async _handle (payload: Payload): Promise { + async _handle (payload: GoCQHTTPUploadGroupFilePayload): Promise { let file = payload.file; if (fs.existsSync(file)) { file = `file://${file}`; diff --git a/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts b/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts index 9ad46aec..50848820 100644 --- a/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -7,24 +7,27 @@ import { SendMessageContext } from '@/napcat-onebot/api'; import { ContextMode, createContext } from '@/napcat-onebot/action/msg/SendMsg'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), - file: Type.String(), - name: Type.String(), - upload_file: Type.Boolean({ default: true }), +export const GoCQHTTPUploadPrivateFilePayloadSchema = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + file: Type.String({ description: '本地文件路径' }), + name: Type.String({ description: '文件名' }), + upload_file: Type.Boolean({ default: true, description: '是否执行上传' }), }); -type Payload = Static; +export type GoCQHTTPUploadPrivateFilePayload = Static; -interface UploadPrivateFileResponse { - file_id: string | null; -} +export const GoCQHTTPUploadPrivateFileReturnSchema = Type.Object({ + file_id: Type.Union([Type.String(), Type.Null()], { description: '文件 ID' }), +}); -export default class GoCQHTTPUploadPrivateFile extends OneBotAction { +export type GoCQHTTPUploadPrivateFileResponse = Static; + +export default class GoCQHTTPUploadPrivateFile extends OneBotAction { override actionName = ActionName.GOCQHTTP_UploadPrivateFile; - override payloadSchema = SchemaData; + override payloadSchema = GoCQHTTPUploadPrivateFilePayloadSchema; + override returnSchema = GoCQHTTPUploadPrivateFileReturnSchema; - async getPeer (payload: Payload): Promise { + async getPeer (payload: GoCQHTTPUploadPrivateFilePayload): Promise { if (payload.user_id) { const peerUid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!peerUid) { diff --git a/packages/napcat-onebot/action/group/DelEssenceMsg.ts b/packages/napcat-onebot/action/group/DelEssenceMsg.ts index 0dcb5837..d19bd2dd 100644 --- a/packages/napcat-onebot/action/group/DelEssenceMsg.ts +++ b/packages/napcat-onebot/action/group/DelEssenceMsg.ts @@ -3,19 +3,25 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - message_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), - msg_seq: Type.Optional(Type.String()), - msg_random: Type.Optional(Type.String()), - group_id: Type.Optional(Type.String()), +const PayloadSchema = Type.Object({ + message_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '消息ID' })), + msg_seq: Type.Optional(Type.String({ description: '消息序号' })), + msg_random: Type.Optional(Type.String({ description: '消息随机数' })), + group_id: Type.Optional(Type.String({ description: '群号' })), }); -type Payload = Static; -export default class DelEssenceMsg extends OneBotAction { - override actionName = ActionName.DelEssenceMsg; - override payloadSchema = SchemaData; +type PayloadType = Static; - async _handle (payload: Payload): Promise { +const ReturnSchema = Type.Any({ description: '操作结果' }); + +type ReturnType = Static; + +export default class DelEssenceMsg extends OneBotAction { + override actionName = ActionName.DelEssenceMsg; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + + async _handle (payload: PayloadType): Promise { // 如果直接提供了 msg_seq, msg_random, group_id,优先使用 if (payload.msg_seq && payload.msg_random && payload.group_id) { return await this.core.apis.GroupApi.removeGroupEssenceBySeq( @@ -34,7 +40,7 @@ export default class DelEssenceMsg extends OneBotAction { if (!msg) { const data = this.core.apis.GroupApi.essenceLRU.getValue(+payload.message_id); if (!data) throw new Error('消息不存在'); - const { msg_seq, msg_random, group_id } = JSON.parse(data) as { msg_seq: string, msg_random: string, group_id: string }; + const { msg_seq, msg_random, group_id } = JSON.parse(data) as { msg_seq: string, msg_random: string, group_id: string; }; return await this.core.apis.GroupApi.removeGroupEssenceBySeq(group_id, msg_seq, msg_random); } return await this.core.apis.GroupApi.removeGroupEssence( diff --git a/packages/napcat-onebot/action/group/DelGroupNotice.ts b/packages/napcat-onebot/action/group/DelGroupNotice.ts index 024c3891..948a0498 100644 --- a/packages/napcat-onebot/action/group/DelGroupNotice.ts +++ b/packages/napcat-onebot/action/group/DelGroupNotice.ts @@ -2,18 +2,23 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - notice_id: Type.String(), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + notice_id: Type.String({ description: '公告ID' }), }); -type Payload = Static; +type PayloadType = Static; -export class DelGroupNotice extends OneBotAction { +const ReturnSchema = Type.Any({ description: '操作结果' }); + +type ReturnType = Static; + +export class DelGroupNotice extends OneBotAction { override actionName = ActionName.DelGroupNotice; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const group = payload.group_id.toString(); const noticeId = payload.notice_id; return await this.core.apis.GroupApi.deleteGroupBulletin(group, noticeId); diff --git a/packages/napcat-onebot/action/group/GetAiRecord.ts b/packages/napcat-onebot/action/group/GetAiRecord.ts index b96501fd..567c54d3 100644 --- a/packages/napcat-onebot/action/group/GetAiRecord.ts +++ b/packages/napcat-onebot/action/group/GetAiRecord.ts @@ -3,19 +3,24 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { AIVoiceChatType } from 'napcat-core/packet/entities/aiChat'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - character: Type.String(), - group_id: Type.Union([Type.Number(), Type.String()]), - text: Type.String(), +const PayloadSchema = Type.Object({ + character: Type.String({ description: '角色ID' }), + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + text: Type.String({ description: '语音文本内容' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetAiRecord extends GetPacketStatusDepends { +const ReturnSchema = Type.String({ description: '语音URL' }); + +type ReturnType = Static; + +export class GetAiRecord extends GetPacketStatusDepends { override actionName = ActionName.GetAiRecord; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const rawRsp = await this.core.apis.PacketApi.pkt.operation.GetAiVoice(+payload.group_id, payload.character, payload.text, AIVoiceChatType.Sound); if (!rawRsp.msgInfoBody[0]) { throw new Error('No voice data'); diff --git a/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts b/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts index d9fdff2c..2195b4da 100644 --- a/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts @@ -2,17 +2,29 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetGroupDetailInfo extends OneBotAction { +const ReturnSchema = Type.Object({ + group_id: Type.Number({ description: '群号' }), + group_name: Type.String({ description: '群名称' }), + member_count: Type.Number({ description: '成员数量' }), + max_member_count: Type.Number({ description: '最大成员数量' }), + group_all_shut: Type.Number({ description: '全员禁言状态' }), + group_remark: Type.String({ description: '群备注' }), +}, { description: '群详细信息' }); + +type ReturnType = Static; + +export class GetGroupDetailInfo extends OneBotAction { override actionName = ActionName.GetGroupDetailInfo; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType): Promise { const data = await this.core.apis.GroupApi.fetchGroupDetail(payload.group_id.toString()); return { ...data, diff --git a/packages/napcat-onebot/action/group/GetGroupEssence.ts b/packages/napcat-onebot/action/group/GetGroupEssence.ts index 9ae88c2b..ac5c6a7c 100644 --- a/packages/napcat-onebot/action/group/GetGroupEssence.ts +++ b/packages/napcat-onebot/action/group/GetGroupEssence.ts @@ -6,15 +6,30 @@ import crypto from 'crypto'; import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetGroupEssence extends OneBotAction { +const ReturnSchema = Type.Array(Type.Object({ + msg_seq: Type.Number({ description: '消息序号' }), + msg_random: Type.Number({ description: '消息随机数' }), + sender_id: Type.Number({ description: '发送者QQ' }), + sender_nick: Type.String({ description: '发送者昵称' }), + operator_id: Type.Number({ description: '操作者QQ' }), + operator_nick: Type.String({ description: '操作者昵称' }), + message_id: Type.Number({ description: '消息ID' }), + operator_time: Type.Number({ description: '操作时间' }), + content: Type.Array(Type.Any(), { description: '消息内容' }), +}), { description: '精华消息列表' }); + +type ReturnType = Static; + +export class GetGroupEssence extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetEssenceMsg; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; private async msgSeqToMsgId (peer: Peer, msgSeq: string, msgRandom: string) { const replyMsgList = (await this.core.apis.MsgApi.getMsgsBySeqAndCount(peer, msgSeq, 1, true, true)).msgList.find((msg) => msg.msgSeq === msgSeq && msg.msgRandom === msgRandom); @@ -27,10 +42,10 @@ export class GetGroupEssence extends OneBotAction { }; } - async _handle (payload: Payload, _adapter: string, config: NetworkAdapterConfig) { + async _handle (payload: PayloadType, _adapter: string, config: NetworkAdapterConfig): Promise { const msglist = (await this.core.apis.WebApi.getGroupEssenceMsgAll(payload.group_id.toString())) .flatMap((e) => e?.data?.msg_list) - // 在群精华回空的时候会出现[null]的情况~ https://github.com/NapNeko/NapCatQQ/issues/1334 + // 在群精华回空的时候会出现[null]的情况~ https://github.com/NapNeko/NapCatQQ/issues/1334 .filter(Boolean); if (!msglist) { throw new Error('获取失败'); diff --git a/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts b/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts index 2bab18f1..1db5f6c1 100644 --- a/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts +++ b/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts @@ -3,18 +3,26 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Notify } from '@/napcat-onebot/types'; -interface RetData { - invited_requests: Notify[]; - InvitedRequest: Notify[]; - join_requests: Notify[]; -} +const PayloadSchema = Type.Object({}, { description: '群忽略通知负载' }); -export class GetGroupIgnoredNotifies extends OneBotAction { +type PayloadType = Static; + +const ReturnSchema = Type.Object({ + invited_requests: Type.Array(Type.Any(), { description: '邀请请求列表' }), + InvitedRequest: Type.Array(Type.Any(), { description: '邀请请求列表' }), + join_requests: Type.Array(Type.Any(), { description: '加入请求列表' }), +}, { description: '群忽略通知结果' }); + +type ReturnType = Static; + +export class GetGroupIgnoredNotifies extends OneBotAction { override actionName = ActionName.GetGroupIgnoredNotifies; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (): Promise { + async _handle (): Promise { const SingleScreenNotifies = await this.core.apis.GroupApi.getSingleScreenNotifies(false, 50); - const retData: RetData = { invited_requests: [], InvitedRequest: [], join_requests: [] }; + const retData: ReturnType = { invited_requests: [], InvitedRequest: [], join_requests: [] }; const notifyPromises = SingleScreenNotifies.map(async (SSNotify) => { const invitorUin = SSNotify.user1?.uid ? +await this.core.apis.UserApi.getUinByUidV2(SSNotify.user1.uid) : 0; diff --git a/packages/napcat-onebot/action/group/GetGroupInfo.ts b/packages/napcat-onebot/action/group/GetGroupInfo.ts index 27df912a..ca125e5f 100644 --- a/packages/napcat-onebot/action/group/GetGroupInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupInfo.ts @@ -1,20 +1,25 @@ -import { OB11Group } from '@/napcat-onebot/index'; import { OB11Construct } from '@/napcat-onebot/helper/data'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { OB11GroupSchema } from '../schemas'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), }); -type Payload = Static; +type PayloadType = Static; -class GetGroupInfo extends OneBotAction { +const ReturnSchema = OB11GroupSchema; + +type ReturnType = Static; + +class GetGroupInfo extends OneBotAction { override actionName = ActionName.GetGroupInfo; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const group = (await this.core.apis.GroupApi.getGroups()).find(e => e.groupCode === payload.group_id.toString()); if (!group) { const data = await this.core.apis.GroupApi.fetchGroupDetail(payload.group_id.toString()); diff --git a/packages/napcat-onebot/action/group/GetGroupList.ts b/packages/napcat-onebot/action/group/GetGroupList.ts index e89666a2..e789134d 100644 --- a/packages/napcat-onebot/action/group/GetGroupList.ts +++ b/packages/napcat-onebot/action/group/GetGroupList.ts @@ -1,20 +1,25 @@ -import { OB11Group } from '@/napcat-onebot/index'; import { OB11Construct } from '@/napcat-onebot/helper/data'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { OB11GroupSchema } from '../schemas'; -const SchemaData = Type.Object({ - no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const PayloadSchema = Type.Object({ + no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否不使用缓存' })), }); -type Payload = Static; +type PayloadType = Static; -class GetGroupList extends OneBotAction { +const ReturnSchema = Type.Array(OB11GroupSchema, { description: '群列表' }); + +type ReturnType = Static; + +class GetGroupList extends OneBotAction { override actionName = ActionName.GetGroupList; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return OB11Construct.groups( await this.core.apis.GroupApi.getGroups( typeof payload.no_cache === 'string' ? payload.no_cache === 'true' : !!payload.no_cache)); diff --git a/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts b/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts index 6fbc017b..3ce2fee8 100644 --- a/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts @@ -1,20 +1,25 @@ -import { OB11GroupMember } from '@/napcat-onebot/index'; import { OB11Construct } from '@/napcat-onebot/helper/data'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { OB11GroupMemberSchema } from '../schemas'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - user_id: Type.Union([Type.Number(), Type.String()]), - no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + user_id: Type.String({ description: 'QQ号' }), + no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否不使用缓存' })), }); -type Payload = Static; +type PayloadType = Static; -class GetGroupMemberInfo extends OneBotAction { +const ReturnSchema = OB11GroupMemberSchema; + +type ReturnType = Static; + +class GetGroupMemberInfo extends OneBotAction { override actionName = ActionName.GetGroupMemberInfo; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; private parseBoolean (value: boolean | string): boolean { return typeof value === 'string' ? value === 'true' : value; @@ -26,7 +31,7 @@ class GetGroupMemberInfo extends OneBotAction { return uid; } - private async getGroupMemberInfo (payload: Payload, uid: string, isNocache: boolean) { + private async getGroupMemberInfo (payload: PayloadType, uid: string, isNocache: boolean) { const groupMemberCache = this.core.apis.GroupApi.groupMemberCache.get(payload.group_id.toString()); const groupMember = groupMemberCache?.get(uid); @@ -40,7 +45,7 @@ class GetGroupMemberInfo extends OneBotAction { return info ? { ...groupMember, ...member, ...info } : member; } - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const isNocache = this.parseBoolean(payload.no_cache ?? true); const uid = await this.getUid(payload.user_id); const member = await this.getGroupMemberInfo(payload, uid, isNocache); diff --git a/packages/napcat-onebot/action/group/GetGroupMemberList.ts b/packages/napcat-onebot/action/group/GetGroupMemberList.ts index 0c978a5c..8a142b65 100644 --- a/packages/napcat-onebot/action/group/GetGroupMemberList.ts +++ b/packages/napcat-onebot/action/group/GetGroupMemberList.ts @@ -5,18 +5,23 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { GroupMember } from 'napcat-core'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否不使用缓存' })), }); -type Payload = Static; +type PayloadType = Static; -export class GetGroupMemberList extends OneBotAction { +const ReturnSchema = Type.Array(Type.Any(), { description: '群成员列表' }); + +type ReturnType = Static; + +export class GetGroupMemberList extends OneBotAction { override actionName = ActionName.GetGroupMemberList; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const groupIdStr = payload.group_id.toString(); const noCache = this.parseBoolean(payload.no_cache ?? false); const groupMembers = await this.getGroupMembers(groupIdStr, noCache); diff --git a/packages/napcat-onebot/action/group/GetGroupNotice.ts b/packages/napcat-onebot/action/group/GetGroupNotice.ts index eceab3c5..8d5439da 100644 --- a/packages/napcat-onebot/action/group/GetGroupNotice.ts +++ b/packages/napcat-onebot/action/group/GetGroupNotice.ts @@ -2,52 +2,41 @@ import { WebApiGroupNoticeFeed } from 'napcat-core'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -interface GroupNotice { - sender_id: number; - publish_time: number; - notice_id: string; - message: { - text: string; - // 保持一段时间兼容性 防止以往版本出现问题 后续版本可考虑移除 - image: Array<{ - height: string; - width: string; - id: string; - }>, - images: Array<{ - height: string; - width: string; - id: string; - }>; - }; - settings?: { - is_show_edit_card: number, - remind_ts: number, - tip_window_type: number, - confirm_required: number; - }; - read_num?: number; -} - -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), }); -type Payload = Static; +type PayloadType = Static; -type ApiGroupNotice = GroupNotice & WebApiGroupNoticeFeed; +const ReturnSchema = Type.Array(Type.Object({ + sender_id: Type.Number({ description: '发送者QQ' }), + publish_time: Type.Number({ description: '发布时间' }), + notice_id: Type.String({ description: '公告ID' }), + message: Type.Object({ + text: Type.String({ description: '文本内容' }), + image: Type.Array(Type.Any(), { description: '图片列表' }), + images: Type.Array(Type.Any(), { description: '图片列表' }), + }, { description: '公告内容' }), + settings: Type.Optional(Type.Any({ description: '设置项' })), + read_num: Type.Optional(Type.Number({ description: '阅读数' })), +}), { description: '群公告列表' }); -export class GetGroupNotice extends OneBotAction { +type ReturnType = Static; + +type ApiGroupNotice = ReturnType[number] & WebApiGroupNoticeFeed; + +export class GetGroupNotice extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetGroupNotice; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const group = payload.group_id.toString(); const ret = await this.core.apis.WebApi.getGroupNotice(group); if (!ret) { throw new Error('获取公告失败'); } - const retNotices: GroupNotice[] = new Array(); + const retNotices: ReturnType = []; for (const key in ret.feeds) { if (!ret.feeds[key]) { continue; @@ -57,7 +46,7 @@ export class GetGroupNotice extends OneBotAction { return { id: pic.id, height: pic.h, width: pic.w }; }) || []; - const retNotice: GroupNotice = { + const retNotice: ReturnType[number] = { notice_id: retApiNotice.fid, sender_id: retApiNotice.u, publish_time: retApiNotice.pubt, diff --git a/packages/napcat-onebot/action/group/GetGroupShutList.ts b/packages/napcat-onebot/action/group/GetGroupShutList.ts index 97f00c0e..d665ea89 100644 --- a/packages/napcat-onebot/action/group/GetGroupShutList.ts +++ b/packages/napcat-onebot/action/group/GetGroupShutList.ts @@ -3,17 +3,22 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), }); -type Payload = Static; +type PayloadType = Static; -export class GetGroupShutList extends OneBotAction { +const ReturnSchema = Type.Array(Type.Any(), { description: '禁言成员列表' }); + +type ReturnType = Static; + +export class GetGroupShutList extends OneBotAction { override actionName = ActionName.GetGroupShutList; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { return await this.core.apis.GroupApi.getGroupShutUpMemberList(payload.group_id.toString()); } } diff --git a/packages/napcat-onebot/action/group/SendGroupAiRecord.ts b/packages/napcat-onebot/action/group/SendGroupAiRecord.ts index 2e9f4499..bfd43a1d 100644 --- a/packages/napcat-onebot/action/group/SendGroupAiRecord.ts +++ b/packages/napcat-onebot/action/group/SendGroupAiRecord.ts @@ -3,21 +3,26 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { AIVoiceChatType } from 'napcat-core/packet/entities/aiChat'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - character: Type.String(), - group_id: Type.Union([Type.Number(), Type.String()]), - text: Type.String(), +const PayloadSchema = Type.Object({ + character: Type.String({ description: '角色ID' }), + group_id: Type.String({ description: '群号' }), + text: Type.String({ description: '语音文本内容' }), }); -type Payload = Static; +type PayloadType = Static; -export class SendGroupAiRecord extends GetPacketStatusDepends { +const ReturnSchema = Type.Object({ + message_id: Type.Number({ description: '消息ID' }), +}, { description: '发送结果' }); + +type ReturnType = Static; + +export class SendGroupAiRecord extends GetPacketStatusDepends { override actionName = ActionName.SendGroupAiRecord; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { await this.core.apis.PacketApi.pkt.operation.GetAiVoice(+payload.group_id, payload.character, payload.text, AIVoiceChatType.Sound); return { message_id: 0, // can't get message_id from GetAiVoice diff --git a/packages/napcat-onebot/action/group/SendGroupMsg.ts b/packages/napcat-onebot/action/group/SendGroupMsg.ts index b79d4282..aae34ead 100644 --- a/packages/napcat-onebot/action/group/SendGroupMsg.ts +++ b/packages/napcat-onebot/action/group/SendGroupMsg.ts @@ -1,18 +1,17 @@ -import { ContextMode, ReturnDataType, SendMsgBase } from '@/napcat-onebot/action/msg/SendMsg'; +import { ContextMode, ReturnDataType, SendMsgBase, SendMsgPayload } from '@/napcat-onebot/action/msg/SendMsg'; import { ActionName, BaseCheckResult } from '@/napcat-onebot/action/router'; -import { OB11PostSendMsg } from '@/napcat-onebot/types'; // 未检测参数 class SendGroupMsg extends SendMsgBase { override actionName = ActionName.SendGroupMsg; - protected override async check (payload: OB11PostSendMsg): Promise { + protected override async check (payload: SendMsgPayload): Promise { delete payload.user_id; payload.message_type = 'group'; return super.check(payload); } - override async _handle (payload: OB11PostSendMsg): Promise { + override async _handle (payload: SendMsgPayload): Promise { return this.base_handle(payload, ContextMode.Group); } } diff --git a/packages/napcat-onebot/action/group/SetEssenceMsg.ts b/packages/napcat-onebot/action/group/SetEssenceMsg.ts index 85bb4a28..70981a0a 100644 --- a/packages/napcat-onebot/action/group/SetEssenceMsg.ts +++ b/packages/napcat-onebot/action/group/SetEssenceMsg.ts @@ -3,17 +3,22 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - message_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), }); -type Payload = Static; +type PayloadType = Static; -export default class SetEssenceMsg extends OneBotAction { +const ReturnSchema = Type.Any({ description: '操作结果' }); + +type ReturnType = Static; + +export default class SetEssenceMsg extends OneBotAction { override actionName = ActionName.SetEssenceMsg; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const msg = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id); if (!msg) { throw new Error('msg not found'); diff --git a/packages/napcat-onebot/action/group/SetGroupAddRequest.ts b/packages/napcat-onebot/action/group/SetGroupAddRequest.ts index 7b66a46c..70d110af 100644 --- a/packages/napcat-onebot/action/group/SetGroupAddRequest.ts +++ b/packages/napcat-onebot/action/group/SetGroupAddRequest.ts @@ -3,20 +3,25 @@ import { GroupNotify, NTGroupRequestOperateTypes } from 'napcat-core/types'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - flag: Type.Union([Type.String(), Type.Number()]), - approve: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), - reason: Type.Optional(Type.Union([Type.String({ default: ' ' }), Type.Null()])), - count: Type.Optional(Type.Number({ default: 100 })), +const PayloadSchema = Type.Object({ + flag: Type.Union([Type.String(), Type.Number()], { description: '请求flag' }), + approve: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否同意' })), + reason: Type.Optional(Type.Union([Type.String({ default: ' ' }), Type.Null()], { description: '拒绝理由' })), + count: Type.Optional(Type.Number({ default: 100, description: '搜索通知数量' })), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupAddRequest extends OneBotAction { +const ReturnSchema = Type.Null({ description: '操作结果' }); + +type ReturnType = Static; + +export default class SetGroupAddRequest extends OneBotAction { override actionName = ActionName.SetGroupAddRequest; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload): Promise { + async _handle (payload: PayloadType): Promise { const flag = payload.flag.toString(); const approve = payload.approve?.toString() !== 'false'; const reason = payload.reason ?? ' '; diff --git a/packages/napcat-onebot/action/group/SetGroupAdmin.ts b/packages/napcat-onebot/action/group/SetGroupAdmin.ts index 2238ae2b..33f19d04 100644 --- a/packages/napcat-onebot/action/group/SetGroupAdmin.ts +++ b/packages/napcat-onebot/action/group/SetGroupAdmin.ts @@ -3,19 +3,24 @@ import { NTGroupMemberRole } from 'napcat-core/types'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - user_id: Type.Union([Type.Number(), Type.String()]), - enable: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + user_id: Type.String({ description: '用户QQ' }), + enable: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否设置为管理员' })), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupAdmin extends OneBotAction { +const ReturnSchema = Type.Null({ description: '操作结果' }); + +type ReturnType = Static; + +export default class SetGroupAdmin extends OneBotAction { override actionName = ActionName.SetGroupAdmin; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload): Promise { + async _handle (payload: PayloadType): Promise { const enable = typeof payload.enable === 'string' ? payload.enable === 'true' : !!payload.enable; const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('get Uid Error'); diff --git a/packages/napcat-onebot/action/group/SetGroupBan.ts b/packages/napcat-onebot/action/group/SetGroupBan.ts index 9a7894d3..cf8d6edb 100644 --- a/packages/napcat-onebot/action/group/SetGroupBan.ts +++ b/packages/napcat-onebot/action/group/SetGroupBan.ts @@ -2,18 +2,23 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - user_id: Type.Union([Type.Number(), Type.String()]), - duration: Type.Union([Type.Number(), Type.String()], { default: 0 }), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + user_id: Type.String({ description: '用户QQ' }), + duration: Type.Union([Type.Number(), Type.String()], { default: 0, description: '禁言时长(秒)' }), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupBan extends OneBotAction { +const ReturnSchema = Type.Null({ description: '操作结果' }); + +type ReturnType = Static; + +export default class SetGroupBan extends OneBotAction { override actionName = ActionName.SetGroupBan; - override payloadSchema = SchemaData; - async _handle (payload: Payload): Promise { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; + async _handle (payload: PayloadType): Promise { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('uid error'); const member_role = (await this.core.apis.GroupApi.getGroupMemberEx(payload.group_id.toString(), uid, true))?.role; diff --git a/packages/napcat-onebot/action/group/SetGroupCard.ts b/packages/napcat-onebot/action/group/SetGroupCard.ts index b9242056..6c05418e 100644 --- a/packages/napcat-onebot/action/group/SetGroupCard.ts +++ b/packages/napcat-onebot/action/group/SetGroupCard.ts @@ -2,19 +2,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - user_id: Type.Union([Type.Number(), Type.String()]), - card: Type.Optional(Type.String()), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + user_id: Type.String({ description: '用户QQ' }), + card: Type.Optional(Type.String({ description: '群名片' })), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupCard extends OneBotAction { +const ReturnSchema = Type.Null({ description: '操作结果' }); + +type ReturnType = Static; + +export default class SetGroupCard extends OneBotAction { override actionName = ActionName.SetGroupCard; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload): Promise { + async _handle (payload: PayloadType): Promise { const member = await this.core.apis.GroupApi.getGroupMember(payload.group_id.toString(), payload.user_id.toString()); if (member) await this.core.apis.GroupApi.setMemberCard(payload.group_id.toString(), member.uid, payload.card || ''); return null; diff --git a/packages/napcat-onebot/action/group/SetGroupKick.ts b/packages/napcat-onebot/action/group/SetGroupKick.ts index 53b33a75..6c4e128b 100644 --- a/packages/napcat-onebot/action/group/SetGroupKick.ts +++ b/packages/napcat-onebot/action/group/SetGroupKick.ts @@ -2,19 +2,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - user_id: Type.Union([Type.Number(), Type.String()]), - reject_add_request: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + user_id: Type.String({ description: '用户QQ' }), + reject_add_request: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否拒绝加群请求' })), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupKick extends OneBotAction { +const ReturnSchema = Type.Null({ description: '操作结果' }); + +type ReturnType = Static; + +export default class SetGroupKick extends OneBotAction { override actionName = ActionName.SetGroupKick; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload): Promise { + async _handle (payload: PayloadType): Promise { const rejectReq = payload.reject_add_request?.toString() === 'true'; const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('get Uid Error'); diff --git a/packages/napcat-onebot/action/group/SetGroupLeave.ts b/packages/napcat-onebot/action/group/SetGroupLeave.ts index 903b9215..e7dd7bb0 100644 --- a/packages/napcat-onebot/action/group/SetGroupLeave.ts +++ b/packages/napcat-onebot/action/group/SetGroupLeave.ts @@ -2,18 +2,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - is_dismiss: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + is_dismiss: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否解散' })), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupLeave extends OneBotAction { +const ReturnSchema = Type.Null({ description: '操作结果' }); + +type ReturnType = Static; + +export default class SetGroupLeave extends OneBotAction { override actionName = ActionName.SetGroupLeave; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload): Promise { + async _handle (payload: PayloadType): Promise { await this.core.apis.GroupApi.quitGroup(payload.group_id.toString()); + return null; } } diff --git a/packages/napcat-onebot/action/group/SetGroupName.ts b/packages/napcat-onebot/action/group/SetGroupName.ts index dd91bddd..b32dc172 100644 --- a/packages/napcat-onebot/action/group/SetGroupName.ts +++ b/packages/napcat-onebot/action/group/SetGroupName.ts @@ -2,18 +2,23 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - group_name: Type.String(), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + group_name: Type.String({ description: '群名称' }), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupName extends OneBotAction { +const ReturnSchema = Type.Null({ description: '操作结果' }); + +type ReturnType = Static; + +export default class SetGroupName extends OneBotAction { override actionName = ActionName.SetGroupName; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload): Promise { + async _handle (payload: PayloadType): Promise { const ret = await this.core.apis.GroupApi.setGroupName(payload.group_id.toString(), payload.group_name); if (ret.result !== 0) { throw new Error(`设置群名称失败 ErrCode: ${ret.result} ErrMsg: ${ret.errMsg}`); diff --git a/packages/napcat-onebot/action/group/SetGroupWholeBan.ts b/packages/napcat-onebot/action/group/SetGroupWholeBan.ts index c451e7c4..984c9451 100644 --- a/packages/napcat-onebot/action/group/SetGroupWholeBan.ts +++ b/packages/napcat-onebot/action/group/SetGroupWholeBan.ts @@ -2,18 +2,23 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - enable: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const PayloadSchema = Type.Object({ + group_id: Type.String({ description: '群号' }), + enable: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否开启全员禁言' })), }); -type Payload = Static; +type PayloadType = Static; -export default class SetGroupWholeBan extends OneBotAction { +const ReturnSchema = Type.Null({ description: '操作结果' }); + +type ReturnType = Static; + +export default class SetGroupWholeBan extends OneBotAction { override actionName = ActionName.SetGroupWholeBan; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload): Promise { + async _handle (payload: PayloadType): Promise { const enable = payload.enable?.toString() !== 'false'; const res = await this.core.apis.GroupApi.banGroup(payload.group_id.toString(), enable); if (res.result !== 0) { diff --git a/packages/napcat-onebot/action/guild/GetGuildList.ts b/packages/napcat-onebot/action/guild/GetGuildList.ts index ec57f988..c778c8f6 100644 --- a/packages/napcat-onebot/action/guild/GetGuildList.ts +++ b/packages/napcat-onebot/action/guild/GetGuildList.ts @@ -1,8 +1,12 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; +import { Type } from '@sinclair/typebox'; + export class GetGuildList extends OneBotAction { override actionName = ActionName.GetGuildList; + override payloadSchema = Type.Object({}); + override returnSchema = Type.Null(); async _handle (): Promise { diff --git a/packages/napcat-onebot/action/guild/GetGuildProfile.ts b/packages/napcat-onebot/action/guild/GetGuildProfile.ts index d7286ad4..de971c2c 100644 --- a/packages/napcat-onebot/action/guild/GetGuildProfile.ts +++ b/packages/napcat-onebot/action/guild/GetGuildProfile.ts @@ -1,8 +1,12 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; +import { Type } from '@sinclair/typebox'; + export class GetGuildProfile extends OneBotAction { override actionName = ActionName.GetGuildProfile; + override payloadSchema = Type.Object({}); + override returnSchema = Type.Null(); async _handle (): Promise { diff --git a/packages/napcat-onebot/action/msg/DeleteMsg.ts b/packages/napcat-onebot/action/msg/DeleteMsg.ts index 95c205b2..4ad252cc 100644 --- a/packages/napcat-onebot/action/msg/DeleteMsg.ts +++ b/packages/napcat-onebot/action/msg/DeleteMsg.ts @@ -3,23 +3,29 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - message_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), }); -type Payload = Static; +type PayloadType = Static; -class DeleteMsg extends OneBotAction { +const ReturnSchema = Type.Null({ description: '操作结果' }); + +type ReturnType = Static; + +class DeleteMsg extends OneBotAction { override actionName = ActionName.DeleteMsg; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const msg = MessageUnique.getMsgIdAndPeerByShortId(Number(payload.message_id)); if (msg) { this.obContext.recallEventCache.set(msg.MsgId, setTimeout(() => { this.obContext.recallEventCache.delete(msg.MsgId); }, 5000)); await this.core.apis.MsgApi.recallMsg(msg.Peer, msg.MsgId); + return null; } else { throw new Error('Recall failed'); } diff --git a/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts b/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts index a57a4352..4a580910 100644 --- a/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts +++ b/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts @@ -4,16 +4,20 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - message_id: Type.Union([Type.Number(), Type.String()]), - group_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), - user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), +const PayloadSchema = Type.Object({ + message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), + group_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '目标群号' })), + user_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '目标用户QQ' })), }); -type Payload = Static; +type PayloadType = Static; -class ForwardSingleMsg extends OneBotAction { - protected async getTargetPeer (payload: Payload): Promise { +const ReturnSchema = Type.Null({ description: '操作结果' }); + +type ReturnType = Static; + +class ForwardSingleMsg extends OneBotAction { + protected async getTargetPeer (payload: PayloadType): Promise { if (payload.user_id) { const peerUid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!peerUid) { @@ -24,7 +28,7 @@ class ForwardSingleMsg extends OneBotAction { return { chatType: ChatType.KCHATTYPEGROUP, peerUid: payload.group_id!.toString() }; } - async _handle (payload: Payload): Promise { + async _handle (payload: PayloadType): Promise { const msg = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id); if (!msg) { throw new Error(`无法找到消息${payload.message_id}`); @@ -42,11 +46,13 @@ class ForwardSingleMsg extends OneBotAction { } export class ForwardFriendSingleMsg extends ForwardSingleMsg { - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; override actionName = ActionName.ForwardFriendSingleMsg; } export class ForwardGroupSingleMsg extends ForwardSingleMsg { - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; override actionName = ActionName.ForwardGroupSingleMsg; } diff --git a/packages/napcat-onebot/action/msg/GetMsg.ts b/packages/napcat-onebot/action/msg/GetMsg.ts index a125ae62..286c1496 100644 --- a/packages/napcat-onebot/action/msg/GetMsg.ts +++ b/packages/napcat-onebot/action/msg/GetMsg.ts @@ -1,23 +1,38 @@ -import { OB11Message } from '@/napcat-onebot/index'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; -export type ReturnDataType = OB11Message; - -const SchemaData = Type.Object({ - message_id: Type.Union([Type.Number(), Type.String()]), +const PayloadSchema = Type.Object({ + message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), }); -type Payload = Static; +type PayloadType = Static; -class GetMsg extends OneBotAction { +const ReturnSchema = Type.Object({ + time: Type.Number({ description: '发送时间' }), + message_type: Type.String({ description: '消息类型' }), + message_id: Type.Number({ description: '消息ID' }), + real_id: Type.Number({ description: '真实ID' }), + message_seq: Type.Number({ description: '消息序号' }), + sender: Type.Any({ description: '发送者' }), + message: Type.Any({ description: '消息内容' }), + raw_message: Type.String({ description: '原始消息内容' }), + font: Type.Number({ description: '字体' }), + group_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '群号' })), + user_id: Type.Union([Type.Number(), Type.String()], { description: '发送者QQ号' }), + emoji_likes_list: Type.Optional(Type.Array(Type.Any(), { description: '表情回应列表' })), +}, { description: 'OneBot 11 消息' }); + +type ReturnType = Static; + +class GetMsg extends OneBotAction { override actionName = ActionName.GetMsg; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload, _adapter: string, config: NetworkAdapterConfig) { + async _handle (payload: PayloadType, _adapter: string, config: NetworkAdapterConfig) { if (!payload.message_id) { throw Error('参数message_id不能为空'); } @@ -27,12 +42,7 @@ class GetMsg extends OneBotAction { throw new Error('消息不存在'); } const peer = { guildId: '', peerUid: msgIdWithPeer?.Peer.peerUid, chatType: msgIdWithPeer.Peer.chatType }; - // const orimsg = this.obContext.recallMsgCache.get(msgIdWithPeer.MsgId); - // if (orimsg) { - // msg = orimsg; - // } else { const msg = (await this.core.apis.MsgApi.getMsgsByMsgId(peer, [msgIdWithPeer?.MsgId || payload.message_id.toString()])).msgList[0]; - // } if (!msg) throw Error('消息不存在'); const retMsg = await this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat); if (!retMsg) throw Error('消息为空'); @@ -44,7 +54,6 @@ class GetMsg extends OneBotAction { likes_cnt: emoji.likesCnt, }); }); - // 烘焙emoji_likes_list 仅此处烘焙 try { retMsg.message_id = MessageUnique.createUniqueMsgId(peer, msg.msgId)!; retMsg.message_seq = retMsg.message_id; diff --git a/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts b/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts index 7698c822..0605b8de 100644 --- a/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts +++ b/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts @@ -4,16 +4,20 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - user_id: Type.Optional(Type.Union([Type.String(), Type.Number()])), - group_id: Type.Optional(Type.Union([Type.String(), Type.Number()])), - message_id: Type.Optional(Type.Union([Type.String(), Type.Number()])), +const PayloadSchema = Type.Object({ + user_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '用户QQ' })), + group_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '群号' })), + message_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '消息ID' })), }); -type PlayloadType = Static; +type PayloadType = Static; -class MarkMsgAsRead extends OneBotAction { - async getPeer (payload: PlayloadType): Promise { +const ReturnSchema = Type.Null({ description: '操作结果' }); + +type ReturnType = Static; + +class MarkMsgAsRead extends OneBotAction { + async getPeer (payload: PayloadType): Promise { if (payload.message_id) { const s_peer = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id)?.Peer; if (s_peer) { @@ -38,7 +42,7 @@ class MarkMsgAsRead extends OneBotAction { return { chatType: ChatType.KCHATTYPEGROUP, peerUid: payload.group_id.toString() }; } - async _handle (payload: PlayloadType): Promise { + async _handle (payload: PayloadType): Promise { const ret = await this.core.apis.MsgApi.setMsgRead(await this.getPeer(payload)); if (ret.result !== 0) { throw new Error('设置已读失败,' + ret.errMsg); @@ -49,16 +53,20 @@ class MarkMsgAsRead extends OneBotAction { // 以下为非标准实现 export class MarkPrivateMsgAsRead extends MarkMsgAsRead { - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; override actionName = ActionName.MarkPrivateMsgAsRead; } export class MarkGroupMsgAsRead extends MarkMsgAsRead { - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; override actionName = ActionName.MarkGroupMsgAsRead; } export class GoCQHTTPMarkMsgAsRead extends MarkMsgAsRead { + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; override actionName = ActionName.GoCQHTTP_MarkMsgAsRead; } diff --git a/packages/napcat-onebot/action/msg/SendMsg.ts b/packages/napcat-onebot/action/msg/SendMsg.ts index d6f0c4ac..cb84d54a 100644 --- a/packages/napcat-onebot/action/msg/SendMsg.ts +++ b/packages/napcat-onebot/action/msg/SendMsg.ts @@ -4,7 +4,6 @@ import { OB11MessageMixType, OB11MessageNode, OB11PostContext, - OB11PostSendMsg, } from '@/napcat-onebot/types'; import { ActionName, BaseCheckResult } from '@/napcat-onebot/action/router'; import { decodeCQCode } from '@/napcat-onebot/helper/cqcode'; @@ -15,12 +14,32 @@ import { ForwardMsgBuilder } from '@/napcat-core/helper/forward-msg-builder'; import { stringifyWithBigInt } from 'napcat-common/src/helper'; import { PacketMsg } from 'napcat-core/packet/message/message'; import { rawMsgWithSendMsg } from 'napcat-core/packet/message/converter'; +import { Static, Type } from '@sinclair/typebox'; -export interface ReturnDataType { - message_id: number; - res_id?: string; - forward_id?: string; -} +export const SendMsgPayloadSchema = Type.Object({ + message_type: Type.Optional(Type.Union([Type.Literal('private'), Type.Literal('group')], { description: '消息类型 (private/group)' })), + user_id: Type.Optional(Type.String({ description: '用户QQ' })), + group_id: Type.Optional(Type.String({ description: '群号' })), + message: Type.Unknown({ description: '消息内容' }), + auto_escape: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否作为纯文本发送' })), + // 以下为扩展字段 + source: Type.Optional(Type.String({ description: '合并转发来源' })), + news: Type.Optional(Type.Array(Type.Object({ text: Type.String() }), { description: '合并转发新闻' })), + summary: Type.Optional(Type.String({ description: '合并转发摘要' })), + prompt: Type.Optional(Type.String({ description: '合并转发提示' })), +}); + +export type SendMsgPayload = Static & { + message: OB11MessageMixType; +}; + +export const SendMsgReturnSchema = Type.Object({ + message_id: Type.Number({ description: '消息ID' }), + res_id: Type.Optional(Type.String({ description: '转发消息的 res_id' })), + forward_id: Type.Optional(Type.String({ description: '转发消息的 forward_id' })), +}); + +export type ReturnDataType = Static; export enum ContextMode { Normal = 0, @@ -99,17 +118,21 @@ export async function createContext (core: NapCatCore, payload: OB11PostContext throw new Error('请指定正确的 group_id 或 user_id'); } -function getSpecialMsgNum (payload: OB11PostSendMsg, msgType: OB11MessageDataType): number { - if (Array.isArray(payload.message)) { - return payload.message.filter(msg => msg.type === msgType).length; - } - return 0; +function getSpecialMsgNum (messages: OB11MessageData[], msgType: OB11MessageDataType): number { + return messages.filter(msg => msg.type === msgType).length; } -export class SendMsgBase extends OneBotAction { - protected override async check (payload: OB11PostSendMsg): Promise { +function isNode (msg: OB11MessageData): msg is OB11MessageNode { + return msg.type === OB11MessageDataType.node; +} + +export class SendMsgBase extends OneBotAction { + override payloadSchema = SendMsgPayloadSchema; + override returnSchema = SendMsgReturnSchema; + + protected override async check (payload: SendMsgPayload): Promise { const messages = normalize(payload.message); - const nodeElementLength = getSpecialMsgNum(payload, OB11MessageDataType.node); + const nodeElementLength = getSpecialMsgNum(messages, OB11MessageDataType.node); if (nodeElementLength > 0 && nodeElementLength !== messages.length) { return { valid: false, @@ -119,27 +142,32 @@ export class SendMsgBase extends OneBotAction { return { valid: true }; } - async _handle (payload: OB11PostSendMsg): Promise { + async _handle (payload: SendMsgPayload): Promise { return this.base_handle(payload); } - async base_handle (payload: OB11PostSendMsg, contextMode: ContextMode = ContextMode.Normal): Promise { + async base_handle (payload: SendMsgPayload, contextMode: ContextMode = ContextMode.Normal): Promise { if (payload.message_type === 'group') contextMode = ContextMode.Group; if (payload.message_type === 'private') contextMode = ContextMode.Private; - const peer = await createContext(this.core, payload, contextMode); + const peer = await createContext(this.core, { + message_type: payload.message_type, + user_id: payload.user_id?.toString(), + group_id: payload.group_id?.toString(), + }, contextMode); const messages = normalize( payload.message, typeof payload.auto_escape === 'string' ? payload.auto_escape === 'true' : !!payload.auto_escape ); - if (getSpecialMsgNum(payload, OB11MessageDataType.node)) { + const nodeMessages = messages.filter(isNode); + if (nodeMessages.length > 0) { const packetMode = this.core.apis.PacketApi.packetStatus; let returnMsgAndResId: { message: RawMessage | null, res_id?: string; } | null; try { returnMsgAndResId = packetMode - ? await this.handleForwardedNodesPacket(peer, messages as OB11MessageNode[], payload.source, payload.news, payload.summary, payload.prompt) - : await this.handleForwardedNodes(peer, messages as OB11MessageNode[]); + ? await this.handleForwardedNodesPacket(peer, nodeMessages, payload.source, payload.news, payload.summary, payload.prompt) + : await this.handleForwardedNodes(peer, nodeMessages); } catch (e: unknown) { throw Error(packetMode ? `发送伪造合并转发消息失败: ${(e as Error)?.stack}` : `发送合并转发消息失败: ${(e as Error)?.stack}`); } @@ -164,7 +192,7 @@ export class SendMsgBase extends OneBotAction { // const music: OB11MessageCustomMusic = messages[0] as OB11MessageCustomMusic; // if (music) { // } - // } + // }\r } // log("send msg:", peer, sendElements) @@ -195,8 +223,9 @@ export class SendMsgBase extends OneBotAction { const OB11Data = normalize(node.type === OB11MessageDataType.node ? node.data.content : node); let sendElements: SendMessageElement[]; - if (getSpecialMsgNum({ message: OB11Data }, OB11MessageDataType.node)) { - const uploadReturnData = await this.uploadForwardedNodesPacket(msgPeer, OB11Data as OB11MessageNode[], node.data.source, node.data.news, node.data.summary, node.data.prompt, { + const subNodeMessages = OB11Data.filter(isNode); + if (subNodeMessages.length > 0) { + const uploadReturnData = await this.uploadForwardedNodesPacket(msgPeer, subNodeMessages, node.data.source, node.data.news, node.data.summary, node.data.prompt, { user_id: (node.data.user_id ?? node.data.uin)?.toString() ?? parentMeta?.user_id ?? this.core.selfInfo.uin, nickname: (node.data.nickname || node.data.name) ?? parentMeta?.nickname ?? 'QQ用户', }, dp + 1); @@ -296,13 +325,13 @@ export class SendMsgBase extends OneBotAction { try { const OB11Data = normalize(messageNode.data.content); // 筛选node消息 - const isNodeMsg = OB11Data.filter(e => e.type === OB11MessageDataType.node).length;// 找到子转发消息 - if (isNodeMsg !== 0) { - if (isNodeMsg !== OB11Data.length) { + const subNodeMessages = OB11Data.filter(isNode); + if (subNodeMessages.length !== 0) { + if (subNodeMessages.length !== OB11Data.length) { this.core.context.logger.logError('子消息中包含非node消息 跳过不合法部分'); continue; } - const nodeMsg = await this.handleForwardedNodes(selfPeer, OB11Data.filter(e => e.type === OB11MessageDataType.node)); + const nodeMsg = await this.handleForwardedNodes(selfPeer, subNodeMessages); if (nodeMsg) { nodeMsgIds.push(nodeMsg.message!.msgId); MessageUnique.createUniqueMsgId(selfPeer, nodeMsg.message!.msgId); diff --git a/packages/napcat-onebot/action/msg/SendPrivateMsg.ts b/packages/napcat-onebot/action/msg/SendPrivateMsg.ts index 6c1f6402..5453dc42 100644 --- a/packages/napcat-onebot/action/msg/SendPrivateMsg.ts +++ b/packages/napcat-onebot/action/msg/SendPrivateMsg.ts @@ -1,17 +1,16 @@ -import { ContextMode, ReturnDataType, SendMsgBase } from './SendMsg'; +import { ContextMode, ReturnDataType, SendMsgBase, SendMsgPayload } from './SendMsg'; import { ActionName, BaseCheckResult } from '@/napcat-onebot/action/router'; -import { OB11PostSendMsg } from '@/napcat-onebot/types'; // 未检测参数 class SendPrivateMsg extends SendMsgBase { override actionName = ActionName.SendPrivateMsg; - protected override async check (payload: OB11PostSendMsg): Promise { + protected override async check (payload: SendMsgPayload): Promise { payload.message_type = 'private'; return super.check(payload); } - override async _handle (payload: OB11PostSendMsg): Promise { + override async _handle (payload: SendMsgPayload): Promise { return this.base_handle(payload, ContextMode.Private); } } diff --git a/packages/napcat-onebot/action/msg/SetMsgEmojiLike.ts b/packages/napcat-onebot/action/msg/SetMsgEmojiLike.ts index 6278ecd8..f48ed65e 100644 --- a/packages/napcat-onebot/action/msg/SetMsgEmojiLike.ts +++ b/packages/napcat-onebot/action/msg/SetMsgEmojiLike.ts @@ -3,19 +3,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - message_id: Type.Union([Type.Number(), Type.String()]), - emoji_id: Type.Union([Type.Number(), Type.String()]), - set: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const PayloadSchema = Type.Object({ + message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), + emoji_id: Type.Union([Type.Number(), Type.String()], { description: '表情ID' }), + set: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否设置' })), }); -type Payload = Static; +type PayloadType = Static; -export class SetMsgEmojiLike extends OneBotAction { +const ReturnSchema = Type.Any({ description: '操作结果' }); + +type ReturnType = Static; + +export class SetMsgEmojiLike extends OneBotAction { override actionName = ActionName.SetMsgEmojiLike; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: PayloadType) { const msg = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id); if (!msg) { throw new Error('msg not found'); diff --git a/packages/napcat-onebot/action/new/GetDoubtFriendsAddRequest.ts b/packages/napcat-onebot/action/new/GetDoubtFriendsAddRequest.ts index 4f60d49b..159de28d 100644 --- a/packages/napcat-onebot/action/new/GetDoubtFriendsAddRequest.ts +++ b/packages/napcat-onebot/action/new/GetDoubtFriendsAddRequest.ts @@ -2,17 +2,18 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - count: Type.Number({ default: 50 }), +export const GetDoubtFriendsAddRequestPayloadSchema = Type.Object({ + count: Type.Number({ default: 50, description: '获取数量' }), }); -type Payload = Static; +export type GetDoubtFriendsAddRequestPayload = Static; -export class GetDoubtFriendsAddRequest extends OneBotAction { +export class GetDoubtFriendsAddRequest extends OneBotAction { override actionName = ActionName.GetDoubtFriendsAddRequest; - override payloadSchema = SchemaData; + override payloadSchema = GetDoubtFriendsAddRequestPayloadSchema; + override returnSchema = Type.Any({ description: '可疑好友申请列表' }); - async _handle (payload: Payload) { + async _handle (payload: GetDoubtFriendsAddRequestPayload) { return await this.core.apis.FriendApi.getDoubtFriendRequest(payload.count); } } diff --git a/packages/napcat-onebot/action/new/SetDoubtFriendsAddRequest.ts b/packages/napcat-onebot/action/new/SetDoubtFriendsAddRequest.ts index 59f48f72..f47022a3 100644 --- a/packages/napcat-onebot/action/new/SetDoubtFriendsAddRequest.ts +++ b/packages/napcat-onebot/action/new/SetDoubtFriendsAddRequest.ts @@ -2,20 +2,21 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - flag: Type.String(), +export const SetDoubtFriendsAddRequestPayloadSchema = Type.Object({ + flag: Type.String({ description: '请求 flag' }), // 注意强制String 非isNumeric 不遵守则不符合设计 - approve: Type.Boolean({ default: true }), + approve: Type.Boolean({ default: true, description: '是否同意 (强制为 true)' }), // 该字段没有语义 仅做保留 强制为True }); -type Payload = Static; +export type SetDoubtFriendsAddRequestPayload = Static; -export class SetDoubtFriendsAddRequest extends OneBotAction { +export class SetDoubtFriendsAddRequest extends OneBotAction { override actionName = ActionName.SetDoubtFriendsAddRequest; - override payloadSchema = SchemaData; + override payloadSchema = SetDoubtFriendsAddRequestPayloadSchema; + override returnSchema = Type.Any(); - async _handle (payload: Payload) { + async _handle (payload: SetDoubtFriendsAddRequestPayload) { return await this.core.apis.FriendApi.handleDoubtFriendRequest(payload.flag); } } diff --git a/packages/napcat-onebot/action/packet/GetPacketStatus.ts b/packages/napcat-onebot/action/packet/GetPacketStatus.ts index ae7fd3ac..122139be 100644 --- a/packages/napcat-onebot/action/packet/GetPacketStatus.ts +++ b/packages/napcat-onebot/action/packet/GetPacketStatus.ts @@ -7,7 +7,7 @@ export abstract class GetPacketStatusDepends extends OneBotAction extends OneBotAction { override actionName = ActionName.GetPacketStatus; + override payloadSchema = Type.Object({}); + override returnSchema = Type.Null(); async _handle () { diff --git a/packages/napcat-onebot/action/packet/GetRkeyEx.ts b/packages/napcat-onebot/action/packet/GetRkeyEx.ts index c73fb4bd..64f1b7bc 100644 --- a/packages/napcat-onebot/action/packet/GetRkeyEx.ts +++ b/packages/napcat-onebot/action/packet/GetRkeyEx.ts @@ -1,8 +1,20 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; +import { Type, Static } from '@sinclair/typebox'; -export class GetRkeyEx extends GetPacketStatusDepends { +export const GetRkeyExReturnSchema = Type.Array(Type.Object({ + type: Type.String({ description: '类型 (private/group)' }), + rkey: Type.String({ description: 'RKey' }), + created_at: Type.Number({ description: '创建时间' }), + ttl: Type.Number({ description: '有效期' }), +}), { description: 'RKey 列表' }); + +export type GetRkeyExReturn = Static; + +export class GetRkeyEx extends GetPacketStatusDepends { override actionName = ActionName.GetRkeyEx; + override payloadSchema = Type.Object({}); + override returnSchema = GetRkeyExReturnSchema; async _handle () { const rkeys = await this.core.apis.PacketApi.pkt.operation.FetchRkey(); @@ -10,8 +22,8 @@ export class GetRkeyEx extends GetPacketStatusDepends { return { type: rkey.type === 10 ? 'private' : 'group', rkey: rkey.rkey, - created_at: rkey.time, - ttl: rkey.ttl, + created_at: Number(rkey.time), + ttl: Number(rkey.ttl), }; }); } diff --git a/packages/napcat-onebot/action/packet/GetRkeyServer.ts b/packages/napcat-onebot/action/packet/GetRkeyServer.ts index 9862d1be..bebf167b 100644 --- a/packages/napcat-onebot/action/packet/GetRkeyServer.ts +++ b/packages/napcat-onebot/action/packet/GetRkeyServer.ts @@ -1,15 +1,22 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; +import { Type, Static } from '@sinclair/typebox'; -export class GetRkeyServer extends GetPacketStatusDepends { +export const GetRkeyServerReturnSchema = Type.Object({ + private_rkey: Type.Optional(Type.String({ description: '私聊 RKey' })), + group_rkey: Type.Optional(Type.String({ description: '群聊 RKey' })), + expired_time: Type.Optional(Type.Number({ description: '过期时间' })), + name: Type.String({ description: '名称' }), +}); + +export type GetRkeyServerReturn = Static; + +export class GetRkeyServer extends GetPacketStatusDepends { override actionName = ActionName.GetRkeyServer; + override payloadSchema = Type.Object({}); + override returnSchema = GetRkeyServerReturnSchema; - private rkeyCache: { - private_rkey?: string; - group_rkey?: string; - expired_time?: number; - name: string; - } | null = null; + private rkeyCache: GetRkeyServerReturn | null = null; private expiryTime: number | null = null; diff --git a/packages/napcat-onebot/action/packet/SendPoke.ts b/packages/napcat-onebot/action/packet/SendPoke.ts index e7094fcf..65eabd6a 100644 --- a/packages/napcat-onebot/action/packet/SendPoke.ts +++ b/packages/napcat-onebot/action/packet/SendPoke.ts @@ -2,20 +2,21 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Optional(Type.String()), - user_id: Type.Optional(Type.String()), - target_id: Type.Optional(Type.String()), +export const SendPokePayloadSchema = Type.Object({ + group_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '群号' })), + user_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '用户QQ' })), + target_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '目标QQ' })), }); -type Payload = Static; -export class SendPokeBase extends GetPacketStatusDepends { - override payloadSchema = SchemaData; +export type SendPokePayload = Static; +export class SendPokeBase extends GetPacketStatusDepends { + override payloadSchema = SendPokePayloadSchema; + override returnSchema = Type.Null(); - async _handle (payload: Payload) { + async _handle (payload: SendPokePayload) { // 这里的 !! 可以传入空字符串 忽略这些数据有利用接口统一接口 - const target_id = payload.target_id ? payload.target_id : payload.user_id; - const peer_id = payload.group_id ? payload.group_id : payload.user_id; + const target_id = payload.target_id?.toString() || payload.user_id?.toString(); + const peer_id = payload.group_id?.toString() || payload.user_id?.toString(); const is_group = !!payload.group_id; if (!target_id || !peer_id) { diff --git a/packages/napcat-onebot/action/packet/SetGroupTodo.ts b/packages/napcat-onebot/action/packet/SetGroupTodo.ts index 91df36b7..a9dc48c3 100644 --- a/packages/napcat-onebot/action/packet/SetGroupTodo.ts +++ b/packages/napcat-onebot/action/packet/SetGroupTodo.ts @@ -4,25 +4,26 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { Static, Type } from '@sinclair/typebox'; import { ActionName } from '../router'; -const SchemaData = Type.Object({ - group_id: Type.String(), - message_id: Type.String(), - message_seq: Type.Optional(Type.String()), +export const SetGroupTodoPayloadSchema = Type.Object({ + group_id: Type.Union([Type.String(), Type.Number()], { description: '群号' }), + message_id: Type.Union([Type.String(), Type.Number()], { description: '消息ID' }), + message_seq: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '消息Seq (可选)' })), }); -type Payload = Static; -export class SetGroupTodo extends GetPacketStatusDepends { - override payloadSchema = SchemaData; +export type SetGroupTodoPayload = Static; +export class SetGroupTodo extends GetPacketStatusDepends { + override payloadSchema = SetGroupTodoPayloadSchema; + override returnSchema = Type.Null(); override actionName = ActionName.SetGroupTodo; - async _handle (payload: Payload) { + async _handle (payload: SetGroupTodoPayload) { if (payload.message_seq) { - return await this.core.apis.PacketApi.pkt.operation.SetGroupTodo(+payload.group_id, payload.message_seq); + return await this.core.apis.PacketApi.pkt.operation.SetGroupTodo(+payload.group_id, payload.message_seq.toString()); } const peer: Peer = { chatType: ChatType.KCHATTYPEGROUP, - peerUid: payload.group_id, + peerUid: payload.group_id.toString(), }; - const { MsgId, Peer } = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id) ?? { Peer: peer, MsgId: payload.message_id }; + const { MsgId, Peer } = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id) ?? { Peer: peer, MsgId: payload.message_id.toString() }; const msg = (await this.core.apis.MsgApi.getMsgsByMsgId(Peer, [MsgId])).msgList[0]; if (!msg) throw new Error('消息不存在'); await this.core.apis.PacketApi.pkt.operation.SetGroupTodo(+payload.group_id, msg.msgSeq); diff --git a/packages/napcat-onebot/action/schemas.ts b/packages/napcat-onebot/action/schemas.ts new file mode 100644 index 00000000..6c56df2b --- /dev/null +++ b/packages/napcat-onebot/action/schemas.ts @@ -0,0 +1,51 @@ +import { Type } from '@sinclair/typebox'; + +export const OB11UserSchema = Type.Object({ + birthday_year: Type.Optional(Type.Number({ description: '出生年份' })), + birthday_month: Type.Optional(Type.Number({ description: '出生月份' })), + birthday_day: Type.Optional(Type.Number({ description: '出生日期' })), + phone_num: Type.Optional(Type.String({ description: '手机号' })), + email: Type.Optional(Type.String({ description: '邮箱' })), + category_id: Type.Optional(Type.Number({ description: '分组ID' })), + user_id: Type.Number({ description: 'QQ号' }), + nickname: Type.String({ description: '昵称' }), + remark: Type.Optional(Type.String({ description: '备注' })), + sex: Type.Optional(Type.String({ description: '性别' })), + level: Type.Optional(Type.Number({ description: '等级' })), + age: Type.Optional(Type.Number({ description: '年龄' })), + qid: Type.Optional(Type.String({ description: 'QID' })), + login_days: Type.Optional(Type.Number({ description: '登录天数' })), + categoryName: Type.Optional(Type.String({ description: '分组名称' })), + categoryId: Type.Optional(Type.Number({ description: '分组ID' })), +}, { description: 'OneBot 11 用户信息' }); + +export const OB11GroupSchema = Type.Object({ + group_all_shut: Type.Number({ description: '是否全员禁言' }), + group_remark: Type.String({ description: '群备注' }), + group_id: Type.Number({ description: '群号' }), + group_name: Type.String({ description: '群名称' }), + member_count: Type.Optional(Type.Number({ description: '成员人数' })), + max_member_count: Type.Optional(Type.Number({ description: '最大成员人数' })), +}, { description: 'OneBot 11 群信息' }); + +export const OB11GroupMemberSchema = Type.Object({ + group_id: Type.Number({ description: '群号' }), + user_id: Type.Number({ description: 'QQ号' }), + nickname: Type.String({ description: '昵称' }), + card: Type.Optional(Type.String({ description: '名片' })), + sex: Type.Optional(Type.String({ description: '性别' })), + age: Type.Optional(Type.Number({ description: '年龄' })), + join_time: Type.Optional(Type.Number({ description: '入群时间戳' })), + last_sent_time: Type.Optional(Type.Number({ description: '最后发言时间戳' })), + level: Type.Optional(Type.String({ description: '等级' })), + qq_level: Type.Optional(Type.Number({ description: 'QQ等级' })), + role: Type.Optional(Type.String({ description: '角色 (owner/admin/member)' })), + title: Type.Optional(Type.String({ description: '头衔' })), + area: Type.Optional(Type.String({ description: '地区' })), + unfriendly: Type.Optional(Type.Boolean({ description: '是否不良记录' })), + title_expire_time: Type.Optional(Type.Number({ description: '头衔过期时间' })), + card_changeable: Type.Optional(Type.Boolean({ description: '是否允许修改名片' })), + shut_up_timestamp: Type.Optional(Type.Number({ description: '禁言截止时间戳' })), + is_robot: Type.Optional(Type.Boolean({ description: '是否为机器人' })), + qage: Type.Optional(Type.Number({ description: 'Q龄' })), +}, { description: 'OneBot 11 群成员信息' }); diff --git a/packages/napcat-onebot/action/stream/CleanStreamTempFile.ts b/packages/napcat-onebot/action/stream/CleanStreamTempFile.ts index d66f7114..9d81abbf 100644 --- a/packages/napcat-onebot/action/stream/CleanStreamTempFile.ts +++ b/packages/napcat-onebot/action/stream/CleanStreamTempFile.ts @@ -2,9 +2,12 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { join } from 'node:path'; import { readdir, unlink } from 'node:fs/promises'; +import { Type } from '@sinclair/typebox'; export class CleanStreamTempFile extends OneBotAction { override actionName = ActionName.CleanStreamTempFile; + override payloadSchema = Type.Object({}); + override returnSchema = Type.Null(); async _handle (_payload: void): Promise { try { diff --git a/packages/napcat-onebot/action/stream/DownloadFileImageStream.ts b/packages/napcat-onebot/action/stream/DownloadFileImageStream.ts index b5e280ee..c4589481 100644 --- a/packages/napcat-onebot/action/stream/DownloadFileImageStream.ts +++ b/packages/napcat-onebot/action/stream/DownloadFileImageStream.ts @@ -7,20 +7,21 @@ import fs from 'fs'; import { imageSizeFallBack } from 'napcat-image-size'; import { BaseDownloadStream, DownloadResult } from './BaseDownloadStream'; -const SchemaData = Type.Object({ - file: Type.Optional(Type.String()), - file_id: Type.Optional(Type.String()), - chunk_size: Type.Optional(Type.Number({ default: 64 * 1024 })), // 默认64KB分块 +export const DownloadFileImageStreamPayloadSchema = Type.Object({ + file: Type.Optional(Type.String({ description: '文件路径或 URL' })), + file_id: Type.Optional(Type.String({ description: '文件 ID' })), + chunk_size: Type.Optional(Type.Number({ default: 64 * 1024, description: '分块大小 (字节)' })), // 默认64KB分块 }); -type Payload = Static; +export type DownloadFileImageStreamPayload = Static; -export class DownloadFileImageStream extends BaseDownloadStream { +export class DownloadFileImageStream extends BaseDownloadStream { override actionName = ActionName.DownloadFileImageStream; - override payloadSchema = SchemaData; + override payloadSchema = DownloadFileImageStreamPayloadSchema; + override returnSchema = Type.Any({ description: '下载结果 (流式)' }); override useStream = true; - async _handle (payload: Payload, _adaptername: string, _config: NetworkAdapterConfig, req: OneBotRequestToolkit): Promise> { + async _handle (payload: DownloadFileImageStreamPayload, _adaptername: string, _config: NetworkAdapterConfig, req: OneBotRequestToolkit): Promise> { try { payload.file ||= payload.file_id || ''; const chunkSize = payload.chunk_size || 64 * 1024; diff --git a/packages/napcat-onebot/action/stream/DownloadFileRecordStream.ts b/packages/napcat-onebot/action/stream/DownloadFileRecordStream.ts index e5482eab..9873f3d0 100644 --- a/packages/napcat-onebot/action/stream/DownloadFileRecordStream.ts +++ b/packages/napcat-onebot/action/stream/DownloadFileRecordStream.ts @@ -9,21 +9,22 @@ import { BaseDownloadStream, DownloadResult } from './BaseDownloadStream'; const out_format = ['mp3', 'amr', 'wma', 'm4a', 'spx', 'ogg', 'wav', 'flac']; -const SchemaData = Type.Object({ - file: Type.Optional(Type.String()), - file_id: Type.Optional(Type.String()), - chunk_size: Type.Optional(Type.Number({ default: 64 * 1024 })), // 默认64KB分块 - out_format: Type.Optional(Type.String()), +export const DownloadFileRecordStreamPayloadSchema = Type.Object({ + file: Type.Optional(Type.String({ description: '文件路径或 URL' })), + file_id: Type.Optional(Type.String({ description: '文件 ID' })), + chunk_size: Type.Optional(Type.Number({ default: 64 * 1024, description: '分块大小 (字节)' })), // 默认64KB分块 + out_format: Type.Optional(Type.String({ description: '输出格式' })), }); -type Payload = Static; +export type DownloadFileRecordStreamPayload = Static; -export class DownloadFileRecordStream extends BaseDownloadStream { +export class DownloadFileRecordStream extends BaseDownloadStream { override actionName = ActionName.DownloadFileRecordStream; - override payloadSchema = SchemaData; + override payloadSchema = DownloadFileRecordStreamPayloadSchema; + override returnSchema = Type.Any({ description: '下载结果 (流式)' }); override useStream = true; - async _handle (payload: Payload, _adaptername: string, _config: NetworkAdapterConfig, req: OneBotRequestToolkit): Promise> { + async _handle (payload: DownloadFileRecordStreamPayload, _adaptername: string, _config: NetworkAdapterConfig, req: OneBotRequestToolkit): Promise> { try { payload.file ||= payload.file_id || ''; const chunkSize = payload.chunk_size || 64 * 1024; diff --git a/packages/napcat-onebot/action/stream/DownloadFileStream.ts b/packages/napcat-onebot/action/stream/DownloadFileStream.ts index e6a08551..c0ac4b3f 100644 --- a/packages/napcat-onebot/action/stream/DownloadFileStream.ts +++ b/packages/napcat-onebot/action/stream/DownloadFileStream.ts @@ -5,20 +5,21 @@ import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; import { StreamPacket, StreamStatus } from './StreamBasic'; import fs from 'fs'; import { BaseDownloadStream, DownloadResult } from './BaseDownloadStream'; -const SchemaData = Type.Object({ - file: Type.Optional(Type.String()), - file_id: Type.Optional(Type.String()), - chunk_size: Type.Optional(Type.Number({ default: 64 * 1024 })), // 默认64KB分块 +const DownloadFileStreamPayloadSchema = Type.Object({ + file: Type.Optional(Type.String({ description: '文件路径或 URL' })), + file_id: Type.Optional(Type.String({ description: '文件 ID' })), + chunk_size: Type.Optional(Type.Number({ default: 64 * 1024, description: '分块大小 (字节)' })), // 默认64KB分块 }); -type Payload = Static; +export type DownloadFileStreamPayload = Static; -export class DownloadFileStream extends BaseDownloadStream { +export class DownloadFileStream extends BaseDownloadStream { override actionName = ActionName.DownloadFileStream; - override payloadSchema = SchemaData; + override payloadSchema = DownloadFileStreamPayloadSchema; + override returnSchema = Type.Any({ description: '下载结果 (流式)' }); override useStream = true; - async _handle (payload: Payload, _adaptername: string, _config: NetworkAdapterConfig, req: OneBotRequestToolkit): Promise> { + async _handle (payload: DownloadFileStreamPayload, _adaptername: string, _config: NetworkAdapterConfig, req: OneBotRequestToolkit): Promise> { try { payload.file ||= payload.file_id || ''; const chunkSize = payload.chunk_size || 64 * 1024; diff --git a/packages/napcat-onebot/action/stream/TestStreamDownload.ts b/packages/napcat-onebot/action/stream/TestStreamDownload.ts index dc80c126..16791ebf 100644 --- a/packages/napcat-onebot/action/stream/TestStreamDownload.ts +++ b/packages/napcat-onebot/action/stream/TestStreamDownload.ts @@ -4,18 +4,19 @@ import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; import { StreamPacket, StreamStatus } from './StreamBasic'; -const SchemaData = Type.Object({ - error: Type.Optional(Type.Boolean({ default: false })), +export const TestDownloadStreamPayloadSchema = Type.Object({ + error: Type.Optional(Type.Boolean({ default: false, description: '是否触发测试错误' })), }); -type Payload = Static; +export type TestDownloadStreamPayload = Static; -export class TestDownloadStream extends OneBotAction> { +export class TestDownloadStream extends OneBotAction> { override actionName = ActionName.TestDownloadStream; - override payloadSchema = SchemaData; + override payloadSchema = TestDownloadStreamPayloadSchema; + override returnSchema = Type.Any({ description: '测试流数据' }); override useStream = true; - async _handle (_payload: Payload, _adaptername: string, _config: NetworkAdapterConfig, req: OneBotRequestToolkit) { + async _handle (_payload: TestDownloadStreamPayload, _adaptername: string, _config: NetworkAdapterConfig, req: OneBotRequestToolkit) { for (let i = 0; i < 10; i++) { await req.send({ type: StreamStatus.Stream, data: `Index-> ${i + 1}`, data_type: 'data_chunk' }); await new Promise(resolve => setTimeout(resolve, 100)); diff --git a/packages/napcat-onebot/action/stream/UploadFileStream.ts b/packages/napcat-onebot/action/stream/UploadFileStream.ts index fa4a0431..4072db5c 100644 --- a/packages/napcat-onebot/action/stream/UploadFileStream.ts +++ b/packages/napcat-onebot/action/stream/UploadFileStream.ts @@ -16,21 +16,21 @@ const CONFIG = { MEMORY_LIMIT: 100 * 1024 * 1024, // 100MB内存总限制 } as const; -const SchemaData = Type.Object({ - stream_id: Type.String(), - chunk_data: Type.Optional(Type.String()), - chunk_index: Type.Optional(Type.Number()), - total_chunks: Type.Optional(Type.Number()), - file_size: Type.Optional(Type.Number()), - expected_sha256: Type.Optional(Type.String()), - is_complete: Type.Optional(Type.Boolean()), - filename: Type.Optional(Type.String()), - reset: Type.Optional(Type.Boolean()), - verify_only: Type.Optional(Type.Boolean()), - file_retention: Type.Number({ default: 5 * 60 * 1000 }), // 默认5分钟 回收 不设置或0为不回收 +export const UploadFileStreamPayloadSchema = Type.Object({ + stream_id: Type.String({ description: '流 ID' }), + chunk_data: Type.Optional(Type.String({ description: '分块数据 (Base64)' })), + chunk_index: Type.Optional(Type.Number({ description: '分块索引' })), + total_chunks: Type.Optional(Type.Number({ description: '总分块数' })), + file_size: Type.Optional(Type.Number({ description: '文件总大小' })), + expected_sha256: Type.Optional(Type.String({ description: '期望的 SHA256' })), + is_complete: Type.Optional(Type.Boolean({ description: '是否完成' })), + filename: Type.Optional(Type.String({ description: '文件名' })), + reset: Type.Optional(Type.Boolean({ description: '是否重置' })), + verify_only: Type.Optional(Type.Boolean({ description: '是否仅验证' })), + file_retention: Type.Number({ default: 5 * 60 * 1000, description: '文件保留时间 (毫秒)' }), // 默认5分钟 回收 不设置或0为不回收 }); -type Payload = Static; +export type UploadFileStreamPayload = Static; // 简化流状态接口 interface StreamState { @@ -66,15 +66,16 @@ interface StreamResult { sha256?: string; } -export class UploadFileStream extends OneBotAction> { +export class UploadFileStream extends OneBotAction> { override actionName = ActionName.UploadFileStream; - override payloadSchema = SchemaData; + override payloadSchema = UploadFileStreamPayloadSchema; + override returnSchema = Type.Any({ description: '上传结果 (流式)' }); override useStream = true; private static streams = new Map(); private static memoryUsage = 0; - async _handle (payload: Payload, _adaptername: string, _config: NetworkAdapterConfig): Promise> { + async _handle (payload: UploadFileStreamPayload, _adaptername: string, _config: NetworkAdapterConfig): Promise> { const { stream_id, reset, verify_only } = payload; if (reset) { diff --git a/packages/napcat-onebot/action/system/CanSendRecord.ts b/packages/napcat-onebot/action/system/CanSendRecord.ts index f983e744..60538cc8 100644 --- a/packages/napcat-onebot/action/system/CanSendRecord.ts +++ b/packages/napcat-onebot/action/system/CanSendRecord.ts @@ -1,12 +1,18 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; +import { Type, Static } from '@sinclair/typebox'; -interface ReturnType { - yes: boolean; -} +export const CanSendReturnSchema = Type.Object({ + yes: Type.Boolean({ description: '是否可以发送' }), +}); -export class CanSend extends OneBotAction { - async _handle (): Promise { +export type CanSendReturnType = Static; + +export class CanSend extends OneBotAction { + override payloadSchema = Type.Object({}); + override returnSchema = CanSendReturnSchema; + + async _handle (): Promise { return { yes: true, }; diff --git a/packages/napcat-onebot/action/system/CleanCache.ts b/packages/napcat-onebot/action/system/CleanCache.ts index cbb4ad51..ac3ea07c 100644 --- a/packages/napcat-onebot/action/system/CleanCache.ts +++ b/packages/napcat-onebot/action/system/CleanCache.ts @@ -2,9 +2,12 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { unlink, readdir } from 'fs/promises'; import path, { join } from 'path'; +import { Type } from '@sinclair/typebox'; export class CleanCache extends OneBotAction { override actionName = ActionName.CleanCache; + override payloadSchema = Type.Object({}); + override returnSchema = Type.Null(); async _handle () { try { diff --git a/packages/napcat-onebot/action/system/GetCSRF.ts b/packages/napcat-onebot/action/system/GetCSRF.ts index 6fe2ee83..a9fe9658 100644 --- a/packages/napcat-onebot/action/system/GetCSRF.ts +++ b/packages/napcat-onebot/action/system/GetCSRF.ts @@ -1,8 +1,17 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; +import { Type, Static } from '@sinclair/typebox'; -export class GetCSRF extends OneBotAction { +export const GetCSRFReturnSchema = Type.Object({ + token: Type.Number({ description: 'CSRF Token' }), +}); + +export type GetCSRFReturnType = Static; + +export class GetCSRF extends OneBotAction { override actionName = ActionName.GetCSRF; + override payloadSchema = Type.Object({}); + override returnSchema = GetCSRFReturnSchema; async _handle () { const sKey = await this.core.apis.UserApi.getSKey(); diff --git a/packages/napcat-onebot/action/system/GetCredentials.ts b/packages/napcat-onebot/action/system/GetCredentials.ts index 1393e124..88605170 100644 --- a/packages/napcat-onebot/action/system/GetCredentials.ts +++ b/packages/napcat-onebot/action/system/GetCredentials.ts @@ -2,22 +2,25 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -interface Response { - cookies: string, - token: number -} - -const SchemaData = Type.Object({ - domain: Type.String(), +export const GetCredentialsPayloadSchema = Type.Object({ + domain: Type.String({ description: '需要获取 cookies 的域名' }), }); -type Payload = Static; +export type GetCredentialsPayload = Static; -export class GetCredentials extends OneBotAction { +export const GetCredentialsReturnSchema = Type.Object({ + cookies: Type.String({ description: 'Cookies' }), + token: Type.Number({ description: 'CSRF Token' }), +}); + +export type GetCredentialsResponse = Static; + +export class GetCredentials extends OneBotAction { override actionName = ActionName.GetCredentials; - override payloadSchema = SchemaData; + override payloadSchema = GetCredentialsPayloadSchema; + override returnSchema = GetCredentialsReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: GetCredentialsPayload) { const cookiesObject = await this.core.apis.UserApi.getCookies(payload.domain); // 把获取到的cookiesObject转换成 k=v; 格式字符串拼接在一起 const cookies = Object.entries(cookiesObject).map(([key, value]) => `${key}=${value}`).join('; '); diff --git a/packages/napcat-onebot/action/system/GetLoginInfo.ts b/packages/napcat-onebot/action/system/GetLoginInfo.ts index 8a8b5cb5..4674675d 100644 --- a/packages/napcat-onebot/action/system/GetLoginInfo.ts +++ b/packages/napcat-onebot/action/system/GetLoginInfo.ts @@ -2,9 +2,13 @@ import { OB11User } from '@/napcat-onebot/index'; import { OB11Construct } from '@/napcat-onebot/helper/data'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; +import { OB11UserSchema } from '../schemas'; +import { Type } from '@sinclair/typebox'; -class GetLoginInfo extends OneBotAction { +class GetLoginInfo extends OneBotAction { override actionName = ActionName.GetLoginInfo; + override payloadSchema = Type.Object({}); + override returnSchema = OB11UserSchema; async _handle () { return OB11Construct.selfInfo(this.core.selfInfo); diff --git a/packages/napcat-onebot/action/system/GetStatus.ts b/packages/napcat-onebot/action/system/GetStatus.ts index c6c52816..0e650825 100644 --- a/packages/napcat-onebot/action/system/GetStatus.ts +++ b/packages/napcat-onebot/action/system/GetStatus.ts @@ -1,15 +1,21 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; +import { Type, Static } from '@sinclair/typebox'; -interface ResponseType { - online: boolean; - good: boolean; - stat: unknown; -} -export default class GetStatus extends OneBotAction { +export const GetStatusReturnSchema = Type.Object({ + online: Type.Boolean({ description: '是否在线' }), + good: Type.Boolean({ description: '状态是否良好' }), + stat: Type.Unknown({ description: '统计信息' }), +}); + +export type GetStatusReturnType = Static; + +export default class GetStatus extends OneBotAction { override actionName = ActionName.GetStatus; + override payloadSchema = Type.Object({}); + override returnSchema = GetStatusReturnSchema; - async _handle (): Promise { + async _handle (): Promise { return { online: !!this.core.selfInfo.online, good: true, diff --git a/packages/napcat-onebot/action/system/GetSystemMsg.ts b/packages/napcat-onebot/action/system/GetSystemMsg.ts index eaf5340e..4f8171ec 100644 --- a/packages/napcat-onebot/action/system/GetSystemMsg.ts +++ b/packages/napcat-onebot/action/system/GetSystemMsg.ts @@ -1,28 +1,31 @@ import { GroupNotifyMsgStatus } from 'napcat-core'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; -import { Notify } from '@/napcat-onebot/types'; import { Static, Type } from '@sinclair/typebox'; +import { OB11NotifySchema } from '../schemas'; -interface RetData { - invited_requests: Notify[]; - InvitedRequest: Notify[]; - join_requests: Notify[]; -} - -const SchemaData = Type.Object({ - count: Type.Union([Type.Number(), Type.String()], { default: 50 }), +export const GetGroupSystemMsgPayloadSchema = Type.Object({ + count: Type.Union([Type.Number(), Type.String()], { default: 50, description: '获取的消息数量' }), }); -type Payload = Static; +export type GetGroupSystemMsgPayload = Static; -export class GetGroupSystemMsg extends OneBotAction { +export const GetGroupSystemMsgReturnSchema = Type.Object({ + invited_requests: Type.Array(OB11NotifySchema, { description: '进群邀请列表' }), + InvitedRequest: Type.Array(OB11NotifySchema, { description: '进群邀请列表 (兼容)' }), + join_requests: Type.Array(OB11NotifySchema, { description: '进群申请列表' }), +}); + +export type GetGroupSystemMsgReturn = Static; + +export class GetGroupSystemMsg extends OneBotAction { override actionName = ActionName.GetGroupSystemMsg; - override payloadSchema = SchemaData; + override payloadSchema = GetGroupSystemMsgPayloadSchema; + override returnSchema = GetGroupSystemMsgReturnSchema; - async _handle (params: Payload): Promise { + async _handle (params: GetGroupSystemMsgPayload): Promise { const SingleScreenNotifies = await this.core.apis.GroupApi.getSingleScreenNotifies(false, +params.count); - const retData: RetData = { invited_requests: [], InvitedRequest: [], join_requests: [] }; + const retData: GetGroupSystemMsgReturn = { invited_requests: [], InvitedRequest: [], join_requests: [] }; const notifyPromises = SingleScreenNotifies.map(async (SSNotify) => { const invitorUin = SSNotify.user1?.uid ? +await this.core.apis.UserApi.getUinByUidV2(SSNotify.user1.uid) : 0; @@ -30,13 +33,13 @@ export class GetGroupSystemMsg extends OneBotAction { const commonData = { request_id: +SSNotify.seq, invitor_uin: invitorUin, - invitor_nick: SSNotify.user1?.nickName, + invitor_nick: SSNotify.user1?.nickName || '', group_id: +SSNotify.group?.groupCode, - message: SSNotify?.postscript, - group_name: SSNotify.group?.groupName, + message: SSNotify?.postscript || '', + group_name: SSNotify.group?.groupName || '', checked: SSNotify.status !== GroupNotifyMsgStatus.KUNHANDLE, actor: actorUin, - requester_nick: SSNotify.user1?.nickName, + requester_nick: SSNotify.user1?.nickName || '', }; if (SSNotify.type === 1) { diff --git a/packages/napcat-onebot/action/system/GetVersionInfo.ts b/packages/napcat-onebot/action/system/GetVersionInfo.ts index 924c86a6..6e98a812 100644 --- a/packages/napcat-onebot/action/system/GetVersionInfo.ts +++ b/packages/napcat-onebot/action/system/GetVersionInfo.ts @@ -1,15 +1,21 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { napCatVersion } from 'napcat-common/src/version'; -interface ResponseType { - app_name: string; - protocol_version: string; - app_version: string; -} -export default class GetVersionInfo extends OneBotAction { - override actionName = ActionName.GetVersionInfo; +import { Type, Static } from '@sinclair/typebox'; - async _handle (): Promise { +const ReturnSchema = Type.Object({ + app_name: Type.String({ description: '应用名称' }), + protocol_version: Type.String({ description: '协议版本' }), + app_version: Type.String({ description: '应用版本' }), +}, { description: '版本信息' }); + +type ReturnType = Static; + +export default class GetVersionInfo extends OneBotAction { + override actionName = ActionName.GetVersionInfo; + override returnSchema = ReturnSchema; + + async _handle (): Promise { return { app_name: 'NapCat.Onebot', protocol_version: 'v11', diff --git a/packages/napcat-onebot/action/system/SetRestart.ts b/packages/napcat-onebot/action/system/SetRestart.ts index 05992629..6da7959f 100644 --- a/packages/napcat-onebot/action/system/SetRestart.ts +++ b/packages/napcat-onebot/action/system/SetRestart.ts @@ -1,9 +1,12 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { OneBotAction } from '../OneBotAction'; import { WebUiDataRuntime } from 'napcat-webui-backend/src/helper/Data'; +import { Type } from '@sinclair/typebox'; export class SetRestart extends OneBotAction { override actionName = ActionName.Reboot; + override payloadSchema = Type.Object({}); + override returnSchema = Type.Null(); async _handle () { const result = await WebUiDataRuntime.requestRestartProcess(); diff --git a/packages/napcat-onebot/action/test/TestAutoRegister01.ts b/packages/napcat-onebot/action/test/TestAutoRegister01.ts index 3b44f099..e0550558 100644 --- a/packages/napcat-onebot/action/test/TestAutoRegister01.ts +++ b/packages/napcat-onebot/action/test/TestAutoRegister01.ts @@ -1,10 +1,13 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { ActionHandler } from '../auto-register'; +import { Type } from '@sinclair/typebox'; @ActionHandler export default class TestAutoRegister01 extends OneBotAction { override actionName = ActionName.TestAutoRegister01; + override payloadSchema = Type.Object({}); + override returnSchema = Type.String({ description: '测试返回内容' }); async _handle (_payload: void): Promise { return 'AutoRegister Router Test'; diff --git a/packages/napcat-onebot/action/test/TestAutoRegister02.ts b/packages/napcat-onebot/action/test/TestAutoRegister02.ts index 63cbd10f..f80fae6d 100644 --- a/packages/napcat-onebot/action/test/TestAutoRegister02.ts +++ b/packages/napcat-onebot/action/test/TestAutoRegister02.ts @@ -1,10 +1,13 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { ActionHandler } from '../auto-register'; +import { Type } from '@sinclair/typebox'; @ActionHandler export default class TestAutoRegister02 extends OneBotAction { override actionName = ActionName.TestAutoRegister02; + override payloadSchema = Type.Object({}); + override returnSchema = Type.String({ description: '测试返回内容' }); async _handle (_payload: void): Promise { return 'AutoRegister Router Test'; diff --git a/packages/napcat-onebot/action/user/GetCookies.ts b/packages/napcat-onebot/action/user/GetCookies.ts index bddec828..7757c97c 100644 --- a/packages/napcat-onebot/action/user/GetCookies.ts +++ b/packages/napcat-onebot/action/user/GetCookies.ts @@ -1,22 +1,26 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -interface Response { - cookies: string, - bkn: string -} -const SchemaData = Type.Object({ - domain: Type.String(), +export const GetCookiesPayloadSchema = Type.Object({ + domain: Type.String({ description: '需要获取 cookies 的域名' }), }); -type Payload = Static; +export type GetCookiesPayload = Static; -export class GetCookies extends OneBotAction { +export const GetCookiesReturnSchema = Type.Object({ + cookies: Type.String({ description: 'Cookies' }), + bkn: Type.String({ description: 'CSRF Token' }), +}); + +export type GetCookiesResponse = Static; + +export class GetCookies extends OneBotAction { override actionName = ActionName.GetCookies; - override payloadSchema = SchemaData; + override payloadSchema = GetCookiesPayloadSchema; + override returnSchema = GetCookiesReturnSchema; - async _handle (payload: Payload) { + async _handle (payload: GetCookiesPayload) { const cookiesObject = await this.core.apis.UserApi.getCookies(payload.domain); // 把获取到的cookiesObject转换成 k=v; 格式字符串拼接在一起 const cookies = Object.entries(cookiesObject).map(([key, value]) => `${key}=${value}`).join('; '); diff --git a/packages/napcat-onebot/action/user/GetFriendList.ts b/packages/napcat-onebot/action/user/GetFriendList.ts index 956689fb..09d8bab2 100644 --- a/packages/napcat-onebot/action/user/GetFriendList.ts +++ b/packages/napcat-onebot/action/user/GetFriendList.ts @@ -1,20 +1,25 @@ -import { OB11User } from '@/napcat-onebot/index'; import { OB11Construct } from '@/napcat-onebot/helper/data'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { OB11UserSchema } from '../schemas'; -const SchemaData = Type.Object({ - no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const PayloadSchema = Type.Object({ + no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否不使用缓存' })), }); -type Payload = Static; +type PayloadType = Static; -export default class GetFriendList extends OneBotAction { +const ReturnSchema = Type.Array(OB11UserSchema, { description: '好友列表' }); + +type ReturnType = Static; + +export default class GetFriendList extends OneBotAction { override actionName = ActionName.GetFriendList; - override payloadSchema = SchemaData; + override payloadSchema = PayloadSchema; + override returnSchema = ReturnSchema; - async _handle (_payload: Payload) { + async _handle (_payload: PayloadType) { const buddyMap = await this.core.apis.FriendApi.getBuddyV2SimpleInfoMap(); const isNocache = typeof _payload.no_cache === 'string' ? _payload.no_cache === 'true' : !!_payload.no_cache; await Promise.all( diff --git a/packages/napcat-onebot/action/user/GetRecentContact.ts b/packages/napcat-onebot/action/user/GetRecentContact.ts index ad8e5926..83ea0180 100644 --- a/packages/napcat-onebot/action/user/GetRecentContact.ts +++ b/packages/napcat-onebot/action/user/GetRecentContact.ts @@ -3,20 +3,35 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - count: Type.Union([Type.Number(), Type.String()], { default: 10 }), +export const GetRecentContactPayloadSchema = Type.Object({ + count: Type.Union([Type.Number(), Type.String()], { default: 10, description: '获取的数量' }), }); -type Payload = Static; +export type GetRecentContactPayload = Static; -export default class GetRecentContact extends OneBotAction { +export const GetRecentContactReturnSchema = Type.Array(Type.Object({ + lastestMsg: Type.Any({ description: '最后一条消息' }), + peerUin: Type.String({ description: '对象QQ' }), + remark: Type.String({ description: '备注' }), + msgTime: Type.String({ description: '消息时间' }), + chatType: Type.Number({ description: '聊天类型' }), + msgId: Type.String({ description: '消息ID' }), + sendNickName: Type.String({ description: '发送者昵称' }), + sendMemberName: Type.String({ description: '发送者群名片' }), + peerName: Type.String({ description: '对象名称' }), +}), { description: '最近会话列表' }); + +export type GetRecentContactReturn = Static; + +export default class GetRecentContact extends OneBotAction { override actionName = ActionName.GetRecentContact; - override payloadSchema = SchemaData; + override payloadSchema = GetRecentContactPayloadSchema; + override returnSchema = GetRecentContactReturnSchema; - async _handle (payload: Payload, _adapter: string, config: NetworkAdapterConfig) { + async _handle (payload: GetRecentContactPayload, _adapter: string, config: NetworkAdapterConfig): Promise { const ret = await this.core.apis.UserApi.getRecentContactListSnapShot(+payload.count); // 烘焙消息 - return await Promise.all(ret.info.changedList.map(async (t) => { + const results = await Promise.all(ret.info.changedList.map(async (t) => { const FastMsg = await this.core.apis.MsgApi.getMsgsByMsgId({ chatType: t.chatType, peerUid: t.peerUid }, [t.msgId]); if (FastMsg.msgList.length > 0 && FastMsg.msgList[0]) { // 扩展ret.info.changedList @@ -34,6 +49,7 @@ export default class GetRecentContact extends OneBotAction { }; } return { + lastestMsg: undefined, peerUin: t.peerUin, remark: t.remark, msgTime: t.msgTime, @@ -44,5 +60,6 @@ export default class GetRecentContact extends OneBotAction { peerName: t.peerName, }; })); + return results; } } diff --git a/packages/napcat-onebot/action/user/SendLike.ts b/packages/napcat-onebot/action/user/SendLike.ts index 6de00884..d5b64a1a 100644 --- a/packages/napcat-onebot/action/user/SendLike.ts +++ b/packages/napcat-onebot/action/user/SendLike.ts @@ -2,24 +2,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - times: Type.Union([Type.Number(), Type.String()], { default: 1 }), - user_id: Type.Union([Type.Number(), Type.String()]), +export const SendLikePayloadSchema = Type.Object({ + user_id: Type.String({ description: '对方 QQ 号' }), + times: Type.Union([Type.Number(), Type.String()], { default: 1, description: '点赞次数' }), }); -type Payload = Static; +export type SendLikePayload = Static; -export default class SendLike extends OneBotAction { +export default class SendLike extends OneBotAction { override actionName = ActionName.SendLike; - override payloadSchema = SchemaData; + override payloadSchema = SendLikePayloadSchema; + override returnSchema = Type.Null(); - async _handle (payload: Payload): Promise { + async _handle (payload: SendLikePayload): Promise { const qq = payload.user_id.toString(); const uid: string = await this.core.apis.UserApi.getUidByUinV2(qq) ?? ''; const result = await this.core.apis.UserApi.like(uid, +payload.times); if (result.result !== 0) { throw new Error(`点赞失败 ${result.errMsg}`); } - return null; } } diff --git a/packages/napcat-onebot/action/user/SetFriendAddRequest.ts b/packages/napcat-onebot/action/user/SetFriendAddRequest.ts index d17105bf..6bc47458 100644 --- a/packages/napcat-onebot/action/user/SetFriendAddRequest.ts +++ b/packages/napcat-onebot/action/user/SetFriendAddRequest.ts @@ -2,19 +2,20 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - flag: Type.Union([Type.String(), Type.Number()]), - approve: Type.Optional(Type.Union([Type.String(), Type.Boolean()])), - remark: Type.Optional(Type.String()), +export const SetFriendAddRequestPayloadSchema = Type.Object({ + flag: Type.Union([Type.String(), Type.Number()], { description: '加好友请求的 flag (需从上报中获取)' }), + approve: Type.Optional(Type.Union([Type.String(), Type.Boolean()], { description: '是否同意请求' })), + remark: Type.Optional(Type.String({ description: '添加后的好友备注' })), }); -type Payload = Static; +export type SetFriendAddRequestPayload = Static; -export default class SetFriendAddRequest extends OneBotAction { +export default class SetFriendAddRequest extends OneBotAction { override actionName = ActionName.SetFriendAddRequest; - override payloadSchema = SchemaData; + override payloadSchema = SetFriendAddRequestPayloadSchema; + override returnSchema = Type.Null(); - async _handle (payload: Payload): Promise { + async _handle (payload: SetFriendAddRequestPayload): Promise { const approve = payload.approve?.toString() !== 'false'; const notify = (await this.core.apis.FriendApi.getBuddyReq()).buddyReqs.find(e => e.reqTime === payload.flag.toString()); if (!notify) { @@ -24,6 +25,5 @@ export default class SetFriendAddRequest extends OneBotAction { if (payload.remark) { await this.core.apis.FriendApi.setBuddyRemark(notify.friendUid, payload.remark); } - return null; } } diff --git a/packages/napcat-onebot/action/user/SetFriendRemark.ts b/packages/napcat-onebot/action/user/SetFriendRemark.ts index a4ce09ee..134dab5a 100644 --- a/packages/napcat-onebot/action/user/SetFriendRemark.ts +++ b/packages/napcat-onebot/action/user/SetFriendRemark.ts @@ -2,24 +2,24 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - user_id: Type.String(), - remark: Type.String(), +export const SetFriendRemarkPayloadSchema = Type.Object({ + user_id: Type.Union([Type.String(), Type.Number()], { description: '好友 QQ 号' }), + remark: Type.String({ description: '备注' }), }); -type Payload = Static; +export type SetFriendRemarkPayload = Static; -export default class SetFriendRemark extends OneBotAction { +export default class SetFriendRemark extends OneBotAction { override actionName = ActionName.SetFriendRemark; - override payloadSchema = SchemaData; + override payloadSchema = SetFriendRemarkPayloadSchema; + override returnSchema = Type.Null(); - async _handle (payload: Payload): Promise { - const friendUid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id); + async _handle (payload: SetFriendRemarkPayload): Promise { + const friendUid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); const is_friend = await this.core.apis.FriendApi.isBuddy(friendUid); if (!is_friend) { throw new Error(`用户 ${payload.user_id} 不是好友`); } await this.core.apis.FriendApi.setBuddyRemark(friendUid, payload.remark); - return null; } } From 075047d790e873e3fa4ad95271a5d5702dd97e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 15:07:43 +0800 Subject: [PATCH 02/17] Refactor payload schemas to use string IDs Replaced Type.Union([Type.Number(), Type.String()]) with Type.String for group_id, user_id, and similar fields across all action payload schemas to standardize input types. Also made minor improvements to error handling, return types, and removed unused imports for better code clarity and consistency. --- .../extends/ClickInlineKeyboardButton.ts | 2 +- .../action/extends/GetAiCharacters.ts | 2 +- .../action/extends/GetCollectionList.ts | 5 ++-- .../action/extends/GetGroupInfoEx.ts | 2 +- .../action/extends/GetMiniAppArk.ts | 28 +++++++++++-------- .../action/extends/GetQunAlbumList.ts | 1 - .../action/extends/GetUserStatus.ts | 19 +++++++------ .../action/extends/MoveGroupFile.ts | 2 +- .../action/extends/RenameGroupFile.ts | 2 +- .../action/extends/SendPacket.ts | 2 +- .../action/extends/SetGroupSign.ts | 2 +- .../action/extends/SetInputStatus.ts | 2 +- .../action/extends/SetSpecialTitle.ts | 4 +-- .../action/extends/ShareContact.ts | 7 ++--- .../action/extends/TransGroupFile.ts | 2 +- .../action/extends/TranslateEnWordToZn.ts | 2 +- .../action/file/GetGroupFileUrl.ts | 2 +- .../action/file/flash/SendFlashMsg.ts | 4 +-- .../action/file/online/CancelOnlineFile.ts | 2 +- .../file/online/GetOnlineFileMessages.ts | 2 +- .../action/file/online/ReceiveOnlineFile.ts | 2 +- .../action/file/online/RefuseOnlineFile.ts | 2 +- .../action/file/online/SendOnlineFile.ts | 2 +- .../action/file/online/SendOnlineFolder.ts | 2 +- .../action/go-cqhttp/CreateGroupFileFolder.ts | 2 +- .../action/go-cqhttp/DeleteGroupFile.ts | 3 +- .../action/go-cqhttp/DeleteGroupFileFolder.ts | 3 +- .../action/go-cqhttp/DownloadFile.ts | 2 +- .../action/go-cqhttp/GetGroupAtAllRemain.ts | 2 +- .../go-cqhttp/GetGroupFileSystemInfo.ts | 2 +- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 2 +- .../action/go-cqhttp/GetGroupHonorInfo.ts | 2 +- .../action/go-cqhttp/GetGroupRootFiles.ts | 2 +- .../action/go-cqhttp/GetOnlineClient.ts | 1 + .../action/go-cqhttp/GetStrangerInfo.ts | 14 +++++----- .../action/go-cqhttp/QuickAction.ts | 6 ++-- .../action/go-cqhttp/SendGroupNotice.ts | 3 +- .../action/go-cqhttp/SetGroupPortrait.ts | 3 +- .../action/go-cqhttp/SetQQProfile.ts | 1 - .../action/go-cqhttp/UploadGroupFile.ts | 2 +- .../action/go-cqhttp/UploadPrivateFile.ts | 4 +-- .../action/group/DelGroupNotice.ts | 2 +- .../napcat-onebot/action/group/GetAiRecord.ts | 2 +- .../action/group/GetGroupDetailInfo.ts | 2 +- .../action/group/GetGroupEssence.ts | 15 ++++++++-- .../action/group/GetGroupIgnoredNotifies.ts | 2 +- .../action/group/GetGroupMemberList.ts | 1 - .../action/group/GetGroupNotice.ts | 2 +- .../action/group/GetGroupShutList.ts | 1 - .../action/msg/ForwardSingleMsg.ts | 4 +-- .../action/packet/GetPacketStatus.ts | 1 + packages/napcat-onebot/action/schemas.ts | 12 ++++++++ .../action/stream/UploadFileStream.ts | 4 +-- .../action/user/GetRecentContact.ts | 16 +++++------ 54 files changed, 119 insertions(+), 101 deletions(-) diff --git a/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts b/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts index acafa29c..a2fd84b8 100644 --- a/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '../OneBotAction'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), bot_appid: Type.String({ description: '机器人AppID' }), button_id: Type.String({ default: '', description: '按钮ID' }), callback_data: Type.String({ default: '', description: '回调数据' }), diff --git a/packages/napcat-onebot/action/extends/GetAiCharacters.ts b/packages/napcat-onebot/action/extends/GetAiCharacters.ts index 8eb5dabf..14476c2d 100644 --- a/packages/napcat-onebot/action/extends/GetAiCharacters.ts +++ b/packages/napcat-onebot/action/extends/GetAiCharacters.ts @@ -4,7 +4,7 @@ import { AIVoiceChatType } from 'napcat-core/packet/entities/aiChat'; import { Type, Static } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), chat_type: Type.Union([Type.Number(), Type.String()], { default: 1, description: '聊天类型' }), }); diff --git a/packages/napcat-onebot/action/extends/GetCollectionList.ts b/packages/napcat-onebot/action/extends/GetCollectionList.ts index 2954498f..d98b2100 100644 --- a/packages/napcat-onebot/action/extends/GetCollectionList.ts +++ b/packages/napcat-onebot/action/extends/GetCollectionList.ts @@ -1,11 +1,10 @@ -import { type NTQQCollectionApi } from 'napcat-core/apis/collection'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - category: Type.Union([Type.Number(), Type.String()], { description: '分类ID' }), - count: Type.Union([Type.Number(), Type.String()], { default: 1, description: '获取数量' }), + category: Type.String({ description: '分类ID' }), + count: Type.String({ default: '1', description: '获取数量' }), }); type PayloadType = Static; diff --git a/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts b/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts index edb38918..7f5e697a 100644 --- a/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts +++ b/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), }); type PayloadType = Static; diff --git a/packages/napcat-onebot/action/extends/GetMiniAppArk.ts b/packages/napcat-onebot/action/extends/GetMiniAppArk.ts index 81c206b0..8140608a 100644 --- a/packages/napcat-onebot/action/extends/GetMiniAppArk.ts +++ b/packages/napcat-onebot/action/extends/GetMiniAppArk.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { MiniAppInfo, MiniAppInfoHelper } from 'napcat-core/packet/utils/helper/miniAppHelper'; -import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from 'napcat-core/packet/entities/miniApp'; +import { MiniAppReqCustomParams, MiniAppReqParams } from 'napcat-core/packet/entities/miniApp'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Union([ @@ -22,15 +22,15 @@ const PayloadSchema = Type.Union([ iconUrl: Type.String({ description: '图标URL' }), webUrl: Type.Optional(Type.String({ description: '网页URL' })), appId: Type.String({ description: '小程序AppID' }), - scene: Type.Union([Type.Number(), Type.String()], { description: '场景ID' }), - templateType: Type.Union([Type.Number(), Type.String()], { description: '模板类型' }), - businessType: Type.Union([Type.Number(), Type.String()], { description: '业务类型' }), - verType: Type.Union([Type.Number(), Type.String()], { description: '版本类型' }), - shareType: Type.Union([Type.Number(), Type.String()], { description: '分享类型' }), + scene: Type.String({ description: '场景ID' }), + templateType: Type.String({ description: '模板类型' }), + businessType: Type.String({ description: '业务类型' }), + verType: Type.String({ description: '版本类型' }), + shareType: Type.String({ description: '分享类型' }), versionId: Type.String({ description: '版本ID' }), sdkId: Type.String({ description: 'SDK ID' }), - withShareTicket: Type.Union([Type.Number(), Type.String()], { description: '是否携带分享票据' }), - rawArkData: Type.Optional(Type.Union([Type.String()], { description: '是否返回原始Ark数据' })), + withShareTicket: Type.String({ description: '是否携带分享票据' }), + rawArkData: Type.Optional(Type.String({ description: '是否返回原始Ark数据' })), }), ], { description: '小程序Ark参数' }); @@ -49,15 +49,19 @@ export class GetMiniAppArk extends GetPacketStatusDepends; -const ReturnSchema = Type.Optional( - Type.Object({ - status: Type.Number({ description: '在线状态' }), - ext_status: Type.Number({ description: '扩展状态' }), - }), - { description: '用户状态' } -); +const ReturnSchema = Type.Object({ + status: Type.Number({ description: '在线状态' }), + ext_status: Type.Number({ description: '扩展状态' }), +}, { description: '用户状态' }); type ReturnType = Static; @@ -24,6 +21,10 @@ export class GetUserStatus extends GetPacketStatusDepends; -const ReturnSchema = Type.Optional(Type.String({ description: '响应十六进制数据' }), { description: '发包结果' }); +const ReturnSchema = Type.Union([Type.String({ description: '响应十六进制数据' }), Type.Undefined()], { description: '发包结果' }); type ReturnType = Static; diff --git a/packages/napcat-onebot/action/extends/SetGroupSign.ts b/packages/napcat-onebot/action/extends/SetGroupSign.ts index 2a7cd012..95c9b223 100644 --- a/packages/napcat-onebot/action/extends/SetGroupSign.ts +++ b/packages/napcat-onebot/action/extends/SetGroupSign.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), }); type PayloadType = Static; diff --git a/packages/napcat-onebot/action/extends/SetInputStatus.ts b/packages/napcat-onebot/action/extends/SetInputStatus.ts index 22da88a2..d1d2ad67 100644 --- a/packages/napcat-onebot/action/extends/SetInputStatus.ts +++ b/packages/napcat-onebot/action/extends/SetInputStatus.ts @@ -4,7 +4,7 @@ import { ChatType } from 'napcat-core'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()], { description: 'QQ号' }), + user_id: Type.String({ description: 'QQ号' }), event_type: Type.Number({ description: '事件类型' }), }); diff --git a/packages/napcat-onebot/action/extends/SetSpecialTitle.ts b/packages/napcat-onebot/action/extends/SetSpecialTitle.ts index a1cbfc8f..7d926413 100644 --- a/packages/napcat-onebot/action/extends/SetSpecialTitle.ts +++ b/packages/napcat-onebot/action/extends/SetSpecialTitle.ts @@ -3,8 +3,8 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), - user_id: Type.Union([Type.Number(), Type.String()], { description: 'QQ号' }), + group_id: Type.String({ description: '群号' }), + user_id: Type.String({ description: 'QQ号' }), special_title: Type.String({ default: '', description: '专属头衔' }), }); diff --git a/packages/napcat-onebot/action/extends/ShareContact.ts b/packages/napcat-onebot/action/extends/ShareContact.ts index e21d4a13..f9f8d827 100644 --- a/packages/napcat-onebot/action/extends/ShareContact.ts +++ b/packages/napcat-onebot/action/extends/ShareContact.ts @@ -1,11 +1,10 @@ -import { GeneralCallResult } from 'napcat-core'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - user_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: 'QQ号' })), - group_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '群号' })), + user_id: Type.Optional(Type.String({ description: 'QQ号' })), + group_id: Type.Optional(Type.String({ description: '群号' })), phone_number: Type.String({ default: '', description: '手机号' }), }); @@ -31,7 +30,7 @@ export class SharePeerBase extends OneBotAction { } const PayloadSchemaGroupEx = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), }); export class SharePeer extends SharePeerBase { override actionName = ActionName.SharePeer; diff --git a/packages/napcat-onebot/action/extends/TransGroupFile.ts b/packages/napcat-onebot/action/extends/TransGroupFile.ts index 11338f9f..9263d4a0 100644 --- a/packages/napcat-onebot/action/extends/TransGroupFile.ts +++ b/packages/napcat-onebot/action/extends/TransGroupFile.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), file_id: Type.String({ description: '文件ID' }), }); diff --git a/packages/napcat-onebot/action/extends/TranslateEnWordToZn.ts b/packages/napcat-onebot/action/extends/TranslateEnWordToZn.ts index b1b285f7..00514207 100644 --- a/packages/napcat-onebot/action/extends/TranslateEnWordToZn.ts +++ b/packages/napcat-onebot/action/extends/TranslateEnWordToZn.ts @@ -8,7 +8,7 @@ const PayloadSchema = Type.Object({ type PayloadType = Static; -const ReturnSchema = Type.Optional(Type.Array(Type.Any()), { description: '翻译结果列表' }); +const ReturnSchema = Type.Union([Type.Array(Type.Any()), Type.Undefined()], { description: '翻译结果列表' }); type ReturnType = Static; diff --git a/packages/napcat-onebot/action/file/GetGroupFileUrl.ts b/packages/napcat-onebot/action/file/GetGroupFileUrl.ts index ba857551..a6cb677b 100644 --- a/packages/napcat-onebot/action/file/GetGroupFileUrl.ts +++ b/packages/napcat-onebot/action/file/GetGroupFileUrl.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), file_id: Type.String({ description: '文件ID' }), }); diff --git a/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts b/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts index e350564d..dd088b75 100644 --- a/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts +++ b/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts @@ -5,8 +5,8 @@ import { ChatType, Peer } from 'napcat-core/types'; export const SendFlashMsgPayloadSchema = Type.Object({ fileset_id: Type.String({ description: '文件集 ID' }), - user_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' })), - group_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '群号' })), + user_id: Type.Optional(Type.String({ description: '用户 QQ' })), + group_id: Type.Optional(Type.String({ description: '群号' })), }); export type SendFlashMsgPayload = Static; diff --git a/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts b/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts index f11a79fe..05015049 100644 --- a/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts +++ b/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts @@ -4,7 +4,7 @@ import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; export const CancelOnlineFilePayloadSchema = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + user_id: Type.String({ description: '用户 QQ' }), msg_id: Type.String({ description: '消息 ID' }), }); diff --git a/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts b/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts index e62eff13..bc122260 100644 --- a/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts +++ b/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts @@ -4,7 +4,7 @@ import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; export const GetOnlineFileMessagesPayloadSchema = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + user_id: Type.String({ description: '用户 QQ' }), }); export type GetOnlineFileMessagesPayload = Static; diff --git a/packages/napcat-onebot/action/file/online/ReceiveOnlineFile.ts b/packages/napcat-onebot/action/file/online/ReceiveOnlineFile.ts index c8dbf849..07fc5788 100644 --- a/packages/napcat-onebot/action/file/online/ReceiveOnlineFile.ts +++ b/packages/napcat-onebot/action/file/online/ReceiveOnlineFile.ts @@ -4,7 +4,7 @@ import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; export const ReceiveOnlineFilePayloadSchema = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + user_id: Type.String({ description: '用户 QQ' }), msg_id: Type.String({ description: '消息 ID' }), element_id: Type.String({ description: '元素 ID' }), }); diff --git a/packages/napcat-onebot/action/file/online/RefuseOnlineFile.ts b/packages/napcat-onebot/action/file/online/RefuseOnlineFile.ts index af87a002..094000dd 100644 --- a/packages/napcat-onebot/action/file/online/RefuseOnlineFile.ts +++ b/packages/napcat-onebot/action/file/online/RefuseOnlineFile.ts @@ -4,7 +4,7 @@ import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; export const RefuseOnlineFilePayloadSchema = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + user_id: Type.String({ description: '用户 QQ' }), msg_id: Type.String({ description: '消息 ID' }), element_id: Type.String({ description: '元素 ID' }), }); diff --git a/packages/napcat-onebot/action/file/online/SendOnlineFile.ts b/packages/napcat-onebot/action/file/online/SendOnlineFile.ts index 12d1e0d3..35cbc32a 100644 --- a/packages/napcat-onebot/action/file/online/SendOnlineFile.ts +++ b/packages/napcat-onebot/action/file/online/SendOnlineFile.ts @@ -4,7 +4,7 @@ import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; export const SendOnlineFilePayloadSchema = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + user_id: Type.String({ description: '用户 QQ' }), file_path: Type.String({ description: '本地文件路径' }), file_name: Type.Optional(Type.String({ description: '文件名 (可选)' })), }); diff --git a/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts b/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts index 7ab8e3ac..6bced1e0 100644 --- a/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts +++ b/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts @@ -4,7 +4,7 @@ import { Static, Type } from '@sinclair/typebox'; import { ChatType } from 'napcat-core/types'; export const SendOnlineFolderPayloadSchema = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + user_id: Type.String({ description: '用户 QQ' }), folder_path: Type.String({ description: '本地文件夹路径' }), folder_name: Type.Optional(Type.String({ description: '文件夹名称 (可选)' })), }); diff --git a/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts index a3d1f370..8652d7e8 100644 --- a/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), // 兼容gocq 与name二选一 folder_name: Type.Optional(Type.String({ description: '文件夹名称' })), // 兼容gocq 与folder_name二选一 diff --git a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts index 6947713a..f397d0e9 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -2,10 +2,9 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { FileNapCatOneBotUUID } from 'napcat-common/src/file-uuid'; import { Static, Type } from '@sinclair/typebox'; -import { NTQQGroupApi } from 'napcat-core/apis'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), file_id: Type.String({ description: '文件ID' }), }); diff --git a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 5f15125b..03242e33 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -1,10 +1,9 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { Static, Type } from '@sinclair/typebox'; -import { NTQQGroupApi } from 'napcat-core/apis'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), folder_id: Type.Optional(Type.String({ description: '文件夹ID' })), folder: Type.Optional(Type.String({ description: '文件夹ID' })), }); diff --git a/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts b/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts index d5a8509f..830bf7b8 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts @@ -29,7 +29,7 @@ export default class GoCQHTTPDownloadFile extends OneBotAction { const isRandomName = !payload.name; const name = payload.name || randomUUID(); - let result: Awaited>; + let result: Awaited>; if (payload.base64) { result = await uriToLocalFile(this.core.NapCatTempPath, `base64://${payload.base64}`, name); diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 2fcced56..8bb7db29 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), }); type PayloadType = Static; diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 59bbe7cb..94a9eca6 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), }); type PayloadType = Static; diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index 34e52c81..cf63bfa4 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -4,7 +4,7 @@ import { OB11Construct } from '@/napcat-onebot/helper/data'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), folder_id: Type.Optional(Type.String({ description: '文件夹ID' })), folder: Type.Optional(Type.String({ description: '文件夹ID' })), file_count: Type.Union([Type.Number(), Type.String()], { default: 50, description: '文件数量' }), diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts index 46157b10..af64949a 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -4,7 +4,7 @@ import { WebHonorType } from 'napcat-core/types'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), type: Type.Optional(Type.Enum(WebHonorType, { description: '荣誉类型' })), }); diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts index f5e53b48..0e5db1fb 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -4,7 +4,7 @@ import { OB11Construct } from '@/napcat-onebot/helper/data'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), file_count: Type.Union([Type.Number(), Type.String()], { default: 50, description: '文件数量' }), }); diff --git a/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts b/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts index 5790d3a9..70928cd4 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts @@ -1,6 +1,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { sleep } from 'napcat-common/src/helper'; +import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({}, { description: '在线客户端负载' }); diff --git a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts index 6b47ce49..45e747cf 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; -import { OB11User, OB11UserSex } from '@/napcat-onebot/index'; +import { OB11UserSex } from '@/napcat-onebot/index'; import { OB11Construct } from '@/napcat-onebot/helper/data'; import { ActionName } from '@/napcat-onebot/action/router'; import { calcQQLevel } from 'napcat-common/src/helper'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()], { description: '用户QQ' }), + user_id: Type.String({ description: '用户QQ' }), no_cache: Type.Union([Type.Boolean(), Type.String()], { default: false, description: '是否不使用缓存' }), }); @@ -58,11 +58,11 @@ export default class GoCQHTTPGetStrangerInfo extends OneBotAction if (!publishGroupBulletinResult || publishGroupBulletinResult.ec !== 0) { throw new Error(`设置群公告失败,错误信息:${publishGroupBulletinResult?.em}`); } - return null; } } diff --git a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts index 45e1401a..0c68893d 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -3,10 +3,9 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { checkFileExistV2, uriToLocalFile } from 'napcat-common/src/file'; import { Static, Type } from '@sinclair/typebox'; import fs from 'node:fs/promises'; -import { GeneralCallResult } from 'napcat-core'; export const SetGroupPortraitPayloadSchema = Type.Object({ file: Type.String({ description: '头像文件路径或 URL' }), - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), }); export type SetGroupPortraitPayload = Static; diff --git a/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts b/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts index d8364f8f..f869b132 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts @@ -1,4 +1,3 @@ -import { NTQQUserApi } from 'napcat-core/apis'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; diff --git a/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts b/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts index c5379700..cde3b633 100644 --- a/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts @@ -7,7 +7,7 @@ import { SendMessageContext } from '@/napcat-onebot/api'; import { Static, Type } from '@sinclair/typebox'; export const GoCQHTTPUploadGroupFilePayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), file: Type.String({ description: '本地文件路径' }), name: Type.String({ description: '文件名' }), folder: Type.Optional(Type.String({ description: '父目录 ID' })), diff --git a/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts b/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts index 50848820..9123f613 100644 --- a/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -8,7 +8,7 @@ import { ContextMode, createContext } from '@/napcat-onebot/action/msg/SendMsg'; import { Static, Type } from '@sinclair/typebox'; export const GoCQHTTPUploadPrivateFilePayloadSchema = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()], { description: '用户 QQ' }), + user_id: Type.String({ description: '用户 QQ' }), file: Type.String({ description: '本地文件路径' }), name: Type.String({ description: '文件名' }), upload_file: Type.Boolean({ default: true, description: '是否执行上传' }), @@ -39,7 +39,7 @@ export default class GoCQHTTPUploadPrivateFile extends OneBotAction { + async _handle (payload: GoCQHTTPUploadPrivateFilePayload): Promise { let file = payload.file; if (fs.existsSync(file)) { file = `file://${file}`; diff --git a/packages/napcat-onebot/action/group/DelGroupNotice.ts b/packages/napcat-onebot/action/group/DelGroupNotice.ts index 948a0498..57a0aca4 100644 --- a/packages/napcat-onebot/action/group/DelGroupNotice.ts +++ b/packages/napcat-onebot/action/group/DelGroupNotice.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), notice_id: Type.String({ description: '公告ID' }), }); diff --git a/packages/napcat-onebot/action/group/GetAiRecord.ts b/packages/napcat-onebot/action/group/GetAiRecord.ts index 567c54d3..15d09dcb 100644 --- a/packages/napcat-onebot/action/group/GetAiRecord.ts +++ b/packages/napcat-onebot/action/group/GetAiRecord.ts @@ -5,7 +5,7 @@ import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ character: Type.String({ description: '角色ID' }), - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), text: Type.String({ description: '语音文本内容' }), }); diff --git a/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts b/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts index 2195b4da..b1edbe0a 100644 --- a/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), }); type PayloadType = Static; diff --git a/packages/napcat-onebot/action/group/GetGroupEssence.ts b/packages/napcat-onebot/action/group/GetGroupEssence.ts index ac5c6a7c..27d87bd5 100644 --- a/packages/napcat-onebot/action/group/GetGroupEssence.ts +++ b/packages/napcat-onebot/action/group/GetGroupEssence.ts @@ -7,7 +7,7 @@ import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; const PayloadSchema = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()], { description: '群号' }), + group_id: Type.String({ description: '群号' }), }); type PayloadType = Static; @@ -57,6 +57,15 @@ export class GetGroupEssence extends OneBotAction { }, msg.msg_seq.toString(), msg.msg_random.toString()); if (msgOriginData) { const { id: message_id, msg: rawMessage } = msgOriginData; + const parsed = await this.obContext.apis.MsgApi.parseMessage(rawMessage, config.messagePostFormat); + let content: any[] = []; + if (parsed) { + if (Array.isArray(parsed.message)) { + content = parsed.message; + } else { + content = [{ type: 'text', data: { text: parsed.message } }]; + } + } return { msg_seq: msg.msg_seq, msg_random: msg.msg_random, @@ -66,7 +75,7 @@ export class GetGroupEssence extends OneBotAction { operator_nick: msg.add_digest_nick, message_id, operator_time: msg.add_digest_time, - content: (await this.obContext.apis.MsgApi.parseMessage(rawMessage, config.messagePostFormat))?.message, + content, }; } const msgTempData = JSON.stringify({ @@ -107,7 +116,7 @@ export class GetGroupEssence extends OneBotAction { }; } return undefined; - }).filter(e => e !== undefined), + }).filter((e): e is any => e !== undefined), }; })); } diff --git a/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts b/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts index 1db5f6c1..23c1d95c 100644 --- a/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts +++ b/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts @@ -1,7 +1,7 @@ import { GroupNotifyMsgStatus } from 'napcat-core'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; -import { Notify } from '@/napcat-onebot/types'; +import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({}, { description: '群忽略通知负载' }); diff --git a/packages/napcat-onebot/action/group/GetGroupMemberList.ts b/packages/napcat-onebot/action/group/GetGroupMemberList.ts index 8a142b65..49c3d2b0 100644 --- a/packages/napcat-onebot/action/group/GetGroupMemberList.ts +++ b/packages/napcat-onebot/action/group/GetGroupMemberList.ts @@ -1,4 +1,3 @@ -import { OB11GroupMember } from '@/napcat-onebot/index'; import { OB11Construct } from '@/napcat-onebot/helper/data'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; diff --git a/packages/napcat-onebot/action/group/GetGroupNotice.ts b/packages/napcat-onebot/action/group/GetGroupNotice.ts index 8d5439da..91123552 100644 --- a/packages/napcat-onebot/action/group/GetGroupNotice.ts +++ b/packages/napcat-onebot/action/group/GetGroupNotice.ts @@ -23,7 +23,7 @@ const ReturnSchema = Type.Array(Type.Object({ type ReturnType = Static; -type ApiGroupNotice = ReturnType[number] & WebApiGroupNoticeFeed; +export type ApiGroupNotice = ReturnType[number] & WebApiGroupNoticeFeed; export class GetGroupNotice extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetGroupNotice; diff --git a/packages/napcat-onebot/action/group/GetGroupShutList.ts b/packages/napcat-onebot/action/group/GetGroupShutList.ts index d665ea89..d81835af 100644 --- a/packages/napcat-onebot/action/group/GetGroupShutList.ts +++ b/packages/napcat-onebot/action/group/GetGroupShutList.ts @@ -1,4 +1,3 @@ -import { ShutUpGroupMember } from 'napcat-core'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; diff --git a/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts b/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts index 4a580910..efd96091 100644 --- a/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts +++ b/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts @@ -6,8 +6,8 @@ import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), - group_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '目标群号' })), - user_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '目标用户QQ' })), + group_id: Type.Optional(Type.String({ description: '目标群号' })), + user_id: Type.Optional(Type.String({ description: '目标用户QQ' })), }); type PayloadType = Static; diff --git a/packages/napcat-onebot/action/packet/GetPacketStatus.ts b/packages/napcat-onebot/action/packet/GetPacketStatus.ts index 122139be..e38cfc88 100644 --- a/packages/napcat-onebot/action/packet/GetPacketStatus.ts +++ b/packages/napcat-onebot/action/packet/GetPacketStatus.ts @@ -1,5 +1,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName, BaseCheckResult } from '@/napcat-onebot/action/router'; +import { Type } from '@sinclair/typebox'; export abstract class GetPacketStatusDepends extends OneBotAction { protected override async check (payload: PT): Promise { diff --git a/packages/napcat-onebot/action/schemas.ts b/packages/napcat-onebot/action/schemas.ts index 6c56df2b..5f91d7a0 100644 --- a/packages/napcat-onebot/action/schemas.ts +++ b/packages/napcat-onebot/action/schemas.ts @@ -49,3 +49,15 @@ export const OB11GroupMemberSchema = Type.Object({ is_robot: Type.Optional(Type.Boolean({ description: '是否为机器人' })), qage: Type.Optional(Type.Number({ description: 'Q龄' })), }, { description: 'OneBot 11 群成员信息' }); + +export const OB11NotifySchema = Type.Object({ + request_id: Type.Number({ description: '请求ID' }), + invitor_uin: Type.Number({ description: '邀请者QQ' }), + invitor_nick: Type.String({ description: '邀请者昵称' }), + group_id: Type.Number({ description: '群号' }), + group_name: Type.String({ description: '群名称' }), + message: Type.String({ description: '附言' }), + checked: Type.Boolean({ description: '是否已处理' }), + actor: Type.Number({ description: '操作者QQ' }), + requester_nick: Type.String({ description: '申请者昵称' }), +}, { description: 'OneBot 11 通知信息' }); diff --git a/packages/napcat-onebot/action/stream/UploadFileStream.ts b/packages/napcat-onebot/action/stream/UploadFileStream.ts index 4072db5c..92ed67b4 100644 --- a/packages/napcat-onebot/action/stream/UploadFileStream.ts +++ b/packages/napcat-onebot/action/stream/UploadFileStream.ts @@ -102,7 +102,7 @@ export class UploadFileStream extends OneBotAction Date: Sun, 25 Jan 2026 16:26:27 +0800 Subject: [PATCH 03/17] Refactor type definitions and payload schemas in actions Standardized type usage and improved type safety across multiple OneBot action files. Updated payload schemas to use string types for IDs and flags, refined return types, and enhanced message content typing. Added error handling for missing parameters in SetGroupTodo. --- .../action/extends/GetGroupAddRequest.ts | 2 +- .../action/extends/GetQunAlbumList.ts | 8 +++++--- .../extends/GetUnidirectionalFriendList.ts | 8 +++++++- .../action/go-cqhttp/SendForwardMsg.ts | 10 ++++++---- .../action/group/GetGroupEssence.ts | 16 +++++++++------- .../action/group/SetGroupAddRequest.ts | 2 +- .../napcat-onebot/action/packet/SetGroupTodo.ts | 7 +++++-- .../action/user/SetFriendAddRequest.ts | 2 +- .../napcat-onebot/action/user/SetFriendRemark.ts | 2 +- 9 files changed, 36 insertions(+), 21 deletions(-) diff --git a/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts b/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts index ff6bef3a..7e2b429e 100644 --- a/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts +++ b/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts @@ -29,7 +29,7 @@ export default class GetGroupAddRequest extends OneBotAction { const NTQQUserApi = this.core.apis.UserApi; const NTQQGroupApi = this.core.apis.GroupApi; const ignoredNotifies = await NTQQGroupApi.getSingleScreenNotifies(true, 10); - const retData: any[] = []; + const retData: ReturnType = []; const notifyPromises = ignoredNotifies .filter(notify => notify.type === 7) diff --git a/packages/napcat-onebot/action/extends/GetQunAlbumList.ts b/packages/napcat-onebot/action/extends/GetQunAlbumList.ts index 74fe4ffd..3c30bf15 100644 --- a/packages/napcat-onebot/action/extends/GetQunAlbumList.ts +++ b/packages/napcat-onebot/action/extends/GetQunAlbumList.ts @@ -1,6 +1,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { NTQQWebApi } from 'napcat-core/apis'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), }); @@ -9,14 +11,14 @@ type PayloadType = Static; const ReturnSchema = Type.Array(Type.Any(), { description: '群相册列表' }); -type ReturnType = Static; +type GetQunAlbumListReturn = Awaited>['response']['album_list']; -export class GetQunAlbumList extends OneBotAction { +export class GetQunAlbumList extends OneBotAction { override actionName = ActionName.GetQunAlbumList; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - async _handle (payload: PayloadType) { + async _handle (payload: PayloadType): Promise { return (await this.core.apis.WebApi.getAlbumListByNTQQ(payload.group_id)).response.album_list; } } diff --git a/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts b/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts index abeb9bc9..fc3610ee 100644 --- a/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts +++ b/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts @@ -42,7 +42,13 @@ export class GetUnidirectionalFriendList extends OneBotAction const rsq = { cmd: 'MQUpdateSvc_com_qq_ti.web.OidbSvc.0xe17_0', data: data as PacketBuf }; const rsp_data = await this.core.apis.PacketApi.pkt.operation.sendPacket(rsq, true); const block_json = ProtoBuf(class extends ProtoBufBase { data = PBString(4); }).decode(rsp_data); - const block_list: any[] = JSON.parse(block_json.data).rpt_block_list; + const block_list = JSON.parse(block_json.data).rpt_block_list as { + uint64_uin: number; + str_uid: string; + bytes_nick: string; + uint32_age: number; + bytes_source: string; + }[]; return block_list.map((block) => ({ uin: block.uint64_uin, diff --git a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts index 415a1751..fd33ea2a 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts @@ -2,17 +2,19 @@ import { ContextMode, normalize, ReturnDataType, SendMsgBase, SendMsgPayload } f import { ActionName } from '@/napcat-onebot/action/router'; // 未验证 +type GoCQHTTPSendForwardMsgPayload = SendMsgPayload & { messages?: any; }; + export class GoCQHTTPSendForwardMsgBase extends SendMsgBase { - protected override async check (payload: SendMsgPayload) { - if ((payload as any).messages) payload.message = normalize((payload as any).messages); + protected override async check (payload: GoCQHTTPSendForwardMsgPayload) { + if (payload.messages) payload.message = normalize(payload.messages); return super.check(payload); } } export class GoCQHTTPSendForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendForwardMsg; - protected override async check (payload: SendMsgPayload) { - if ((payload as any).messages) payload.message = normalize((payload as any).messages); + protected override async check (payload: GoCQHTTPSendForwardMsgPayload) { + if (payload.messages) payload.message = normalize(payload.messages); return super.check(payload); } } diff --git a/packages/napcat-onebot/action/group/GetGroupEssence.ts b/packages/napcat-onebot/action/group/GetGroupEssence.ts index 27d87bd5..edae452b 100644 --- a/packages/napcat-onebot/action/group/GetGroupEssence.ts +++ b/packages/napcat-onebot/action/group/GetGroupEssence.ts @@ -5,6 +5,7 @@ import { MessageUnique } from 'napcat-common/src/message-unique'; import crypto from 'crypto'; import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; +import { OB11MessageData, OB11MessageDataType } from '@/napcat-onebot/types'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -58,12 +59,12 @@ export class GetGroupEssence extends OneBotAction { if (msgOriginData) { const { id: message_id, msg: rawMessage } = msgOriginData; const parsed = await this.obContext.apis.MsgApi.parseMessage(rawMessage, config.messagePostFormat); - let content: any[] = []; + let content: OB11MessageData[] = []; if (parsed) { if (Array.isArray(parsed.message)) { content = parsed.message; } else { - content = [{ type: 'text', data: { text: parsed.message } }]; + content = [{ type: OB11MessageDataType.text, data: { text: parsed.message } }]; } } return { @@ -99,24 +100,25 @@ export class GetGroupEssence extends OneBotAction { operator_nick: msg.add_digest_nick, message_id: shortId, operator_time: msg.add_digest_time, - content: msg.msg_content.map((msg) => { + content: msg.msg_content.map((msg): OB11MessageData | undefined => { if (msg.msg_type === 1) { return { - type: 'text', + type: OB11MessageDataType.text, data: { - text: msg?.text, + text: msg?.text ?? '', }, }; } else if (msg.msg_type === 3) { return { - type: 'image', + type: OB11MessageDataType.image, data: { + file: '', url: msg?.image_url, }, }; } return undefined; - }).filter((e): e is any => e !== undefined), + }).filter((e): e is OB11MessageData => e !== undefined), }; })); } diff --git a/packages/napcat-onebot/action/group/SetGroupAddRequest.ts b/packages/napcat-onebot/action/group/SetGroupAddRequest.ts index 70d110af..4eb01aad 100644 --- a/packages/napcat-onebot/action/group/SetGroupAddRequest.ts +++ b/packages/napcat-onebot/action/group/SetGroupAddRequest.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ - flag: Type.Union([Type.String(), Type.Number()], { description: '请求flag' }), + flag: Type.String({ description: '请求flag' }), approve: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否同意' })), reason: Type.Optional(Type.Union([Type.String({ default: ' ' }), Type.Null()], { description: '拒绝理由' })), count: Type.Optional(Type.Number({ default: 100, description: '搜索通知数量' })), diff --git a/packages/napcat-onebot/action/packet/SetGroupTodo.ts b/packages/napcat-onebot/action/packet/SetGroupTodo.ts index a9dc48c3..2a1d06ea 100644 --- a/packages/napcat-onebot/action/packet/SetGroupTodo.ts +++ b/packages/napcat-onebot/action/packet/SetGroupTodo.ts @@ -6,8 +6,8 @@ import { ActionName } from '../router'; export const SetGroupTodoPayloadSchema = Type.Object({ group_id: Type.Union([Type.String(), Type.Number()], { description: '群号' }), - message_id: Type.Union([Type.String(), Type.Number()], { description: '消息ID' }), - message_seq: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '消息Seq (可选)' })), + message_id: Type.Optional(Type.String({ description: '消息ID' })), + message_seq: Type.Optional(Type.String({ description: '消息Seq (可选)' })), }); export type SetGroupTodoPayload = Static; @@ -19,6 +19,9 @@ export class SetGroupTodo extends GetPacketStatusDepends Date: Sun, 25 Jan 2026 16:32:36 +0800 Subject: [PATCH 04/17] Refactor type handling and improve message parsing Updated several actions to use more precise type casting and type guards, improving type safety and clarity. Enhanced message parsing logic for forward messages and group/friend message history. Standardized return schemas and error handling for avatar and group portrait actions. --- .../action/extends/GetAiCharacters.ts | 4 +- .../extends/GetUnidirectionalFriendList.ts | 8 ++-- .../action/extends/SendPacket.ts | 3 +- .../action/extends/SetQQAvatar.ts | 2 +- .../action/go-cqhttp/GetForwardMsg.ts | 38 +++++++++++++------ .../action/go-cqhttp/GetFriendMsgHistory.ts | 4 +- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 13 ++++--- .../action/go-cqhttp/GetGroupMsgHistory.ts | 4 +- .../action/go-cqhttp/SendForwardMsg.ts | 7 ++-- .../action/go-cqhttp/SetGroupPortrait.ts | 22 ++++++++--- 10 files changed, 67 insertions(+), 38 deletions(-) diff --git a/packages/napcat-onebot/action/extends/GetAiCharacters.ts b/packages/napcat-onebot/action/extends/GetAiCharacters.ts index 14476c2d..c482b972 100644 --- a/packages/napcat-onebot/action/extends/GetAiCharacters.ts +++ b/packages/napcat-onebot/action/extends/GetAiCharacters.ts @@ -1,6 +1,5 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; -import { AIVoiceChatType } from 'napcat-core/packet/entities/aiChat'; import { Type, Static } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ @@ -33,7 +32,8 @@ export class GetAiCharacters extends GetPacketStatusDepends ({ type: item.category, characters: item.voices.map((voice) => ({ diff --git a/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts b/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts index fc3610ee..546121f8 100644 --- a/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts +++ b/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts @@ -39,16 +39,18 @@ export class GetUnidirectionalFriendList extends OneBotAction }; const packed_data = await this.pack_data(JSON.stringify(req_json)); const data = Buffer.from(packed_data); - const rsq = { cmd: 'MQUpdateSvc_com_qq_ti.web.OidbSvc.0xe17_0', data: data as PacketBuf }; + const rsq = { cmd: 'MQUpdateSvc_com_qq_ti.web.OidbSvc.0xe17_0', data: data as unknown as PacketBuf }; const rsp_data = await this.core.apis.PacketApi.pkt.operation.sendPacket(rsq, true); const block_json = ProtoBuf(class extends ProtoBufBase { data = PBString(4); }).decode(rsp_data); - const block_list = JSON.parse(block_json.data).rpt_block_list as { + interface BlockItem { uint64_uin: number; str_uid: string; bytes_nick: string; uint32_age: number; bytes_source: string; - }[]; + } + const block_data: { rpt_block_list: BlockItem[]; } = JSON.parse(block_json.data); + const block_list = block_data.rpt_block_list; return block_list.map((block) => ({ uin: block.uint64_uin, diff --git a/packages/napcat-onebot/action/extends/SendPacket.ts b/packages/napcat-onebot/action/extends/SendPacket.ts index 1e702021..1b54a2d0 100644 --- a/packages/napcat-onebot/action/extends/SendPacket.ts +++ b/packages/napcat-onebot/action/extends/SendPacket.ts @@ -21,7 +21,8 @@ export class SendPacket extends GetPacketStatusDepends override actionName = ActionName.SendPacket; async _handle (payload: PayloadType) { const rsp = typeof payload.rsp === 'boolean' ? payload.rsp : payload.rsp === 'true'; - const data = await this.core.apis.PacketApi.pkt.operation.sendPacket({ cmd: payload.cmd, data: Buffer.from(payload.data, 'hex') as PacketBuf }, rsp); + const packetData = Buffer.from(payload.data, 'hex') as unknown as PacketBuf; + const data = await this.core.apis.PacketApi.pkt.operation.sendPacket({ cmd: payload.cmd, data: packetData }, rsp); return typeof data === 'object' ? data.toString('hex') : undefined; } } diff --git a/packages/napcat-onebot/action/extends/SetQQAvatar.ts b/packages/napcat-onebot/action/extends/SetQQAvatar.ts index 953841f8..23b72767 100644 --- a/packages/napcat-onebot/action/extends/SetQQAvatar.ts +++ b/packages/napcat-onebot/action/extends/SetQQAvatar.ts @@ -31,7 +31,7 @@ export default class SetAvatar extends OneBotAction { throw new Error(`头像${payload.file}设置失败,api无返回`); } // log(`头像设置返回:${JSON.stringify(ret)}`) - if (ret.result as number === 1004022) { + if (Number(ret.result) === 1004022) { throw new Error(`头像${payload.file}设置失败,文件可能不是图片格式`); } else if (ret.result !== 0) { throw new Error(`头像${payload.file}设置失败,未知的错误,${ret.result}:${ret.errMsg}`); diff --git a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts index 393b47a6..b1543ced 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts @@ -14,11 +14,15 @@ const PayloadSchema = Type.Object({ type PayloadType = Static; const ReturnSchema = Type.Object({ - messages: Type.Optional(Type.Array(Type.Any(), { description: '消息列表' })), + messages: Type.Optional(Type.Array(Type.Unknown(), { description: '消息列表' })), }, { description: '合并转发消息' }); type ReturnType = Static; +function isForward (msg: OB11MessageData | string): msg is OB11MessageForward { + return typeof msg !== 'string' && msg.type === OB11MessageDataType.forward; +} + export class GoCQHTTPGetForwardMsgAction extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetForwardMsg; override payloadSchema = PayloadSchema; @@ -43,13 +47,18 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { - return { + const fakeMsg: RawMessage = { chatType: ChatType.KCHATTYPEGROUP, elements: [{ elementType: ElementType.MULTIFORWARD, @@ -80,7 +89,7 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { const ob = (await this.obContext.apis.MsgApi.parseMessageV2(createFakeForwardMsg(resId), true))?.arrayMsg; - if (ob) { + const firstMsg = ob?.message?.[0]; + if (firstMsg && isForward(firstMsg)) { return { - messages: (ob?.message?.[0] as OB11MessageForward)?.data?.content, + messages: firstMsg.data.content, }; } throw new Error('protocolFallbackLogic: 找不到相关的聊天记录'); @@ -138,9 +149,12 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat, payload.parse_mult_msg, payload.disable_get_url))) - ).filter(msg => msg !== undefined); - return { messages: ob11MsgList as OB11Message[] }; + ).filter((msg): msg is OB11Message => msg !== undefined); + return { messages: ob11MsgList }; } } diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index cf63bfa4..d22ea7b4 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -13,8 +13,8 @@ const PayloadSchema = Type.Object({ type PayloadType = Static; const ReturnSchema = Type.Object({ - files: Type.Array(Type.Any(), { description: '文件列表' }), - folders: Type.Array(Type.Any(), { description: '文件夹列表' }), + files: Type.Array(Type.Unknown(), { description: '文件列表' }), + folders: Type.Array(Type.Unknown(), { description: '文件夹列表' }), }, { description: '群文件夹文件列表' }); type ReturnType = Static; @@ -23,19 +23,20 @@ export class GetGroupFilesByFolder extends OneBotAction override actionName = ActionName.GoCQHTTP_GetGroupFilesByFolder; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - async _handle (payload: PayloadType) { - const ret = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), { + async _handle (payload: PayloadType): Promise { + const retRaw = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), { sortType: 1, fileCount: +payload.file_count, startIndex: 0, sortOrder: 2, showOnlinedocFolder: 0, folderId: payload.folder ?? payload.folder_id ?? '', - }).catch(() => []); + }); + const ret = Array.isArray(retRaw) ? retRaw : []; return { files: ret.filter(item => item.fileInfo) .map(item => OB11Construct.file(item.peerId, item.fileInfo!)), - folders: [] as [], + folders: [], }; } } diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts index fbd6a8d1..71fe33bc 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -46,7 +46,7 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat, payload.parse_mult_msg, payload.disable_get_url, payload.quick_reply))) - ).filter(msg => msg !== undefined); - return { messages: ob11MsgList as OB11Message[] }; + ).filter((msg): msg is OB11Message => msg !== undefined); + return { messages: ob11MsgList }; } } diff --git a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts index fd33ea2a..e56b375b 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts @@ -1,8 +1,9 @@ +import { OB11MessageMixType } from '@/napcat-onebot/types'; import { ContextMode, normalize, ReturnDataType, SendMsgBase, SendMsgPayload } from '@/napcat-onebot/action/msg/SendMsg'; import { ActionName } from '@/napcat-onebot/action/router'; // 未验证 -type GoCQHTTPSendForwardMsgPayload = SendMsgPayload & { messages?: any; }; +type GoCQHTTPSendForwardMsgPayload = SendMsgPayload & { messages?: OB11MessageMixType; }; export class GoCQHTTPSendForwardMsgBase extends SendMsgBase { protected override async check (payload: GoCQHTTPSendForwardMsgPayload) { @@ -20,14 +21,14 @@ export class GoCQHTTPSendForwardMsg extends GoCQHTTPSendForwardMsgBase { } export class GoCQHTTPSendPrivateForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendPrivateForwardMsg; - override async _handle (payload: SendMsgPayload): Promise { + override async _handle (payload: GoCQHTTPSendForwardMsgPayload): Promise { return this.base_handle(payload, ContextMode.Private); } } export class GoCQHTTPSendGroupForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendGroupForwardMsg; - override async _handle (payload: SendMsgPayload): Promise { + override async _handle (payload: GoCQHTTPSendForwardMsgPayload): Promise { return this.base_handle(payload, ContextMode.Group); } } diff --git a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts index 0c68893d..8b3abb5b 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -10,12 +10,19 @@ export const SetGroupPortraitPayloadSchema = Type.Object({ export type SetGroupPortraitPayload = Static; -export default class SetGroupPortrait extends OneBotAction { +const ReturnSchema = Type.Object({ + result: Type.Number(), + errMsg: Type.String(), +}, { description: '设置结果' }); + +export type ReturnType = Static; + +export default class SetGroupPortrait extends OneBotAction { override actionName = ActionName.SetGroupPortrait; override payloadSchema = SetGroupPortraitPayloadSchema; - override returnSchema = Type.Any({ description: '设置结果' }); + override returnSchema = ReturnSchema; - async _handle (payload: SetGroupPortraitPayload): Promise { + async _handle (payload: SetGroupPortraitPayload): Promise { const { path, success } = (await uriToLocalFile(this.core.NapCatTempPath, payload.file)); if (!success) { throw new Error(`头像${payload.file}设置失败,file字段可能格式不正确`); @@ -27,12 +34,15 @@ export default class SetGroupPortrait extends OneBotAction { }); throw new Error(`头像${payload.file}设置失败,无法获取头像,文件可能不存在`); From 8f1dc3fdde24825258e915d574787f787a5a3d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 17:12:25 +0800 Subject: [PATCH 05/17] Add napcat-schema package for OpenAPI generation Introduces the napcat-schema package with scripts and configuration to auto-generate OpenAPI schemas for NapCat OneBot 11 actions. Refactors action handler export in napcat-onebot to support schema extraction. --- packages/napcat-onebot/action/index.ts | 6 +- packages/napcat-schema/index.ts | 85 +++ packages/napcat-schema/package.json | 19 + packages/napcat-schema/tsconfig.json | 11 + packages/napcat-schema/vite.config.ts | 46 ++ pnpm-lock.yaml | 772 +++++++++++++++++-------- 6 files changed, 701 insertions(+), 238 deletions(-) create mode 100644 packages/napcat-schema/index.ts create mode 100644 packages/napcat-schema/package.json create mode 100644 packages/napcat-schema/tsconfig.json create mode 100644 packages/napcat-schema/vite.config.ts diff --git a/packages/napcat-onebot/action/index.ts b/packages/napcat-onebot/action/index.ts index 11f8b4c6..a9be0a1d 100644 --- a/packages/napcat-onebot/action/index.ts +++ b/packages/napcat-onebot/action/index.ts @@ -156,7 +156,7 @@ import { ReceiveOnlineFile } from './file/online/ReceiveOnlineFile'; import { RefuseOnlineFile } from './file/online/RefuseOnlineFile'; import { GetFilesetId } from './file/flash/GetFilesetIdByCode'; -export function createActionMap (obContext: NapCatOneBot11Adapter, core: NapCatCore) { +export function getAllHandlers (obContext: NapCatOneBot11Adapter, core: NapCatCore) { const actionHandlers = [ new CleanStreamTempFile(obContext, core), new DownloadFileStream(obContext, core), @@ -324,7 +324,11 @@ export function createActionMap (obContext: NapCatOneBot11Adapter, core: NapCatC new DownloadFileset(obContext, core), new GetFilesetId(obContext, core), ]; + return actionHandlers; +} +export function createActionMap (obContext: NapCatOneBot11Adapter, core: NapCatCore) { + const actionHandlers = getAllHandlers(obContext, core); type HandlerUnion = typeof actionHandlers[number]; type MapType = { [H in HandlerUnion as H['actionName']]: H; diff --git a/packages/napcat-schema/index.ts b/packages/napcat-schema/index.ts new file mode 100644 index 00000000..dcf037d7 --- /dev/null +++ b/packages/napcat-schema/index.ts @@ -0,0 +1,85 @@ +import { getAllHandlers } from '@/napcat-onebot/action/index'; +import { AutoRegisterRouter } from '@/napcat-onebot/action/auto-register'; +import { writeFileSync } from 'node:fs'; +import { resolve, dirname } from 'node:path'; +import { TSchema } from '@sinclair/typebox'; +import { fileURLToPath } from 'node:url'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +export const actionSchemas: Record = {}; + + +export function initSchemas () { + const handlers = getAllHandlers(null as any, null as any); + handlers.forEach(handler => { + if (handler.actionName && (handler.actionName as string) !== 'unknown') { + actionSchemas[handler.actionName] = { + payload: handler.payloadSchema, + return: handler.returnSchema + }; + } + }); + AutoRegisterRouter.forEach((ActionClass) => { + const handler = new ActionClass(null as any, null as any); + if (handler.actionName && (handler.actionName as string) !== 'unknown') { + actionSchemas[handler.actionName] = { + payload: handler.payloadSchema, + return: handler.returnSchema + }; + } + }); +} + +export function generateOpenAPI () { + try { + initSchemas(); + } catch (e) { + console.warn('Init schemas partial failure (expected due to complex imports), proceeding with collected data...'); + } + + const openapi: any = { + openapi: '3.1.0', + info: { + title: 'NapCat OneBot 11 API', + description: 'Auto-generated OpenAPI schema for NapCat OneBot 11 actions', + version: '1.0.0' + }, + paths: {} + }; + + for (const [actionName, schemas] of Object.entries(actionSchemas)) { + if (!schemas.payload) continue; + const path = `/${actionName}`; + + const cleanPayload = JSON.parse(JSON.stringify(schemas.payload || { type: 'object', properties: {} })); + const cleanReturn = JSON.parse(JSON.stringify(schemas.return || { type: 'object', properties: {} })); + + openapi.paths[path] = { + post: { + summary: actionName, + requestBody: { + content: { + 'application/json': { + schema: cleanPayload + } + } + }, + responses: { + '200': { + description: '成功', + content: { + 'application/json': { + schema: cleanReturn + } + } + } + } + } + }; + } + const outputPath = resolve(__dirname, 'openapi.json'); + writeFileSync(outputPath, JSON.stringify(openapi, null, 2)); + console.log(`OpenAPI schema generated at: ${outputPath}`); +} +generateOpenAPI(); \ No newline at end of file diff --git a/packages/napcat-schema/package.json b/packages/napcat-schema/package.json new file mode 100644 index 00000000..314d44ca --- /dev/null +++ b/packages/napcat-schema/package.json @@ -0,0 +1,19 @@ +{ + "name": "napcat-schema", + "version": "1.0.0", + "private": true, + "type": "module", + "main": "index.ts", + "scripts": { + "generate:openapi": "node ./dist/schemas.mjs", + "build:schema": "vite build" + }, + "dependencies": { + "@sinclair/typebox": "^0.34.38", + "napcat-onebot": "workspace:*" + }, + "devDependencies": { + "tsx": "^4.7.1", + "vite": "^6.0.0" + } +} \ No newline at end of file diff --git a/packages/napcat-schema/tsconfig.json b/packages/napcat-schema/tsconfig.json new file mode 100644 index 00000000..2101dac0 --- /dev/null +++ b/packages/napcat-schema/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "include": [ + "*.ts", + "**/*.ts", + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/packages/napcat-schema/vite.config.ts b/packages/napcat-schema/vite.config.ts new file mode 100644 index 00000000..ab8d4fb9 --- /dev/null +++ b/packages/napcat-schema/vite.config.ts @@ -0,0 +1,46 @@ +import { defineConfig } from 'vite'; +import path, { resolve } from 'path'; +import { builtinModules } from 'module'; +import nodeResolve from '@rollup/plugin-node-resolve'; + +// 依赖排除 +const external = [ + 'ws', + 'express', + 'electron' +]; +const nodeModules = [...builtinModules, builtinModules.map((m) => `node:${m}`)].flat(); + +export default defineConfig({ + resolve: { + conditions: ['node', 'default'], + alias: { + '@/napcat-core': resolve(__dirname, '../napcat-core'), + '@/napcat-common': resolve(__dirname, '../napcat-common'), + '@/napcat-onebot': resolve(__dirname, '../napcat-onebot'), + '@/napcat-pty': resolve(__dirname, '../napcat-pty'), + '@/napcat-webui-backend': resolve(__dirname, '../napcat-webui-backend'), + '@/image-size': resolve(__dirname, '../image-size'), + }, + }, + plugins: [ + nodeResolve(), + ], + build: { + target: 'esnext', + minify: false, + emptyOutDir: true, + outDir: 'dist', + lib: { + entry: path.resolve(__dirname, './index.ts'), + formats: ['es'], + fileName: () => 'schemas.mjs', + }, + rollupOptions: { + external: [ + ...nodeModules, + ...external + ] + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b0ffbe4..24017d0e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,7 +20,7 @@ importers: version: 16.0.3(rollup@4.53.2) '@vitejs/plugin-react-swc': specifier: ^4.2.2 - version: 4.2.2(@swc/helpers@0.5.17)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)) + version: 4.2.2(@swc/helpers@0.5.17)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)) '@vitest/ui': specifier: ^4.0.9 version: 4.0.9(vitest@4.0.9) @@ -35,13 +35,13 @@ importers: version: 5.9.3 vite: specifier: ^6.4.1 - version: 6.4.1(@types/node@22.19.1)(jiti@1.21.7) + version: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) vite-plugin-cp: specifier: ^6.0.3 version: 6.0.3 vitest: specifier: ^4.0.9 - version: 4.0.9(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/ui@4.0.9)(jiti@1.21.7) + version: 4.0.9(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/ui@4.0.9)(jiti@1.21.7)(tsx@4.21.0) packages/napcat-common: dependencies: @@ -256,6 +256,22 @@ importers: specifier: ^22.0.1 version: 22.19.1 + packages/napcat-schema: + dependencies: + '@sinclair/typebox': + specifier: ^0.34.38 + version: 0.34.41 + napcat-onebot: + specifier: workspace:* + version: link:../napcat-onebot + devDependencies: + tsx: + specifier: ^4.7.1 + version: 4.21.0 + vite: + specifier: ^6.0.0 + version: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) + packages/napcat-shell: dependencies: napcat-common: @@ -289,7 +305,7 @@ importers: devDependencies: vitest: specifier: ^4.0.9 - version: 4.0.9(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/ui@4.0.9)(jiti@1.21.7) + version: 4.0.9(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/ui@4.0.9)(jiti@1.21.7)(tsx@4.21.0) packages/napcat-universal: dependencies: @@ -393,97 +409,97 @@ importers: version: 3.2.2(react@19.2.0) '@heroui/accordion': specifier: ^2.2.8 - version: 2.2.24(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.24(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/avatar': specifier: 2.2.7 - version: 2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/breadcrumbs': specifier: 2.2.7 - version: 2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/button': specifier: 2.2.10 - version: 2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/card': specifier: 2.2.10 - version: 2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/checkbox': specifier: 2.3.9 - version: 2.3.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.3.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/chip': specifier: 2.2.7 - version: 2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/code': specifier: 2.2.7 - version: 2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/divider': specifier: ^2.2.21 - version: 2.2.21(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.21(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/dropdown': specifier: 2.3.10 - version: 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/form': specifier: 2.1.9 - version: 2.1.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.1.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/image': specifier: 2.2.6 - version: 2.2.6(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.6(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/input': specifier: 2.4.10 - version: 2.4.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.4.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/kbd': specifier: 2.2.7 - version: 2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/link': specifier: 2.2.8 - version: 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/listbox': specifier: 2.3.10 - version: 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/modal': specifier: 2.2.8 - version: 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/navbar': specifier: 2.2.9 - version: 2.2.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/pagination': specifier: ^2.2.9 - version: 2.2.24(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.24(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/popover': specifier: 2.3.10 - version: 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/select': specifier: 2.4.10 - version: 2.4.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.4.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/skeleton': specifier: ^2.2.6 - version: 2.2.17(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.17(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/slider': specifier: 2.4.8 - version: 2.4.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.4.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/snippet': specifier: 2.2.11 - version: 2.2.11(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.11(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/spinner': specifier: 2.2.7 - version: 2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/switch': specifier: 2.2.9 - version: 2.2.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/system': specifier: 2.4.7 - version: 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/table': specifier: ^2.2.9 - version: 2.2.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/tabs': specifier: 2.2.8 - version: 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/theme': specifier: 2.4.6 - version: 2.4.6(tailwindcss@3.4.18) + version: 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/tooltip': specifier: 2.2.8 - version: 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@monaco-editor/loader': specifier: ^1.4.0 version: 1.6.1 @@ -588,10 +604,10 @@ importers: version: 4.0.1 tailwind-variants: specifier: ^0.3.0 - version: 0.3.1(tailwindcss@3.4.18) + version: 0.3.1(tailwindcss@3.4.18(tsx@4.21.0)) tailwindcss: specifier: ^3.4.17 - version: 3.4.18 + version: 3.4.18(tsx@4.21.0) zod: specifier: ^3.24.1 version: 3.25.76 @@ -628,7 +644,7 @@ importers: version: 1.8.8 '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)) + version: 4.7.0(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)) autoprefixer: specifier: ^10.4.20 version: 10.4.22(postcss@8.5.6) @@ -670,19 +686,19 @@ importers: version: 5.9.3 vite: specifier: ^6.0.5 - version: 6.4.1(@types/node@22.19.1)(jiti@1.21.7) + version: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) vite-plugin-compression: specifier: ^0.5.1 - version: 0.5.1(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)) + version: 0.5.1(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)) vite-plugin-image-optimizer: specifier: ^2.0.3 - version: 2.0.3(sharp@0.34.5)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)) + version: 2.0.3(sharp@0.34.5)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)) vite-plugin-static-copy: specifier: ^2.2.0 - version: 2.3.2(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)) + version: 2.3.2(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)) + version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)) packages: @@ -860,156 +876,312 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3878,6 +4050,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -6326,6 +6503,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + tsyringe@4.10.0: resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} engines: {node: '>= 6.0.0'} @@ -6982,81 +7164,159 @@ snapshots: '@esbuild/aix-ppc64@0.25.12': optional: true + '@esbuild/aix-ppc64@0.27.2': + optional: true + '@esbuild/android-arm64@0.25.12': optional: true + '@esbuild/android-arm64@0.27.2': + optional: true + '@esbuild/android-arm@0.25.12': optional: true + '@esbuild/android-arm@0.27.2': + optional: true + '@esbuild/android-x64@0.25.12': optional: true + '@esbuild/android-x64@0.27.2': + optional: true + '@esbuild/darwin-arm64@0.25.12': optional: true + '@esbuild/darwin-arm64@0.27.2': + optional: true + '@esbuild/darwin-x64@0.25.12': optional: true + '@esbuild/darwin-x64@0.27.2': + optional: true + '@esbuild/freebsd-arm64@0.25.12': optional: true + '@esbuild/freebsd-arm64@0.27.2': + optional: true + '@esbuild/freebsd-x64@0.25.12': optional: true + '@esbuild/freebsd-x64@0.27.2': + optional: true + '@esbuild/linux-arm64@0.25.12': optional: true + '@esbuild/linux-arm64@0.27.2': + optional: true + '@esbuild/linux-arm@0.25.12': optional: true + '@esbuild/linux-arm@0.27.2': + optional: true + '@esbuild/linux-ia32@0.25.12': optional: true + '@esbuild/linux-ia32@0.27.2': + optional: true + '@esbuild/linux-loong64@0.25.12': optional: true + '@esbuild/linux-loong64@0.27.2': + optional: true + '@esbuild/linux-mips64el@0.25.12': optional: true + '@esbuild/linux-mips64el@0.27.2': + optional: true + '@esbuild/linux-ppc64@0.25.12': optional: true + '@esbuild/linux-ppc64@0.27.2': + optional: true + '@esbuild/linux-riscv64@0.25.12': optional: true + '@esbuild/linux-riscv64@0.27.2': + optional: true + '@esbuild/linux-s390x@0.25.12': optional: true + '@esbuild/linux-s390x@0.27.2': + optional: true + '@esbuild/linux-x64@0.25.12': optional: true + '@esbuild/linux-x64@0.27.2': + optional: true + '@esbuild/netbsd-arm64@0.25.12': optional: true + '@esbuild/netbsd-arm64@0.27.2': + optional: true + '@esbuild/netbsd-x64@0.25.12': optional: true + '@esbuild/netbsd-x64@0.27.2': + optional: true + '@esbuild/openbsd-arm64@0.25.12': optional: true + '@esbuild/openbsd-arm64@0.27.2': + optional: true + '@esbuild/openbsd-x64@0.25.12': optional: true + '@esbuild/openbsd-x64@0.27.2': + optional: true + '@esbuild/openharmony-arm64@0.25.12': optional: true + '@esbuild/openharmony-arm64@0.27.2': + optional: true + '@esbuild/sunos-x64@0.25.12': optional: true + '@esbuild/sunos-x64@0.27.2': + optional: true + '@esbuild/win32-arm64@0.25.12': optional: true + '@esbuild/win32-arm64@0.27.2': + optional: true + '@esbuild/win32-ia32@0.25.12': optional: true + '@esbuild/win32-ia32@0.27.2': + optional: true + '@esbuild/win32-x64@0.25.12': optional: true + '@esbuild/win32-x64@0.27.2': + optional: true + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@1.21.7))': dependencies: eslint: 9.39.1(jiti@1.21.7) @@ -7131,17 +7391,17 @@ snapshots: '@gar/promisify@1.1.3': {} - '@heroui/accordion@2.2.24(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/accordion@2.2.24(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/aria-utils': 2.2.24(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/divider': 2.2.20(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/aria-utils': 2.2.24(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/divider': 2.2.20(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/dom-animation': 2.1.10(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) - '@heroui/framer-utils': 2.1.23(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/framer-utils': 2.1.23(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.14(react@19.2.0) '@heroui/shared-icons': 2.1.10(react@19.2.0) '@heroui/shared-utils': 2.1.12 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-aria-accordion': 2.2.18(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -7152,9 +7412,9 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/aria-utils@2.2.24(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/aria-utils@2.2.24(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/system': 2.4.23(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/system': 2.4.23(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-stately/collections': 3.12.8(react@19.2.0) '@react-types/overlays': 3.9.2(react@19.2.0) @@ -7165,11 +7425,11 @@ snapshots: - '@heroui/theme' - framer-motion - '@heroui/aria-utils@2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/aria-utils@2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-rsc-utils': 2.1.2(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/utils': 3.26.0(react@19.2.0) '@react-stately/collections': 3.12.0(react@19.2.0) '@react-stately/overlays': 3.6.12(react@19.2.0) @@ -7181,12 +7441,12 @@ snapshots: - '@heroui/theme' - framer-motion - '@heroui/avatar@2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/avatar@2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-image': 2.1.3(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) '@react-aria/interactions': 3.22.5(react@19.2.0) @@ -7194,13 +7454,13 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/breadcrumbs@2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/breadcrumbs@2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-icons': 2.1.2(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-aria/breadcrumbs': 3.5.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) '@react-aria/utils': 3.26.0(react@19.2.0) @@ -7209,14 +7469,14 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/button@2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/button@2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) - '@heroui/ripple': 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/ripple': 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/spinner': 2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/spinner': 2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-aria-button': 2.2.5(react@19.2.0) '@react-aria/button': 3.11.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) @@ -7228,13 +7488,13 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/card@2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/card@2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) - '@heroui/ripple': 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/ripple': 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-aria-button': 2.2.5(react@19.2.0) '@react-aria/button': 3.11.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) @@ -7245,13 +7505,13 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/checkbox@2.3.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/checkbox@2.3.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/form': 2.1.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/form': 2.1.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.14(react@19.2.0) '@heroui/shared-utils': 2.1.12 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-callback-ref': 2.1.8(react@19.2.0) '@heroui/use-safe-layout-effect': 2.1.8(react@19.2.0) '@react-aria/checkbox': 3.16.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -7264,13 +7524,13 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/checkbox@2.3.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/checkbox@2.3.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/form': 2.1.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/form': 2.1.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-callback-ref': 2.1.2(react@19.2.0) '@heroui/use-safe-layout-effect': 2.1.2(react@19.2.0) '@react-aria/checkbox': 3.15.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -7285,13 +7545,13 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/chip@2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/chip@2.2.7(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-icons': 2.1.2(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-aria/focus': 3.19.0(react@19.2.0) '@react-aria/interactions': 3.22.5(react@19.2.0) '@react-aria/utils': 3.26.0(react@19.2.0) @@ -7299,39 +7559,39 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/code@2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/code@2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system-rsc': 2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system-rsc': 2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/divider@2.2.20(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/divider@2.2.20(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-rsc-utils': 2.1.9(react@19.2.0) - '@heroui/system-rsc': 2.3.20(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system-rsc': 2.3.20(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-types/shared': 3.32.1(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/divider@2.2.21(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/divider@2.2.21(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-rsc-utils': 2.1.9(react@19.2.0) - '@heroui/system-rsc': 2.3.21(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system-rsc': 2.3.21(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-types/shared': 3.32.1(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/divider@2.2.6(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/divider@2.2.6(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-rsc-utils': 2.1.2(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system-rsc': 2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system-rsc': 2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-types/shared': 3.26.0(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -7344,15 +7604,15 @@ snapshots: dependencies: framer-motion: 12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/dropdown@2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/dropdown@2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/menu': 2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/popover': 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/menu': 2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/popover': 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-aria/focus': 3.19.0(react@19.2.0) '@react-aria/menu': 3.16.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/utils': 3.26.0(react@19.2.0) @@ -7362,23 +7622,23 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/form@2.1.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/form@2.1.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/shared-utils': 2.1.12 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-stately/form': 3.2.2(react@19.2.0) '@react-types/form': 3.7.16(react@19.2.0) '@react-types/shared': 3.32.1(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/form@2.1.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/form@2.1.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-aria/utils': 3.26.0(react@19.2.0) '@react-stately/form': 3.1.0(react@19.2.0) '@react-types/form': 3.7.8(react@19.2.0) @@ -7386,9 +7646,9 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/framer-utils@2.1.23(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/framer-utils@2.1.23(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/system': 2.4.23(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/system': 2.4.23(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/use-measure': 2.1.8(react@19.2.0) framer-motion: 12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 @@ -7396,10 +7656,10 @@ snapshots: transitivePeerDependencies: - '@heroui/theme' - '@heroui/framer-utils@2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/framer-utils@2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/use-measure': 2.1.2(react@19.2.0) framer-motion: 12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 @@ -7407,24 +7667,24 @@ snapshots: transitivePeerDependencies: - '@heroui/theme' - '@heroui/image@2.2.6(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/image@2.2.6(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-image': 2.1.3(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/input@2.4.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/input@2.4.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/form': 2.1.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/form': 2.1.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-icons': 2.1.2(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-safe-layout-effect': 2.1.2(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) '@react-aria/interactions': 3.22.5(react@19.2.0) @@ -7439,23 +7699,23 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@heroui/kbd@2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/kbd@2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system-rsc': 2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system-rsc': 2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-aria/utils': 3.26.0(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/link@2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/link@2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-icons': 2.1.2(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-aria-link': 2.2.6(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) '@react-aria/link': 3.7.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -7464,14 +7724,14 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/listbox@2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/listbox@2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/divider': 2.2.6(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/divider': 2.2.6(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-is-mobile': 2.2.3(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) '@react-aria/interactions': 3.22.5(react@19.2.0) @@ -7486,14 +7746,14 @@ snapshots: transitivePeerDependencies: - framer-motion - '@heroui/menu@2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/menu@2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/divider': 2.2.6(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/divider': 2.2.6(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-is-mobile': 2.2.3(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) '@react-aria/interactions': 3.22.5(react@19.2.0) @@ -7508,15 +7768,15 @@ snapshots: transitivePeerDependencies: - framer-motion - '@heroui/modal@2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/modal@2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/dom-animation': 2.1.2(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) - '@heroui/framer-utils': 2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/framer-utils': 2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-icons': 2.1.2(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-aria-button': 2.2.5(react@19.2.0) '@heroui/use-aria-modal-overlay': 2.2.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/use-disclosure': 2.2.3(react@19.2.0) @@ -7532,14 +7792,14 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/navbar@2.2.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/navbar@2.2.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/dom-animation': 2.1.2(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) - '@heroui/framer-utils': 2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/framer-utils': 2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-scroll-position': 2.1.2(react@19.2.0) '@react-aria/button': 3.11.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) @@ -7552,13 +7812,13 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/pagination@2.2.24(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/pagination@2.2.24(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.14(react@19.2.0) '@heroui/shared-icons': 2.1.10(react@19.2.0) '@heroui/shared-utils': 2.1.12 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-intersection-observer': 2.2.14(react@19.2.0) '@heroui/use-pagination': 2.2.18(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -7569,16 +7829,16 @@ snapshots: react-dom: 19.2.0(react@19.2.0) scroll-into-view-if-needed: 3.0.10 - '@heroui/popover@2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/popover@2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/button': 2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/button': 2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/dom-animation': 2.1.2(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) - '@heroui/framer-utils': 2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/framer-utils': 2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-aria-button': 2.2.5(react@19.2.0) '@heroui/use-safe-layout-effect': 2.1.2(react@19.2.0) '@react-aria/dialog': 3.5.20(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -7613,40 +7873,40 @@ snapshots: '@heroui/shared-utils': 2.1.3 react: 19.2.0 - '@heroui/ripple@2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/ripple@2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/dom-animation': 2.1.2(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) framer-motion: 12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/scroll-shadow@2.3.6(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/scroll-shadow@2.3.6(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-data-scroll-overflow': 2.2.3(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/select@2.4.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/select@2.4.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/form': 2.1.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/listbox': 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/popover': 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/form': 2.1.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/listbox': 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/popover': 2.3.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) - '@heroui/scroll-shadow': 2.3.6(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/scroll-shadow': 2.3.6(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/shared-icons': 2.1.2(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/spinner': 2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/spinner': 2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-aria-button': 2.2.5(react@19.2.0) '@heroui/use-aria-multiselect': 2.4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/use-safe-layout-effect': 2.1.2(react@19.2.0) @@ -7673,21 +7933,21 @@ snapshots: '@heroui/shared-utils@2.1.3': {} - '@heroui/skeleton@2.2.17(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/skeleton@2.2.17(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/shared-utils': 2.1.12 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/slider@2.4.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/slider@2.4.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) - '@heroui/tooltip': 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) + '@heroui/tooltip': 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) '@react-aria/i18n': 3.12.4(react@19.2.0) '@react-aria/interactions': 3.22.5(react@19.2.0) @@ -7700,15 +7960,15 @@ snapshots: transitivePeerDependencies: - framer-motion - '@heroui/snippet@2.2.11(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/snippet@2.2.11(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/button': 2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/button': 2.2.10(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-icons': 2.1.2(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) - '@heroui/tooltip': 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) + '@heroui/tooltip': 2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/use-clipboard': 2.1.3(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) '@react-aria/utils': 3.26.0(react@19.2.0) @@ -7716,30 +7976,30 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/spacer@2.2.21(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/spacer@2.2.21(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.14(react@19.2.0) '@heroui/shared-utils': 2.1.12 - '@heroui/system-rsc': 2.3.20(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system-rsc': 2.3.20(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/spinner@2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/spinner@2.2.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system-rsc': 2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system-rsc': 2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/switch@2.2.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/switch@2.2.9(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-safe-layout-effect': 2.1.2(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) '@react-aria/interactions': 3.22.5(react@19.2.0) @@ -7751,30 +8011,30 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/system-rsc@2.3.20(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0)': + '@heroui/system-rsc@2.3.20(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0)': dependencies: - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-types/shared': 3.32.1(react@19.2.0) clsx: 1.2.1 react: 19.2.0 - '@heroui/system-rsc@2.3.21(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0)': + '@heroui/system-rsc@2.3.21(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0)': dependencies: - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-types/shared': 3.32.1(react@19.2.0) react: 19.2.0 - '@heroui/system-rsc@2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0)': + '@heroui/system-rsc@2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0)': dependencies: - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-types/shared': 3.26.0(react@19.2.0) clsx: 1.2.1 react: 19.2.0 - '@heroui/system@2.4.23(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/system@2.4.23(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.14(react@19.2.0) - '@heroui/system-rsc': 2.3.20(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0) + '@heroui/system-rsc': 2.3.20(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0) '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -7784,10 +8044,10 @@ snapshots: transitivePeerDependencies: - '@heroui/theme' - '@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@heroui/react-utils': 2.1.4(react@19.2.0) - '@heroui/system-rsc': 2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react@19.2.0) + '@heroui/system-rsc': 2.3.6(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react@19.2.0) '@internationalized/date': 3.6.0 '@react-aria/i18n': 3.12.4(react@19.2.0) '@react-aria/overlays': 3.24.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -7800,15 +8060,15 @@ snapshots: transitivePeerDependencies: - '@heroui/theme' - '@heroui/table@2.2.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/table@2.2.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/checkbox': 2.3.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/checkbox': 2.3.27(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.14(react@19.2.0) '@heroui/shared-icons': 2.1.10(react@19.2.0) '@heroui/shared-utils': 2.1.12 - '@heroui/spacer': 2.2.21(@heroui/theme@2.4.6(tailwindcss@3.4.18))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/spacer': 2.2.21(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-aria/table': 3.17.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -7821,14 +8081,14 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@heroui/tabs@2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/tabs@2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/framer-utils': 2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/framer-utils': 2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-is-mounted': 2.1.2(react@19.2.0) '@heroui/use-update-effect': 2.1.2(react@19.2.0) '@react-aria/focus': 3.19.0(react@19.2.0) @@ -7843,7 +8103,7 @@ snapshots: react-dom: 19.2.0(react@19.2.0) scroll-into-view-if-needed: 3.0.10 - '@heroui/theme@2.4.6(tailwindcss@3.4.18)': + '@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0))': dependencies: '@heroui/shared-utils': 2.1.3 clsx: 1.2.1 @@ -7852,18 +8112,18 @@ snapshots: deepmerge: 4.3.1 flat: 5.0.2 tailwind-merge: 2.6.0 - tailwind-variants: 0.1.20(tailwindcss@3.4.18) - tailwindcss: 3.4.18 + tailwind-variants: 0.1.20(tailwindcss@3.4.18(tsx@4.21.0)) + tailwindcss: 3.4.18(tsx@4.21.0) - '@heroui/tooltip@2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@heroui/tooltip@2.2.8(@heroui/system@2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/aria-utils': 2.2.8(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/dom-animation': 2.1.2(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) - '@heroui/framer-utils': 2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/framer-utils': 2.1.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@heroui/react-utils': 2.1.4(react@19.2.0) '@heroui/shared-utils': 2.1.3 - '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@heroui/theme': 2.4.6(tailwindcss@3.4.18) + '@heroui/system': 2.4.7(@heroui/theme@2.4.6(tailwindcss@3.4.18(tsx@4.21.0)))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@heroui/theme': 2.4.6(tailwindcss@3.4.18(tsx@4.21.0)) '@heroui/use-safe-layout-effect': 2.1.2(react@19.2.0) '@react-aria/interactions': 3.22.5(react@19.2.0) '@react-aria/overlays': 3.24.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -9797,15 +10057,15 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react-swc@4.2.2(@swc/helpers@0.5.17)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7))': + '@vitejs/plugin-react-swc@4.2.2(@swc/helpers@0.5.17)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.47 '@swc/core': 1.15.1(@swc/helpers@0.5.17) - vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7) + vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -9813,7 +10073,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7) + vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) transitivePeerDependencies: - supports-color @@ -9826,13 +10086,13 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.9(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7))': + '@vitest/mocker@4.0.9(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0))': dependencies: '@vitest/spy': 4.0.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7) + vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) '@vitest/pretty-format@4.0.9': dependencies: @@ -9860,7 +10120,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.9(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/ui@4.0.9)(jiti@1.21.7) + vitest: 4.0.9(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/ui@4.0.9)(jiti@1.21.7)(tsx@4.21.0) '@vitest/utils@4.0.9': dependencies: @@ -10743,6 +11003,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -12668,12 +12957,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.21.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 postcss: 8.5.6 + tsx: 4.21.0 postcss-nested@6.2.0(postcss@8.5.6): dependencies: @@ -13512,17 +13802,17 @@ snapshots: tailwind-merge@2.6.0: {} - tailwind-variants@0.1.20(tailwindcss@3.4.18): + tailwind-variants@0.1.20(tailwindcss@3.4.18(tsx@4.21.0)): dependencies: tailwind-merge: 1.14.0 - tailwindcss: 3.4.18 + tailwindcss: 3.4.18(tsx@4.21.0) - tailwind-variants@0.3.1(tailwindcss@3.4.18): + tailwind-variants@0.3.1(tailwindcss@3.4.18(tsx@4.21.0)): dependencies: tailwind-merge: 2.5.4 - tailwindcss: 3.4.18 + tailwindcss: 3.4.18(tsx@4.21.0) - tailwindcss@3.4.18: + tailwindcss@3.4.18(tsx@4.21.0): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -13541,7 +13831,7 @@ snapshots: postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) postcss-js: 4.1.0(postcss@8.5.6) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.21.0) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.11 @@ -13688,6 +13978,13 @@ snapshots: tslib@2.8.1: {} + tsx@4.21.0: + dependencies: + esbuild: 0.27.2 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + tsyringe@4.10.0: dependencies: tslib: 1.14.1 @@ -13959,12 +14256,12 @@ snapshots: remove-trailing-separator: 1.1.0 replace-ext: 1.0.1 - vite-plugin-compression@0.5.1(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)): + vite-plugin-compression@0.5.1(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)): dependencies: chalk: 4.1.2 debug: 4.4.3 fs-extra: 10.1.0 - vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7) + vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) transitivePeerDependencies: - supports-color @@ -13977,35 +14274,35 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-image-optimizer@2.0.3(sharp@0.34.5)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)): + vite-plugin-image-optimizer@2.0.3(sharp@0.34.5)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)): dependencies: ansi-colors: 4.1.3 pathe: 2.0.3 - vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7) + vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) optionalDependencies: sharp: 0.34.5 - vite-plugin-static-copy@2.3.2(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)): + vite-plugin-static-copy@2.3.2(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)): dependencies: chokidar: 3.6.0 fast-glob: 3.3.3 fs-extra: 11.3.2 p-map: 7.0.4 picocolors: 1.1.1 - vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7) + vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7) + vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) transitivePeerDependencies: - supports-color - typescript - vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7): + vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -14017,11 +14314,12 @@ snapshots: '@types/node': 22.19.1 fsevents: 2.3.3 jiti: 1.21.7 + tsx: 4.21.0 - vitest@4.0.9(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/ui@4.0.9)(jiti@1.21.7): + vitest@4.0.9(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/ui@4.0.9)(jiti@1.21.7)(tsx@4.21.0): dependencies: '@vitest/expect': 4.0.9 - '@vitest/mocker': 4.0.9(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)) + '@vitest/mocker': 4.0.9(vite@6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0)) '@vitest/pretty-format': 4.0.9 '@vitest/runner': 4.0.9 '@vitest/snapshot': 4.0.9 @@ -14038,7 +14336,7 @@ snapshots: tinyexec: 0.3.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7) + vite: 6.4.1(@types/node@22.19.1)(jiti@1.21.7)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 From fd1808e36a9f562bd08932de20afd5d62f099fe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 17:45:46 +0800 Subject: [PATCH 06/17] Add action examples and enhance action metadata Introduced a centralized examples.ts file providing payload and return examples for all actions. Updated numerous action classes to include actionDescription, actionTags, payloadExample, and returnExample fields, improving API documentation and discoverability. --- packages/napcat-onebot/action/OneBotAction.ts | 6 + packages/napcat-onebot/action/examples.ts | 365 ++++++++++++++++++ .../action/extends/GetAiCharacters.ts | 6 + .../action/extends/GetClientkey.ts | 6 + .../action/extends/GetCollectionList.ts | 6 + .../napcat-onebot/action/extends/OCRImage.ts | 6 + .../action/extends/SetGroupKickMembers.ts | 5 + .../action/extends/SetGroupRemark.ts | 6 + .../action/extends/SetOnlineStatus.ts | 5 + .../action/extends/SetQQAvatar.ts | 6 + .../action/extends/SetSpecialTitle.ts | 5 + packages/napcat-onebot/action/file/GetFile.ts | 6 + .../action/file/GetGroupFileUrl.ts | 6 + .../napcat-onebot/action/file/GetImage.ts | 5 + .../action/file/GetPrivateFileUrl.ts | 6 + .../napcat-onebot/action/file/GetRecord.ts | 5 + .../action/go-cqhttp/GetForwardMsg.ts | 2 + .../action/go-cqhttp/GetGroupAtAllRemain.ts | 2 + .../action/go-cqhttp/GetGroupHonorInfo.ts | 2 + .../action/go-cqhttp/GetStrangerInfo.ts | 7 + .../action/go-cqhttp/SendForwardMsg.ts | 2 + .../action/group/DelEssenceMsg.ts | 5 + .../action/group/DelGroupNotice.ts | 5 + .../napcat-onebot/action/group/GetAiRecord.ts | 5 + .../action/group/GetGroupInfo.ts | 6 + .../action/group/GetGroupList.ts | 6 + .../action/group/GetGroupMemberInfo.ts | 6 + .../action/group/GetGroupMemberList.ts | 13 +- .../action/group/GetGroupNotice.ts | 6 + .../action/group/SendGroupAiRecord.ts | 5 + .../action/group/SendGroupMsg.ts | 5 + .../action/group/SetEssenceMsg.ts | 5 + .../action/group/SetGroupAddRequest.ts | 5 + .../action/group/SetGroupAdmin.ts | 5 + .../napcat-onebot/action/group/SetGroupBan.ts | 6 + .../action/group/SetGroupCard.ts | 5 + .../action/group/SetGroupKick.ts | 5 + .../action/group/SetGroupLeave.ts | 5 + .../action/group/SetGroupName.ts | 5 + .../action/group/SetGroupWholeBan.ts | 5 + .../action/guild/GetGuildList.ts | 2 + .../action/guild/GetGuildProfile.ts | 2 + .../napcat-onebot/action/msg/DeleteMsg.ts | 5 + .../action/msg/ForwardSingleMsg.ts | 6 + packages/napcat-onebot/action/msg/GetMsg.ts | 6 + .../napcat-onebot/action/msg/MarkMsgAsRead.ts | 6 + packages/napcat-onebot/action/msg/SendMsg.ts | 6 + .../action/msg/SendPrivateMsg.ts | 6 + .../action/packet/GetPacketStatus.ts | 2 + .../napcat-onebot/action/packet/SendPoke.ts | 5 + .../action/packet/SetGroupTodo.ts | 6 + .../action/system/CanSendImage.ts | 4 + .../action/system/CanSendRecord.ts | 6 + .../napcat-onebot/action/system/CleanCache.ts | 2 + .../action/system/GetCredentials.ts | 6 + .../action/system/GetLoginInfo.ts | 6 + .../napcat-onebot/action/system/GetStatus.ts | 6 + .../action/system/GetSystemMsg.ts | 6 + .../action/system/GetVersionInfo.ts | 6 + .../napcat-onebot/action/system/SetRestart.ts | 2 + .../napcat-onebot/action/user/GetCookies.ts | 6 + .../action/user/GetFriendList.ts | 6 + .../napcat-onebot/action/user/SendLike.ts | 9 + .../action/user/SetFriendAddRequest.ts | 5 + .../action/user/SetFriendRemark.ts | 13 +- packages/napcat-schema/index.ts | 93 ++++- 66 files changed, 779 insertions(+), 22 deletions(-) create mode 100644 packages/napcat-onebot/action/examples.ts diff --git a/packages/napcat-onebot/action/OneBotAction.ts b/packages/napcat-onebot/action/OneBotAction.ts index ad181d4e..121874d4 100644 --- a/packages/napcat-onebot/action/OneBotAction.ts +++ b/packages/napcat-onebot/action/OneBotAction.ts @@ -5,6 +5,7 @@ import { NapCatOneBot11Adapter, OB11Return } from '@/napcat-onebot/index'; import { NetworkAdapterConfig } from '../config/config'; import { TSchema } from '@sinclair/typebox'; import { StreamPacket, StreamPacketBasic, StreamStatus } from './stream/StreamBasic'; +import { ActionExamples } from './examples'; export class OB11Response { private static createResponse (data: T, status: string, retcode: number, message: string = '', echo: unknown = null, useStream: boolean = false): OB11Return { @@ -40,8 +41,13 @@ export abstract class OneBotAction { private validate?: ValidateFunction = undefined; payloadSchema?: TSchema = undefined; returnSchema?: TSchema = undefined; + payloadExample?: unknown = undefined; + returnExample?: unknown = undefined; + actionDescription: string = ''; + actionTags: string[] = []; obContext: NapCatOneBot11Adapter; useStream: boolean = false; + errorExamples: Array<{ code: number, description: string; }> = ActionExamples.Common.errors; constructor (obContext: NapCatOneBot11Adapter, core: NapCatCore) { this.obContext = obContext; diff --git a/packages/napcat-onebot/action/examples.ts b/packages/napcat-onebot/action/examples.ts new file mode 100644 index 00000000..2e633fc6 --- /dev/null +++ b/packages/napcat-onebot/action/examples.ts @@ -0,0 +1,365 @@ +export const ActionExamples = { + GetGroupInfo: { + payload: { group_id: '123456789' }, + return: { + group_id: 123456789, + group_name: '测试群', + member_count: 10, + max_member_count: 500, + group_all_shut: 0, + group_remark: '' + } + }, + GetGroupList: { + payload: {}, + return: [ + { + group_id: 123456789, + group_name: '测试群', + member_count: 10, + max_member_count: 500, + group_all_shut: 0, + group_remark: '' + } + ] + }, + GetGroupMemberList: { + payload: { group_id: '123456789' }, + return: [ + { + group_id: 123456789, + user_id: 987654321, + nickname: '测试成员', + card: '群名片', + role: 'member' + } + ] + }, + SendGroupMsg: { + payload: { group_id: '123456789', message: 'hello' }, + return: { message_id: 123456 } + }, + SendLike: { + payload: { user_id: '123456789', times: 1 }, + return: null + }, + GetFriendList: { + payload: {}, + return: [ + { + user_id: 123456789, + nickname: '测试好友', + remark: '备注' + } + ] + }, + GetStrangerInfo: { + payload: { user_id: '123456789' }, + return: { + user_id: 123456789, + nickname: '陌生人', + sex: 'unknown', + age: 0 + } + }, + SetFriendRemark: { + payload: { user_id: '123456789', remark: '新备注' }, + return: null + }, + GetCookies: { + payload: { domain: 'qun.qq.com' }, + return: { cookies: 'p_skey=xxxx; p_uin=xxxx', bkn: '123456' } + }, + SendPrivateMsg: { + payload: { user_id: '123456789', message: 'hello' }, + return: { message_id: 123456 } + }, + OCRImage: { + payload: { image: 'https://example.com/test.jpg' }, + return: [{ text: '识别文本', confidence: 0.99 }] + }, + GetClientkey: { + payload: {}, + return: { clientkey: 'abcdef123456' } + }, + SetQQAvatar: { + payload: { file: 'base64://...' }, + return: null + }, + SetGroupKickMembers: { + payload: { group_id: '123456789', user_id: ['987654321'], reject_add_request: false }, + return: null + }, + GetLoginInfo: { + payload: {}, + return: { user_id: 123456789, nickname: '机器人' } + }, + GetVersionInfo: { + payload: {}, + return: { + app_name: 'NapCatQQ', + app_version: '1.0.0', + protocol_version: 'v11' + } + }, + GetStatus: { + payload: {}, + return: { online: true, good: true } + }, + DeleteMsg: { + payload: { message_id: 123456 }, + return: null + }, + SetGroupWholeBan: { + payload: { group_id: '123456789', enable: true }, + return: null + }, + SetGroupBan: { + payload: { group_id: '123456789', user_id: '987654321', duration: 1800 }, + return: null + }, + SetGroupKick: { + payload: { group_id: '123456789', user_id: '987654321', reject_add_request: false }, + return: null + }, + SetGroupAdmin: { + payload: { group_id: '123456789', user_id: '987654321', enable: true }, + return: null + }, + SetGroupName: { + payload: { group_id: '123456789', group_name: '新群名' }, + return: null + }, + SetGroupCard: { + payload: { group_id: '123456789', user_id: '987654321', card: '新名片' }, + return: null + }, + GetGroupMemberInfo: { + payload: { group_id: '123456789', user_id: '987654321' }, + return: { + group_id: 123456789, + user_id: 987654321, + nickname: '成员昵称', + card: '名片', + role: 'member' + } + }, + SendMsg: { + payload: { message_type: 'group', group_id: '123456789', message: 'hello' }, + return: { message_id: 123456 } + }, + GetMsg: { + payload: { message_id: 123456 }, + return: { + time: 123456789, + message_type: 'group', + message_id: 123456, + real_id: 123456, + sender: { user_id: 987654321, nickname: '昵称' }, + message: 'hello' + } + }, + SetGroupLeave: { + payload: { group_id: '123456789', is_dismiss: false }, + return: null + }, + CanSendRecord: { + payload: {}, + return: { yes: true } + }, + CanSendImage: { + payload: {}, + return: { yes: true } + }, + SetFriendAddRequest: { + payload: { flag: '12345', approve: true, remark: '好友' }, + return: null + }, + SetGroupAddRequest: { + payload: { flag: '12345', sub_type: 'add', approve: true }, + return: null + }, + DelEssenceMsg: { + payload: { message_id: 12345 }, + return: null + }, + SetEssenceMsg: { + payload: { message_id: 12345 }, + return: null + }, + GetGroupEssence: { + payload: { group_id: '123456789' }, + return: [ + { + msg_seq: 12345, + msg_random: 67890, + sender_id: 987654321, + sender_nick: '发送者', + operator_id: 123456789, + operator_nick: '操作者', + message_id: 123456, + operator_time: 1234567890, + content: [{ type: 'text', data: { text: '精华消息内容' } }] + } + ] + }, + GetGroupShutList: { + payload: { group_id: '123456789' }, + return: [ + { + user_id: 987654321, + nickname: '禁言成员', + card: '名片', + shut_up_time: 1234567890 + } + ] + }, + GetGroupDetailInfo: { + payload: { group_id: '123456789' }, + return: { + group_id: 123456789, + group_name: '测试群', + member_count: 10, + max_member_count: 500, + group_all_shut: 0, + group_remark: '' + } + }, + DelGroupNotice: { + payload: { group_id: '123456789', notice_id: 'abc-123' }, + return: null + }, + GetAiRecord: { + payload: { group_id: '123456789', character: 'ai' }, + return: { msg: 'AI回复内容' } + }, + GetGroupNotice: { + payload: { group_id: '123456789' }, + return: [ + { + notice_id: 'abc-123', + sender_id: 987654321, + publish_time: 1234567890, + message: { text: '公告内容', images: [] } + } + ] + }, + SendGroupAiRecord: { + payload: { group_id: '123456789', character: 'ai', text: '你好' }, + return: { message_id: 123456 } + }, + GetFile: { + payload: { file: 'abc-123' }, + return: { + file: '/path/to/file', + url: 'http://example.com/file', + file_size: '1024', + file_name: 'test.txt' + } + }, + GetImage: { + payload: { file: 'abc-123' }, + return: { + file: '/path/to/image.jpg', + url: 'http://example.com/image.jpg', + file_size: '1024', + file_name: 'image.jpg' + } + }, + GetRecord: { + payload: { file: 'abc-123', out_format: 'mp3' }, + return: { + file: '/path/to/record.mp3', + url: 'http://example.com/record.mp3', + file_size: '1024', + file_name: 'record.mp3', + base64: '...' + } + }, + GetGroupFileUrl: { + payload: { group_id: '123456789', file_id: 'abc-123' }, + return: { url: 'http://example.com/group_file' } + }, + GetPrivateFileUrl: { + payload: { file_id: 'abc-123' }, + return: { url: 'http://example.com/private_file' } + }, + GetAiCharacters: { + payload: { group_id: '123456789' }, + return: [ + { + type: '常用', + characters: [ + { character_id: 'ai-1', character_name: 'AI助手', preview_url: 'http://...' } + ] + } + ] + }, + SetOnlineStatus: { + payload: { status: 11, ext_status: 0, battery_status: 100 }, + return: null + }, + SetGroupRemark: { + payload: { group_id: '123456789', remark: '群备注' }, + return: null + }, + GetCollectionList: { + payload: { category: '1', count: '10' }, + return: [] + }, + SetSpecialTitle: { + payload: { group_id: '123456789', user_id: '987654321', special_title: '群头衔' }, + return: null + }, + MarkMsgAsRead: { + payload: { group_id: '123456789' }, + return: null + }, + ForwardSingleMsg: { + payload: { message_id: 12345, group_id: '123456789' }, + return: null + }, + SendPoke: { + payload: { group_id: '123456789', user_id: '987654321' }, + return: null + }, + SetGroupTodo: { + payload: { group_id: '123456789', message_id: '12345' }, + return: null + }, + GetCredentials: { + payload: { domain: 'qun.qq.com' }, + return: { cookies: '...', token: 123456 } + }, + GetGroupSystemMsg: { + payload: { count: 10 }, + return: { + invited_requests: [], + InvitedRequest: [], + join_requests: [] + } + }, + GetRecentContact: { + payload: { count: 10 }, + return: [] + }, + GetCSRF: { + payload: {}, + return: { token: 123456789 } + }, + SetMsgEmojiLike: { + payload: { message_id: 12345, emoji_id: '124' }, + return: null + }, + UploadGroupFile: { + payload: { group_id: '123456789', file: '/path/to/file', name: 'test.txt' }, + return: null + }, + Common: { + errors: [ + { code: 1400, description: '请求参数错误或业务逻辑执行失败' }, + { code: 1401, description: '权限不足' }, + { code: 1404, description: '资源不存在' } + ] + } +}; diff --git a/packages/napcat-onebot/action/extends/GetAiCharacters.ts b/packages/napcat-onebot/action/extends/GetAiCharacters.ts index c482b972..a4cb1876 100644 --- a/packages/napcat-onebot/action/extends/GetAiCharacters.ts +++ b/packages/napcat-onebot/action/extends/GetAiCharacters.ts @@ -2,6 +2,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Type, Static } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), chat_type: Type.Union([Type.Number(), Type.String()], { default: 1, description: '聊天类型' }), @@ -30,6 +32,10 @@ export class GetAiCharacters extends GetPacketStatusDepends { override actionName = ActionName.GetClientkey; override payloadSchema = Type.Void(); override returnSchema = ReturnSchema; + override actionDescription = '获取 ClientKey'; + override actionTags = ['扩展接口']; + override payloadExample = ActionExamples.GetClientkey.payload; + override returnExample = ActionExamples.GetClientkey.return; async _handle () { return { clientkey: (await this.core.apis.UserApi.forceFetchClientKey()).clientKey }; diff --git a/packages/napcat-onebot/action/extends/GetCollectionList.ts b/packages/napcat-onebot/action/extends/GetCollectionList.ts index d98b2100..5bdd1655 100644 --- a/packages/napcat-onebot/action/extends/GetCollectionList.ts +++ b/packages/napcat-onebot/action/extends/GetCollectionList.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ category: Type.String({ description: '分类ID' }), count: Type.String({ default: '1', description: '获取数量' }), @@ -17,6 +19,10 @@ export class GetCollectionList extends OneBotAction { override actionName = ActionName.GetCollectionList; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取收藏列表'; + override actionTags = ['扩展接口']; + override payloadExample = ActionExamples.GetCollectionList.payload; + override returnExample = ActionExamples.GetCollectionList.return; async _handle (payload: PayloadType) { return await this.core.apis.CollectionApi.getAllCollection(+payload.category, +payload.count); diff --git a/packages/napcat-onebot/action/extends/OCRImage.ts b/packages/napcat-onebot/action/extends/OCRImage.ts index 66a38198..bf9abf0e 100644 --- a/packages/napcat-onebot/action/extends/OCRImage.ts +++ b/packages/napcat-onebot/action/extends/OCRImage.ts @@ -4,6 +4,8 @@ import { checkFileExist, uriToLocalFile } from 'napcat-common/src/file'; import fs from 'fs'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ image: Type.String({ description: '图片路径、URL或Base64' }), }); @@ -17,6 +19,10 @@ type ReturnType = Static; class OCRImageBase extends OneBotAction { override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '图片 OCR 识别'; + override actionTags = ['扩展接口']; + override payloadExample = ActionExamples.OCRImage.payload; + override returnExample = ActionExamples.OCRImage.return; async _handle (payload: PayloadType): Promise { const { path, success } = await uriToLocalFile(this.core.NapCatTempPath, payload.image); diff --git a/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts b/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts index c84a2330..783736db 100644 --- a/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts +++ b/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), user_id: Type.Array(Type.String(), { description: 'QQ号列表' }), @@ -18,6 +20,9 @@ export default class SetGroupKickMembers extends OneBotAction { const rejectReq = payload.reject_add_request?.toString() === 'true'; diff --git a/packages/napcat-onebot/action/extends/SetGroupRemark.ts b/packages/napcat-onebot/action/extends/SetGroupRemark.ts index 5883aaa5..5d361888 100644 --- a/packages/napcat-onebot/action/extends/SetGroupRemark.ts +++ b/packages/napcat-onebot/action/extends/SetGroupRemark.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), remark: Type.String({ description: '备注' }), @@ -17,6 +19,10 @@ export default class SetGroupRemark extends OneBotAction { const ret = await this.core.apis.GroupApi.setGroupRemark(payload.group_id, payload.remark); if (ret.result !== 0) { diff --git a/packages/napcat-onebot/action/extends/SetOnlineStatus.ts b/packages/napcat-onebot/action/extends/SetOnlineStatus.ts index ccf69130..db14b260 100644 --- a/packages/napcat-onebot/action/extends/SetOnlineStatus.ts +++ b/packages/napcat-onebot/action/extends/SetOnlineStatus.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ status: Type.Union([Type.Number(), Type.String()], { description: '在线状态' }), ext_status: Type.Union([Type.Number(), Type.String()], { description: '扩展状态' }), @@ -18,6 +20,9 @@ export class SetOnlineStatus extends OneBotAction { override actionName = ActionName.SetOnlineStatus; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '设置在线状态'; + override actionTags = ['扩展接口']; + override payloadExample = ActionExamples.SetOnlineStatus.payload; async _handle (payload: PayloadType) { const ret = await this.core.apis.UserApi.setSelfOnlineStatus( diff --git a/packages/napcat-onebot/action/extends/SetQQAvatar.ts b/packages/napcat-onebot/action/extends/SetQQAvatar.ts index 23b72767..064146b0 100644 --- a/packages/napcat-onebot/action/extends/SetQQAvatar.ts +++ b/packages/napcat-onebot/action/extends/SetQQAvatar.ts @@ -4,6 +4,8 @@ import fs from 'node:fs/promises'; import { checkFileExist, uriToLocalFile } from 'napcat-common/src/file'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ file: Type.String({ description: '图片路径、URL或Base64' }), }); @@ -18,6 +20,10 @@ export default class SetAvatar extends OneBotAction { override actionName = ActionName.SetQQAvatar; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '设置 QQ 头像'; + override actionTags = ['扩展接口']; + override payloadExample = ActionExamples.SetQQAvatar.payload; + async _handle (payload: PayloadType): Promise { const { path, success } = (await uriToLocalFile(this.core.NapCatTempPath, payload.file)); if (!success) { diff --git a/packages/napcat-onebot/action/extends/SetSpecialTitle.ts b/packages/napcat-onebot/action/extends/SetSpecialTitle.ts index 7d926413..9d665ecd 100644 --- a/packages/napcat-onebot/action/extends/SetSpecialTitle.ts +++ b/packages/napcat-onebot/action/extends/SetSpecialTitle.ts @@ -2,6 +2,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), user_id: Type.String({ description: 'QQ号' }), @@ -18,6 +20,9 @@ export class SetSpecialTitle extends GetPacketStatusDepends; export class GetFileBase extends OneBotAction { override payloadSchema = GetFilePayloadSchema; override returnSchema = GetFileReturnSchema; + override actionTags = ['文件接口']; async _handle (payload: GetFilePayload): Promise { payload.file ||= payload.file_id || ''; @@ -116,4 +119,7 @@ export class GetFileBase extends OneBotAction { export default class GetFile extends GetFileBase { override actionName = ActionName.GetFile; + override actionDescription = '获取文件'; + override payloadExample = ActionExamples.GetFile.payload; + override returnExample = ActionExamples.GetFile.return; } diff --git a/packages/napcat-onebot/action/file/GetGroupFileUrl.ts b/packages/napcat-onebot/action/file/GetGroupFileUrl.ts index a6cb677b..c14bb10d 100644 --- a/packages/napcat-onebot/action/file/GetGroupFileUrl.ts +++ b/packages/napcat-onebot/action/file/GetGroupFileUrl.ts @@ -3,6 +3,8 @@ import { FileNapCatOneBotUUID } from 'napcat-common/src/file-uuid'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), file_id: Type.String({ description: '文件ID' }), @@ -20,6 +22,10 @@ export class GetGroupFileUrl extends GetPacketStatusDepends; export default class GetRecord extends GetFileBase { override actionName = ActionName.GetRecord; override payloadSchema = PayloadSchema; + override actionDescription = '获取语音'; + override payloadExample = ActionExamples.GetRecord.payload; + override returnExample = ActionExamples.GetRecord.return; override async _handle (payload: PayloadType): Promise { const res = await super._handle(payload as GetFilePayload); diff --git a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts index b1543ced..5fcb892c 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts @@ -27,6 +27,8 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { override actionName = ActionName.GetGroupHonorInfo; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取群荣誉信息'; + override actionTags = ['群组接口']; async _handle (payload: PayloadType): Promise { if (!payload.type) { diff --git a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts index 45e747cf..66edc405 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -5,6 +5,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { calcQQLevel } from 'napcat-common/src/helper'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ user_id: Type.String({ description: '用户QQ' }), no_cache: Type.Union([Type.Boolean(), Type.String()], { default: false, description: '是否不使用缓存' }), @@ -36,6 +38,11 @@ export default class GoCQHTTPGetStrangerInfo extends OneBotAction { const user_id = payload.user_id.toString(); const isNocache = typeof payload.no_cache === 'string' ? payload.no_cache === 'true' : !!payload.no_cache; diff --git a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts index e56b375b..713deb8a 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts @@ -13,6 +13,8 @@ export class GoCQHTTPSendForwardMsgBase extends SendMsgBase { } export class GoCQHTTPSendForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendForwardMsg; + override actionDescription = '发送合并转发消息'; + override actionTags = ['消息接口']; protected override async check (payload: GoCQHTTPSendForwardMsgPayload) { if (payload.messages) payload.message = normalize(payload.messages); diff --git a/packages/napcat-onebot/action/group/DelEssenceMsg.ts b/packages/napcat-onebot/action/group/DelEssenceMsg.ts index d19bd2dd..079c4874 100644 --- a/packages/napcat-onebot/action/group/DelEssenceMsg.ts +++ b/packages/napcat-onebot/action/group/DelEssenceMsg.ts @@ -3,6 +3,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ message_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '消息ID' })), msg_seq: Type.Optional(Type.String({ description: '消息序号' })), @@ -20,6 +22,9 @@ export default class DelEssenceMsg extends OneBotAction override actionName = ActionName.DelEssenceMsg; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '移出精华消息'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.DelEssenceMsg.payload; async _handle (payload: PayloadType): Promise { // 如果直接提供了 msg_seq, msg_random, group_id,优先使用 diff --git a/packages/napcat-onebot/action/group/DelGroupNotice.ts b/packages/napcat-onebot/action/group/DelGroupNotice.ts index 57a0aca4..d6ed614c 100644 --- a/packages/napcat-onebot/action/group/DelGroupNotice.ts +++ b/packages/napcat-onebot/action/group/DelGroupNotice.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), notice_id: Type.String({ description: '公告ID' }), @@ -17,6 +19,9 @@ export class DelGroupNotice extends OneBotAction { override actionName = ActionName.DelGroupNotice; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '删除群公告'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.DelGroupNotice.payload; async _handle (payload: PayloadType) { const group = payload.group_id.toString(); diff --git a/packages/napcat-onebot/action/group/GetAiRecord.ts b/packages/napcat-onebot/action/group/GetAiRecord.ts index 15d09dcb..4d079669 100644 --- a/packages/napcat-onebot/action/group/GetAiRecord.ts +++ b/packages/napcat-onebot/action/group/GetAiRecord.ts @@ -3,6 +3,8 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { AIVoiceChatType } from 'napcat-core/packet/entities/aiChat'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ character: Type.String({ description: '角色ID' }), group_id: Type.String({ description: '群号' }), @@ -19,6 +21,9 @@ export class GetAiRecord extends GetPacketStatusDepends override actionName = ActionName.GetAiRecord; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取AI语音'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.GetAiRecord.payload; async _handle (payload: PayloadType) { const rawRsp = await this.core.apis.PacketApi.pkt.operation.GetAiVoice(+payload.group_id, payload.character, payload.text, AIVoiceChatType.Sound); diff --git a/packages/napcat-onebot/action/group/GetGroupInfo.ts b/packages/napcat-onebot/action/group/GetGroupInfo.ts index ca125e5f..7074f6b3 100644 --- a/packages/napcat-onebot/action/group/GetGroupInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupInfo.ts @@ -4,6 +4,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { OB11GroupSchema } from '../schemas'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), }); @@ -18,6 +20,10 @@ class GetGroupInfo extends OneBotAction { override actionName = ActionName.GetGroupInfo; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取群信息'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.GetGroupInfo.payload; + override returnExample = ActionExamples.GetGroupInfo.return; async _handle (payload: PayloadType) { const group = (await this.core.apis.GroupApi.getGroups()).find(e => e.groupCode === payload.group_id.toString()); diff --git a/packages/napcat-onebot/action/group/GetGroupList.ts b/packages/napcat-onebot/action/group/GetGroupList.ts index e789134d..05f0c250 100644 --- a/packages/napcat-onebot/action/group/GetGroupList.ts +++ b/packages/napcat-onebot/action/group/GetGroupList.ts @@ -4,6 +4,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { OB11GroupSchema } from '../schemas'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否不使用缓存' })), }); @@ -18,6 +20,10 @@ class GetGroupList extends OneBotAction { override actionName = ActionName.GetGroupList; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取群列表'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.GetGroupList.payload; + override returnExample = ActionExamples.GetGroupList.return; async _handle (payload: PayloadType) { return OB11Construct.groups( diff --git a/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts b/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts index 3ce2fee8..0b534a09 100644 --- a/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts @@ -4,6 +4,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { OB11GroupMemberSchema } from '../schemas'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), user_id: Type.String({ description: 'QQ号' }), @@ -20,6 +22,10 @@ class GetGroupMemberInfo extends OneBotAction { override actionName = ActionName.GetGroupMemberInfo; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取群成员信息'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.GetGroupMemberInfo.payload; + override returnExample = ActionExamples.GetGroupMemberInfo.return; private parseBoolean (value: boolean | string): boolean { return typeof value === 'string' ? value === 'true' : value; diff --git a/packages/napcat-onebot/action/group/GetGroupMemberList.ts b/packages/napcat-onebot/action/group/GetGroupMemberList.ts index 49c3d2b0..da7966b7 100644 --- a/packages/napcat-onebot/action/group/GetGroupMemberList.ts +++ b/packages/napcat-onebot/action/group/GetGroupMemberList.ts @@ -18,8 +18,17 @@ type ReturnType = Static; export class GetGroupMemberList extends OneBotAction { override actionName = ActionName.GetGroupMemberList; override payloadSchema = PayloadSchema; - override returnSchema = ReturnSchema; - + override returnSchema = ReturnSchema; override actionDescription = '获取群成员列表'; + override payloadExample = { group_id: '123456789' }; + override returnExample = [ + { + group_id: 123456789, + user_id: 987654321, + nickname: '测试成员', + card: '群名片', + role: 'member' + } + ]; async _handle (payload: PayloadType) { const groupIdStr = payload.group_id.toString(); const noCache = this.parseBoolean(payload.no_cache ?? false); diff --git a/packages/napcat-onebot/action/group/GetGroupNotice.ts b/packages/napcat-onebot/action/group/GetGroupNotice.ts index 91123552..a6d5397c 100644 --- a/packages/napcat-onebot/action/group/GetGroupNotice.ts +++ b/packages/napcat-onebot/action/group/GetGroupNotice.ts @@ -2,6 +2,8 @@ import { WebApiGroupNoticeFeed } from 'napcat-core'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), }); @@ -29,6 +31,10 @@ export class GetGroupNotice extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetGroupNotice; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取群公告'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.GetGroupNotice.payload; + override returnExample = ActionExamples.GetGroupNotice.return; async _handle (payload: PayloadType) { const group = payload.group_id.toString(); diff --git a/packages/napcat-onebot/action/group/SendGroupAiRecord.ts b/packages/napcat-onebot/action/group/SendGroupAiRecord.ts index bfd43a1d..a3943f76 100644 --- a/packages/napcat-onebot/action/group/SendGroupAiRecord.ts +++ b/packages/napcat-onebot/action/group/SendGroupAiRecord.ts @@ -3,6 +3,8 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { AIVoiceChatType } from 'napcat-core/packet/entities/aiChat'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ character: Type.String({ description: '角色ID' }), group_id: Type.String({ description: '群号' }), @@ -21,6 +23,9 @@ export class SendGroupAiRecord extends GetPacketStatusDepends { delete payload.user_id; diff --git a/packages/napcat-onebot/action/group/SetEssenceMsg.ts b/packages/napcat-onebot/action/group/SetEssenceMsg.ts index 70981a0a..4f2cbae6 100644 --- a/packages/napcat-onebot/action/group/SetEssenceMsg.ts +++ b/packages/napcat-onebot/action/group/SetEssenceMsg.ts @@ -3,6 +3,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), }); @@ -17,6 +19,9 @@ export default class SetEssenceMsg extends OneBotAction override actionName = ActionName.SetEssenceMsg; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '设置精华消息'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.SetEssenceMsg.payload; async _handle (payload: PayloadType) { const msg = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id); diff --git a/packages/napcat-onebot/action/group/SetGroupAddRequest.ts b/packages/napcat-onebot/action/group/SetGroupAddRequest.ts index 4eb01aad..e9a5eb4f 100644 --- a/packages/napcat-onebot/action/group/SetGroupAddRequest.ts +++ b/packages/napcat-onebot/action/group/SetGroupAddRequest.ts @@ -3,6 +3,8 @@ import { GroupNotify, NTGroupRequestOperateTypes } from 'napcat-core/types'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ flag: Type.String({ description: '请求flag' }), approve: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否同意' })), @@ -20,6 +22,9 @@ export default class SetGroupAddRequest extends OneBotAction { const flag = payload.flag.toString(); diff --git a/packages/napcat-onebot/action/group/SetGroupAdmin.ts b/packages/napcat-onebot/action/group/SetGroupAdmin.ts index 33f19d04..615f83dd 100644 --- a/packages/napcat-onebot/action/group/SetGroupAdmin.ts +++ b/packages/napcat-onebot/action/group/SetGroupAdmin.ts @@ -3,6 +3,8 @@ import { NTGroupMemberRole } from 'napcat-core/types'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), user_id: Type.String({ description: '用户QQ' }), @@ -19,6 +21,9 @@ export default class SetGroupAdmin extends OneBotAction override actionName = ActionName.SetGroupAdmin; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '设置群管理员'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.SetGroupAdmin.payload; async _handle (payload: PayloadType): Promise { const enable = typeof payload.enable === 'string' ? payload.enable === 'true' : !!payload.enable; diff --git a/packages/napcat-onebot/action/group/SetGroupBan.ts b/packages/napcat-onebot/action/group/SetGroupBan.ts index cf8d6edb..6159196a 100644 --- a/packages/napcat-onebot/action/group/SetGroupBan.ts +++ b/packages/napcat-onebot/action/group/SetGroupBan.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), user_id: Type.String({ description: '用户QQ' }), @@ -18,6 +20,10 @@ export default class SetGroupBan extends OneBotAction { override actionName = ActionName.SetGroupBan; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '群组禁言'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.SetGroupBan.payload; + async _handle (payload: PayloadType): Promise { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('uid error'); diff --git a/packages/napcat-onebot/action/group/SetGroupCard.ts b/packages/napcat-onebot/action/group/SetGroupCard.ts index 6c05418e..751f456b 100644 --- a/packages/napcat-onebot/action/group/SetGroupCard.ts +++ b/packages/napcat-onebot/action/group/SetGroupCard.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), user_id: Type.String({ description: '用户QQ' }), @@ -18,6 +20,9 @@ export default class SetGroupCard extends OneBotAction override actionName = ActionName.SetGroupCard; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '设置群名片'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.SetGroupCard.payload; async _handle (payload: PayloadType): Promise { const member = await this.core.apis.GroupApi.getGroupMember(payload.group_id.toString(), payload.user_id.toString()); diff --git a/packages/napcat-onebot/action/group/SetGroupKick.ts b/packages/napcat-onebot/action/group/SetGroupKick.ts index 6c4e128b..c914487d 100644 --- a/packages/napcat-onebot/action/group/SetGroupKick.ts +++ b/packages/napcat-onebot/action/group/SetGroupKick.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), user_id: Type.String({ description: '用户QQ' }), @@ -18,6 +20,9 @@ export default class SetGroupKick extends OneBotAction override actionName = ActionName.SetGroupKick; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '群组踢人'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.SetGroupKick.payload; async _handle (payload: PayloadType): Promise { const rejectReq = payload.reject_add_request?.toString() === 'true'; diff --git a/packages/napcat-onebot/action/group/SetGroupLeave.ts b/packages/napcat-onebot/action/group/SetGroupLeave.ts index e7dd7bb0..61d63dd1 100644 --- a/packages/napcat-onebot/action/group/SetGroupLeave.ts +++ b/packages/napcat-onebot/action/group/SetGroupLeave.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), is_dismiss: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否解散' })), @@ -17,6 +19,9 @@ export default class SetGroupLeave extends OneBotAction override actionName = ActionName.SetGroupLeave; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '退出群组'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.SetGroupLeave.payload; async _handle (payload: PayloadType): Promise { await this.core.apis.GroupApi.quitGroup(payload.group_id.toString()); diff --git a/packages/napcat-onebot/action/group/SetGroupName.ts b/packages/napcat-onebot/action/group/SetGroupName.ts index b32dc172..aacf0fa3 100644 --- a/packages/napcat-onebot/action/group/SetGroupName.ts +++ b/packages/napcat-onebot/action/group/SetGroupName.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), group_name: Type.String({ description: '群名称' }), @@ -17,6 +19,9 @@ export default class SetGroupName extends OneBotAction override actionName = ActionName.SetGroupName; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '设置群名称'; + override actionTags = ['群组接口']; + override payloadExample = ActionExamples.SetGroupName.payload; async _handle (payload: PayloadType): Promise { const ret = await this.core.apis.GroupApi.setGroupName(payload.group_id.toString(), payload.group_name); diff --git a/packages/napcat-onebot/action/group/SetGroupWholeBan.ts b/packages/napcat-onebot/action/group/SetGroupWholeBan.ts index 984c9451..3be9f976 100644 --- a/packages/napcat-onebot/action/group/SetGroupWholeBan.ts +++ b/packages/napcat-onebot/action/group/SetGroupWholeBan.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), enable: Type.Optional(Type.Union([Type.Boolean(), Type.String()], { description: '是否开启全员禁言' })), @@ -17,6 +19,9 @@ export default class SetGroupWholeBan extends OneBotAction { const enable = payload.enable?.toString() !== 'false'; diff --git a/packages/napcat-onebot/action/guild/GetGuildList.ts b/packages/napcat-onebot/action/guild/GetGuildList.ts index c778c8f6..3d2d1379 100644 --- a/packages/napcat-onebot/action/guild/GetGuildList.ts +++ b/packages/napcat-onebot/action/guild/GetGuildList.ts @@ -7,6 +7,8 @@ export class GetGuildList extends OneBotAction { override actionName = ActionName.GetGuildList; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); + override actionDescription = '获取频道列表'; + override actionTags = ['频道接口']; async _handle (): Promise { diff --git a/packages/napcat-onebot/action/guild/GetGuildProfile.ts b/packages/napcat-onebot/action/guild/GetGuildProfile.ts index de971c2c..0308c186 100644 --- a/packages/napcat-onebot/action/guild/GetGuildProfile.ts +++ b/packages/napcat-onebot/action/guild/GetGuildProfile.ts @@ -7,6 +7,8 @@ export class GetGuildProfile extends OneBotAction { override actionName = ActionName.GetGuildProfile; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); + override actionDescription = '获取频道个人信息'; + override actionTags = ['频道接口']; async _handle (): Promise { diff --git a/packages/napcat-onebot/action/msg/DeleteMsg.ts b/packages/napcat-onebot/action/msg/DeleteMsg.ts index 4ad252cc..aa1b100e 100644 --- a/packages/napcat-onebot/action/msg/DeleteMsg.ts +++ b/packages/napcat-onebot/action/msg/DeleteMsg.ts @@ -3,6 +3,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), }); @@ -17,6 +19,9 @@ class DeleteMsg extends OneBotAction { override actionName = ActionName.DeleteMsg; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '撤回消息'; + override actionTags = ['消息接口']; + override payloadExample = ActionExamples.DeleteMsg.payload; async _handle (payload: PayloadType) { const msg = MessageUnique.getMsgIdAndPeerByShortId(Number(payload.message_id)); diff --git a/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts b/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts index efd96091..166db586 100644 --- a/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts +++ b/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts @@ -4,6 +4,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), group_id: Type.Optional(Type.String({ description: '目标群号' })), @@ -17,6 +19,10 @@ const ReturnSchema = Type.Null({ description: '操作结果' }); type ReturnType = Static; class ForwardSingleMsg extends OneBotAction { + override actionDescription = '转发单条消息'; + override actionTags = ['消息接口']; + override payloadExample = ActionExamples.ForwardSingleMsg.payload; + protected async getTargetPeer (payload: PayloadType): Promise { if (payload.user_id) { const peerUid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); diff --git a/packages/napcat-onebot/action/msg/GetMsg.ts b/packages/napcat-onebot/action/msg/GetMsg.ts index 286c1496..d9ebfe31 100644 --- a/packages/napcat-onebot/action/msg/GetMsg.ts +++ b/packages/napcat-onebot/action/msg/GetMsg.ts @@ -4,6 +4,8 @@ import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), }); @@ -31,6 +33,10 @@ class GetMsg extends OneBotAction { override actionName = ActionName.GetMsg; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取消息'; + override actionTags = ['消息接口']; + override payloadExample = ActionExamples.GetMsg.payload; + override returnExample = ActionExamples.GetMsg.return; async _handle (payload: PayloadType, _adapter: string, config: NetworkAdapterConfig) { if (!payload.message_id) { diff --git a/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts b/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts index 0605b8de..6dbce521 100644 --- a/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts +++ b/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts @@ -4,6 +4,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + const PayloadSchema = Type.Object({ user_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '用户QQ' })), group_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '群号' })), @@ -17,6 +19,10 @@ const ReturnSchema = Type.Null({ description: '操作结果' }); type ReturnType = Static; class MarkMsgAsRead extends OneBotAction { + override actionDescription = '标记消息已读'; + override actionTags = ['消息接口']; + override payloadExample = ActionExamples.MarkMsgAsRead.payload; + async getPeer (payload: PayloadType): Promise { if (payload.message_id) { const s_peer = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id)?.Peer; diff --git a/packages/napcat-onebot/action/msg/SendMsg.ts b/packages/napcat-onebot/action/msg/SendMsg.ts index cb84d54a..375389a4 100644 --- a/packages/napcat-onebot/action/msg/SendMsg.ts +++ b/packages/napcat-onebot/action/msg/SendMsg.ts @@ -16,6 +16,8 @@ import { PacketMsg } from 'napcat-core/packet/message/message'; import { rawMsgWithSendMsg } from 'napcat-core/packet/message/converter'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + export const SendMsgPayloadSchema = Type.Object({ message_type: Type.Optional(Type.Union([Type.Literal('private'), Type.Literal('group')], { description: '消息类型 (private/group)' })), user_id: Type.Optional(Type.String({ description: '用户QQ' })), @@ -129,6 +131,7 @@ function isNode (msg: OB11MessageData): msg is OB11MessageNode { export class SendMsgBase extends OneBotAction { override payloadSchema = SendMsgPayloadSchema; override returnSchema = SendMsgReturnSchema; + override actionTags = ['消息接口']; protected override async check (payload: SendMsgPayload): Promise { const messages = normalize(payload.message); @@ -442,4 +445,7 @@ export class SendMsgBase extends OneBotAction { } export default class SendMsg extends SendMsgBase { override actionName = ActionName.SendMsg; + override actionDescription = '发送消息'; + override payloadExample = ActionExamples.SendMsg.payload; + override returnExample = ActionExamples.SendMsg.return; } diff --git a/packages/napcat-onebot/action/msg/SendPrivateMsg.ts b/packages/napcat-onebot/action/msg/SendPrivateMsg.ts index 5453dc42..2caf6cd7 100644 --- a/packages/napcat-onebot/action/msg/SendPrivateMsg.ts +++ b/packages/napcat-onebot/action/msg/SendPrivateMsg.ts @@ -1,9 +1,15 @@ import { ContextMode, ReturnDataType, SendMsgBase, SendMsgPayload } from './SendMsg'; import { ActionName, BaseCheckResult } from '@/napcat-onebot/action/router'; +import { ActionExamples } from '../examples'; + // 未检测参数 class SendPrivateMsg extends SendMsgBase { override actionName = ActionName.SendPrivateMsg; + override actionDescription = '发送私聊消息'; + override actionTags = ['消息接口']; + override payloadExample = ActionExamples.SendPrivateMsg.payload; + override returnExample = ActionExamples.SendPrivateMsg.return; protected override async check (payload: SendMsgPayload): Promise { payload.message_type = 'private'; diff --git a/packages/napcat-onebot/action/packet/GetPacketStatus.ts b/packages/napcat-onebot/action/packet/GetPacketStatus.ts index e38cfc88..f81ef33f 100644 --- a/packages/napcat-onebot/action/packet/GetPacketStatus.ts +++ b/packages/napcat-onebot/action/packet/GetPacketStatus.ts @@ -19,6 +19,8 @@ export class GetPacketStatus extends GetPacketStatusDepends { override actionName = ActionName.GetPacketStatus; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); + override actionDescription = '获取 Packet 状态'; + override actionTags = ['系统接口']; async _handle () { diff --git a/packages/napcat-onebot/action/packet/SendPoke.ts b/packages/napcat-onebot/action/packet/SendPoke.ts index 65eabd6a..9845cd3a 100644 --- a/packages/napcat-onebot/action/packet/SendPoke.ts +++ b/packages/napcat-onebot/action/packet/SendPoke.ts @@ -2,6 +2,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + export const SendPokePayloadSchema = Type.Object({ group_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '群号' })), user_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '用户QQ' })), @@ -12,6 +14,9 @@ export type SendPokePayload = Static; export class SendPokeBase extends GetPacketStatusDepends { override payloadSchema = SendPokePayloadSchema; override returnSchema = Type.Null(); + override actionDescription = '发送戳一戳'; + override actionTags = ['核心接口']; + override payloadExample = ActionExamples.SendPoke.payload; async _handle (payload: SendPokePayload) { // 这里的 !! 可以传入空字符串 忽略这些数据有利用接口统一接口 diff --git a/packages/napcat-onebot/action/packet/SetGroupTodo.ts b/packages/napcat-onebot/action/packet/SetGroupTodo.ts index 2a1d06ea..038e964d 100644 --- a/packages/napcat-onebot/action/packet/SetGroupTodo.ts +++ b/packages/napcat-onebot/action/packet/SetGroupTodo.ts @@ -4,6 +4,8 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { Static, Type } from '@sinclair/typebox'; import { ActionName } from '../router'; +import { ActionExamples } from '../examples'; + export const SetGroupTodoPayloadSchema = Type.Object({ group_id: Type.Union([Type.String(), Type.Number()], { description: '群号' }), message_id: Type.Optional(Type.String({ description: '消息ID' })), @@ -15,6 +17,10 @@ export class SetGroupTodo extends GetPacketStatusDepends; export class CanSend extends OneBotAction { override payloadSchema = Type.Object({}); override returnSchema = CanSendReturnSchema; + override actionTags = ['系统接口']; async _handle (): Promise { return { @@ -21,4 +24,7 @@ export class CanSend extends OneBotAction { export default class CanSendRecord extends CanSend { override actionName = ActionName.CanSendRecord; + override actionDescription = '检查是否可以发送语音'; + override payloadExample = ActionExamples.CanSendRecord.payload; + override returnExample = ActionExamples.CanSendRecord.return; } diff --git a/packages/napcat-onebot/action/system/CleanCache.ts b/packages/napcat-onebot/action/system/CleanCache.ts index ac3ea07c..89b48b9b 100644 --- a/packages/napcat-onebot/action/system/CleanCache.ts +++ b/packages/napcat-onebot/action/system/CleanCache.ts @@ -8,6 +8,8 @@ export class CleanCache extends OneBotAction { override actionName = ActionName.CleanCache; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); + override actionDescription = '清理缓存'; + override actionTags = ['系统接口']; async _handle () { try { diff --git a/packages/napcat-onebot/action/system/GetCredentials.ts b/packages/napcat-onebot/action/system/GetCredentials.ts index 88605170..ac89cf82 100644 --- a/packages/napcat-onebot/action/system/GetCredentials.ts +++ b/packages/napcat-onebot/action/system/GetCredentials.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + export const GetCredentialsPayloadSchema = Type.Object({ domain: Type.String({ description: '需要获取 cookies 的域名' }), }); @@ -19,6 +21,10 @@ export class GetCredentials extends OneBotAction { override actionName = ActionName.GetLoginInfo; override payloadSchema = Type.Object({}); override returnSchema = OB11UserSchema; + override actionDescription = '获取登录号信息'; + override actionTags = ['系统接口']; + override payloadExample = ActionExamples.GetLoginInfo.payload; + override returnExample = ActionExamples.GetLoginInfo.return; async _handle () { return OB11Construct.selfInfo(this.core.selfInfo); diff --git a/packages/napcat-onebot/action/system/GetStatus.ts b/packages/napcat-onebot/action/system/GetStatus.ts index 0e650825..8deb2895 100644 --- a/packages/napcat-onebot/action/system/GetStatus.ts +++ b/packages/napcat-onebot/action/system/GetStatus.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + export const GetStatusReturnSchema = Type.Object({ online: Type.Boolean({ description: '是否在线' }), good: Type.Boolean({ description: '状态是否良好' }), @@ -14,6 +16,10 @@ export default class GetStatus extends OneBotAction { override actionName = ActionName.GetStatus; override payloadSchema = Type.Object({}); override returnSchema = GetStatusReturnSchema; + override actionDescription = '获取运行状态'; + override actionTags = ['系统接口']; + override payloadExample = ActionExamples.GetStatus.payload; + override returnExample = ActionExamples.GetStatus.return; async _handle (): Promise { return { diff --git a/packages/napcat-onebot/action/system/GetSystemMsg.ts b/packages/napcat-onebot/action/system/GetSystemMsg.ts index 4f8171ec..c5742446 100644 --- a/packages/napcat-onebot/action/system/GetSystemMsg.ts +++ b/packages/napcat-onebot/action/system/GetSystemMsg.ts @@ -4,6 +4,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { OB11NotifySchema } from '../schemas'; +import { ActionExamples } from '../examples'; + export const GetGroupSystemMsgPayloadSchema = Type.Object({ count: Type.Union([Type.Number(), Type.String()], { default: 50, description: '获取的消息数量' }), }); @@ -22,6 +24,10 @@ export class GetGroupSystemMsg extends OneBotAction { const SingleScreenNotifies = await this.core.apis.GroupApi.getSingleScreenNotifies(false, +params.count); diff --git a/packages/napcat-onebot/action/system/GetVersionInfo.ts b/packages/napcat-onebot/action/system/GetVersionInfo.ts index 6e98a812..42d42ec2 100644 --- a/packages/napcat-onebot/action/system/GetVersionInfo.ts +++ b/packages/napcat-onebot/action/system/GetVersionInfo.ts @@ -11,9 +11,15 @@ const ReturnSchema = Type.Object({ type ReturnType = Static; +import { ActionExamples } from '../examples'; + export default class GetVersionInfo extends OneBotAction { override actionName = ActionName.GetVersionInfo; override returnSchema = ReturnSchema; + override actionDescription = '获取版本信息'; + override actionTags = ['系统接口']; + override payloadExample = ActionExamples.GetVersionInfo.payload; + override returnExample = ActionExamples.GetVersionInfo.return; async _handle (): Promise { return { diff --git a/packages/napcat-onebot/action/system/SetRestart.ts b/packages/napcat-onebot/action/system/SetRestart.ts index 6da7959f..df0b666c 100644 --- a/packages/napcat-onebot/action/system/SetRestart.ts +++ b/packages/napcat-onebot/action/system/SetRestart.ts @@ -7,6 +7,8 @@ export class SetRestart extends OneBotAction { override actionName = ActionName.Reboot; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); + override actionDescription = '重启服务'; + override actionTags = ['系统接口']; async _handle () { const result = await WebUiDataRuntime.requestRestartProcess(); diff --git a/packages/napcat-onebot/action/user/GetCookies.ts b/packages/napcat-onebot/action/user/GetCookies.ts index 7757c97c..9a1d28ea 100644 --- a/packages/napcat-onebot/action/user/GetCookies.ts +++ b/packages/napcat-onebot/action/user/GetCookies.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + export const GetCookiesPayloadSchema = Type.Object({ domain: Type.String({ description: '需要获取 cookies 的域名' }), }); @@ -19,6 +21,10 @@ export class GetCookies extends OneBotAction override actionName = ActionName.GetFriendList; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取好友列表'; + override actionTags = ['用户接口']; + override payloadExample = ActionExamples.GetFriendList.payload; + override returnExample = ActionExamples.GetFriendList.return; async _handle (_payload: PayloadType) { const buddyMap = await this.core.apis.FriendApi.getBuddyV2SimpleInfoMap(); diff --git a/packages/napcat-onebot/action/user/SendLike.ts b/packages/napcat-onebot/action/user/SendLike.ts index d5b64a1a..d4c90a74 100644 --- a/packages/napcat-onebot/action/user/SendLike.ts +++ b/packages/napcat-onebot/action/user/SendLike.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + export const SendLikePayloadSchema = Type.Object({ user_id: Type.String({ description: '对方 QQ 号' }), times: Type.Union([Type.Number(), Type.String()], { default: 1, description: '点赞次数' }), @@ -13,6 +15,13 @@ export default class SendLike extends OneBotAction { override actionName = ActionName.SendLike; override payloadSchema = SendLikePayloadSchema; override returnSchema = Type.Null(); + override actionDescription = '点赞'; + override actionTags = ['用户接口']; + override payloadExample = ActionExamples.SendLike.payload; + override errorExamples = [ + ...ActionExamples.Common.errors, + { code: 1400, description: '点赞失败(频率过快或用户不存在)' } + ]; async _handle (payload: SendLikePayload): Promise { const qq = payload.user_id.toString(); diff --git a/packages/napcat-onebot/action/user/SetFriendAddRequest.ts b/packages/napcat-onebot/action/user/SetFriendAddRequest.ts index d79bef33..bd24b58b 100644 --- a/packages/napcat-onebot/action/user/SetFriendAddRequest.ts +++ b/packages/napcat-onebot/action/user/SetFriendAddRequest.ts @@ -10,10 +10,15 @@ export const SetFriendAddRequestPayloadSchema = Type.Object({ export type SetFriendAddRequestPayload = Static; +import { ActionExamples } from '../examples'; + export default class SetFriendAddRequest extends OneBotAction { override actionName = ActionName.SetFriendAddRequest; override payloadSchema = SetFriendAddRequestPayloadSchema; override returnSchema = Type.Null(); + override actionDescription = '处理加好友请求'; + override actionTags = ['用户接口']; + override payloadExample = ActionExamples.SetFriendAddRequest.payload; async _handle (payload: SetFriendAddRequestPayload): Promise { const approve = payload.approve?.toString() !== 'false'; diff --git a/packages/napcat-onebot/action/user/SetFriendRemark.ts b/packages/napcat-onebot/action/user/SetFriendRemark.ts index f6e7336f..556e99bc 100644 --- a/packages/napcat-onebot/action/user/SetFriendRemark.ts +++ b/packages/napcat-onebot/action/user/SetFriendRemark.ts @@ -2,9 +2,11 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ActionExamples } from '../examples'; + export const SetFriendRemarkPayloadSchema = Type.Object({ - user_id: Type.String({ description: '好友 QQ 号' }), - remark: Type.String({ description: '备注' }), + user_id: Type.String({ description: '对方 QQ 号' }), + remark: Type.String({ description: '备注内容' }), }); export type SetFriendRemarkPayload = Static; @@ -13,6 +15,13 @@ export default class SetFriendRemark extends OneBotAction { const friendUid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); diff --git a/packages/napcat-schema/index.ts b/packages/napcat-schema/index.ts index dcf037d7..35d2ad39 100644 --- a/packages/napcat-schema/index.ts +++ b/packages/napcat-schema/index.ts @@ -4,28 +4,52 @@ import { writeFileSync } from 'node:fs'; import { resolve, dirname } from 'node:path'; import { TSchema } from '@sinclair/typebox'; import { fileURLToPath } from 'node:url'; +import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; + const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); -export const actionSchemas: Record = {}; +interface ActionSchemaInfo { + payload?: TSchema; + return?: TSchema; + description?: string; + tags?: string[]; + payloadExample?: unknown; + returnExample?: unknown; + errorExamples?: Array<{ code: number, description: string }>; +} + +export const actionSchemas: Record = {}; export function initSchemas () { const handlers = getAllHandlers(null as any, null as any); handlers.forEach(handler => { if (handler.actionName && (handler.actionName as string) !== 'unknown') { + const action = handler as OneBotAction; actionSchemas[handler.actionName] = { - payload: handler.payloadSchema, - return: handler.returnSchema + payload: action.payloadSchema, + return: action.returnSchema, + description: action.actionDescription, + tags: action.actionTags, + payloadExample: action.payloadExample, + returnExample: action.returnExample, + errorExamples: action.errorExamples }; } }); AutoRegisterRouter.forEach((ActionClass) => { const handler = new ActionClass(null as any, null as any); if (handler.actionName && (handler.actionName as string) !== 'unknown') { + const action = handler as OneBotAction; actionSchemas[handler.actionName] = { - payload: handler.payloadSchema, - return: handler.returnSchema + payload: action.payloadSchema, + return: action.returnSchema, + description: action.actionDescription, + tags: action.actionTags, + payloadExample: action.payloadExample, + returnExample: action.returnExample, + errorExamples: action.errorExamples }; } }); @@ -38,14 +62,14 @@ export function generateOpenAPI () { console.warn('Init schemas partial failure (expected due to complex imports), proceeding with collected data...'); } - const openapi: any = { + const openapi: Record = { openapi: '3.1.0', info: { title: 'NapCat OneBot 11 API', description: 'Auto-generated OpenAPI schema for NapCat OneBot 11 actions', version: '1.0.0' }, - paths: {} + paths: {} as Record }; for (const [actionName, schemas] of Object.entries(actionSchemas)) { @@ -55,9 +79,51 @@ export function generateOpenAPI () { const cleanPayload = JSON.parse(JSON.stringify(schemas.payload || { type: 'object', properties: {} })); const cleanReturn = JSON.parse(JSON.stringify(schemas.return || { type: 'object', properties: {} })); - openapi.paths[path] = { + if (schemas.payloadExample) { + cleanPayload.example = schemas.payloadExample; + } + if (schemas.returnExample) { + cleanReturn.example = schemas.returnExample; + } + + const paths = openapi['paths'] as Record; + const responses: Record = { + '200': { + description: '成功', + content: { + 'application/json': { + schema: cleanReturn + } + } + } + }; + + if (schemas.errorExamples) { + schemas.errorExamples.forEach(error => { + responses[error.code.toString()] = { + description: error.description, + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + status: { type: 'string', example: 'failed' }, + retcode: { type: 'number', example: error.code }, + data: { type: 'null' }, + message: { type: 'string', example: error.description } + } + } + } + } + }; + }); + } + + paths[path] = { post: { summary: actionName, + description: schemas.description || actionName, + tags: schemas.tags || ['Default'], requestBody: { content: { 'application/json': { @@ -65,16 +131,7 @@ export function generateOpenAPI () { } } }, - responses: { - '200': { - description: '成功', - content: { - 'application/json': { - schema: cleanReturn - } - } - } - } + responses: responses } }; } From 335c83a3d5b54682263fecdb0b022c14db1c3629 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 17:55:07 +0800 Subject: [PATCH 07/17] Refactor action example imports and add example files Moved action example data to dedicated 'examples.ts' files for each action category (extends, file, go-cqhttp, group, msg, system, user). Updated all action classes to import and use the new example modules, improving code organization and maintainability. Also added missing actionTags and actionDescription where appropriate. --- .../napcat-onebot/action/extends/OCRImage.ts | 5 +- .../napcat-onebot/action/extends/examples.ts | 38 +++++++ .../napcat-onebot/action/file/examples.ts | 22 ++++ .../action/go-cqhttp/CreateGroupFileFolder.ts | 5 + .../action/go-cqhttp/DeleteGroupFile.ts | 5 + .../action/go-cqhttp/DeleteGroupFileFolder.ts | 5 + .../action/go-cqhttp/DownloadFile.ts | 4 + .../action/go-cqhttp/GetForwardMsg.ts | 4 +- .../action/go-cqhttp/GetFriendMsgHistory.ts | 4 + .../action/go-cqhttp/GetGroupAtAllRemain.ts | 4 +- .../go-cqhttp/GetGroupFileSystemInfo.ts | 4 + .../action/go-cqhttp/GetGroupFilesByFolder.ts | 5 + .../action/go-cqhttp/GetGroupHonorInfo.ts | 4 +- .../action/go-cqhttp/GetGroupMsgHistory.ts | 4 + .../action/go-cqhttp/GetGroupRootFiles.ts | 5 + .../action/go-cqhttp/GetOnlineClient.ts | 4 + .../action/go-cqhttp/GetStrangerInfo.ts | 8 +- .../go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 4 + .../action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 4 + .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 4 + .../action/go-cqhttp/GoCQHTTPSetModelShow.ts | 4 + .../action/go-cqhttp/QuickAction.ts | 4 + .../action/go-cqhttp/SendGroupNotice.ts | 5 + .../action/go-cqhttp/SetGroupPortrait.ts | 5 + .../action/go-cqhttp/SetQQProfile.ts | 4 + .../action/go-cqhttp/UploadGroupFile.ts | 4 + .../action/go-cqhttp/UploadPrivateFile.ts | 4 + .../action/go-cqhttp/examples.ts | 102 ++++++++++++++++++ .../action/group/GetGroupDetailInfo.ts | 1 + .../action/group/GetGroupInfo.ts | 5 +- .../napcat-onebot/action/group/examples.ts | 78 ++++++++++++++ packages/napcat-onebot/action/msg/examples.ts | 33 ++++++ .../action/system/CanSendImage.ts | 6 +- .../action/system/CanSendRecord.ts | 6 +- .../napcat-onebot/action/system/GetCSRF.ts | 4 + .../napcat-onebot/action/system/examples.ts | 42 ++++++++ .../action/user/GetRecentContact.ts | 4 + .../napcat-onebot/action/user/examples.ts | 38 +++++++ 38 files changed, 471 insertions(+), 20 deletions(-) create mode 100644 packages/napcat-onebot/action/extends/examples.ts create mode 100644 packages/napcat-onebot/action/file/examples.ts create mode 100644 packages/napcat-onebot/action/go-cqhttp/examples.ts create mode 100644 packages/napcat-onebot/action/group/examples.ts create mode 100644 packages/napcat-onebot/action/msg/examples.ts create mode 100644 packages/napcat-onebot/action/system/examples.ts create mode 100644 packages/napcat-onebot/action/user/examples.ts diff --git a/packages/napcat-onebot/action/extends/OCRImage.ts b/packages/napcat-onebot/action/extends/OCRImage.ts index bf9abf0e..9d31007d 100644 --- a/packages/napcat-onebot/action/extends/OCRImage.ts +++ b/packages/napcat-onebot/action/extends/OCRImage.ts @@ -4,7 +4,7 @@ import { checkFileExist, uriToLocalFile } from 'napcat-common/src/file'; import fs from 'fs'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { ExtendsActionsExamples } from './examples'; const PayloadSchema = Type.Object({ image: Type.String({ description: '图片路径、URL或Base64' }), @@ -21,8 +21,7 @@ class OCRImageBase extends OneBotAction { override returnSchema = ReturnSchema; override actionDescription = '图片 OCR 识别'; override actionTags = ['扩展接口']; - override payloadExample = ActionExamples.OCRImage.payload; - override returnExample = ActionExamples.OCRImage.return; + override payloadExample = ExtendsActionsExamples.OCRImage.payload; async _handle (payload: PayloadType): Promise { const { path, success } = await uriToLocalFile(this.core.NapCatTempPath, payload.image); diff --git a/packages/napcat-onebot/action/extends/examples.ts b/packages/napcat-onebot/action/extends/examples.ts new file mode 100644 index 00000000..376c3b37 --- /dev/null +++ b/packages/napcat-onebot/action/extends/examples.ts @@ -0,0 +1,38 @@ +export const ExtendsActionsExamples = { + OCRImage: { + payload: { image: 'image_id_123' }, + response: { texts: [{ text: '识别内容', coordinates: [] }] }, + }, + GetAiCharacters: { + payload: { group_id: '123456' }, + response: { characters: [] }, + }, + GetClientkey: { + payload: {}, + response: { clientkey: 'abcdef123456' }, + }, + SetQQAvatar: { + payload: { file: 'base64://...' }, + response: {}, + }, + SetGroupKickMembers: { + payload: { group_id: '123456', user_id: ['123456789'], reject_add_request: false }, + response: {}, + }, + TranslateEnWordToZn: { + payload: { words: ['hello'] }, + response: { words: ['你好'] }, + }, + GetRkey: { + payload: {}, + response: { rkey: '...' }, + }, + SetLongNick: { + payload: { longNick: '个性签名' }, + response: {}, + }, + SetSpecialTitle: { + payload: { group_id: '123456', user_id: '123456789', special_title: '头衔' }, + response: {}, + }, +}; diff --git a/packages/napcat-onebot/action/file/examples.ts b/packages/napcat-onebot/action/file/examples.ts new file mode 100644 index 00000000..9db7e976 --- /dev/null +++ b/packages/napcat-onebot/action/file/examples.ts @@ -0,0 +1,22 @@ +export const FileActionsExamples = { + GetFile: { + payload: { file: 'file_id_123' }, + response: { file: '/path/to/file', url: 'http://...', file_size: 1024, file_name: 'test.jpg' }, + }, + GetGroupFileUrl: { + payload: { group_id: '123456', file_id: 'file_id_123', busid: 102 }, + response: { url: 'http://...' }, + }, + GetImage: { + payload: { file: 'image_id_123' }, + response: { file: '/path/to/image', url: 'http://...' }, + }, + GetPrivateFileUrl: { + payload: { user_id: '123456789', file_id: 'file_id_123' }, + response: { url: 'http://...' }, + }, + GetRecord: { + payload: { file: 'record_id_123', out_format: 'mp3' }, + response: { file: '/path/to/record', url: 'http://...' }, + }, +}; diff --git a/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 8652d7e8..34de7dd4 100644 --- a/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -1,6 +1,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -23,6 +24,10 @@ export class CreateGroupFileFolder extends OneBotAction override actionName = ActionName.GoCQHTTP_CreateGroupFileFolder; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '创建群文件目录'; + override actionTags = ['Go-CQHTTP']; + override payloadExample = GoCQHTTPActionsExamples.CreateGroupFileFolder.payload; + async _handle (payload: PayloadType) { const folderName = payload.folder_name || payload.name; return (await this.core.apis.GroupApi.creatGroupFileFolder(payload.group_id.toString(), folderName!)).resultWithGroupItem; diff --git a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts index f397d0e9..046194f7 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -2,6 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { FileNapCatOneBotUUID } from 'napcat-common/src/file-uuid'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -18,6 +19,10 @@ export class DeleteGroupFile extends OneBotAction { override actionName = ActionName.GOCQHTTP_DeleteGroupFile; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '删除群文件'; + override actionTags = ['Go-CQHTTP']; + override payloadExample = GoCQHTTPActionsExamples.DeleteGroupFile.payload; + async _handle (payload: PayloadType) { const data = FileNapCatOneBotUUID.decodeModelId(payload.file_id); if (!data || !data.fileId) throw new Error('Invalid file_id'); diff --git a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 03242e33..496e00ae 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -1,6 +1,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -18,6 +19,10 @@ export class DeleteGroupFileFolder extends OneBotAction override actionName = ActionName.GoCQHTTP_DeleteGroupFileFolder; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '删除群文件目录'; + override actionTags = ['Go-CQHTTP']; + override payloadExample = GoCQHTTPActionsExamples.DeleteGroupFileFolder.payload; + async _handle (payload: PayloadType) { return (await this.core.apis.GroupApi.delGroupFileFolder( payload.group_id.toString(), payload.folder ?? payload.folder_id ?? '')).groupFileCommonResult; diff --git a/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts b/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts index 830bf7b8..a8190615 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts @@ -5,6 +5,7 @@ import { join as joinPath } from 'node:path'; import { calculateFileMD5, uriToLocalFile } from 'napcat-common/src/file'; import { randomUUID } from 'crypto'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({ url: Type.Optional(Type.String({ description: '下载链接' })), @@ -25,6 +26,9 @@ export default class GoCQHTTPDownloadFile extends OneBotAction { const isRandomName = !payload.name; diff --git a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts index 5fcb892c..0b4b69d7 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts @@ -5,6 +5,7 @@ import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from 'napcat-core'; import { isNumeric } from 'napcat-common/src/helper'; +import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({ message_id: Type.Optional(Type.String({ description: '消息ID' })), @@ -28,7 +29,8 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { // 处理参数 diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 67c1fbaa..0d46b81e 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -1,6 +1,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -21,7 +22,8 @@ export class GoCQHTTPGetGroupAtAllRemain extends OneBotAction override actionName = ActionName.GoCQHTTP_GetGroupFilesByFolder; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取群文件夹文件列表'; + override actionTags = ['Go-CQHTTP']; + override payloadExample = GoCQHTTPActionsExamples.GetGroupFilesByFolder.payload; + async _handle (payload: PayloadType): Promise { const retRaw = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), { sortType: 1, diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts index e7c3999e..728fac34 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -2,6 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { WebHonorType } from 'napcat-core/types'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -27,7 +28,8 @@ export class GetGroupHonorInfo extends OneBotAction { override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; override actionDescription = '获取群荣誉信息'; - override actionTags = ['群组接口']; + override actionTags = ['Go-CQHTTP']; + override payloadExample = GoCQHTTPActionsExamples.GetGroupHonorInfo.payload; async _handle (payload: PayloadType): Promise { if (!payload.type) { diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts index 71fe33bc..73d65e7a 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -5,6 +5,7 @@ import { ChatType, Peer } from 'napcat-core/types'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; +import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -29,6 +30,9 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction { const peer: Peer = { chatType: ChatType.KCHATTYPEGROUP, peerUid: payload.group_id.toString() }; diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts index 0e5db1fb..5dfdee1f 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -2,6 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { OB11Construct } from '@/napcat-onebot/helper/data'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -21,6 +22,10 @@ export class GetGroupRootFiles extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetGroupRootFiles; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取群根目录文件列表'; + override actionTags = ['Go-CQHTTP']; + override payloadExample = GoCQHTTPActionsExamples.GetGroupRootFiles.payload; + async _handle (payload: PayloadType) { const ret = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), { sortType: 1, diff --git a/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts b/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts index 70928cd4..a270979d 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts @@ -2,6 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { sleep } from 'napcat-common/src/helper'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({}, { description: '在线客户端负载' }); @@ -15,6 +16,9 @@ export class GetOnlineClient extends OneBotAction { override actionName = ActionName.GetOnlineClient; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionDescription = '获取在线客户端'; + override actionTags = ['Go-CQHTTP']; + override payloadExample = GoCQHTTPActionsExamples.GetOnlineClient.payload; async _handle () { // 注册监听 diff --git a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts index 66edc405..16c8f27f 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -4,8 +4,7 @@ import { OB11Construct } from '@/napcat-onebot/helper/data'; import { ActionName } from '@/napcat-onebot/action/router'; import { calcQQLevel } from 'napcat-common/src/helper'; import { Static, Type } from '@sinclair/typebox'; - -import { ActionExamples } from '../examples'; +import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({ user_id: Type.String({ description: '用户QQ' }), @@ -39,9 +38,8 @@ export default class GoCQHTTPGetStrangerInfo extends OneBotAction { const user_id = payload.user_id.toString(); diff --git a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index 808d8120..85f06d2d 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -1,6 +1,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; export const GoCQHTTPCheckUrlSafelyPayloadSchema = Type.Object({ url: Type.String({ description: '要检查的 URL' }), @@ -18,6 +19,9 @@ export class GoCQHTTPCheckUrlSafely extends OneBotAction { override actionName = ActionName.GoCQHTTP_SetModelShow; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); + override actionDescription = '设置模型显示'; + override actionTags = ['Go-CQHTTP']; + override payloadExample = GoCQHTTPActionsExamples.GoCQHTTPSetModelShow.payload; async _handle () { diff --git a/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts b/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts index 39e2d5cf..a0d7897a 100644 --- a/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts +++ b/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts @@ -2,6 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { QuickAction, QuickActionEvent } from '@/napcat-onebot/types'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; const SenderSchema = Type.Object({ user_id: Type.String({ description: '用户ID' }), @@ -62,6 +63,9 @@ export class GoCQHTTPHandleQuickAction extends OneBotAction { this.obContext.apis.QuickActionApi diff --git a/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts b/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts index 7c368b49..5fe771a2 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts @@ -3,6 +3,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { unlink } from 'node:fs/promises'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; export const SendGroupNoticePayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -21,6 +22,10 @@ export class SendGroupNotice extends OneBotAction override actionName = ActionName.GoCQHTTP_SendGroupNotice; override payloadSchema = SendGroupNoticePayloadSchema; override returnSchema = Type.Null(); + override actionDescription = '发送群公告'; + override actionTags = ['Go-CQHTTP']; + override payloadExample = GoCQHTTPActionsExamples.SendGroupNotice.payload; + async _handle (payload: SendGroupNoticePayload) { let UploadImage: { id: string, width: number, height: number; } | undefined; if (payload.image) { diff --git a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts index 8b3abb5b..d56f1e3b 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -3,6 +3,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { checkFileExistV2, uriToLocalFile } from 'napcat-common/src/file'; import { Static, Type } from '@sinclair/typebox'; import fs from 'node:fs/promises'; +import { GoCQHTTPActionsExamples } from './examples'; + export const SetGroupPortraitPayloadSchema = Type.Object({ file: Type.String({ description: '头像文件路径或 URL' }), group_id: Type.String({ description: '群号' }), @@ -21,6 +23,9 @@ export default class SetGroupPortrait extends OneBotAction { const { path, success } = (await uriToLocalFile(this.core.NapCatTempPath, payload.file)); diff --git a/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts b/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts index f869b132..3a28a374 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts @@ -1,6 +1,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; export const SetQQProfilePayloadSchema = Type.Object({ nickname: Type.String({ description: '昵称' }), @@ -13,6 +14,9 @@ export class SetQQProfile extends OneBotAction { override actionName = ActionName.SetQQProfile; override payloadSchema = SetQQProfilePayloadSchema; override returnSchema = Type.Any({ description: '设置结果' }); + override actionDescription = '设置 QQ 资料'; + override actionTags = ['Go-CQHTTP']; + override payloadExample = GoCQHTTPActionsExamples.SetQQProfile.payload; async _handle (payload: SetQQProfilePayload) { const self = this.core.selfInfo; diff --git a/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts b/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts index cde3b633..5ad77b46 100644 --- a/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts @@ -5,6 +5,7 @@ import fs from 'fs'; import { uriToLocalFile } from 'napcat-common/src/file'; import { SendMessageContext } from '@/napcat-onebot/api'; import { Static, Type } from '@sinclair/typebox'; +import { GoCQHTTPActionsExamples } from './examples'; export const GoCQHTTPUploadGroupFilePayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -27,6 +28,9 @@ export default class GoCQHTTPUploadGroupFile extends OneBotAction { let file = payload.file; diff --git a/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts b/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts index 9123f613..781330ed 100644 --- a/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -6,6 +6,7 @@ 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 './examples'; export const GoCQHTTPUploadPrivateFilePayloadSchema = Type.Object({ user_id: Type.String({ description: '用户 QQ' }), @@ -26,6 +27,9 @@ export default class GoCQHTTPUploadPrivateFile extends OneBotAction { if (payload.user_id) { diff --git a/packages/napcat-onebot/action/go-cqhttp/examples.ts b/packages/napcat-onebot/action/go-cqhttp/examples.ts new file mode 100644 index 00000000..a090ee49 --- /dev/null +++ b/packages/napcat-onebot/action/go-cqhttp/examples.ts @@ -0,0 +1,102 @@ +export const GoCQHTTPActionsExamples = { + GetStrangerInfo: { + payload: { user_id: '123456789' }, + response: { user_id: 123456789, nickname: '昵称', sex: 'unknown' }, + }, + GetGroupHonorInfo: { + payload: { group_id: '123456', type: 'all' }, + response: { group_id: 123456, current_talkative: {}, talkative_list: [] }, + }, + GetForwardMsg: { + payload: { message_id: '123456' }, + response: { messages: [] }, + }, + SendForwardMsg: { + payload: { group_id: '123456', messages: [] }, + response: { message_id: 123456 }, + }, + GetGroupAtAllRemain: { + payload: { group_id: '123456' }, + response: { can_at_all: true, remain_at_all_count_for_group: 10, remain_at_all_count_for_self: 10 }, + }, + CreateGroupFileFolder: { + payload: { group_id: '123456', name: '测试目录' }, + response: { result: {}, groupItem: {} }, + }, + DeleteGroupFile: { + payload: { group_id: '123456', file_id: 'file_uuid_123' }, + response: {}, + }, + DeleteGroupFileFolder: { + payload: { group_id: '123456', folder_id: 'folder_uuid_123' }, + response: {}, + }, + DownloadFile: { + payload: { url: 'https://example.com/file.png', thread_count: 1, headers: 'User-Agent: NapCat' }, + response: { file: '/path/to/downloaded/file' }, + }, + GetFriendMsgHistory: { + payload: { user_id: '123456789', message_seq: 0, count: 20 }, + response: { messages: [] }, + }, + GetGroupFilesByFolder: { + payload: { group_id: '123456', folder_id: 'folder_id' }, + response: { files: [], folders: [] }, + }, + GetGroupFileSystemInfo: { + payload: { group_id: '123456' }, + response: { file_count: 10, limit_count: 10000, used_space: 1024, total_space: 10737418240 }, + }, + GetGroupMsgHistory: { + payload: { group_id: '123456', message_seq: 0, count: 20 }, + response: { messages: [] }, + }, + GetGroupRootFiles: { + payload: { group_id: '123456' }, + response: { files: [], folders: [] }, + }, + GetOnlineClient: { + payload: { no_cache: false }, + response: { clients: [] }, + }, + GoCQHTTPCheckUrlSafely: { + payload: { url: 'https://example.com' }, + response: { level: 1 }, + }, + GoCQHTTPDeleteFriend: { + payload: { user_id: '123456789' }, + response: {}, + }, + GoCQHTTPGetModelShow: { + payload: { model: 'iPhone 13' }, + response: { variants: [] }, + }, + GoCQHTTPSetModelShow: { + payload: { model: 'iPhone 13', model_show: 'iPhone 13' }, + response: {}, + }, + QuickAction: { + payload: { context: {}, operation: {} }, + response: {}, + }, + SendGroupNotice: { + payload: { group_id: '123456', content: '公告内容', image: 'base64://...' }, + response: {}, + }, + SetGroupPortrait: { + payload: { group_id: '123456', file: 'base64://...' }, + response: {}, + }, + SetQQProfile: { + payload: { nickname: '新昵称', personal_note: '个性签名' }, + response: {}, + }, + UploadGroupFile: { + payload: { group_id: '123456', file: '/path/to/file', name: 'test.txt' }, + response: { file_id: 'file_uuid_123' }, + }, + UploadPrivateFile: { + payload: { user_id: '123456789', file: '/path/to/file', name: 'test.txt' }, + response: { file_id: 'file_uuid_123' }, + }, +}; diff --git a/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts b/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts index b1edbe0a..16b393cf 100644 --- a/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts @@ -1,6 +1,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), diff --git a/packages/napcat-onebot/action/group/GetGroupInfo.ts b/packages/napcat-onebot/action/group/GetGroupInfo.ts index 7074f6b3..7c60def9 100644 --- a/packages/napcat-onebot/action/group/GetGroupInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupInfo.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { OB11GroupSchema } from '../schemas'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -22,8 +22,7 @@ class GetGroupInfo extends OneBotAction { override returnSchema = ReturnSchema; override actionDescription = '获取群信息'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.GetGroupInfo.payload; - override returnExample = ActionExamples.GetGroupInfo.return; + override payloadExample = GroupActionsExamples.GetGroupInfo.payload; async _handle (payload: PayloadType) { const group = (await this.core.apis.GroupApi.getGroups()).find(e => e.groupCode === payload.group_id.toString()); diff --git a/packages/napcat-onebot/action/group/examples.ts b/packages/napcat-onebot/action/group/examples.ts new file mode 100644 index 00000000..0ba0f990 --- /dev/null +++ b/packages/napcat-onebot/action/group/examples.ts @@ -0,0 +1,78 @@ +export const GroupActionsExamples = { + DelEssenceMsg: { + payload: { message_id: 123456 }, + response: {}, + }, + DelGroupNotice: { + payload: { group_id: '123456', notice_id: 'notice_123' }, + response: {}, + }, + GetGroupDetailInfo: { + payload: { group_id: '123456' }, + response: { group_id: 123456, group_name: '测试群', member_count: 100, max_member_count: 500 }, + }, + GetGroupEssence: { + payload: { group_id: '123456' }, + response: [{ message_id: 123456, sender_id: 123456, sender_nick: '昵称', operator_id: 123456, operator_nick: '昵称', operator_time: 1710000000, content: '精华内容' }], + }, + GetGroupInfo: { + payload: { group_id: '123456' }, + response: { group_id: 123456, group_name: '测试群', member_count: 100, max_member_count: 500 }, + }, + GetGroupList: { + payload: {}, + response: [{ group_id: 123456, group_name: '测试群', member_count: 100, max_member_count: 500 }], + }, + GetGroupMemberInfo: { + payload: { group_id: '123456', user_id: '123456789' }, + response: { group_id: 123456, user_id: 123456789, nickname: '昵称', card: '名片', role: 'member' }, + }, + GetGroupMemberList: { + payload: { group_id: '123456' }, + response: [{ group_id: 123456, user_id: 123456789, nickname: '昵称', card: '名片', role: 'member' }], + }, + GetGroupNotice: { + payload: { group_id: '123456' }, + response: [{ notice_id: 'notice_123', sender_id: 123456, publish_time: 1710000000, message: { text: '公告内容', image: [] } }], + }, + SendGroupMsg: { + payload: { group_id: '123456', message: 'hello' }, + response: { message_id: 123456 }, + }, + SetEssenceMsg: { + payload: { message_id: 123456 }, + response: {}, + }, + SetGroupAddRequest: { + payload: { flag: 'flag_123', sub_type: 'add', approve: true }, + response: {}, + }, + SetGroupAdmin: { + payload: { group_id: '123456', user_id: '123456789', enable: true }, + response: {}, + }, + SetGroupBan: { + payload: { group_id: '123456', user_id: '123456789', duration: 1800 }, + response: {}, + }, + SetGroupCard: { + payload: { group_id: '123456', user_id: '123456789', card: '新名片' }, + response: {}, + }, + SetGroupKick: { + payload: { group_id: '123456', user_id: '123456789', reject_add_request: false }, + response: {}, + }, + SetGroupLeave: { + payload: { group_id: '123456', is_dismiss: false }, + response: {}, + }, + SetGroupName: { + payload: { group_id: '123456', group_name: '新群名' }, + response: {}, + }, + SetGroupWholeBan: { + payload: { group_id: '123456', enable: true }, + response: {}, + }, +}; diff --git a/packages/napcat-onebot/action/msg/examples.ts b/packages/napcat-onebot/action/msg/examples.ts new file mode 100644 index 00000000..9aa6b898 --- /dev/null +++ b/packages/napcat-onebot/action/msg/examples.ts @@ -0,0 +1,33 @@ +export const MsgActionsExamples = { + DeleteMsg: { + payload: { message_id: 123456 }, + response: {}, + }, + GetMsg: { + payload: { message_id: 123456 }, + response: { + time: 1710000000, + message_type: 'group', + message_id: 123456, + real_id: 123456, + sender: { user_id: 123456789, nickname: '昵称' }, + message: 'hello', + }, + }, + MarkMsgAsRead: { + payload: { group_id: '123456' }, + response: {}, + }, + SendMsg: { + payload: { message_type: 'group', group_id: '123456', message: 'hello' }, + response: { message_id: 123456 }, + }, + SendPrivateMsg: { + payload: { user_id: '123456789', message: 'hello' }, + response: { message_id: 123456 }, + }, + SetMsgEmojiLike: { + payload: { message_id: 123456, emoji_id: '12345' }, + response: {}, + }, +}; diff --git a/packages/napcat-onebot/action/system/CanSendImage.ts b/packages/napcat-onebot/action/system/CanSendImage.ts index 5bfba3dc..66101230 100644 --- a/packages/napcat-onebot/action/system/CanSendImage.ts +++ b/packages/napcat-onebot/action/system/CanSendImage.ts @@ -1,10 +1,10 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { CanSend } from './CanSendRecord'; -import { ActionExamples } from '../examples'; +import { SystemActionsExamples } from './examples'; export default class CanSendImage extends CanSend { override actionName = ActionName.CanSendImage; override actionDescription = '检查是否可以发送图片'; - override payloadExample = ActionExamples.CanSendImage.payload; - override returnExample = ActionExamples.CanSendImage.return; + override actionTags = ['系统接口']; + override payloadExample = SystemActionsExamples.CanSendImage.payload; } diff --git a/packages/napcat-onebot/action/system/CanSendRecord.ts b/packages/napcat-onebot/action/system/CanSendRecord.ts index e1c4d976..fd007af0 100644 --- a/packages/napcat-onebot/action/system/CanSendRecord.ts +++ b/packages/napcat-onebot/action/system/CanSendRecord.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { SystemActionsExamples } from './examples'; export const CanSendReturnSchema = Type.Object({ yes: Type.Boolean({ description: '是否可以发送' }), @@ -25,6 +25,6 @@ export class CanSend extends OneBotAction { export default class CanSendRecord extends CanSend { override actionName = ActionName.CanSendRecord; override actionDescription = '检查是否可以发送语音'; - override payloadExample = ActionExamples.CanSendRecord.payload; - override returnExample = ActionExamples.CanSendRecord.return; + override actionTags = ['系统接口']; + override payloadExample = SystemActionsExamples.CanSendRecord.payload; } diff --git a/packages/napcat-onebot/action/system/GetCSRF.ts b/packages/napcat-onebot/action/system/GetCSRF.ts index a9fe9658..9be720d2 100644 --- a/packages/napcat-onebot/action/system/GetCSRF.ts +++ b/packages/napcat-onebot/action/system/GetCSRF.ts @@ -1,6 +1,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; +import { SystemActionsExamples } from './examples'; export const GetCSRFReturnSchema = Type.Object({ token: Type.Number({ description: 'CSRF Token' }), @@ -12,6 +13,9 @@ export class GetCSRF extends OneBotAction { override actionName = ActionName.GetCSRF; override payloadSchema = Type.Object({}); override returnSchema = GetCSRFReturnSchema; + override actionDescription = '获取 CSRF Token'; + override actionTags = ['系统接口']; + override payloadExample = SystemActionsExamples.GetCSRF.payload; async _handle () { const sKey = await this.core.apis.UserApi.getSKey(); diff --git a/packages/napcat-onebot/action/system/examples.ts b/packages/napcat-onebot/action/system/examples.ts new file mode 100644 index 00000000..19137849 --- /dev/null +++ b/packages/napcat-onebot/action/system/examples.ts @@ -0,0 +1,42 @@ +export const SystemActionsExamples = { + CanSendImage: { + payload: {}, + response: { yes: true }, + }, + CanSendRecord: { + payload: {}, + response: { yes: true }, + }, + CleanCache: { + payload: {}, + response: {}, + }, + GetCredentials: { + payload: {}, + response: { cookies: '...', csrf_token: 123456789 }, + }, + GetCSRF: { + payload: {}, + response: { token: 123456789 }, + }, + GetLoginInfo: { + payload: {}, + response: { user_id: 123456789, nickname: '机器人' }, + }, + GetStatus: { + payload: {}, + response: { online: true, good: true }, + }, + GetSystemMsg: { + payload: {}, + response: { invited_requests: [], join_requests: [] }, + }, + GetVersionInfo: { + payload: {}, + response: { app_name: 'NapCatQQ', app_version: '1.0.0', protocol_version: 'v11' }, + }, + SetRestart: { + payload: { delay: 0 }, + response: {}, + }, +}; diff --git a/packages/napcat-onebot/action/user/GetRecentContact.ts b/packages/napcat-onebot/action/user/GetRecentContact.ts index 8a8b6585..0ecc2883 100644 --- a/packages/napcat-onebot/action/user/GetRecentContact.ts +++ b/packages/napcat-onebot/action/user/GetRecentContact.ts @@ -2,6 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; import { Static, Type } from '@sinclair/typebox'; +import { UserActionsExamples } from './examples'; export const GetRecentContactPayloadSchema = Type.Object({ count: Type.Union([Type.Number(), Type.String()], { default: 10, description: '获取的数量' }), @@ -27,6 +28,9 @@ export default class GetRecentContact extends OneBotAction { const ret = await this.core.apis.UserApi.getRecentContactListSnapShot(+payload.count); diff --git a/packages/napcat-onebot/action/user/examples.ts b/packages/napcat-onebot/action/user/examples.ts new file mode 100644 index 00000000..558637aa --- /dev/null +++ b/packages/napcat-onebot/action/user/examples.ts @@ -0,0 +1,38 @@ +export const UserActionsExamples = { + GetCookies: { + payload: { domain: 'qun.qq.com' }, + response: { cookies: 'p_skey=xxx; p_uin=o0123456789;' }, + }, + GetFriendList: { + payload: {}, + response: [{ user_id: 123456789, nickname: '昵称', remark: '备注' }], + }, + GetRecentContact: { + payload: { count: 10 }, + response: [ + { + lastestMsg: 'hello', + peerUin: '123456789', + remark: 'remark', + msgTime: '1710000000', + chatType: 1, + msgId: '12345', + sendNickName: 'nick', + sendMemberName: 'card', + peerName: 'name', + }, + ], + }, + SendLike: { + payload: { user_id: '123456789', times: 10 }, + response: {}, + }, + SetFriendAddRequest: { + payload: { flag: 'flag_123', approve: true, remark: '好友' }, + response: {}, + }, + SetFriendRemark: { + payload: { user_id: '123456789', remark: '新备注' }, + response: {}, + }, +}; From 7784dd9d7b72199f5a4132af847e2ad413cd1fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 17:55:13 +0800 Subject: [PATCH 08/17] Update GetGroupMemberList.ts --- .../action/group/GetGroupMemberList.ts | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/napcat-onebot/action/group/GetGroupMemberList.ts b/packages/napcat-onebot/action/group/GetGroupMemberList.ts index da7966b7..0dcd4f0c 100644 --- a/packages/napcat-onebot/action/group/GetGroupMemberList.ts +++ b/packages/napcat-onebot/action/group/GetGroupMemberList.ts @@ -3,6 +3,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { GroupMember } from 'napcat-core'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -18,17 +19,12 @@ type ReturnType = Static; export class GetGroupMemberList extends OneBotAction { override actionName = ActionName.GetGroupMemberList; override payloadSchema = PayloadSchema; - override returnSchema = ReturnSchema; override actionDescription = '获取群成员列表'; - override payloadExample = { group_id: '123456789' }; - override returnExample = [ - { - group_id: 123456789, - user_id: 987654321, - nickname: '测试成员', - card: '群名片', - role: 'member' - } - ]; + override returnSchema = ReturnSchema; + override actionDescription = '获取群成员列表'; + override actionTags = ['群组接口']; + override payloadExample = GroupActionsExamples.GetGroupMemberList.payload; + override returnExample = GroupActionsExamples.GetGroupMemberList.response; + async _handle (payload: PayloadType) { const groupIdStr = payload.group_id.toString(); const noCache = this.parseBoolean(payload.no_cache ?? false); From e6687750eb348665d4f46dcb7928305a900aacf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 18:06:24 +0800 Subject: [PATCH 09/17] Add actionSummary and improve action metadata Introduces the actionSummary property to OneBotAction and updates all action classes to provide concise summaries and improved descriptions. Refactors example imports for better modularity, adds new example files for guild and packet actions, and updates the OpenAPI schema generator to use the new summary and improved descriptions. This enhances API documentation clarity and consistency. --- packages/napcat-onebot/action/OneBotAction.ts | 1 + .../action/extends/GetAiCharacters.ts | 3 +- .../action/extends/GetClientkey.ts | 3 +- .../napcat-onebot/action/extends/OCRImage.ts | 5 +- .../action/extends/SetLongNick.ts | 1 + .../action/go-cqhttp/GetStrangerInfo.ts | 3 +- .../action/group/DelGroupNotice.ts | 3 +- .../action/group/GetGroupInfo.ts | 3 +- .../action/group/GetGroupList.ts | 3 +- .../action/group/GetGroupMemberInfo.ts | 9 ++-- .../action/group/GetGroupMemberList.ts | 3 +- .../action/group/SendGroupMsg.ts | 8 ++-- .../action/guild/GetGuildList.ts | 3 ++ .../action/guild/GetGuildProfile.ts | 3 ++ .../napcat-onebot/action/guild/examples.ts | 10 ++++ .../napcat-onebot/action/msg/DeleteMsg.ts | 3 +- packages/napcat-onebot/action/msg/GetMsg.ts | 9 ++-- .../napcat-onebot/action/msg/MarkMsgAsRead.ts | 6 ++- packages/napcat-onebot/action/msg/SendMsg.ts | 4 +- .../napcat-onebot/action/packet/examples.ts | 14 ++++++ .../action/system/GetLoginInfo.ts | 3 +- .../action/user/GetFriendList.ts | 3 +- .../napcat-onebot/action/user/SendLike.ts | 3 +- packages/napcat-schema/index.ts | 47 ++++++++++++++----- 24 files changed, 116 insertions(+), 37 deletions(-) create mode 100644 packages/napcat-onebot/action/guild/examples.ts create mode 100644 packages/napcat-onebot/action/packet/examples.ts diff --git a/packages/napcat-onebot/action/OneBotAction.ts b/packages/napcat-onebot/action/OneBotAction.ts index 121874d4..c10ea401 100644 --- a/packages/napcat-onebot/action/OneBotAction.ts +++ b/packages/napcat-onebot/action/OneBotAction.ts @@ -43,6 +43,7 @@ export abstract class OneBotAction { returnSchema?: TSchema = undefined; payloadExample?: unknown = undefined; returnExample?: unknown = undefined; + actionSummary: string = ''; actionDescription: string = ''; actionTags: string[] = []; obContext: NapCatOneBot11Adapter; diff --git a/packages/napcat-onebot/action/extends/GetAiCharacters.ts b/packages/napcat-onebot/action/extends/GetAiCharacters.ts index a4cb1876..bfbf93a5 100644 --- a/packages/napcat-onebot/action/extends/GetAiCharacters.ts +++ b/packages/napcat-onebot/action/extends/GetAiCharacters.ts @@ -32,7 +32,8 @@ export class GetAiCharacters extends GetPacketStatusDepends { override actionName = ActionName.GetClientkey; override payloadSchema = Type.Void(); override returnSchema = ReturnSchema; - override actionDescription = '获取 ClientKey'; + override actionSummary = '获取 ClientKey'; + override actionDescription = '获取当前登录帐号的 ClientKey'; override actionTags = ['扩展接口']; override payloadExample = ActionExamples.GetClientkey.payload; override returnExample = ActionExamples.GetClientkey.return; diff --git a/packages/napcat-onebot/action/extends/OCRImage.ts b/packages/napcat-onebot/action/extends/OCRImage.ts index 9d31007d..5acab9e6 100644 --- a/packages/napcat-onebot/action/extends/OCRImage.ts +++ b/packages/napcat-onebot/action/extends/OCRImage.ts @@ -19,7 +19,8 @@ type ReturnType = Static; class OCRImageBase extends OneBotAction { override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '图片 OCR 识别'; + override actionSummary = '图片 OCR 识别'; + override actionDescription = '识别图片中的文字内容'; override actionTags = ['扩展接口']; override payloadExample = ExtendsActionsExamples.OCRImage.payload; @@ -46,8 +47,10 @@ class OCRImageBase extends OneBotAction { export class OCRImage extends OCRImageBase { override actionName = ActionName.OCRImage; + override actionSummary = '图片 OCR 识别'; } export class IOCRImage extends OCRImageBase { override actionName = ActionName.IOCRImage; + override actionSummary = '图片 OCR 识别 (内部)'; } diff --git a/packages/napcat-onebot/action/extends/SetLongNick.ts b/packages/napcat-onebot/action/extends/SetLongNick.ts index a75a628e..af978160 100644 --- a/packages/napcat-onebot/action/extends/SetLongNick.ts +++ b/packages/napcat-onebot/action/extends/SetLongNick.ts @@ -1,6 +1,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ExtendsActionsExamples } from './examples'; const PayloadSchema = Type.Object({ longNick: Type.String({ description: '签名内容' }), diff --git a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts index 16c8f27f..c546e3db 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -37,7 +37,8 @@ export default class GoCQHTTPGetStrangerInfo extends OneBotAction { override actionName = ActionName.DelGroupNotice; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '删除群公告'; + override actionSummary = '删除群公告'; + override actionDescription = '删除群聊中的公告'; override actionTags = ['群组接口']; override payloadExample = ActionExamples.DelGroupNotice.payload; diff --git a/packages/napcat-onebot/action/group/GetGroupInfo.ts b/packages/napcat-onebot/action/group/GetGroupInfo.ts index 7c60def9..cfdb0861 100644 --- a/packages/napcat-onebot/action/group/GetGroupInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupInfo.ts @@ -20,7 +20,8 @@ class GetGroupInfo extends OneBotAction { override actionName = ActionName.GetGroupInfo; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取群信息'; + override actionSummary = '获取群信息'; + override actionDescription = '获取群聊的基本信息'; override actionTags = ['群组接口']; override payloadExample = GroupActionsExamples.GetGroupInfo.payload; diff --git a/packages/napcat-onebot/action/group/GetGroupList.ts b/packages/napcat-onebot/action/group/GetGroupList.ts index 05f0c250..4b2f87e4 100644 --- a/packages/napcat-onebot/action/group/GetGroupList.ts +++ b/packages/napcat-onebot/action/group/GetGroupList.ts @@ -20,7 +20,8 @@ class GetGroupList extends OneBotAction { override actionName = ActionName.GetGroupList; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取群列表'; + override actionSummary = '获取群列表'; + override actionDescription = '获取当前帐号的群聊列表'; override actionTags = ['群组接口']; override payloadExample = ActionExamples.GetGroupList.payload; override returnExample = ActionExamples.GetGroupList.return; diff --git a/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts b/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts index 0b534a09..912cdad6 100644 --- a/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupMemberInfo.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { OB11GroupMemberSchema } from '../schemas'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -22,10 +22,11 @@ class GetGroupMemberInfo extends OneBotAction { override actionName = ActionName.GetGroupMemberInfo; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取群成员信息'; + override actionSummary = '获取群成员信息'; + override actionDescription = '获取群聊中指定成员的信息'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.GetGroupMemberInfo.payload; - override returnExample = ActionExamples.GetGroupMemberInfo.return; + override payloadExample = GroupActionsExamples.GetGroupMemberInfo.payload; + override returnExample = GroupActionsExamples.GetGroupMemberInfo.response; private parseBoolean (value: boolean | string): boolean { return typeof value === 'string' ? value === 'true' : value; diff --git a/packages/napcat-onebot/action/group/GetGroupMemberList.ts b/packages/napcat-onebot/action/group/GetGroupMemberList.ts index 0dcd4f0c..acf01c8f 100644 --- a/packages/napcat-onebot/action/group/GetGroupMemberList.ts +++ b/packages/napcat-onebot/action/group/GetGroupMemberList.ts @@ -20,7 +20,8 @@ export class GetGroupMemberList extends OneBotAction { override actionName = ActionName.GetGroupMemberList; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取群成员列表'; + override actionSummary = '获取群成员列表'; + override actionDescription = '获取群聊中的所有成员列表'; override actionTags = ['群组接口']; override payloadExample = GroupActionsExamples.GetGroupMemberList.payload; override returnExample = GroupActionsExamples.GetGroupMemberList.response; diff --git a/packages/napcat-onebot/action/group/SendGroupMsg.ts b/packages/napcat-onebot/action/group/SendGroupMsg.ts index a6db5172..3341a51d 100644 --- a/packages/napcat-onebot/action/group/SendGroupMsg.ts +++ b/packages/napcat-onebot/action/group/SendGroupMsg.ts @@ -1,14 +1,16 @@ import { ContextMode, ReturnDataType, SendMsgBase, SendMsgPayload } from '@/napcat-onebot/action/msg/SendMsg'; import { ActionName, BaseCheckResult } from '@/napcat-onebot/action/router'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; // 未检测参数 class SendGroupMsg extends SendMsgBase { override actionName = ActionName.SendGroupMsg; + override actionSummary = '发送群消息'; override actionDescription = '发送群消息'; - override payloadExample = ActionExamples.SendGroupMsg.payload; - override returnExample = ActionExamples.SendGroupMsg.return; + override actionTags = ['群组接口']; + override payloadExample = GroupActionsExamples.SendGroupMsg.payload; + override returnExample = GroupActionsExamples.SendGroupMsg.response; protected override async check (payload: SendMsgPayload): Promise { delete payload.user_id; diff --git a/packages/napcat-onebot/action/guild/GetGuildList.ts b/packages/napcat-onebot/action/guild/GetGuildList.ts index 3d2d1379..77fe4a5e 100644 --- a/packages/napcat-onebot/action/guild/GetGuildList.ts +++ b/packages/napcat-onebot/action/guild/GetGuildList.ts @@ -2,6 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type } from '@sinclair/typebox'; +import { GuildActionsExamples } from './examples'; export class GetGuildList extends OneBotAction { override actionName = ActionName.GetGuildList; @@ -9,6 +10,8 @@ export class GetGuildList extends OneBotAction { override returnSchema = Type.Null(); override actionDescription = '获取频道列表'; override actionTags = ['频道接口']; + override payloadExample = GuildActionsExamples.GetGuildList.payload; + override returnExample = GuildActionsExamples.GetGuildList.response; async _handle (): Promise { diff --git a/packages/napcat-onebot/action/guild/GetGuildProfile.ts b/packages/napcat-onebot/action/guild/GetGuildProfile.ts index 0308c186..88ade402 100644 --- a/packages/napcat-onebot/action/guild/GetGuildProfile.ts +++ b/packages/napcat-onebot/action/guild/GetGuildProfile.ts @@ -2,6 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type } from '@sinclair/typebox'; +import { GuildActionsExamples } from './examples'; export class GetGuildProfile extends OneBotAction { override actionName = ActionName.GetGuildProfile; @@ -9,6 +10,8 @@ export class GetGuildProfile extends OneBotAction { override returnSchema = Type.Null(); override actionDescription = '获取频道个人信息'; override actionTags = ['频道接口']; + override payloadExample = GuildActionsExamples.GetGuildProfile.payload; + override returnExample = GuildActionsExamples.GetGuildProfile.response; async _handle (): Promise { diff --git a/packages/napcat-onebot/action/guild/examples.ts b/packages/napcat-onebot/action/guild/examples.ts new file mode 100644 index 00000000..2e0a1fad --- /dev/null +++ b/packages/napcat-onebot/action/guild/examples.ts @@ -0,0 +1,10 @@ +export const GuildActionsExamples = { + GetGuildList: { + payload: {}, + response: [{ guild_id: '123456', guild_name: '测试频道' }], + }, + GetGuildProfile: { + payload: { guild_id: '123456' }, + response: { guild_id: '123456', guild_name: '测试频道', guild_display_id: '123' }, + }, +}; diff --git a/packages/napcat-onebot/action/msg/DeleteMsg.ts b/packages/napcat-onebot/action/msg/DeleteMsg.ts index aa1b100e..80892673 100644 --- a/packages/napcat-onebot/action/msg/DeleteMsg.ts +++ b/packages/napcat-onebot/action/msg/DeleteMsg.ts @@ -19,7 +19,8 @@ class DeleteMsg extends OneBotAction { override actionName = ActionName.DeleteMsg; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '撤回消息'; + override actionSummary = '撤回消息'; + override actionDescription = '撤回已发送的消息'; override actionTags = ['消息接口']; override payloadExample = ActionExamples.DeleteMsg.payload; diff --git a/packages/napcat-onebot/action/msg/GetMsg.ts b/packages/napcat-onebot/action/msg/GetMsg.ts index d9ebfe31..313e730f 100644 --- a/packages/napcat-onebot/action/msg/GetMsg.ts +++ b/packages/napcat-onebot/action/msg/GetMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; -import { ActionExamples } from '../examples'; +import { MsgActionsExamples } from './examples'; const PayloadSchema = Type.Object({ message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), @@ -33,10 +33,11 @@ class GetMsg extends OneBotAction { override actionName = ActionName.GetMsg; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取消息'; + override actionSummary = '获取消息'; + override actionDescription = '根据消息 ID 获取消息详细信息'; override actionTags = ['消息接口']; - override payloadExample = ActionExamples.GetMsg.payload; - override returnExample = ActionExamples.GetMsg.return; + override payloadExample = MsgActionsExamples.GetMsg.payload; + override returnExample = MsgActionsExamples.GetMsg.response; async _handle (payload: PayloadType, _adapter: string, config: NetworkAdapterConfig) { if (!payload.message_id) { diff --git a/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts b/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts index 6dbce521..bfa63c5e 100644 --- a/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts +++ b/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts @@ -19,7 +19,8 @@ const ReturnSchema = Type.Null({ description: '操作结果' }); type ReturnType = Static; class MarkMsgAsRead extends OneBotAction { - override actionDescription = '标记消息已读'; + override actionSummary = '标记消息已读'; + override actionDescription = '标记指定渠道的消息为已读'; override actionTags = ['消息接口']; override payloadExample = ActionExamples.MarkMsgAsRead.payload; @@ -62,18 +63,21 @@ export class MarkPrivateMsgAsRead extends MarkMsgAsRead { override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; override actionName = ActionName.MarkPrivateMsgAsRead; + override actionSummary = '标记私聊已读'; } export class MarkGroupMsgAsRead extends MarkMsgAsRead { override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; override actionName = ActionName.MarkGroupMsgAsRead; + override actionSummary = '标记群聊已读'; } export class GoCQHTTPMarkMsgAsRead extends MarkMsgAsRead { override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; override actionName = ActionName.GoCQHTTP_MarkMsgAsRead; + override actionSummary = '标记消息已读 (Go-CQHTTP)'; } export class MarkAllMsgAsRead extends OneBotAction { diff --git a/packages/napcat-onebot/action/msg/SendMsg.ts b/packages/napcat-onebot/action/msg/SendMsg.ts index 375389a4..6cfe8c7a 100644 --- a/packages/napcat-onebot/action/msg/SendMsg.ts +++ b/packages/napcat-onebot/action/msg/SendMsg.ts @@ -445,7 +445,9 @@ export class SendMsgBase extends OneBotAction { } export default class SendMsg extends SendMsgBase { override actionName = ActionName.SendMsg; - override actionDescription = '发送消息'; + override actionSummary = '发送消息'; + override actionDescription = '发送私聊或群聊消息'; + override actionTags = ['消息接口']; override payloadExample = ActionExamples.SendMsg.payload; override returnExample = ActionExamples.SendMsg.return; } diff --git a/packages/napcat-onebot/action/packet/examples.ts b/packages/napcat-onebot/action/packet/examples.ts new file mode 100644 index 00000000..8eec8af8 --- /dev/null +++ b/packages/napcat-onebot/action/packet/examples.ts @@ -0,0 +1,14 @@ +export const PacketActionsExamples = { + GetPacketStatus: { + payload: {}, + response: { status: 'ok' }, + }, + SendPoke: { + payload: { user_id: '123456789' }, + response: {}, + }, + SetGroupTodo: { + payload: { group_id: '123456', content: '待办内容' }, + response: {}, + }, +}; diff --git a/packages/napcat-onebot/action/system/GetLoginInfo.ts b/packages/napcat-onebot/action/system/GetLoginInfo.ts index 97aca4ae..cc567bfc 100644 --- a/packages/napcat-onebot/action/system/GetLoginInfo.ts +++ b/packages/napcat-onebot/action/system/GetLoginInfo.ts @@ -11,7 +11,8 @@ class GetLoginInfo extends OneBotAction { override actionName = ActionName.GetLoginInfo; override payloadSchema = Type.Object({}); override returnSchema = OB11UserSchema; - override actionDescription = '获取登录号信息'; + override actionSummary = '获取登录号信息'; + override actionDescription = '获取当前登录帐号的信息'; override actionTags = ['系统接口']; override payloadExample = ActionExamples.GetLoginInfo.payload; override returnExample = ActionExamples.GetLoginInfo.return; diff --git a/packages/napcat-onebot/action/user/GetFriendList.ts b/packages/napcat-onebot/action/user/GetFriendList.ts index 5285ffde..6e6f859e 100644 --- a/packages/napcat-onebot/action/user/GetFriendList.ts +++ b/packages/napcat-onebot/action/user/GetFriendList.ts @@ -20,7 +20,8 @@ export default class GetFriendList extends OneBotAction override actionName = ActionName.GetFriendList; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取好友列表'; + override actionSummary = '获取好友列表'; + override actionDescription = '获取当前帐号的好友列表'; override actionTags = ['用户接口']; override payloadExample = ActionExamples.GetFriendList.payload; override returnExample = ActionExamples.GetFriendList.return; diff --git a/packages/napcat-onebot/action/user/SendLike.ts b/packages/napcat-onebot/action/user/SendLike.ts index d4c90a74..5c44ec5b 100644 --- a/packages/napcat-onebot/action/user/SendLike.ts +++ b/packages/napcat-onebot/action/user/SendLike.ts @@ -15,7 +15,8 @@ export default class SendLike extends OneBotAction { override actionName = ActionName.SendLike; override payloadSchema = SendLikePayloadSchema; override returnSchema = Type.Null(); - override actionDescription = '点赞'; + override actionSummary = '点赞'; + override actionDescription = '给指定用户点赞'; override actionTags = ['用户接口']; override payloadExample = ActionExamples.SendLike.payload; override errorExamples = [ diff --git a/packages/napcat-schema/index.ts b/packages/napcat-schema/index.ts index 35d2ad39..5ce0f626 100644 --- a/packages/napcat-schema/index.ts +++ b/packages/napcat-schema/index.ts @@ -12,6 +12,7 @@ const __dirname = dirname(__filename); interface ActionSchemaInfo { payload?: TSchema; return?: TSchema; + summary?: string; description?: string; tags?: string[]; payloadExample?: unknown; @@ -30,6 +31,7 @@ export function initSchemas () { actionSchemas[handler.actionName] = { payload: action.payloadSchema, return: action.returnSchema, + summary: action.actionSummary, description: action.actionDescription, tags: action.actionTags, payloadExample: action.payloadExample, @@ -45,6 +47,7 @@ export function initSchemas () { actionSchemas[handler.actionName] = { payload: action.payloadSchema, return: action.returnSchema, + summary: action.actionSummary, description: action.actionDescription, tags: action.actionTags, payloadExample: action.payloadExample, @@ -65,8 +68,8 @@ export function generateOpenAPI () { const openapi: Record = { openapi: '3.1.0', info: { - title: 'NapCat OneBot 11 API', - description: 'Auto-generated OpenAPI schema for NapCat OneBot 11 actions', + title: 'NapCat OneBot 11 接口文档', + description: 'NapCatOneBot11 旨在提供更先进、更统一、更美观的 OneBot 11 协议实现。', version: '1.0.0' }, paths: {} as Record @@ -79,12 +82,27 @@ export function generateOpenAPI () { const cleanPayload = JSON.parse(JSON.stringify(schemas.payload || { type: 'object', properties: {} })); const cleanReturn = JSON.parse(JSON.stringify(schemas.return || { type: 'object', properties: {} })); - if (schemas.payloadExample) { - cleanPayload.example = schemas.payloadExample; - } - if (schemas.returnExample) { - cleanReturn.example = schemas.returnExample; - } + const wrappedPayload = { + type: 'object', + properties: { + action: { type: 'string', example: actionName }, + params: cleanPayload, + echo: { type: 'string', example: `${actionName}:1234567890` } + } + }; + + const wrappedReturn = { + type: 'object', + properties: { + status: { type: 'string', example: 'ok' }, + retcode: { type: 'number', example: 0 }, + data: cleanReturn, + message: { type: 'string', example: '' }, + wording: { type: 'string', example: '' }, + echo: { type: 'string', example: `${actionName}:1234567890` } + }, + required: ['status', 'retcode', 'data', 'message', 'wording'] + }; const paths = openapi['paths'] as Record; const responses: Record = { @@ -92,7 +110,7 @@ export function generateOpenAPI () { description: '成功', content: { 'application/json': { - schema: cleanReturn + schema: wrappedReturn } } } @@ -121,13 +139,18 @@ export function generateOpenAPI () { paths[path] = { post: { - summary: actionName, - description: schemas.description || actionName, + summary: schemas.summary || actionName, + description: schemas.description || schemas.summary || actionName, tags: schemas.tags || ['Default'], requestBody: { content: { 'application/json': { - schema: cleanPayload + schema: wrappedPayload, + example: { + action: actionName, + params: schemas.payloadExample || {}, + echo: `${actionName}:1234567890` + } } } }, From 1df37427484240fca4ee21535e4d15b4bb053205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 18:10:15 +0800 Subject: [PATCH 10/17] Enhance action metadata and add examples for new actions Added actionSummary, actionDescription, and actionTags to multiple OneBot actions for improved API documentation. Introduced payload and response examples for new actions (GetDoubtFriendsAddRequest, SetDoubtFriendsAddRequest) in a new examples.ts file. Also removed unused imports from several files for code clarity. --- packages/napcat-onebot/action/extends/SetLongNick.ts | 1 - packages/napcat-onebot/action/extends/SetQQAvatar.ts | 3 ++- packages/napcat-onebot/action/file/GetFile.ts | 7 +++---- packages/napcat-onebot/action/file/GetImage.ts | 4 +++- .../action/go-cqhttp/CreateGroupFileFolder.ts | 3 ++- .../action/go-cqhttp/GetGroupFileSystemInfo.ts | 3 ++- .../action/go-cqhttp/GetGroupRootFiles.ts | 3 ++- .../napcat-onebot/action/group/GetGroupDetailInfo.ts | 1 - packages/napcat-onebot/action/guild/GetGuildList.ts | 3 ++- packages/napcat-onebot/action/guild/GetGuildProfile.ts | 3 ++- .../action/new/GetDoubtFriendsAddRequest.ts | 6 ++++++ .../action/new/SetDoubtFriendsAddRequest.ts | 5 +++++ packages/napcat-onebot/action/new/examples.ts | 10 ++++++++++ 13 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 packages/napcat-onebot/action/new/examples.ts diff --git a/packages/napcat-onebot/action/extends/SetLongNick.ts b/packages/napcat-onebot/action/extends/SetLongNick.ts index af978160..a75a628e 100644 --- a/packages/napcat-onebot/action/extends/SetLongNick.ts +++ b/packages/napcat-onebot/action/extends/SetLongNick.ts @@ -1,7 +1,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ExtendsActionsExamples } from './examples'; const PayloadSchema = Type.Object({ longNick: Type.String({ description: '签名内容' }), diff --git a/packages/napcat-onebot/action/extends/SetQQAvatar.ts b/packages/napcat-onebot/action/extends/SetQQAvatar.ts index 064146b0..5c2e1b01 100644 --- a/packages/napcat-onebot/action/extends/SetQQAvatar.ts +++ b/packages/napcat-onebot/action/extends/SetQQAvatar.ts @@ -20,7 +20,8 @@ export default class SetAvatar extends OneBotAction { override actionName = ActionName.SetQQAvatar; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '设置 QQ 头像'; + override actionSummary = '设置 QQ 头像'; + override actionDescription = '设置当前帐号的 QQ 头像'; override actionTags = ['扩展接口']; override payloadExample = ActionExamples.SetQQAvatar.payload; diff --git a/packages/napcat-onebot/action/file/GetFile.ts b/packages/napcat-onebot/action/file/GetFile.ts index 69060711..fbf90197 100644 --- a/packages/napcat-onebot/action/file/GetFile.ts +++ b/packages/napcat-onebot/action/file/GetFile.ts @@ -5,7 +5,6 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { OB11MessageImage, OB11MessageVideo } from '@/napcat-onebot/types'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; export const GetFilePayloadSchema = Type.Object({ file: Type.Optional(Type.String({ description: '文件路径、URL或Base64' })), @@ -119,7 +118,7 @@ export class GetFileBase extends OneBotAction { export default class GetFile extends GetFileBase { override actionName = ActionName.GetFile; - override actionDescription = '获取文件'; - override payloadExample = ActionExamples.GetFile.payload; - override returnExample = ActionExamples.GetFile.return; + override actionSummary = '获取文件'; + override actionDescription = '获取指定文件的详细信息及下载路径'; + override actionTags = ['文件接口']; } diff --git a/packages/napcat-onebot/action/file/GetImage.ts b/packages/napcat-onebot/action/file/GetImage.ts index 6210ec2e..fc96ce9d 100644 --- a/packages/napcat-onebot/action/file/GetImage.ts +++ b/packages/napcat-onebot/action/file/GetImage.ts @@ -5,7 +5,9 @@ import { ActionExamples } from '../examples'; export default class GetImage extends GetFileBase { override actionName = ActionName.GetImage; - override actionDescription = '获取图片'; + override actionSummary = '获取图片'; + override actionDescription = '获取图片信息'; + override actionTags = ['文件接口']; override payloadExample = ActionExamples.GetImage.payload; override returnExample = ActionExamples.GetImage.return; } diff --git a/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 34de7dd4..546d35f8 100644 --- a/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -24,7 +24,8 @@ export class CreateGroupFileFolder extends OneBotAction override actionName = ActionName.GoCQHTTP_CreateGroupFileFolder; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '创建群文件目录'; + override actionSummary = '创建群文件目录'; + override actionDescription = '在群文件系统中创建新的文件夹'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.CreateGroupFileFolder.payload; diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 5e17cd26..f3eeca88 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -22,7 +22,8 @@ export class GetGroupFileSystemInfo extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetGroupRootFiles; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取群根目录文件列表'; + override actionSummary = '获取群根目录文件列表'; + override actionDescription = '获取群文件根目录下的所有文件和文件夹'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.GetGroupRootFiles.payload; diff --git a/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts b/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts index 16b393cf..b1edbe0a 100644 --- a/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts @@ -1,7 +1,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), diff --git a/packages/napcat-onebot/action/guild/GetGuildList.ts b/packages/napcat-onebot/action/guild/GetGuildList.ts index 77fe4a5e..caecbfa4 100644 --- a/packages/napcat-onebot/action/guild/GetGuildList.ts +++ b/packages/napcat-onebot/action/guild/GetGuildList.ts @@ -8,7 +8,8 @@ export class GetGuildList extends OneBotAction { override actionName = ActionName.GetGuildList; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); - override actionDescription = '获取频道列表'; + override actionSummary = '获取频道列表'; + override actionDescription = '获取当前帐号已加入的频道列表'; override actionTags = ['频道接口']; override payloadExample = GuildActionsExamples.GetGuildList.payload; override returnExample = GuildActionsExamples.GetGuildList.response; diff --git a/packages/napcat-onebot/action/guild/GetGuildProfile.ts b/packages/napcat-onebot/action/guild/GetGuildProfile.ts index 88ade402..5c762006 100644 --- a/packages/napcat-onebot/action/guild/GetGuildProfile.ts +++ b/packages/napcat-onebot/action/guild/GetGuildProfile.ts @@ -8,7 +8,8 @@ export class GetGuildProfile extends OneBotAction { override actionName = ActionName.GetGuildProfile; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); - override actionDescription = '获取频道个人信息'; + override actionSummary = '获取频道个人信息'; + override actionDescription = '获取当前帐号在频道中的个人资料'; override actionTags = ['频道接口']; override payloadExample = GuildActionsExamples.GetGuildProfile.payload; override returnExample = GuildActionsExamples.GetGuildProfile.response; diff --git a/packages/napcat-onebot/action/new/GetDoubtFriendsAddRequest.ts b/packages/napcat-onebot/action/new/GetDoubtFriendsAddRequest.ts index 159de28d..fdb98bb9 100644 --- a/packages/napcat-onebot/action/new/GetDoubtFriendsAddRequest.ts +++ b/packages/napcat-onebot/action/new/GetDoubtFriendsAddRequest.ts @@ -1,6 +1,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { NewActionsExamples } from './examples'; export const GetDoubtFriendsAddRequestPayloadSchema = Type.Object({ count: Type.Number({ default: 50, description: '获取数量' }), @@ -12,6 +13,11 @@ export class GetDoubtFriendsAddRequest extends OneBotAction Date: Sun, 25 Jan 2026 18:18:25 +0800 Subject: [PATCH 11/17] Refactor action examples and enhance metadata Replaced generic ActionExamples imports with more specific examples modules (FileActionsExamples, GroupActionsExamples, GoCQHTTPActionsExamples) across file, group, and go-cqhttp actions. Added or updated actionSummary, actionDescription, actionTags, payloadExample, and returnExample properties for improved API documentation and clarity. --- packages/napcat-onebot/action/file/GetFile.ts | 3 +++ packages/napcat-onebot/action/file/GetGroupFileUrl.ts | 9 +++++---- packages/napcat-onebot/action/file/GetImage.ts | 8 ++++---- .../napcat-onebot/action/file/GetPrivateFileUrl.ts | 9 +++++---- packages/napcat-onebot/action/file/GetRecord.ts | 10 ++++++---- .../napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts | 4 +++- .../action/go-cqhttp/DeleteGroupFileFolder.ts | 4 +++- .../napcat-onebot/action/go-cqhttp/DownloadFile.ts | 4 +++- .../napcat-onebot/action/go-cqhttp/GetForwardMsg.ts | 4 +++- .../action/go-cqhttp/GetFriendMsgHistory.ts | 4 +++- .../action/go-cqhttp/GetGroupAtAllRemain.ts | 4 +++- .../action/go-cqhttp/GetGroupFileSystemInfo.ts | 1 + .../action/go-cqhttp/GetGroupFilesByFolder.ts | 4 +++- .../action/go-cqhttp/GetGroupHonorInfo.ts | 4 +++- .../action/go-cqhttp/GetGroupMsgHistory.ts | 4 +++- .../action/go-cqhttp/GetGroupRootFiles.ts | 1 + .../napcat-onebot/action/go-cqhttp/GetOnlineClient.ts | 4 +++- .../napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts | 1 + .../action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 4 +++- .../action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 4 +++- .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 4 +++- .../action/go-cqhttp/GoCQHTTPSetModelShow.ts | 4 +++- packages/napcat-onebot/action/go-cqhttp/QuickAction.ts | 4 +++- .../napcat-onebot/action/go-cqhttp/SendForwardMsg.ts | 7 ++++++- .../napcat-onebot/action/go-cqhttp/SendGroupNotice.ts | 4 +++- .../napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts | 4 +++- .../napcat-onebot/action/go-cqhttp/SetQQProfile.ts | 4 +++- .../napcat-onebot/action/go-cqhttp/UploadGroupFile.ts | 4 +++- .../action/go-cqhttp/UploadPrivateFile.ts | 4 +++- packages/napcat-onebot/action/group/DelEssenceMsg.ts | 8 +++++--- packages/napcat-onebot/action/group/DelGroupNotice.ts | 5 +++-- packages/napcat-onebot/action/group/GetAiRecord.ts | 6 ++---- .../napcat-onebot/action/group/GetGroupDetailInfo.ts | 7 +++++++ packages/napcat-onebot/action/group/GetGroupEssence.ts | 7 +++++++ .../action/group/GetGroupIgnoredNotifies.ts | 3 +++ packages/napcat-onebot/action/group/GetGroupInfo.ts | 1 + packages/napcat-onebot/action/group/GetGroupNotice.ts | 9 +++++---- .../napcat-onebot/action/group/GetGroupShutList.ts | 3 +++ .../napcat-onebot/action/group/SendGroupAiRecord.ts | 6 ++---- packages/napcat-onebot/action/group/SetEssenceMsg.ts | 8 +++++--- .../napcat-onebot/action/group/SetGroupAddRequest.ts | 8 +++++--- packages/napcat-onebot/action/group/SetGroupAdmin.ts | 8 +++++--- packages/napcat-onebot/action/group/SetGroupBan.ts | 8 +++++--- packages/napcat-onebot/action/group/SetGroupCard.ts | 8 +++++--- packages/napcat-onebot/action/group/SetGroupKick.ts | 8 +++++--- packages/napcat-onebot/action/group/SetGroupLeave.ts | 8 +++++--- packages/napcat-onebot/action/group/SetGroupName.ts | 8 +++++--- .../napcat-onebot/action/group/SetGroupWholeBan.ts | 8 +++++--- 48 files changed, 175 insertions(+), 81 deletions(-) diff --git a/packages/napcat-onebot/action/file/GetFile.ts b/packages/napcat-onebot/action/file/GetFile.ts index fbf90197..00eae1a2 100644 --- a/packages/napcat-onebot/action/file/GetFile.ts +++ b/packages/napcat-onebot/action/file/GetFile.ts @@ -5,6 +5,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { OB11MessageImage, OB11MessageVideo } from '@/napcat-onebot/types'; import { Static, Type } from '@sinclair/typebox'; +import { FileActionsExamples } from './examples'; export const GetFilePayloadSchema = Type.Object({ file: Type.Optional(Type.String({ description: '文件路径、URL或Base64' })), @@ -121,4 +122,6 @@ export default class GetFile extends GetFileBase { override actionSummary = '获取文件'; override actionDescription = '获取指定文件的详细信息及下载路径'; override actionTags = ['文件接口']; + override payloadExample = FileActionsExamples.GetFile.payload; + override returnExample = FileActionsExamples.GetFile.response; } diff --git a/packages/napcat-onebot/action/file/GetGroupFileUrl.ts b/packages/napcat-onebot/action/file/GetGroupFileUrl.ts index c14bb10d..9d79b2c1 100644 --- a/packages/napcat-onebot/action/file/GetGroupFileUrl.ts +++ b/packages/napcat-onebot/action/file/GetGroupFileUrl.ts @@ -3,7 +3,7 @@ import { FileNapCatOneBotUUID } from 'napcat-common/src/file-uuid'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { FileActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -22,10 +22,11 @@ export class GetGroupFileUrl extends GetPacketStatusDepends; export default class GetRecord extends GetFileBase { override actionName = ActionName.GetRecord; override payloadSchema = PayloadSchema; - override actionDescription = '获取语音'; - override payloadExample = ActionExamples.GetRecord.payload; - override returnExample = ActionExamples.GetRecord.return; + override actionSummary = '获取语音'; + override actionDescription = '获取指定语音文件的信息,并支持格式转换'; + override actionTags = ['文件接口']; + override payloadExample = FileActionsExamples.GetRecord.payload; + override returnExample = FileActionsExamples.GetRecord.response; override async _handle (payload: PayloadType): Promise { const res = await super._handle(payload as GetFilePayload); diff --git a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts index 046194f7..907929e1 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -19,9 +19,11 @@ export class DeleteGroupFile extends OneBotAction { override actionName = ActionName.GOCQHTTP_DeleteGroupFile; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '删除群文件'; + override actionSummary = '删除群文件'; + override actionDescription = '在群文件系统中删除指定的文件'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.DeleteGroupFile.payload; + override returnExample = GoCQHTTPActionsExamples.DeleteGroupFile.response; async _handle (payload: PayloadType) { const data = FileNapCatOneBotUUID.decodeModelId(payload.file_id); diff --git a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 496e00ae..d90415d6 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -19,9 +19,11 @@ export class DeleteGroupFileFolder extends OneBotAction override actionName = ActionName.GoCQHTTP_DeleteGroupFileFolder; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '删除群文件目录'; + override actionSummary = '删除群文件目录'; + override actionDescription = '在群文件系统中删除指定的文件夹'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.DeleteGroupFileFolder.payload; + override returnExample = GoCQHTTPActionsExamples.DeleteGroupFileFolder.response; async _handle (payload: PayloadType) { return (await this.core.apis.GroupApi.delGroupFileFolder( diff --git a/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts b/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts index a8190615..6279a9b1 100644 --- a/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/DownloadFile.ts @@ -26,9 +26,11 @@ export default class GoCQHTTPDownloadFile extends OneBotAction { const isRandomName = !payload.name; diff --git a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts index 0b4b69d7..c3fe80f7 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetForwardMsg.ts @@ -28,9 +28,11 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { // 处理参数 diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 0d46b81e..52eaa930 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -21,9 +21,11 @@ export class GoCQHTTPGetGroupAtAllRemain extends OneBotAction override actionName = ActionName.GoCQHTTP_GetGroupFilesByFolder; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取群文件夹文件列表'; + override actionSummary = '获取群文件夹文件列表'; + override actionDescription = '获取指定群文件夹下的文件及子文件夹列表'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.GetGroupFilesByFolder.payload; + override returnExample = GoCQHTTPActionsExamples.GetGroupFilesByFolder.response; async _handle (payload: PayloadType): Promise { const retRaw = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), { diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts index 728fac34..85341641 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -27,9 +27,11 @@ export class GetGroupHonorInfo extends OneBotAction { override actionName = ActionName.GetGroupHonorInfo; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取群荣誉信息'; + override actionSummary = '获取群荣誉信息'; + override actionDescription = '获取指定群聊的荣誉信息,如龙王等'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.GetGroupHonorInfo.payload; + override returnExample = GoCQHTTPActionsExamples.GetGroupHonorInfo.response; async _handle (payload: PayloadType): Promise { if (!payload.type) { diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts index 73d65e7a..bb440ec8 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -30,9 +30,11 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction { const peer: Peer = { chatType: ChatType.KCHATTYPEGROUP, peerUid: payload.group_id.toString() }; diff --git a/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts b/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts index fccf6f05..e5b74d33 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -26,6 +26,7 @@ export class GetGroupRootFiles extends OneBotAction { override actionDescription = '获取群文件根目录下的所有文件和文件夹'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.GetGroupRootFiles.payload; + override returnExample = GoCQHTTPActionsExamples.GetGroupRootFiles.response; async _handle (payload: PayloadType) { const ret = await this.core.apis.MsgApi.getGroupFileList(payload.group_id.toString(), { diff --git a/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts b/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts index a270979d..6d30abf4 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetOnlineClient.ts @@ -16,9 +16,11 @@ export class GetOnlineClient extends OneBotAction { override actionName = ActionName.GetOnlineClient; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取在线客户端'; + override actionSummary = '获取在线客户端'; + override actionDescription = '获取当前登录账号的在线客户端列表'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.GetOnlineClient.payload; + override returnExample = GoCQHTTPActionsExamples.GetOnlineClient.response; async _handle () { // 注册监听 diff --git a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts index c546e3db..ee627092 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -41,6 +41,7 @@ export default class GoCQHTTPGetStrangerInfo extends OneBotAction { const user_id = payload.user_id.toString(); diff --git a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index 85f06d2d..a281c738 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -19,9 +19,11 @@ export class GoCQHTTPCheckUrlSafely extends OneBotAction { override actionName = ActionName.GoCQHTTP_SetModelShow; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); - override actionDescription = '设置模型显示'; + override actionSummary = '设置模型显示'; + override actionDescription = '设置当前账号的设备模型显示名称'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.GoCQHTTPSetModelShow.payload; + override returnExample = GoCQHTTPActionsExamples.GoCQHTTPSetModelShow.response; async _handle () { diff --git a/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts b/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts index a0d7897a..0614c7a5 100644 --- a/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts +++ b/packages/napcat-onebot/action/go-cqhttp/QuickAction.ts @@ -63,9 +63,11 @@ export class GoCQHTTPHandleQuickAction extends OneBotAction { this.obContext.apis.QuickActionApi diff --git a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts index 713deb8a..24b6b132 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts @@ -2,6 +2,8 @@ import { OB11MessageMixType } from '@/napcat-onebot/types'; import { ContextMode, normalize, ReturnDataType, SendMsgBase, SendMsgPayload } from '@/napcat-onebot/action/msg/SendMsg'; import { ActionName } from '@/napcat-onebot/action/router'; +import { GoCQHTTPActionsExamples } from './examples'; + // 未验证 type GoCQHTTPSendForwardMsgPayload = SendMsgPayload & { messages?: OB11MessageMixType; }; @@ -13,8 +15,11 @@ export class GoCQHTTPSendForwardMsgBase extends SendMsgBase { } export class GoCQHTTPSendForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendForwardMsg; + override actionSummary = '发送合并转发消息'; override actionDescription = '发送合并转发消息'; - override actionTags = ['消息接口']; + override actionTags = ['Go-CQHTTP']; + override payloadExample = GoCQHTTPActionsExamples.SendForwardMsg.payload; + override returnExample = GoCQHTTPActionsExamples.SendForwardMsg.response; protected override async check (payload: GoCQHTTPSendForwardMsgPayload) { if (payload.messages) payload.message = normalize(payload.messages); diff --git a/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts b/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts index 5fe771a2..9ef23efb 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SendGroupNotice.ts @@ -22,9 +22,11 @@ export class SendGroupNotice extends OneBotAction override actionName = ActionName.GoCQHTTP_SendGroupNotice; override payloadSchema = SendGroupNoticePayloadSchema; override returnSchema = Type.Null(); - override actionDescription = '发送群公告'; + override actionSummary = '发送群公告'; + override actionDescription = '在指定群聊中发布新的公告'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.SendGroupNotice.payload; + override returnExample = GoCQHTTPActionsExamples.SendGroupNotice.response; async _handle (payload: SendGroupNoticePayload) { let UploadImage: { id: string, width: number, height: number; } | undefined; diff --git a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts index d56f1e3b..afd82dd1 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -23,9 +23,11 @@ export default class SetGroupPortrait extends OneBotAction { const { path, success } = (await uriToLocalFile(this.core.NapCatTempPath, payload.file)); diff --git a/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts b/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts index 3a28a374..7dfbbe11 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SetQQProfile.ts @@ -14,9 +14,11 @@ export class SetQQProfile extends OneBotAction { override actionName = ActionName.SetQQProfile; override payloadSchema = SetQQProfilePayloadSchema; override returnSchema = Type.Any({ description: '设置结果' }); - override actionDescription = '设置 QQ 资料'; + override actionSummary = '设置QQ资料'; + override actionDescription = '修改当前账号的昵称、个性签名等资料'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.SetQQProfile.payload; + override returnExample = GoCQHTTPActionsExamples.SetQQProfile.response; async _handle (payload: SetQQProfilePayload) { const self = this.core.selfInfo; diff --git a/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts b/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts index 5ad77b46..72169932 100644 --- a/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts @@ -28,9 +28,11 @@ export default class GoCQHTTPUploadGroupFile extends OneBotAction { let file = payload.file; diff --git a/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts b/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts index 781330ed..39e23908 100644 --- a/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -27,9 +27,11 @@ export default class GoCQHTTPUploadPrivateFile extends OneBotAction { if (payload.user_id) { diff --git a/packages/napcat-onebot/action/group/DelEssenceMsg.ts b/packages/napcat-onebot/action/group/DelEssenceMsg.ts index 079c4874..d151cb55 100644 --- a/packages/napcat-onebot/action/group/DelEssenceMsg.ts +++ b/packages/napcat-onebot/action/group/DelEssenceMsg.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ message_id: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: '消息ID' })), @@ -22,9 +22,11 @@ export default class DelEssenceMsg extends OneBotAction override actionName = ActionName.DelEssenceMsg; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '移出精华消息'; + override actionSummary = '移出精华消息'; + override actionDescription = '将一条消息从群精华消息列表中移出'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.DelEssenceMsg.payload; + override payloadExample = GroupActionsExamples.DelEssenceMsg.payload; + override returnExample = GroupActionsExamples.DelEssenceMsg.response; async _handle (payload: PayloadType): Promise { // 如果直接提供了 msg_seq, msg_random, group_id,优先使用 diff --git a/packages/napcat-onebot/action/group/DelGroupNotice.ts b/packages/napcat-onebot/action/group/DelGroupNotice.ts index d5c5acba..194b2f25 100644 --- a/packages/napcat-onebot/action/group/DelGroupNotice.ts +++ b/packages/napcat-onebot/action/group/DelGroupNotice.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -22,7 +22,8 @@ export class DelGroupNotice extends OneBotAction { override actionSummary = '删除群公告'; override actionDescription = '删除群聊中的公告'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.DelGroupNotice.payload; + override payloadExample = GroupActionsExamples.DelGroupNotice.payload; + override returnExample = GroupActionsExamples.DelGroupNotice.response; async _handle (payload: PayloadType) { const group = payload.group_id.toString(); diff --git a/packages/napcat-onebot/action/group/GetAiRecord.ts b/packages/napcat-onebot/action/group/GetAiRecord.ts index 4d079669..3d32d12e 100644 --- a/packages/napcat-onebot/action/group/GetAiRecord.ts +++ b/packages/napcat-onebot/action/group/GetAiRecord.ts @@ -3,8 +3,6 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { AIVoiceChatType } from 'napcat-core/packet/entities/aiChat'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; - const PayloadSchema = Type.Object({ character: Type.String({ description: '角色ID' }), group_id: Type.String({ description: '群号' }), @@ -21,9 +19,9 @@ export class GetAiRecord extends GetPacketStatusDepends override actionName = ActionName.GetAiRecord; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取AI语音'; + override actionSummary = '获取AI语音'; + override actionDescription = '通过AI语音引擎获取指定文本的语音URL'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.GetAiRecord.payload; async _handle (payload: PayloadType) { const rawRsp = await this.core.apis.PacketApi.pkt.operation.GetAiVoice(+payload.group_id, payload.character, payload.text, AIVoiceChatType.Sound); diff --git a/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts b/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts index b1edbe0a..736e8584 100644 --- a/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupDetailInfo.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { GroupActionsExamples } from './examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), }); @@ -23,6 +25,11 @@ export class GetGroupDetailInfo extends OneBotAction { override actionName = ActionName.GetGroupDetailInfo; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '获取群详细信息'; + override actionDescription = '获取群聊的详细信息,包括成员数、最大成员数等'; + override actionTags = ['群组接口']; + override payloadExample = GroupActionsExamples.GetGroupDetailInfo.payload; + override returnExample = GroupActionsExamples.GetGroupDetailInfo.response; async _handle (payload: PayloadType): Promise { const data = await this.core.apis.GroupApi.fetchGroupDetail(payload.group_id.toString()); diff --git a/packages/napcat-onebot/action/group/GetGroupEssence.ts b/packages/napcat-onebot/action/group/GetGroupEssence.ts index edae452b..7a323044 100644 --- a/packages/napcat-onebot/action/group/GetGroupEssence.ts +++ b/packages/napcat-onebot/action/group/GetGroupEssence.ts @@ -7,6 +7,8 @@ import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/napcat-onebot/config/config'; import { OB11MessageData, OB11MessageDataType } from '@/napcat-onebot/types'; +import { GroupActionsExamples } from './examples'; + const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), }); @@ -31,6 +33,11 @@ export class GetGroupEssence extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetEssenceMsg; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '获取群精华消息'; + override actionDescription = '获取指定群聊中的精华消息列表'; + override actionTags = ['群组接口']; + override payloadExample = GroupActionsExamples.GetGroupEssence.payload; + override returnExample = GroupActionsExamples.GetGroupEssence.response; private async msgSeqToMsgId (peer: Peer, msgSeq: string, msgRandom: string) { const replyMsgList = (await this.core.apis.MsgApi.getMsgsBySeqAndCount(peer, msgSeq, 1, true, true)).msgList.find((msg) => msg.msgSeq === msgSeq && msg.msgRandom === msgRandom); diff --git a/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts b/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts index 23c1d95c..a8aeee9a 100644 --- a/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts +++ b/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts @@ -19,6 +19,9 @@ export class GetGroupIgnoredNotifies extends OneBotAction { const SingleScreenNotifies = await this.core.apis.GroupApi.getSingleScreenNotifies(false, 50); diff --git a/packages/napcat-onebot/action/group/GetGroupInfo.ts b/packages/napcat-onebot/action/group/GetGroupInfo.ts index cfdb0861..62f4166b 100644 --- a/packages/napcat-onebot/action/group/GetGroupInfo.ts +++ b/packages/napcat-onebot/action/group/GetGroupInfo.ts @@ -24,6 +24,7 @@ class GetGroupInfo extends OneBotAction { override actionDescription = '获取群聊的基本信息'; override actionTags = ['群组接口']; override payloadExample = GroupActionsExamples.GetGroupInfo.payload; + override returnExample = GroupActionsExamples.GetGroupInfo.response; async _handle (payload: PayloadType) { const group = (await this.core.apis.GroupApi.getGroups()).find(e => e.groupCode === payload.group_id.toString()); diff --git a/packages/napcat-onebot/action/group/GetGroupNotice.ts b/packages/napcat-onebot/action/group/GetGroupNotice.ts index a6d5397c..eabf46ac 100644 --- a/packages/napcat-onebot/action/group/GetGroupNotice.ts +++ b/packages/napcat-onebot/action/group/GetGroupNotice.ts @@ -2,7 +2,7 @@ import { WebApiGroupNoticeFeed } from 'napcat-core'; import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -31,10 +31,11 @@ export class GetGroupNotice extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetGroupNotice; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取群公告'; + override actionSummary = '获取群公告'; + override actionDescription = '获取指定群聊中的公告列表'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.GetGroupNotice.payload; - override returnExample = ActionExamples.GetGroupNotice.return; + override payloadExample = GroupActionsExamples.GetGroupNotice.payload; + override returnExample = GroupActionsExamples.GetGroupNotice.response; async _handle (payload: PayloadType) { const group = payload.group_id.toString(); diff --git a/packages/napcat-onebot/action/group/GetGroupShutList.ts b/packages/napcat-onebot/action/group/GetGroupShutList.ts index d81835af..9d919808 100644 --- a/packages/napcat-onebot/action/group/GetGroupShutList.ts +++ b/packages/napcat-onebot/action/group/GetGroupShutList.ts @@ -16,6 +16,9 @@ export class GetGroupShutList extends OneBotAction { override actionName = ActionName.GetGroupShutList; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '获取群禁言列表'; + override actionDescription = '获取指定群聊中被禁言的成员列表'; + override actionTags = ['群组接口']; async _handle (payload: PayloadType) { return await this.core.apis.GroupApi.getGroupShutUpMemberList(payload.group_id.toString()); diff --git a/packages/napcat-onebot/action/group/SendGroupAiRecord.ts b/packages/napcat-onebot/action/group/SendGroupAiRecord.ts index a3943f76..12213748 100644 --- a/packages/napcat-onebot/action/group/SendGroupAiRecord.ts +++ b/packages/napcat-onebot/action/group/SendGroupAiRecord.ts @@ -3,8 +3,6 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { AIVoiceChatType } from 'napcat-core/packet/entities/aiChat'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; - const PayloadSchema = Type.Object({ character: Type.String({ description: '角色ID' }), group_id: Type.String({ description: '群号' }), @@ -23,9 +21,9 @@ export class SendGroupAiRecord extends GetPacketStatusDepends override actionName = ActionName.SetEssenceMsg; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '设置精华消息'; + override actionSummary = '设置精华消息'; + override actionDescription = '将一条消息设置为群精华消息'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.SetEssenceMsg.payload; + override payloadExample = GroupActionsExamples.SetEssenceMsg.payload; + override returnExample = GroupActionsExamples.SetEssenceMsg.response; async _handle (payload: PayloadType) { const msg = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id); diff --git a/packages/napcat-onebot/action/group/SetGroupAddRequest.ts b/packages/napcat-onebot/action/group/SetGroupAddRequest.ts index e9a5eb4f..9f7d9c92 100644 --- a/packages/napcat-onebot/action/group/SetGroupAddRequest.ts +++ b/packages/napcat-onebot/action/group/SetGroupAddRequest.ts @@ -3,7 +3,7 @@ import { GroupNotify, NTGroupRequestOperateTypes } from 'napcat-core/types'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ flag: Type.String({ description: '请求flag' }), @@ -22,9 +22,11 @@ export default class SetGroupAddRequest extends OneBotAction { const flag = payload.flag.toString(); diff --git a/packages/napcat-onebot/action/group/SetGroupAdmin.ts b/packages/napcat-onebot/action/group/SetGroupAdmin.ts index 615f83dd..3e2db283 100644 --- a/packages/napcat-onebot/action/group/SetGroupAdmin.ts +++ b/packages/napcat-onebot/action/group/SetGroupAdmin.ts @@ -3,7 +3,7 @@ import { NTGroupMemberRole } from 'napcat-core/types'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -21,9 +21,11 @@ export default class SetGroupAdmin extends OneBotAction override actionName = ActionName.SetGroupAdmin; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '设置群管理员'; + override actionSummary = '设置群管理员'; + override actionDescription = '设置或取消群聊中的管理员'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.SetGroupAdmin.payload; + override payloadExample = GroupActionsExamples.SetGroupAdmin.payload; + override returnExample = GroupActionsExamples.SetGroupAdmin.response; async _handle (payload: PayloadType): Promise { const enable = typeof payload.enable === 'string' ? payload.enable === 'true' : !!payload.enable; diff --git a/packages/napcat-onebot/action/group/SetGroupBan.ts b/packages/napcat-onebot/action/group/SetGroupBan.ts index 6159196a..349e1edf 100644 --- a/packages/napcat-onebot/action/group/SetGroupBan.ts +++ b/packages/napcat-onebot/action/group/SetGroupBan.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -20,9 +20,11 @@ export default class SetGroupBan extends OneBotAction { override actionName = ActionName.SetGroupBan; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '群组禁言'; + override actionSummary = '群组禁言'; + override actionDescription = '禁言群聊中的指定成员'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.SetGroupBan.payload; + override payloadExample = GroupActionsExamples.SetGroupBan.payload; + override returnExample = GroupActionsExamples.SetGroupBan.response; async _handle (payload: PayloadType): Promise { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); diff --git a/packages/napcat-onebot/action/group/SetGroupCard.ts b/packages/napcat-onebot/action/group/SetGroupCard.ts index 751f456b..e621b73a 100644 --- a/packages/napcat-onebot/action/group/SetGroupCard.ts +++ b/packages/napcat-onebot/action/group/SetGroupCard.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -20,9 +20,11 @@ export default class SetGroupCard extends OneBotAction override actionName = ActionName.SetGroupCard; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '设置群名片'; + override actionSummary = '设置群名片'; + override actionDescription = '设置群聊中指定成员的群名片'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.SetGroupCard.payload; + override payloadExample = GroupActionsExamples.SetGroupCard.payload; + override returnExample = GroupActionsExamples.SetGroupCard.response; async _handle (payload: PayloadType): Promise { const member = await this.core.apis.GroupApi.getGroupMember(payload.group_id.toString(), payload.user_id.toString()); diff --git a/packages/napcat-onebot/action/group/SetGroupKick.ts b/packages/napcat-onebot/action/group/SetGroupKick.ts index c914487d..26fe89a9 100644 --- a/packages/napcat-onebot/action/group/SetGroupKick.ts +++ b/packages/napcat-onebot/action/group/SetGroupKick.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -20,9 +20,11 @@ export default class SetGroupKick extends OneBotAction override actionName = ActionName.SetGroupKick; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '群组踢人'; + override actionSummary = '群组踢人'; + override actionDescription = '将指定成员踢出群聊'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.SetGroupKick.payload; + override payloadExample = GroupActionsExamples.SetGroupKick.payload; + override returnExample = GroupActionsExamples.SetGroupKick.response; async _handle (payload: PayloadType): Promise { const rejectReq = payload.reject_add_request?.toString() === 'true'; diff --git a/packages/napcat-onebot/action/group/SetGroupLeave.ts b/packages/napcat-onebot/action/group/SetGroupLeave.ts index 61d63dd1..f898065c 100644 --- a/packages/napcat-onebot/action/group/SetGroupLeave.ts +++ b/packages/napcat-onebot/action/group/SetGroupLeave.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -19,9 +19,11 @@ export default class SetGroupLeave extends OneBotAction override actionName = ActionName.SetGroupLeave; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '退出群组'; + override actionSummary = '退出群组'; + override actionDescription = '退出或解散指定群聊'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.SetGroupLeave.payload; + override payloadExample = GroupActionsExamples.SetGroupLeave.payload; + override returnExample = GroupActionsExamples.SetGroupLeave.response; async _handle (payload: PayloadType): Promise { await this.core.apis.GroupApi.quitGroup(payload.group_id.toString()); diff --git a/packages/napcat-onebot/action/group/SetGroupName.ts b/packages/napcat-onebot/action/group/SetGroupName.ts index aacf0fa3..89056568 100644 --- a/packages/napcat-onebot/action/group/SetGroupName.ts +++ b/packages/napcat-onebot/action/group/SetGroupName.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -19,9 +19,11 @@ export default class SetGroupName extends OneBotAction override actionName = ActionName.SetGroupName; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '设置群名称'; + override actionSummary = '设置群名称'; + override actionDescription = '修改指定群聊的名称'; override actionTags = ['群组接口']; - override payloadExample = ActionExamples.SetGroupName.payload; + override payloadExample = GroupActionsExamples.SetGroupName.payload; + override returnExample = GroupActionsExamples.SetGroupName.response; async _handle (payload: PayloadType): Promise { const ret = await this.core.apis.GroupApi.setGroupName(payload.group_id.toString(), payload.group_name); diff --git a/packages/napcat-onebot/action/group/SetGroupWholeBan.ts b/packages/napcat-onebot/action/group/SetGroupWholeBan.ts index 3be9f976..caa6e2fa 100644 --- a/packages/napcat-onebot/action/group/SetGroupWholeBan.ts +++ b/packages/napcat-onebot/action/group/SetGroupWholeBan.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { GroupActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -19,9 +19,11 @@ export default class SetGroupWholeBan extends OneBotAction { const enable = payload.enable?.toString() !== 'false'; From 5b80a8576fb2b6c4687e6ea731475b962b4e133f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 18:23:19 +0800 Subject: [PATCH 12/17] Refactor extends actions to use new examples module Replaced imports of ActionExamples with ExtendsActionsExamples in all extends actions. Updated action summary, description, tags, and example references for consistency and clarity across actions. This improves maintainability and aligns with the new examples structure. --- .../napcat-onebot/action/extends/GetAiCharacters.ts | 10 +++++----- packages/napcat-onebot/action/extends/GetClientkey.ts | 10 +++++----- packages/napcat-onebot/action/extends/GetRkey.ts | 7 +++++++ packages/napcat-onebot/action/extends/OCRImage.ts | 1 + .../action/extends/SetGroupKickMembers.ts | 8 +++++--- packages/napcat-onebot/action/extends/SetLongNick.ts | 7 +++++++ packages/napcat-onebot/action/extends/SetQQAvatar.ts | 9 +++++---- .../napcat-onebot/action/extends/SetSpecialTitle.ts | 8 +++++--- .../action/extends/TranslateEnWordToZn.ts | 7 +++++++ .../napcat-onebot/action/packet/GetPacketStatus.ts | 6 +++++- packages/napcat-onebot/action/packet/SendPoke.ts | 8 +++++--- packages/napcat-onebot/action/packet/SetGroupTodo.ts | 10 ++++++---- .../napcat-onebot/action/stream/DownloadFileStream.ts | 3 +++ .../napcat-onebot/action/stream/UploadFileStream.ts | 3 +++ 14 files changed, 69 insertions(+), 28 deletions(-) diff --git a/packages/napcat-onebot/action/extends/GetAiCharacters.ts b/packages/napcat-onebot/action/extends/GetAiCharacters.ts index bfbf93a5..54ec2e54 100644 --- a/packages/napcat-onebot/action/extends/GetAiCharacters.ts +++ b/packages/napcat-onebot/action/extends/GetAiCharacters.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Type, Static } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { ExtendsActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -32,11 +32,11 @@ export class GetAiCharacters extends GetPacketStatusDepends { override actionName = ActionName.GetClientkey; override payloadSchema = Type.Void(); override returnSchema = ReturnSchema; - override actionSummary = '获取 ClientKey'; - override actionDescription = '获取当前登录帐号的 ClientKey'; + override actionSummary = '获取ClientKey'; + override actionDescription = '获取当前登录帐号的ClientKey'; override actionTags = ['扩展接口']; - override payloadExample = ActionExamples.GetClientkey.payload; - override returnExample = ActionExamples.GetClientkey.return; + override payloadExample = ExtendsActionsExamples.GetClientkey.payload; + override returnExample = ExtendsActionsExamples.GetClientkey.response; async _handle () { return { clientkey: (await this.core.apis.UserApi.forceFetchClientKey()).clientKey }; diff --git a/packages/napcat-onebot/action/extends/GetRkey.ts b/packages/napcat-onebot/action/extends/GetRkey.ts index 2bd05e3a..a76bb540 100644 --- a/packages/napcat-onebot/action/extends/GetRkey.ts +++ b/packages/napcat-onebot/action/extends/GetRkey.ts @@ -2,6 +2,8 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Type, Static } from '@sinclair/typebox'; +import { ExtendsActionsExamples } from './examples'; + const ReturnSchema = Type.Array(Type.Any(), { description: 'Rkey列表' }); type ReturnType = Static; @@ -10,6 +12,11 @@ export class GetRkey extends GetPacketStatusDepends { override actionName = ActionName.GetRkey; override payloadSchema = Type.Void(); override returnSchema = ReturnSchema; + override actionSummary = '获取Rkey'; + override actionDescription = '获取用于媒体资源的Rkey列表'; + override actionTags = ['扩展接口']; + override payloadExample = ExtendsActionsExamples.GetRkey.payload; + override returnExample = ExtendsActionsExamples.GetRkey.response; async _handle () { return await this.core.apis.PacketApi.pkt.operation.FetchRkey(); diff --git a/packages/napcat-onebot/action/extends/OCRImage.ts b/packages/napcat-onebot/action/extends/OCRImage.ts index 5acab9e6..7a79e153 100644 --- a/packages/napcat-onebot/action/extends/OCRImage.ts +++ b/packages/napcat-onebot/action/extends/OCRImage.ts @@ -23,6 +23,7 @@ class OCRImageBase extends OneBotAction { override actionDescription = '识别图片中的文字内容'; override actionTags = ['扩展接口']; override payloadExample = ExtendsActionsExamples.OCRImage.payload; + override returnExample = ExtendsActionsExamples.OCRImage.response; async _handle (payload: PayloadType): Promise { const { path, success } = await uriToLocalFile(this.core.NapCatTempPath, payload.image); diff --git a/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts b/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts index 783736db..aca57ea3 100644 --- a/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts +++ b/packages/napcat-onebot/action/extends/SetGroupKickMembers.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { ExtendsActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -20,9 +20,11 @@ export default class SetGroupKickMembers extends OneBotAction { const rejectReq = payload.reject_add_request?.toString() === 'true'; diff --git a/packages/napcat-onebot/action/extends/SetLongNick.ts b/packages/napcat-onebot/action/extends/SetLongNick.ts index a75a628e..a5b52b62 100644 --- a/packages/napcat-onebot/action/extends/SetLongNick.ts +++ b/packages/napcat-onebot/action/extends/SetLongNick.ts @@ -2,6 +2,8 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; +import { ExtendsActionsExamples } from './examples'; + const PayloadSchema = Type.Object({ longNick: Type.String({ description: '签名内容' }), }); @@ -16,6 +18,11 @@ export class SetLongNick extends OneBotAction { override actionName = ActionName.SetLongNick; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '设置个性签名'; + override actionDescription = '修改当前登录帐号的个性签名'; + override actionTags = ['扩展接口']; + override payloadExample = ExtendsActionsExamples.SetLongNick.payload; + override returnExample = ExtendsActionsExamples.SetLongNick.response; async _handle (payload: PayloadType) { return await this.core.apis.UserApi.setLongNick(payload.longNick); diff --git a/packages/napcat-onebot/action/extends/SetQQAvatar.ts b/packages/napcat-onebot/action/extends/SetQQAvatar.ts index 5c2e1b01..ca826bf4 100644 --- a/packages/napcat-onebot/action/extends/SetQQAvatar.ts +++ b/packages/napcat-onebot/action/extends/SetQQAvatar.ts @@ -4,7 +4,7 @@ import fs from 'node:fs/promises'; import { checkFileExist, uriToLocalFile } from 'napcat-common/src/file'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { ExtendsActionsExamples } from './examples'; const PayloadSchema = Type.Object({ file: Type.String({ description: '图片路径、URL或Base64' }), @@ -20,10 +20,11 @@ export default class SetAvatar extends OneBotAction { override actionName = ActionName.SetQQAvatar; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionSummary = '设置 QQ 头像'; - override actionDescription = '设置当前帐号的 QQ 头像'; + override actionSummary = '设置QQ头像'; + override actionDescription = '修改当前账号的QQ头像'; override actionTags = ['扩展接口']; - override payloadExample = ActionExamples.SetQQAvatar.payload; + override payloadExample = ExtendsActionsExamples.SetQQAvatar.payload; + override returnExample = ExtendsActionsExamples.SetQQAvatar.response; async _handle (payload: PayloadType): Promise { const { path, success } = (await uriToLocalFile(this.core.NapCatTempPath, payload.file)); diff --git a/packages/napcat-onebot/action/extends/SetSpecialTitle.ts b/packages/napcat-onebot/action/extends/SetSpecialTitle.ts index 9d665ecd..72775a08 100644 --- a/packages/napcat-onebot/action/extends/SetSpecialTitle.ts +++ b/packages/napcat-onebot/action/extends/SetSpecialTitle.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { ExtendsActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -20,9 +20,11 @@ export class SetSpecialTitle extends GetPacketStatusDepends { override actionName = ActionName.TranslateEnWordToZn; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '英文单词翻译'; + override actionDescription = '将英文单词列表翻译为中文'; + override actionTags = ['扩展接口']; + override payloadExample = ExtendsActionsExamples.TranslateEnWordToZn.payload; + override returnExample = ExtendsActionsExamples.TranslateEnWordToZn.response; async _handle (payload: PayloadType): Promise { const ret = await this.core.apis.SystemApi.translateEnWordToZn(payload.words); diff --git a/packages/napcat-onebot/action/packet/GetPacketStatus.ts b/packages/napcat-onebot/action/packet/GetPacketStatus.ts index f81ef33f..9fc0e73e 100644 --- a/packages/napcat-onebot/action/packet/GetPacketStatus.ts +++ b/packages/napcat-onebot/action/packet/GetPacketStatus.ts @@ -1,6 +1,7 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName, BaseCheckResult } from '@/napcat-onebot/action/router'; import { Type } from '@sinclair/typebox'; +import { PacketActionsExamples } from './examples'; export abstract class GetPacketStatusDepends extends OneBotAction { protected override async check (payload: PT): Promise { @@ -19,8 +20,11 @@ export class GetPacketStatus extends GetPacketStatusDepends { override actionName = ActionName.GetPacketStatus; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); - override actionDescription = '获取 Packet 状态'; + override actionSummary = '获取Packet状态'; + override actionDescription = '获取底层Packet服务的运行状态'; override actionTags = ['系统接口']; + override payloadExample = PacketActionsExamples.GetPacketStatus.payload; + override returnExample = PacketActionsExamples.GetPacketStatus.response; async _handle () { diff --git a/packages/napcat-onebot/action/packet/SendPoke.ts b/packages/napcat-onebot/action/packet/SendPoke.ts index 9845cd3a..b906a3c6 100644 --- a/packages/napcat-onebot/action/packet/SendPoke.ts +++ b/packages/napcat-onebot/action/packet/SendPoke.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; +import { PacketActionsExamples } from './examples'; export const SendPokePayloadSchema = Type.Object({ group_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '群号' })), @@ -14,9 +14,11 @@ export type SendPokePayload = Static; export class SendPokeBase extends GetPacketStatusDepends { override payloadSchema = SendPokePayloadSchema; override returnSchema = Type.Null(); - override actionDescription = '发送戳一戳'; + override actionSummary = '发送戳一戳'; + override actionDescription = '在群聊或私聊中发送戳一戳动作'; override actionTags = ['核心接口']; - override payloadExample = ActionExamples.SendPoke.payload; + override payloadExample = PacketActionsExamples.SendPoke.payload; + override returnExample = PacketActionsExamples.SendPoke.response; async _handle (payload: SendPokePayload) { // 这里的 !! 可以传入空字符串 忽略这些数据有利用接口统一接口 diff --git a/packages/napcat-onebot/action/packet/SetGroupTodo.ts b/packages/napcat-onebot/action/packet/SetGroupTodo.ts index 038e964d..936944ad 100644 --- a/packages/napcat-onebot/action/packet/SetGroupTodo.ts +++ b/packages/napcat-onebot/action/packet/SetGroupTodo.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketS import { Static, Type } from '@sinclair/typebox'; import { ActionName } from '../router'; -import { ActionExamples } from '../examples'; +import { PacketActionsExamples } from './examples'; export const SetGroupTodoPayloadSchema = Type.Object({ group_id: Type.Union([Type.String(), Type.Number()], { description: '群号' }), @@ -14,12 +14,14 @@ export const SetGroupTodoPayloadSchema = Type.Object({ export type SetGroupTodoPayload = Static; export class SetGroupTodo extends GetPacketStatusDepends { + override actionName = ActionName.SetGroupTodo; override payloadSchema = SetGroupTodoPayloadSchema; override returnSchema = Type.Null(); - override actionName = ActionName.SetGroupTodo; - override actionDescription = '设置群待办'; + override actionSummary = '设置群待办'; + override actionDescription = '将指定消息设置为群待办'; override actionTags = ['核心接口']; - override payloadExample = ActionExamples.SetGroupTodo.payload; + override payloadExample = PacketActionsExamples.SetGroupTodo.payload; + override returnExample = PacketActionsExamples.SetGroupTodo.response; async _handle (payload: SetGroupTodoPayload) { if (payload.message_seq) { diff --git a/packages/napcat-onebot/action/stream/DownloadFileStream.ts b/packages/napcat-onebot/action/stream/DownloadFileStream.ts index c0ac4b3f..ec542c34 100644 --- a/packages/napcat-onebot/action/stream/DownloadFileStream.ts +++ b/packages/napcat-onebot/action/stream/DownloadFileStream.ts @@ -17,6 +17,9 @@ export class DownloadFileStream extends BaseDownloadStream> { diff --git a/packages/napcat-onebot/action/stream/UploadFileStream.ts b/packages/napcat-onebot/action/stream/UploadFileStream.ts index 92ed67b4..a9035626 100644 --- a/packages/napcat-onebot/action/stream/UploadFileStream.ts +++ b/packages/napcat-onebot/action/stream/UploadFileStream.ts @@ -70,6 +70,9 @@ export class UploadFileStream extends OneBotAction(); From 60a9114495ef7183306786446c78f2af101de562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 19:19:03 +0800 Subject: [PATCH 13/17] Add action metadata to OneBot action classes Added or updated actionSummary, actionTags, payloadExample, and returnExample properties for all OneBot action classes in the napcat-onebot package. This improves API documentation and discoverability by providing concise summaries, categorization tags, and usage examples for each action. --- .../napcat-onebot/action/extends/BotExit.ts | 4 + .../extends/ClickInlineKeyboardButton.ts | 11 +- .../action/extends/CreateCollection.ts | 10 ++ .../action/extends/DelGroupAlbumMedia.ts | 9 ++ .../action/extends/DoGroupAlbumComment.ts | 10 ++ .../action/extends/FetchCustomFace.ts | 8 ++ .../action/extends/FetchEmojiLike.ts | 8 ++ .../action/extends/GetCollectionList.ts | 18 ++- .../action/extends/GetEmojiLikes.ts | 8 ++ .../action/extends/GetFriendWithCategory.ts | 11 ++ .../action/extends/GetGroupAddRequest.ts | 16 +++ .../action/extends/GetGroupAlbumMediaList.ts | 11 ++ .../action/extends/GetGroupInfoEx.ts | 10 ++ .../action/extends/GetMiniAppArk.ts | 10 +- .../action/extends/GetProfileLike.ts | 25 ++++ .../action/extends/GetQunAlbumList.ts | 10 ++ .../napcat-onebot/action/extends/GetRkey.ts | 16 ++- .../action/extends/GetRobotUinRange.ts | 6 + .../extends/GetUnidirectionalFriendList.ts | 12 ++ .../action/extends/GetUserStatus.ts | 9 ++ .../action/extends/MoveGroupFile.ts | 10 ++ .../action/extends/RenameGroupFile.ts | 10 ++ .../action/extends/SendPacket.ts | 9 ++ .../action/extends/SetDiyOnlineStatus.ts | 11 +- .../action/extends/SetGroupAddOption.ts | 9 ++ .../action/extends/SetGroupAlbumMediaLike.ts | 9 ++ .../action/extends/SetGroupRemark.ts | 11 +- .../action/extends/SetGroupRobotAddOption.ts | 9 ++ .../action/extends/SetGroupSearch.ts | 9 ++ .../action/extends/SetGroupSign.ts | 6 + .../action/extends/SetInputStatus.ts | 8 ++ .../action/extends/SetOnlineStatus.ts | 12 +- .../action/extends/ShareContact.ts | 17 +++ .../action/extends/TransGroupFile.ts | 10 ++ .../action/extends/UploadImageToQunAlbum.ts | 10 ++ .../action/file/flash/CreateFlashTask.ts | 9 ++ .../action/file/flash/DownloadFileset.ts | 6 + .../action/file/flash/GetFilesetIdByCode.ts | 8 ++ .../action/file/flash/GetFilesetInfo.ts | 9 ++ .../action/file/flash/GetFlashFileList.ts | 11 ++ .../action/file/flash/GetFlashFileUrl.ts | 8 ++ .../action/file/flash/GetShareLink.ts | 6 + .../action/file/flash/SendFlashMsg.ts | 9 ++ .../action/file/online/CancelOnlineFile.ts | 7 + .../file/online/GetOnlineFileMessages.ts | 6 + .../action/file/online/ReceiveOnlineFile.ts | 8 ++ .../action/file/online/RefuseOnlineFile.ts | 7 + .../action/file/online/SendOnlineFile.ts | 8 ++ .../action/file/online/SendOnlineFolder.ts | 7 + .../action/go-cqhttp/CreateGroupFileFolder.ts | 10 +- .../action/go-cqhttp/SendForwardMsg.ts | 29 ++++- .../napcat-onebot/action/group/GetAiRecord.ts | 12 +- .../action/group/GetGroupIgnoredNotifies.ts | 6 + .../action/group/GetGroupShutList.ts | 11 +- .../action/group/SendGroupAiRecord.ts | 12 +- .../napcat-onebot/action/msg/DeleteMsg.ts | 7 +- .../action/msg/ForwardSingleMsg.ts | 9 +- .../napcat-onebot/action/msg/MarkMsgAsRead.ts | 11 +- .../action/msg/SendPrivateMsg.ts | 12 +- .../action/msg/SetMsgEmojiLike.ts | 10 ++ .../action/new/SetDoubtFriendsAddRequest.ts | 7 +- .../action/packet/GetPacketStatus.ts | 5 +- .../napcat-onebot/action/packet/GetRkeyEx.ts | 11 ++ .../action/packet/GetRkeyServer.ts | 6 + .../action/stream/CleanStreamTempFile.ts | 6 + .../action/stream/DownloadFileImageStream.ts | 8 ++ .../action/stream/DownloadFileRecordStream.ts | 8 ++ .../action/stream/DownloadFileStream.ts | 9 ++ .../action/stream/TestStreamDownload.ts | 8 ++ .../action/stream/UploadFileStream.ts | 14 ++ .../action/system/CanSendImage.ts | 5 +- .../action/system/CanSendRecord.ts | 6 +- .../napcat-onebot/action/system/CleanCache.ts | 3 + .../napcat-onebot/action/system/GetCSRF.ts | 7 +- .../action/system/GetCredentials.ts | 14 +- .../napcat-onebot/action/system/GetStatus.ts | 11 +- .../action/system/GetSystemMsg.ts | 13 +- .../action/system/GetVersionInfo.ts | 11 +- .../napcat-onebot/action/system/SetRestart.ts | 3 + .../napcat-onebot/action/user/GetCookies.ts | 14 +- .../action/user/GetRecentContact.ts | 15 ++- .../napcat-onebot/action/user/SendLike.ts | 6 +- .../action/user/SetFriendAddRequest.ts | 12 +- .../action/user/SetFriendRemark.ts | 7 +- packages/napcat-schema/index.ts | 123 ++++++++++++------ packages/napcat-schema/package.json | 3 +- 86 files changed, 809 insertions(+), 136 deletions(-) diff --git a/packages/napcat-onebot/action/extends/BotExit.ts b/packages/napcat-onebot/action/extends/BotExit.ts index b5b5d9b8..c00e4739 100644 --- a/packages/napcat-onebot/action/extends/BotExit.ts +++ b/packages/napcat-onebot/action/extends/BotExit.ts @@ -6,6 +6,10 @@ export class BotExit extends OneBotAction { override actionName = ActionName.Exit; override payloadSchema = Type.Void(); override returnSchema = Type.Void(); + override actionSummary = '退出登录'; + override actionTags = ['系统扩展']; + override payloadExample = {}; + override returnExample = null; async _handle () { process.exit(0); diff --git a/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts b/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts index a2fd84b8..331ba1ca 100644 --- a/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/packages/napcat-onebot/action/extends/ClickInlineKeyboardButton.ts @@ -19,8 +19,15 @@ type ReturnType = Static; export class ClickInlineKeyboardButton extends OneBotAction { override actionName = ActionName.ClickInlineKeyboardButton; override payloadSchema = PayloadSchema; - override returnSchema = ReturnSchema; - + override returnSchema = ReturnSchema; override actionSummary = '点击内联键盘按钮'; + override actionTags = ['消息扩展']; + override payloadExample = { + message_id: 12345, + button_id: 'btn_1' + }; + override returnExample = { + result: true + }; async _handle (payload: PayloadType) { return await this.core.apis.MsgApi.clickInlineKeyboardButton({ buttonId: payload.button_id, diff --git a/packages/napcat-onebot/action/extends/CreateCollection.ts b/packages/napcat-onebot/action/extends/CreateCollection.ts index fdd113a0..d1801d3f 100644 --- a/packages/napcat-onebot/action/extends/CreateCollection.ts +++ b/packages/napcat-onebot/action/extends/CreateCollection.ts @@ -17,6 +17,16 @@ export class CreateCollection extends OneBotAction { override actionName = ActionName.CreateCollection; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '创建收藏'; + override actionTags = ['扩展接口']; + override payloadExample = { + rawData: '收藏内容', + brief: '收藏标题' + }; + override returnExample = { + result: 0, + errMsg: '' + }; async _handle (payload: PayloadType) { return await this.core.apis.CollectionApi.createCollection( diff --git a/packages/napcat-onebot/action/extends/DelGroupAlbumMedia.ts b/packages/napcat-onebot/action/extends/DelGroupAlbumMedia.ts index 6862b187..145d5e6f 100644 --- a/packages/napcat-onebot/action/extends/DelGroupAlbumMedia.ts +++ b/packages/napcat-onebot/action/extends/DelGroupAlbumMedia.ts @@ -16,6 +16,15 @@ type ReturnType = Static; export class DelGroupAlbumMedia extends OneBotAction { override actionName = ActionName.DelGroupAlbumMedia; + override actionSummary = '删除群相册媒体'; + override actionTags = ['群组扩展']; + override payloadExample = { + group_code: 123456, + media_id_list: ['media_id_1', 'media_id_2'] + }; + override returnExample = { + result: true + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/extends/DoGroupAlbumComment.ts b/packages/napcat-onebot/action/extends/DoGroupAlbumComment.ts index 8a2f4164..b6d4f787 100644 --- a/packages/napcat-onebot/action/extends/DoGroupAlbumComment.ts +++ b/packages/napcat-onebot/action/extends/DoGroupAlbumComment.ts @@ -13,6 +13,16 @@ export type DoGroupAlbumCommentPayload = Static { override actionName = ActionName.DoGroupAlbumComment; + override actionSummary = '发表群相册评论'; + override actionTags = ['群组扩展']; + override payloadExample = { + group_code: 123456, + media_id: 'media_id_1', + content: '很有意思' + }; + override returnExample = { + result: true + }; override payloadSchema = DoGroupAlbumCommentPayloadSchema; override returnSchema = Type.Any({ description: '评论结果' }); diff --git a/packages/napcat-onebot/action/extends/FetchCustomFace.ts b/packages/napcat-onebot/action/extends/FetchCustomFace.ts index b5ffbeb9..2215316b 100644 --- a/packages/napcat-onebot/action/extends/FetchCustomFace.ts +++ b/packages/napcat-onebot/action/extends/FetchCustomFace.ts @@ -16,6 +16,14 @@ export class FetchCustomFace extends OneBotAction { override actionName = ActionName.FetchCustomFace; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '获取自定义表情'; + override actionTags = ['系统扩展']; + override payloadExample = { + count: 10 + }; + override returnExample = [ + 'http://example.com/face1.png' + ]; async _handle (payload: PayloadType) { const ret = await this.core.apis.MsgApi.fetchFavEmojiList(+payload.count); diff --git a/packages/napcat-onebot/action/extends/FetchEmojiLike.ts b/packages/napcat-onebot/action/extends/FetchEmojiLike.ts index 677e5861..319668ec 100644 --- a/packages/napcat-onebot/action/extends/FetchEmojiLike.ts +++ b/packages/napcat-onebot/action/extends/FetchEmojiLike.ts @@ -30,6 +30,14 @@ type ReturnType = Static; export class FetchEmojiLike extends OneBotAction { override actionName = ActionName.FetchEmojiLike; + override actionSummary = '获取表情点赞详情'; + override actionTags = ['消息扩展']; + override payloadExample = { + message_id: 12345 + }; + override returnExample = { + likes: [{ emoji_id: '123', count: 10 }] + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/extends/GetCollectionList.ts b/packages/napcat-onebot/action/extends/GetCollectionList.ts index 5bdd1655..deb84dd2 100644 --- a/packages/napcat-onebot/action/extends/GetCollectionList.ts +++ b/packages/napcat-onebot/action/extends/GetCollectionList.ts @@ -2,8 +2,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; - const PayloadSchema = Type.Object({ category: Type.String({ description: '分类ID' }), count: Type.String({ default: '1', description: '获取数量' }), @@ -19,10 +17,18 @@ export class GetCollectionList extends OneBotAction { override actionName = ActionName.GetCollectionList; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionDescription = '获取收藏列表'; - override actionTags = ['扩展接口']; - override payloadExample = ActionExamples.GetCollectionList.payload; - override returnExample = ActionExamples.GetCollectionList.return; + override actionSummary = '获取收藏列表'; + override actionTags = ['系统扩展']; + override payloadExample = { + category: '1', + count: '10' + }; + override returnExample = [ + { + collection_id: '123', + title: '收藏标题' + } + ]; async _handle (payload: PayloadType) { return await this.core.apis.CollectionApi.getAllCollection(+payload.category, +payload.count); diff --git a/packages/napcat-onebot/action/extends/GetEmojiLikes.ts b/packages/napcat-onebot/action/extends/GetEmojiLikes.ts index 437804db..ef4a1c4d 100644 --- a/packages/napcat-onebot/action/extends/GetEmojiLikes.ts +++ b/packages/napcat-onebot/action/extends/GetEmojiLikes.ts @@ -26,6 +26,14 @@ type ReturnType = Static; export class GetEmojiLikes extends OneBotAction { override actionName = ActionName.GetEmojiLikes; + override actionSummary = '获取消息表情点赞列表'; + override actionTags = ['消息扩展']; + override payloadExample = { + message_id: 12345 + }; + override returnExample = { + likes: [{ emoji_id: '123', user_id: 654321 }] + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/extends/GetFriendWithCategory.ts b/packages/napcat-onebot/action/extends/GetFriendWithCategory.ts index ff0766ad..0d81d652 100644 --- a/packages/napcat-onebot/action/extends/GetFriendWithCategory.ts +++ b/packages/napcat-onebot/action/extends/GetFriendWithCategory.ts @@ -20,6 +20,17 @@ export class GetFriendWithCategory extends OneBotAction { override actionName = ActionName.GetFriendsWithCategory; override payloadSchema = Type.Void(); override returnSchema = ReturnSchema; + override actionSummary = '获取带分组的好友列表'; + override actionTags = ['用户扩展']; + override payloadExample = {}; + override returnExample = [ + { + categoryId: 1, + categoryName: '我的好友', + categoryMbCount: 1, + buddyList: [] + } + ]; async _handle () { const categories = await this.core.apis.FriendApi.getBuddyV2ExWithCate(); diff --git a/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts b/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts index 7e2b429e..a84258a8 100644 --- a/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts +++ b/packages/napcat-onebot/action/extends/GetGroupAddRequest.ts @@ -24,6 +24,22 @@ export default class GetGroupAddRequest extends OneBotAction { override actionName = ActionName.GetGroupIgnoreAddRequest; override payloadSchema = Type.Void(); override returnSchema = ReturnSchema; + override actionSummary = '获取群被忽略的加群请求'; + override actionTags = ['群组接口']; + override payloadExample = {}; + override returnExample = [ + { + request_id: 12345, + invitor_uin: 123456789, + invitor_nick: '邀请者', + group_id: 123456789, + message: '加群请求', + group_name: '群名称', + checked: false, + actor: 0, + requester_nick: '请求者' + } + ]; async _handle (): Promise { const NTQQUserApi = this.core.apis.UserApi; diff --git a/packages/napcat-onebot/action/extends/GetGroupAlbumMediaList.ts b/packages/napcat-onebot/action/extends/GetGroupAlbumMediaList.ts index fa64bd1c..317f8f8a 100644 --- a/packages/napcat-onebot/action/extends/GetGroupAlbumMediaList.ts +++ b/packages/napcat-onebot/action/extends/GetGroupAlbumMediaList.ts @@ -16,6 +16,17 @@ type ReturnType = Static; export class GetGroupAlbumMediaList extends OneBotAction { override actionName = ActionName.GetGroupAlbumMediaList; + override actionSummary = '获取群相册媒体列表'; + override actionTags = ['群组扩展']; + override payloadExample = { + group_code: 123456, + album_id: 'album_id_1' + }; + override returnExample = { + media_list: [ + { media_id: 'media_id_1', url: 'http://example.com/1.jpg' } + ] + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts b/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts index 7f5e697a..d0b2e04a 100644 --- a/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts +++ b/packages/napcat-onebot/action/extends/GetGroupInfoEx.ts @@ -13,6 +13,16 @@ type ReturnType = Static; export class GetGroupInfoEx extends OneBotAction { override actionName = ActionName.GetGroupInfoEx; + override actionSummary = '获取群详细信息 (扩展)'; + override actionTags = ['群组扩展']; + override payloadExample = { + group_id: 123456 + }; + override returnExample = { + group_id: 123456, + group_name: '测试群', + member_count: 100 + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/extends/GetMiniAppArk.ts b/packages/napcat-onebot/action/extends/GetMiniAppArk.ts index 8140608a..e3206f5e 100644 --- a/packages/napcat-onebot/action/extends/GetMiniAppArk.ts +++ b/packages/napcat-onebot/action/extends/GetMiniAppArk.ts @@ -45,8 +45,14 @@ type ReturnType = Static; export class GetMiniAppArk extends GetPacketStatusDepends { override actionName = ActionName.GetMiniAppArk; override payloadSchema = PayloadSchema; - override returnSchema = ReturnSchema; - + override returnSchema = ReturnSchema; override actionSummary = '获取小程序 Ark'; + override actionTags = ['系统扩展']; + override payloadExample = { + app_id: 'wx123456' + }; + override returnExample = { + ark: 'ark_content' + }; async _handle (payload: PayloadType) { let reqParam: MiniAppReqParams; const customParams: MiniAppReqCustomParams = { diff --git a/packages/napcat-onebot/action/extends/GetProfileLike.ts b/packages/napcat-onebot/action/extends/GetProfileLike.ts index f3b8b703..3dbf7823 100644 --- a/packages/napcat-onebot/action/extends/GetProfileLike.ts +++ b/packages/napcat-onebot/action/extends/GetProfileLike.ts @@ -34,6 +34,31 @@ export class GetProfileLike extends OneBotAction { override actionName = ActionName.GetProfileLike; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '获取资料点赞'; + override actionTags = ['用户扩展']; + override payloadExample = { + user_id: '123456789', + start: 0, + count: 10 + }; + override returnExample = { + uid: 'u_123', + time: '1734567890', + favoriteInfo: { + userInfos: [], + total_count: 10, + last_time: 1734567890, + today_count: 5 + }, + voteInfo: { + total_count: 100, + new_count: 2, + new_nearby_count: 0, + last_visit_time: 1734567890, + userInfos: [] + } + }; + async _handle (payload: PayloadType): Promise { const isSelf = this.core.selfInfo.uin === payload.user_id || !payload.user_id; const userUid = isSelf || !payload.user_id ? this.core.selfInfo.uid : await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); diff --git a/packages/napcat-onebot/action/extends/GetQunAlbumList.ts b/packages/napcat-onebot/action/extends/GetQunAlbumList.ts index 3c30bf15..2302f3ec 100644 --- a/packages/napcat-onebot/action/extends/GetQunAlbumList.ts +++ b/packages/napcat-onebot/action/extends/GetQunAlbumList.ts @@ -15,6 +15,16 @@ type GetQunAlbumListReturn = Awaited { override actionName = ActionName.GetQunAlbumList; + override actionSummary = '获取群相册列表'; + override actionTags = ['群组扩展']; + override payloadExample = { + group_code: 123456 + }; + override returnExample = { + album_list: [ + { album_id: 'album_id_1', album_name: '相册1' } + ] + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/extends/GetRkey.ts b/packages/napcat-onebot/action/extends/GetRkey.ts index a76bb540..e2eaf681 100644 --- a/packages/napcat-onebot/action/extends/GetRkey.ts +++ b/packages/napcat-onebot/action/extends/GetRkey.ts @@ -2,8 +2,6 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { GetPacketStatusDepends } from '@/napcat-onebot/action/packet/GetPacketStatus'; import { Type, Static } from '@sinclair/typebox'; -import { ExtendsActionsExamples } from './examples'; - const ReturnSchema = Type.Array(Type.Any(), { description: 'Rkey列表' }); type ReturnType = Static; @@ -12,11 +10,15 @@ export class GetRkey extends GetPacketStatusDepends { override actionName = ActionName.GetRkey; override payloadSchema = Type.Void(); override returnSchema = ReturnSchema; - override actionSummary = '获取Rkey'; - override actionDescription = '获取用于媒体资源的Rkey列表'; - override actionTags = ['扩展接口']; - override payloadExample = ExtendsActionsExamples.GetRkey.payload; - override returnExample = ExtendsActionsExamples.GetRkey.response; + override actionSummary = '获取 RKey'; + override actionTags = ['系统扩展']; + override payloadExample = {}; + override returnExample = [ + { + "key": "rkey_value", + "expired": 1734567890 + } + ]; async _handle () { return await this.core.apis.PacketApi.pkt.operation.FetchRkey(); diff --git a/packages/napcat-onebot/action/extends/GetRobotUinRange.ts b/packages/napcat-onebot/action/extends/GetRobotUinRange.ts index c29846f2..84e61939 100644 --- a/packages/napcat-onebot/action/extends/GetRobotUinRange.ts +++ b/packages/napcat-onebot/action/extends/GetRobotUinRange.ts @@ -8,6 +8,12 @@ type ReturnType = Static; export class GetRobotUinRange extends OneBotAction { override actionName = ActionName.GetRobotUinRange; + override actionSummary = '获取机器人 UIN 范围'; + override actionTags = ['系统扩展']; + override payloadExample = {}; + override returnExample = [ + { minUin: '12345678', maxUin: '87654321' } + ]; override payloadSchema = Type.Void(); override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts b/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts index 546121f8..077d35c1 100644 --- a/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts +++ b/packages/napcat-onebot/action/extends/GetUnidirectionalFriendList.ts @@ -21,6 +21,18 @@ export class GetUnidirectionalFriendList extends OneBotAction override actionName = ActionName.GetUnidirectionalFriendList; override payloadSchema = Type.Void(); override returnSchema = ReturnSchema; + override actionSummary = '获取单向好友列表'; + override actionTags = ['用户扩展']; + override payloadExample = {}; + override returnExample = [ + { + uin: 123456789, + uid: 'u_123', + nick_name: '单向好友', + age: 20, + source: '来源' + } + ]; async pack_data (data: string): Promise { return ProtoBuf(class extends ProtoBufBase { diff --git a/packages/napcat-onebot/action/extends/GetUserStatus.ts b/packages/napcat-onebot/action/extends/GetUserStatus.ts index 7b4a056f..65860762 100644 --- a/packages/napcat-onebot/action/extends/GetUserStatus.ts +++ b/packages/napcat-onebot/action/extends/GetUserStatus.ts @@ -19,6 +19,15 @@ export class GetUserStatus extends GetPacketStatusDepends; export class MoveGroupFile extends GetPacketStatusDepends { override actionName = ActionName.MoveGroupFile; + override actionSummary = '移动群文件'; + override actionTags = ['文件扩展']; + override payloadExample = { + group_id: 123456, + file_id: '/file_id', + parent_id: '/target_folder_id' + }; + override returnExample = { + result: true + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/extends/RenameGroupFile.ts b/packages/napcat-onebot/action/extends/RenameGroupFile.ts index b0df87d1..0ef446de 100644 --- a/packages/napcat-onebot/action/extends/RenameGroupFile.ts +++ b/packages/napcat-onebot/action/extends/RenameGroupFile.ts @@ -20,6 +20,16 @@ type ReturnType = Static; export class RenameGroupFile extends GetPacketStatusDepends { override actionName = ActionName.RenameGroupFile; + override actionSummary = '重命名群文件'; + override actionTags = ['文件扩展']; + override payloadExample = { + group_id: 123456, + file_id: '/file_id', + name: 'new_name.jpg' + }; + override returnExample = { + result: true + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/extends/SendPacket.ts b/packages/napcat-onebot/action/extends/SendPacket.ts index 1b54a2d0..9f687943 100644 --- a/packages/napcat-onebot/action/extends/SendPacket.ts +++ b/packages/napcat-onebot/action/extends/SendPacket.ts @@ -19,6 +19,15 @@ export class SendPacket extends GetPacketStatusDepends override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; override actionName = ActionName.SendPacket; + override actionSummary = '发送原始数据包'; + override actionTags = ['系统扩展']; + override payloadExample = { + cmd: 'Example.Cmd', + data: '123456', + rsp: true + }; + override returnExample = '123456'; + async _handle (payload: PayloadType) { const rsp = typeof payload.rsp === 'boolean' ? payload.rsp : payload.rsp === 'true'; const packetData = Buffer.from(payload.data, 'hex') as unknown as PacketBuf; diff --git a/packages/napcat-onebot/action/extends/SetDiyOnlineStatus.ts b/packages/napcat-onebot/action/extends/SetDiyOnlineStatus.ts index 1732bf69..983789a7 100644 --- a/packages/napcat-onebot/action/extends/SetDiyOnlineStatus.ts +++ b/packages/napcat-onebot/action/extends/SetDiyOnlineStatus.ts @@ -17,8 +17,15 @@ type ReturnType = Static; export class SetDiyOnlineStatus extends OneBotAction { override actionName = ActionName.SetDiyOnlineStatus; override payloadSchema = PayloadSchema; - override returnSchema = ReturnSchema; - + override returnSchema = ReturnSchema; override actionSummary = '设置自定义在线状态'; + override actionDescription = '设置自定义在线状态'; + override actionTags = ['用户扩展']; + override payloadExample = { + status: 11 + }; + override returnExample = { + result: 0 + }; async _handle (payload: PayloadType) { const ret = await this.core.apis.UserApi.setDiySelfOnlineStatus( payload.face_id.toString(), diff --git a/packages/napcat-onebot/action/extends/SetGroupAddOption.ts b/packages/napcat-onebot/action/extends/SetGroupAddOption.ts index c3f838e5..d857b911 100644 --- a/packages/napcat-onebot/action/extends/SetGroupAddOption.ts +++ b/packages/napcat-onebot/action/extends/SetGroupAddOption.ts @@ -17,6 +17,15 @@ type ReturnType = Static; export default class SetGroupAddOption extends OneBotAction { override actionName = ActionName.SetGroupAddOption; + override actionSummary = '设置群加群选项'; + override actionTags = ['群组扩展']; + override payloadExample = { + group_id: 123456, + option: 1 + }; + override returnExample = { + result: true + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; async _handle (payload: PayloadType): Promise { diff --git a/packages/napcat-onebot/action/extends/SetGroupAlbumMediaLike.ts b/packages/napcat-onebot/action/extends/SetGroupAlbumMediaLike.ts index c62e0970..ef79947a 100644 --- a/packages/napcat-onebot/action/extends/SetGroupAlbumMediaLike.ts +++ b/packages/napcat-onebot/action/extends/SetGroupAlbumMediaLike.ts @@ -18,6 +18,15 @@ type ReturnType = Static; export class SetGroupAlbumMediaLike extends OneBotAction { override actionName = ActionName.SetGroupAlbumMediaLike; + override actionSummary = '点赞群相册媒体'; + override actionTags = ['群组扩展']; + override payloadExample = { + group_code: 123456, + media_id: 'media_id_1' + }; + override returnExample = { + result: true + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/extends/SetGroupRemark.ts b/packages/napcat-onebot/action/extends/SetGroupRemark.ts index 5d361888..d245c016 100644 --- a/packages/napcat-onebot/action/extends/SetGroupRemark.ts +++ b/packages/napcat-onebot/action/extends/SetGroupRemark.ts @@ -2,8 +2,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; - const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), remark: Type.String({ description: '备注' }), @@ -19,9 +17,14 @@ export default class SetGroupRemark extends OneBotAction { const ret = await this.core.apis.GroupApi.setGroupRemark(payload.group_id, payload.remark); diff --git a/packages/napcat-onebot/action/extends/SetGroupRobotAddOption.ts b/packages/napcat-onebot/action/extends/SetGroupRobotAddOption.ts index 38930433..595d0669 100644 --- a/packages/napcat-onebot/action/extends/SetGroupRobotAddOption.ts +++ b/packages/napcat-onebot/action/extends/SetGroupRobotAddOption.ts @@ -16,6 +16,15 @@ type ReturnType = Static; export default class SetGroupRobotAddOption extends OneBotAction { override actionName = ActionName.SetGroupRobotAddOption; + override actionSummary = '设置群机器人加群选项'; + override actionTags = ['群组扩展']; + override payloadExample = { + group_id: 123456, + option: 1 + }; + override returnExample = { + result: true + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; async _handle (payload: PayloadType): Promise { diff --git a/packages/napcat-onebot/action/extends/SetGroupSearch.ts b/packages/napcat-onebot/action/extends/SetGroupSearch.ts index c7b4a569..f3732ddf 100644 --- a/packages/napcat-onebot/action/extends/SetGroupSearch.ts +++ b/packages/napcat-onebot/action/extends/SetGroupSearch.ts @@ -16,6 +16,15 @@ type ReturnType = Static; export default class SetGroupSearch extends OneBotAction { override actionName = ActionName.SetGroupSearch; + override actionSummary = '设置群搜索选项'; + override actionTags = ['群组扩展']; + override payloadExample = { + group_id: 123456, + is_searchable: true + }; + override returnExample = { + result: true + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; async _handle (payload: PayloadType): Promise { diff --git a/packages/napcat-onebot/action/extends/SetGroupSign.ts b/packages/napcat-onebot/action/extends/SetGroupSign.ts index 95c9b223..500c06b1 100644 --- a/packages/napcat-onebot/action/extends/SetGroupSign.ts +++ b/packages/napcat-onebot/action/extends/SetGroupSign.ts @@ -15,6 +15,12 @@ type ReturnType = Static; class SetGroupSignBase extends GetPacketStatusDepends { override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '设置群签名'; + override actionTags = ['群扩展']; + override payloadExample = { + group_id: '123456789' + }; + override returnExample = null; async _handle (payload: PayloadType) { return await this.core.apis.PacketApi.pkt.operation.GroupSign(+payload.group_id); diff --git a/packages/napcat-onebot/action/extends/SetInputStatus.ts b/packages/napcat-onebot/action/extends/SetInputStatus.ts index d1d2ad67..89a49f27 100644 --- a/packages/napcat-onebot/action/extends/SetInputStatus.ts +++ b/packages/napcat-onebot/action/extends/SetInputStatus.ts @@ -18,6 +18,14 @@ export class SetInputStatus extends OneBotAction { override actionName = ActionName.SetInputStatus; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '设置输入状态'; + override actionTags = ['系统扩展']; + override payloadExample = { + user_id: '123456789', + event_type: 1 + }; + override returnExample = null; + async _handle (payload: PayloadType) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('uid is empty'); diff --git a/packages/napcat-onebot/action/extends/SetOnlineStatus.ts b/packages/napcat-onebot/action/extends/SetOnlineStatus.ts index db14b260..73cad36c 100644 --- a/packages/napcat-onebot/action/extends/SetOnlineStatus.ts +++ b/packages/napcat-onebot/action/extends/SetOnlineStatus.ts @@ -2,8 +2,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; - const PayloadSchema = Type.Object({ status: Type.Union([Type.Number(), Type.String()], { description: '在线状态' }), ext_status: Type.Union([Type.Number(), Type.String()], { description: '扩展状态' }), @@ -20,9 +18,15 @@ export class SetOnlineStatus extends OneBotAction { override actionName = ActionName.SetOnlineStatus; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '设置在线状态'; override actionDescription = '设置在线状态'; - override actionTags = ['扩展接口']; - override payloadExample = ActionExamples.SetOnlineStatus.payload; + override actionTags = ['系统扩展']; + override payloadExample = { + status: 11, + ext_status: 0, + battery_status: 100 + }; + override returnExample = null; async _handle (payload: PayloadType) { const ret = await this.core.apis.UserApi.setSelfOnlineStatus( diff --git a/packages/napcat-onebot/action/extends/ShareContact.ts b/packages/napcat-onebot/action/extends/ShareContact.ts index f9f8d827..31ed0df5 100644 --- a/packages/napcat-onebot/action/extends/ShareContact.ts +++ b/packages/napcat-onebot/action/extends/ShareContact.ts @@ -18,6 +18,16 @@ export class SharePeerBase extends OneBotAction { override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; + override actionSummary = '分享用户 (Ark)'; + override actionDescription = '获取用户推荐的 Ark 内容'; + override actionTags = ['消息扩展']; + override payloadExample = { + user_id: '123456', + phone_number: '' + }; + override returnExample = { + ark: '...' + }; async _handle (payload: PayloadType) { if (payload.group_id) { @@ -44,6 +54,13 @@ type ReturnTypeGroupEx = Static; export class ShareGroupExBase extends OneBotAction { override payloadSchema = PayloadSchemaGroupEx; override returnSchema = ReturnSchemaGroupEx; + override actionSummary = '分享群 (Ark)'; + override actionDescription = '获取群分享的 Ark 内容'; + override actionTags = ['消息扩展']; + override payloadExample = { + group_id: '123456' + }; + override returnExample = '{"app": "com.tencent.structmsg", ...}'; async _handle (payload: PayloadTypeGroupEx) { return await this.core.apis.GroupApi.getArkJsonGroupShare(payload.group_id.toString()); diff --git a/packages/napcat-onebot/action/extends/TransGroupFile.ts b/packages/napcat-onebot/action/extends/TransGroupFile.ts index 9263d4a0..e4a92447 100644 --- a/packages/napcat-onebot/action/extends/TransGroupFile.ts +++ b/packages/napcat-onebot/action/extends/TransGroupFile.ts @@ -18,6 +18,16 @@ type ReturnType = Static; export class TransGroupFile extends GetPacketStatusDepends { override actionName = ActionName.TransGroupFile; + override actionSummary = '传输群文件'; + override actionTags = ['文件扩展']; + override payloadExample = { + group_id: 123456, + file_id: '/file_id', + target_group_id: 654321 + }; + override returnExample = { + result: true + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/extends/UploadImageToQunAlbum.ts b/packages/napcat-onebot/action/extends/UploadImageToQunAlbum.ts index 3f9a6533..3a5bbe33 100644 --- a/packages/napcat-onebot/action/extends/UploadImageToQunAlbum.ts +++ b/packages/napcat-onebot/action/extends/UploadImageToQunAlbum.ts @@ -20,6 +20,16 @@ type ReturnType = Static; export class UploadImageToQunAlbum extends OneBotAction { override actionName = ActionName.UploadImageToQunAlbum; + override actionSummary = '上传图片到群相册'; + override actionTags = ['群组扩展']; + override payloadExample = { + group_code: 123456, + album_id: 'album_id_1', + file: '/path/to/image.jpg' + }; + override returnExample = { + result: true + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/file/flash/CreateFlashTask.ts b/packages/napcat-onebot/action/file/flash/CreateFlashTask.ts index f1486e98..a1270a9e 100644 --- a/packages/napcat-onebot/action/file/flash/CreateFlashTask.ts +++ b/packages/napcat-onebot/action/file/flash/CreateFlashTask.ts @@ -22,6 +22,15 @@ export class CreateFlashTask extends OneBotAction { override actionName = ActionName.CreateFlashTask; override payloadSchema = CreateFlashTaskPayloadSchema; override returnSchema = Type.Any({ description: '任务创建结果' }); + override actionSummary = '创建闪照任务'; + override actionTags = ['文件扩展']; + override payloadExample = { + files: 'C:\\test.jpg', + name: 'test_task' + }; + override returnExample = { + task_id: 'task_123' + }; async _handle (payload: CreateFlashTaskPayload) { const fileList = Array.isArray(payload.files) ? payload.files : [payload.files]; diff --git a/packages/napcat-onebot/action/file/flash/DownloadFileset.ts b/packages/napcat-onebot/action/file/flash/DownloadFileset.ts index 58a2a655..6c770e77 100644 --- a/packages/napcat-onebot/action/file/flash/DownloadFileset.ts +++ b/packages/napcat-onebot/action/file/flash/DownloadFileset.ts @@ -12,6 +12,12 @@ export class DownloadFileset extends OneBotAction { override actionName = ActionName.DownloadFileset; override payloadSchema = DownloadFilesetPayloadSchema; override returnSchema = Type.Any({ description: '下载结果' }); + override actionSummary = '下载文件集'; + override actionTags = ['文件扩展']; + override payloadExample = { + fileset_id: 'set_123' + }; + override returnExample = null; async _handle (payload: DownloadFilesetPayload) { // 默认路径 / fileset_id /为下载路径 diff --git a/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts b/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts index b32c4461..f0079a3a 100644 --- a/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts +++ b/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts @@ -12,6 +12,14 @@ export class GetFilesetId extends OneBotAction { override actionName = ActionName.GetFilesetId; override payloadSchema = GetFilesetIdPayloadSchema; override returnSchema = Type.Any({ description: '文件集 ID' }); + override actionSummary = '获取文件集 ID'; + override actionTags = ['文件扩展']; + override payloadExample = { + share_code: '123456' + }; + override returnExample = { + fileset_id: 'set_123' + }; async _handle (payload: GetFilesetIdPayload) { // 适配share_link 防止被传 Link无法解析 diff --git a/packages/napcat-onebot/action/file/flash/GetFilesetInfo.ts b/packages/napcat-onebot/action/file/flash/GetFilesetInfo.ts index 7000b604..50534cf8 100644 --- a/packages/napcat-onebot/action/file/flash/GetFilesetInfo.ts +++ b/packages/napcat-onebot/action/file/flash/GetFilesetInfo.ts @@ -12,6 +12,15 @@ export class GetFilesetInfo extends OneBotAction { override actionName = ActionName.GetFilesetInfo; override payloadSchema = GetFilesetInfoPayloadSchema; override returnSchema = Type.Any({ description: '文件集信息' }); + override actionSummary = '获取文件集信息'; + override actionTags = ['文件扩展']; + override payloadExample = { + fileset_id: 'set_123' + }; + override returnExample = { + fileset_id: 'set_123', + file_list: [] + }; async _handle (payload: GetFilesetInfoPayload) { return await this.core.apis.FlashApi.getFileSetIndoBySetId(payload.fileset_id); diff --git a/packages/napcat-onebot/action/file/flash/GetFlashFileList.ts b/packages/napcat-onebot/action/file/flash/GetFlashFileList.ts index aee52dcc..871483f9 100644 --- a/packages/napcat-onebot/action/file/flash/GetFlashFileList.ts +++ b/packages/napcat-onebot/action/file/flash/GetFlashFileList.ts @@ -12,6 +12,17 @@ export class GetFlashFileList extends OneBotAction override actionName = ActionName.GetFlashFileList; override payloadSchema = GetFlashFileListPayloadSchema; override returnSchema = Type.Any({ description: '文件列表' }); + override actionSummary = '获取闪照文件列表'; + override actionTags = ['文件扩展']; + override payloadExample = { + fileset_id: 'set_123' + }; + override returnExample = [ + { + file_name: 'test.jpg', + size: 1024 + } + ]; async _handle (payload: GetFlashFileListPayload) { return await this.core.apis.FlashApi.getFileListBySetId(payload.fileset_id); diff --git a/packages/napcat-onebot/action/file/flash/GetFlashFileUrl.ts b/packages/napcat-onebot/action/file/flash/GetFlashFileUrl.ts index 13a52338..27c1391f 100644 --- a/packages/napcat-onebot/action/file/flash/GetFlashFileUrl.ts +++ b/packages/napcat-onebot/action/file/flash/GetFlashFileUrl.ts @@ -14,6 +14,14 @@ export class GetFlashFileUrl extends OneBotAction { override actionName = ActionName.GetFlashFileUrl; override payloadSchema = GetFlashFileUrlPayloadSchema; override returnSchema = Type.Any({ description: '文件下载链接' }); + override actionSummary = '获取闪照文件链接'; + override actionTags = ['文件扩展']; + override payloadExample = { + fileset_id: 'set_123' + }; + override returnExample = { + url: 'http://example.com/flash.jpg' + }; async _handle (payload: GetFlashFileUrlPayload) { // 文件的索引依旧从0开始 diff --git a/packages/napcat-onebot/action/file/flash/GetShareLink.ts b/packages/napcat-onebot/action/file/flash/GetShareLink.ts index dae7e705..7598bb69 100644 --- a/packages/napcat-onebot/action/file/flash/GetShareLink.ts +++ b/packages/napcat-onebot/action/file/flash/GetShareLink.ts @@ -12,6 +12,12 @@ export class GetShareLink extends OneBotAction { override actionName = ActionName.GetShareLink; override payloadSchema = GetShareLinkPayloadSchema; override returnSchema = Type.Any({ description: '分享链接' }); + override actionSummary = '获取文件分享链接'; + override actionTags = ['文件扩展']; + override payloadExample = { + fileset_id: 'set_123' + }; + override returnExample = 'http://example.com/share'; async _handle (payload: GetShareLinkPayload) { return await this.core.apis.FlashApi.getShareLinkBySetId(payload.fileset_id); diff --git a/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts b/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts index dd088b75..73583d00 100644 --- a/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts +++ b/packages/napcat-onebot/action/file/flash/SendFlashMsg.ts @@ -15,6 +15,15 @@ export class SendFlashMsg extends OneBotAction { override actionName = ActionName.SendFlashMsg; override payloadSchema = SendFlashMsgPayloadSchema; override returnSchema = Type.Any({ description: '发送结果' }); + override actionSummary = '发送闪照消息'; + override actionTags = ['文件扩展']; + override payloadExample = { + fileset_id: 'set_123', + user_id: '123456789' + }; + override returnExample = { + message_id: 123456 + }; async _handle (payload: SendFlashMsgPayload) { let peer: Peer; diff --git a/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts b/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts index 05015049..4ab31d8d 100644 --- a/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts +++ b/packages/napcat-onebot/action/file/online/CancelOnlineFile.ts @@ -14,6 +14,13 @@ export class CancelOnlineFile extends OneBotAction override actionName = ActionName.CancelOnlineFile; override payloadSchema = CancelOnlineFilePayloadSchema; override returnSchema = Type.Any({ description: '取消结果' }); + override actionSummary = '取消在线文件'; + override actionTags = ['文件扩展']; + override payloadExample = { + user_id: '123456789', + msg_id: '123' + }; + override returnExample = null; async _handle (payload: CancelOnlineFilePayload) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); diff --git a/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts b/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts index bc122260..d3bf26b1 100644 --- a/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts +++ b/packages/napcat-onebot/action/file/online/GetOnlineFileMessages.ts @@ -13,6 +13,12 @@ export class GetOnlineFileMessages extends OneBotAction override actionName = ActionName.RefuseOnlineFile; override payloadSchema = RefuseOnlineFilePayloadSchema; override returnSchema = Type.Any({ description: '拒绝结果' }); + override actionSummary = '拒绝在线文件'; + override actionTags = ['文件扩展']; + override payloadExample = { + user_id: '123456789', + msg_id: '123' + }; + override returnExample = null; async _handle (payload: RefuseOnlineFilePayload) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); diff --git a/packages/napcat-onebot/action/file/online/SendOnlineFile.ts b/packages/napcat-onebot/action/file/online/SendOnlineFile.ts index 35cbc32a..8c0ba336 100644 --- a/packages/napcat-onebot/action/file/online/SendOnlineFile.ts +++ b/packages/napcat-onebot/action/file/online/SendOnlineFile.ts @@ -15,6 +15,14 @@ export class SendOnlineFile extends OneBotAction { override actionName = ActionName.SendOnlineFile; override payloadSchema = SendOnlineFilePayloadSchema; override returnSchema = Type.Any({ description: '发送结果' }); + override actionSummary = '发送在线文件'; + override actionTags = ['文件扩展']; + override payloadExample = { + user_id: '123456789', + file_path: 'C:\\path\\to\\file.txt', + file_name: 'test.txt' + }; + override returnExample = null; async _handle (payload: SendOnlineFilePayload) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); diff --git a/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts b/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts index 6bced1e0..6a3d0a79 100644 --- a/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts +++ b/packages/napcat-onebot/action/file/online/SendOnlineFolder.ts @@ -15,6 +15,13 @@ export class SendOnlineFolder extends OneBotAction override actionName = ActionName.SendOnlineFolder; override payloadSchema = SendOnlineFolderPayloadSchema; override returnSchema = Type.Any({ description: '发送结果' }); + override actionSummary = '发送在线文件夹'; + override actionTags = ['文件扩展']; + override payloadExample = { + user_id: '123456789', + folder_path: 'C:\\path\\to\\folder' + }; + override returnExample = null; async _handle (payload: SendOnlineFolderPayload) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); diff --git a/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 546d35f8..a02060b5 100644 --- a/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/packages/napcat-onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -1,7 +1,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { GoCQHTTPActionsExamples } from './examples'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), @@ -27,7 +26,14 @@ export class CreateGroupFileFolder extends OneBotAction override actionSummary = '创建群文件目录'; override actionDescription = '在群文件系统中创建新的文件夹'; override actionTags = ['Go-CQHTTP']; - override payloadExample = GoCQHTTPActionsExamples.CreateGroupFileFolder.payload; + override payloadExample = { + group_id: '123456789', + folder_name: '新建文件夹' + }; + override returnExample = { + result: {}, + groupItem: {} + }; async _handle (payload: PayloadType) { const folderName = payload.folder_name || payload.name; diff --git a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts index 24b6b132..abbe57bd 100644 --- a/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts +++ b/packages/napcat-onebot/action/go-cqhttp/SendForwardMsg.ts @@ -2,8 +2,6 @@ import { OB11MessageMixType } from '@/napcat-onebot/types'; import { ContextMode, normalize, ReturnDataType, SendMsgBase, SendMsgPayload } from '@/napcat-onebot/action/msg/SendMsg'; import { ActionName } from '@/napcat-onebot/action/router'; -import { GoCQHTTPActionsExamples } from './examples'; - // 未验证 type GoCQHTTPSendForwardMsgPayload = SendMsgPayload & { messages?: OB11MessageMixType; }; @@ -18,8 +16,13 @@ export class GoCQHTTPSendForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionSummary = '发送合并转发消息'; override actionDescription = '发送合并转发消息'; override actionTags = ['Go-CQHTTP']; - override payloadExample = GoCQHTTPActionsExamples.SendForwardMsg.payload; - override returnExample = GoCQHTTPActionsExamples.SendForwardMsg.response; + override payloadExample = { + group_id: '123456789', + messages: [] + }; + override returnExample = { + message_id: 123456 + }; protected override async check (payload: GoCQHTTPSendForwardMsgPayload) { if (payload.messages) payload.message = normalize(payload.messages); @@ -28,6 +31,15 @@ export class GoCQHTTPSendForwardMsg extends GoCQHTTPSendForwardMsgBase { } export class GoCQHTTPSendPrivateForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendPrivateForwardMsg; + override actionSummary = '发送私聊合并转发消息'; + override actionTags = ['Go-CQHTTP']; + override payloadExample = { + user_id: '123456789', + messages: [] + }; + override returnExample = { + message_id: 123456 + }; override async _handle (payload: GoCQHTTPSendForwardMsgPayload): Promise { return this.base_handle(payload, ContextMode.Private); } @@ -35,6 +47,15 @@ export class GoCQHTTPSendPrivateForwardMsg extends GoCQHTTPSendForwardMsgBase { export class GoCQHTTPSendGroupForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendGroupForwardMsg; + override actionSummary = '发送群合并转发消息'; + override actionTags = ['Go-CQHTTP']; + override payloadExample = { + group_id: '123456789', + messages: [] + }; + override returnExample = { + message_id: 123456 + }; override async _handle (payload: GoCQHTTPSendForwardMsgPayload): Promise { return this.base_handle(payload, ContextMode.Group); } diff --git a/packages/napcat-onebot/action/group/GetAiRecord.ts b/packages/napcat-onebot/action/group/GetAiRecord.ts index 3d32d12e..a0ea8e61 100644 --- a/packages/napcat-onebot/action/group/GetAiRecord.ts +++ b/packages/napcat-onebot/action/group/GetAiRecord.ts @@ -19,9 +19,15 @@ export class GetAiRecord extends GetPacketStatusDepends override actionName = ActionName.GetAiRecord; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; - override actionSummary = '获取AI语音'; - override actionDescription = '通过AI语音引擎获取指定文本的语音URL'; - override actionTags = ['群组接口']; + override actionSummary = '获取 AI 语音'; + override actionDescription = '通过 AI 语音引擎获取指定文本的语音 URL'; + override actionTags = ['AI 扩展']; + override payloadExample = { + character: 'ai_char_1', + group_id: '123456', + text: '你好' + }; + override returnExample = 'http://example.com/ai_voice.silk'; async _handle (payload: PayloadType) { const rawRsp = await this.core.apis.PacketApi.pkt.operation.GetAiVoice(+payload.group_id, payload.character, payload.text, AIVoiceChatType.Sound); diff --git a/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts b/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts index a8aeee9a..1c719dc7 100644 --- a/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts +++ b/packages/napcat-onebot/action/group/GetGroupIgnoredNotifies.ts @@ -22,6 +22,12 @@ export class GetGroupIgnoredNotifies extends OneBotAction { const SingleScreenNotifies = await this.core.apis.GroupApi.getSingleScreenNotifies(false, 50); diff --git a/packages/napcat-onebot/action/group/GetGroupShutList.ts b/packages/napcat-onebot/action/group/GetGroupShutList.ts index 9d919808..c641bb69 100644 --- a/packages/napcat-onebot/action/group/GetGroupShutList.ts +++ b/packages/napcat-onebot/action/group/GetGroupShutList.ts @@ -17,8 +17,17 @@ export class GetGroupShutList extends OneBotAction { override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; override actionSummary = '获取群禁言列表'; - override actionDescription = '获取指定群聊中被禁言的成员列表'; override actionTags = ['群组接口']; + override payloadExample = { + group_id: '123456789' + }; + override returnExample = [ + { + user_id: 123456789, + nickname: '禁言用户', + shut_up_time: 1734567890 + } + ]; async _handle (payload: PayloadType) { return await this.core.apis.GroupApi.getGroupShutUpMemberList(payload.group_id.toString()); diff --git a/packages/napcat-onebot/action/group/SendGroupAiRecord.ts b/packages/napcat-onebot/action/group/SendGroupAiRecord.ts index 12213748..d1243c37 100644 --- a/packages/napcat-onebot/action/group/SendGroupAiRecord.ts +++ b/packages/napcat-onebot/action/group/SendGroupAiRecord.ts @@ -21,9 +21,15 @@ export class SendGroupAiRecord extends GetPacketStatusDepends { override actionSummary = '撤回消息'; override actionDescription = '撤回已发送的消息'; override actionTags = ['消息接口']; - override payloadExample = ActionExamples.DeleteMsg.payload; + override payloadExample = { + message_id: 12345 + }; + override returnExample = {}; async _handle (payload: PayloadType) { const msg = MessageUnique.getMsgIdAndPeerByShortId(Number(payload.message_id)); diff --git a/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts b/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts index 166db586..b64a1bae 100644 --- a/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts +++ b/packages/napcat-onebot/action/msg/ForwardSingleMsg.ts @@ -4,8 +4,6 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; - const PayloadSchema = Type.Object({ message_id: Type.Union([Type.Number(), Type.String()], { description: '消息ID' }), group_id: Type.Optional(Type.String({ description: '目标群号' })), @@ -19,9 +17,14 @@ const ReturnSchema = Type.Null({ description: '操作结果' }); type ReturnType = Static; class ForwardSingleMsg extends OneBotAction { + override actionSummary = '转发单条消息'; override actionDescription = '转发单条消息'; override actionTags = ['消息接口']; - override payloadExample = ActionExamples.ForwardSingleMsg.payload; + override payloadExample = { + message_id: 12345, + group_id: '123456' + }; + override returnExample = {}; protected async getTargetPeer (payload: PayloadType): Promise { if (payload.user_id) { diff --git a/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts b/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts index bfa63c5e..81fdd893 100644 --- a/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts +++ b/packages/napcat-onebot/action/msg/MarkMsgAsRead.ts @@ -4,8 +4,6 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { MessageUnique } from 'napcat-common/src/message-unique'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; - const PayloadSchema = Type.Object({ user_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '用户QQ' })), group_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '群号' })), @@ -22,7 +20,10 @@ class MarkMsgAsRead extends OneBotAction { override actionSummary = '标记消息已读'; override actionDescription = '标记指定渠道的消息为已读'; override actionTags = ['消息接口']; - override payloadExample = ActionExamples.MarkMsgAsRead.payload; + override payloadExample = { + message_id: 12345 + }; + override returnExample = {}; async getPeer (payload: PayloadType): Promise { if (payload.message_id) { @@ -82,6 +83,10 @@ export class GoCQHTTPMarkMsgAsRead extends MarkMsgAsRead { export class MarkAllMsgAsRead extends OneBotAction { override actionName = ActionName._MarkAllMsgAsRead; + override actionSummary = '标记所有消息已读'; + override actionTags = ['消息接口']; + override payloadExample = {}; + override returnExample = {}; async _handle (): Promise { await this.core.apis.MsgApi.markAllMsgAsRead(); diff --git a/packages/napcat-onebot/action/msg/SendPrivateMsg.ts b/packages/napcat-onebot/action/msg/SendPrivateMsg.ts index 2caf6cd7..0800985e 100644 --- a/packages/napcat-onebot/action/msg/SendPrivateMsg.ts +++ b/packages/napcat-onebot/action/msg/SendPrivateMsg.ts @@ -1,15 +1,19 @@ import { ContextMode, ReturnDataType, SendMsgBase, SendMsgPayload } from './SendMsg'; import { ActionName, BaseCheckResult } from '@/napcat-onebot/action/router'; -import { ActionExamples } from '../examples'; - // 未检测参数 class SendPrivateMsg extends SendMsgBase { override actionName = ActionName.SendPrivateMsg; + override actionSummary = '发送私聊消息'; override actionDescription = '发送私聊消息'; override actionTags = ['消息接口']; - override payloadExample = ActionExamples.SendPrivateMsg.payload; - override returnExample = ActionExamples.SendPrivateMsg.return; + override payloadExample = { + user_id: '123456789', + message: 'hello' + }; + override returnExample = { + message_id: 123456 + }; protected override async check (payload: SendMsgPayload): Promise { payload.message_type = 'private'; diff --git a/packages/napcat-onebot/action/msg/SetMsgEmojiLike.ts b/packages/napcat-onebot/action/msg/SetMsgEmojiLike.ts index f48ed65e..745bcff0 100644 --- a/packages/napcat-onebot/action/msg/SetMsgEmojiLike.ts +++ b/packages/napcat-onebot/action/msg/SetMsgEmojiLike.ts @@ -17,6 +17,16 @@ type ReturnType = Static; export class SetMsgEmojiLike extends OneBotAction { override actionName = ActionName.SetMsgEmojiLike; + override actionSummary = '设置消息表情点赞'; + override actionTags = ['消息扩展']; + override payloadExample = { + message_id: 12345, + emoji_id: '123', + set: true + }; + override returnExample = { + result: true + }; override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; diff --git a/packages/napcat-onebot/action/new/SetDoubtFriendsAddRequest.ts b/packages/napcat-onebot/action/new/SetDoubtFriendsAddRequest.ts index 16a34829..cb77b40b 100644 --- a/packages/napcat-onebot/action/new/SetDoubtFriendsAddRequest.ts +++ b/packages/napcat-onebot/action/new/SetDoubtFriendsAddRequest.ts @@ -1,7 +1,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { NewActionsExamples } from './examples'; export const SetDoubtFriendsAddRequestPayloadSchema = Type.Object({ flag: Type.String({ description: '请求 flag' }), @@ -19,7 +18,11 @@ export class SetDoubtFriendsAddRequest extends OneBotAction extends OneBotAction { protected override async check (payload: PT): Promise { @@ -23,8 +22,8 @@ export class GetPacketStatus extends GetPacketStatusDepends { override actionSummary = '获取Packet状态'; override actionDescription = '获取底层Packet服务的运行状态'; override actionTags = ['系统接口']; - override payloadExample = PacketActionsExamples.GetPacketStatus.payload; - override returnExample = PacketActionsExamples.GetPacketStatus.response; + override payloadExample = {}; + override returnExample = null; async _handle () { diff --git a/packages/napcat-onebot/action/packet/GetRkeyEx.ts b/packages/napcat-onebot/action/packet/GetRkeyEx.ts index 64f1b7bc..b5079d10 100644 --- a/packages/napcat-onebot/action/packet/GetRkeyEx.ts +++ b/packages/napcat-onebot/action/packet/GetRkeyEx.ts @@ -15,6 +15,17 @@ export class GetRkeyEx extends GetPacketStatusDepends { override actionName = ActionName.GetRkeyEx; override payloadSchema = Type.Object({}); override returnSchema = GetRkeyExReturnSchema; + override actionSummary = '获取扩展 RKey'; + override actionTags = ['系统扩展']; + override payloadExample = {}; + override returnExample = [ + { + type: 'private', + rkey: 'rkey_123', + created_at: 1734567890, + ttl: 3600 + } + ]; async _handle () { const rkeys = await this.core.apis.PacketApi.pkt.operation.FetchRkey(); diff --git a/packages/napcat-onebot/action/packet/GetRkeyServer.ts b/packages/napcat-onebot/action/packet/GetRkeyServer.ts index bebf167b..2a969e77 100644 --- a/packages/napcat-onebot/action/packet/GetRkeyServer.ts +++ b/packages/napcat-onebot/action/packet/GetRkeyServer.ts @@ -13,6 +13,12 @@ export type GetRkeyServerReturn = Static; export class GetRkeyServer extends GetPacketStatusDepends { override actionName = ActionName.GetRkeyServer; + override actionSummary = '获取 RKey 服务器'; + override actionTags = ['系统扩展']; + override payloadExample = {}; + override returnExample = { + server: 'http://rkey-server.com' + }; override payloadSchema = Type.Object({}); override returnSchema = GetRkeyServerReturnSchema; diff --git a/packages/napcat-onebot/action/stream/CleanStreamTempFile.ts b/packages/napcat-onebot/action/stream/CleanStreamTempFile.ts index 9d81abbf..aa02ecec 100644 --- a/packages/napcat-onebot/action/stream/CleanStreamTempFile.ts +++ b/packages/napcat-onebot/action/stream/CleanStreamTempFile.ts @@ -6,6 +6,12 @@ import { Type } from '@sinclair/typebox'; export class CleanStreamTempFile extends OneBotAction { override actionName = ActionName.CleanStreamTempFile; + override actionSummary = '清理流式传输临时文件'; + override actionTags = ['流式传输扩展']; + override payloadExample = {}; + override returnExample = { + message: 'success' + }; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); diff --git a/packages/napcat-onebot/action/stream/DownloadFileImageStream.ts b/packages/napcat-onebot/action/stream/DownloadFileImageStream.ts index c4589481..5885fcb8 100644 --- a/packages/napcat-onebot/action/stream/DownloadFileImageStream.ts +++ b/packages/napcat-onebot/action/stream/DownloadFileImageStream.ts @@ -17,6 +17,14 @@ export type DownloadFileImageStreamPayload = Static { override actionName = ActionName.DownloadFileImageStream; + override actionSummary = '下载图片文件流'; + override actionTags = ['流式传输扩展']; + override payloadExample = { + file: 'image_file_id' + }; + override returnExample = { + file: 'temp_image_path' + }; override payloadSchema = DownloadFileImageStreamPayloadSchema; override returnSchema = Type.Any({ description: '下载结果 (流式)' }); override useStream = true; diff --git a/packages/napcat-onebot/action/stream/DownloadFileRecordStream.ts b/packages/napcat-onebot/action/stream/DownloadFileRecordStream.ts index 9873f3d0..306e3802 100644 --- a/packages/napcat-onebot/action/stream/DownloadFileRecordStream.ts +++ b/packages/napcat-onebot/action/stream/DownloadFileRecordStream.ts @@ -20,6 +20,14 @@ export type DownloadFileRecordStreamPayload = Static { override actionName = ActionName.DownloadFileRecordStream; + override actionSummary = '下载语音文件流'; + override actionTags = ['流式传输扩展']; + override payloadExample = { + file: 'record_file_id' + }; + override returnExample = { + file: 'temp_record_path' + }; override payloadSchema = DownloadFileRecordStreamPayloadSchema; override returnSchema = Type.Any({ description: '下载结果 (流式)' }); override useStream = true; diff --git a/packages/napcat-onebot/action/stream/DownloadFileStream.ts b/packages/napcat-onebot/action/stream/DownloadFileStream.ts index ec542c34..54d35092 100644 --- a/packages/napcat-onebot/action/stream/DownloadFileStream.ts +++ b/packages/napcat-onebot/action/stream/DownloadFileStream.ts @@ -20,6 +20,15 @@ export class DownloadFileStream extends BaseDownloadStream> { diff --git a/packages/napcat-onebot/action/stream/TestStreamDownload.ts b/packages/napcat-onebot/action/stream/TestStreamDownload.ts index 16791ebf..a3ac7f86 100644 --- a/packages/napcat-onebot/action/stream/TestStreamDownload.ts +++ b/packages/napcat-onebot/action/stream/TestStreamDownload.ts @@ -12,6 +12,14 @@ export type TestDownloadStreamPayload = Static> { override actionName = ActionName.TestDownloadStream; + override actionSummary = '测试下载流'; + override actionTags = ['流式传输扩展']; + override payloadExample = { + url: 'http://example.com/file' + }; + override returnExample = { + success: true + }; override payloadSchema = TestDownloadStreamPayloadSchema; override returnSchema = Type.Any({ description: '测试流数据' }); override useStream = true; diff --git a/packages/napcat-onebot/action/stream/UploadFileStream.ts b/packages/napcat-onebot/action/stream/UploadFileStream.ts index a9035626..42b12f1b 100644 --- a/packages/napcat-onebot/action/stream/UploadFileStream.ts +++ b/packages/napcat-onebot/action/stream/UploadFileStream.ts @@ -73,6 +73,20 @@ export class UploadFileStream extends OneBotAction(); diff --git a/packages/napcat-onebot/action/system/CanSendImage.ts b/packages/napcat-onebot/action/system/CanSendImage.ts index 66101230..d5e4ddbb 100644 --- a/packages/napcat-onebot/action/system/CanSendImage.ts +++ b/packages/napcat-onebot/action/system/CanSendImage.ts @@ -1,10 +1,11 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { CanSend } from './CanSendRecord'; -import { SystemActionsExamples } from './examples'; export default class CanSendImage extends CanSend { override actionName = ActionName.CanSendImage; + override actionSummary = '是否可以发送图片'; override actionDescription = '检查是否可以发送图片'; override actionTags = ['系统接口']; - override payloadExample = SystemActionsExamples.CanSendImage.payload; + override payloadExample = {}; + override returnExample = { yes: true }; } diff --git a/packages/napcat-onebot/action/system/CanSendRecord.ts b/packages/napcat-onebot/action/system/CanSendRecord.ts index fd007af0..760d9eec 100644 --- a/packages/napcat-onebot/action/system/CanSendRecord.ts +++ b/packages/napcat-onebot/action/system/CanSendRecord.ts @@ -2,8 +2,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; -import { SystemActionsExamples } from './examples'; - export const CanSendReturnSchema = Type.Object({ yes: Type.Boolean({ description: '是否可以发送' }), }); @@ -24,7 +22,9 @@ export class CanSend extends OneBotAction { export default class CanSendRecord extends CanSend { override actionName = ActionName.CanSendRecord; + override actionSummary = '是否可以发送语音'; override actionDescription = '检查是否可以发送语音'; override actionTags = ['系统接口']; - override payloadExample = SystemActionsExamples.CanSendRecord.payload; + override payloadExample = {}; + override returnExample = { yes: true }; } diff --git a/packages/napcat-onebot/action/system/CleanCache.ts b/packages/napcat-onebot/action/system/CleanCache.ts index 89b48b9b..b352cf87 100644 --- a/packages/napcat-onebot/action/system/CleanCache.ts +++ b/packages/napcat-onebot/action/system/CleanCache.ts @@ -8,8 +8,11 @@ export class CleanCache extends OneBotAction { override actionName = ActionName.CleanCache; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); + override actionSummary = '清理缓存'; override actionDescription = '清理缓存'; override actionTags = ['系统接口']; + override payloadExample = {}; + override returnExample = null; async _handle () { try { diff --git a/packages/napcat-onebot/action/system/GetCSRF.ts b/packages/napcat-onebot/action/system/GetCSRF.ts index 9be720d2..b01e2a99 100644 --- a/packages/napcat-onebot/action/system/GetCSRF.ts +++ b/packages/napcat-onebot/action/system/GetCSRF.ts @@ -1,7 +1,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Type, Static } from '@sinclair/typebox'; -import { SystemActionsExamples } from './examples'; export const GetCSRFReturnSchema = Type.Object({ token: Type.Number({ description: 'CSRF Token' }), @@ -13,9 +12,13 @@ export class GetCSRF extends OneBotAction { override actionName = ActionName.GetCSRF; override payloadSchema = Type.Object({}); override returnSchema = GetCSRFReturnSchema; + override actionSummary = '获取 CSRF Token'; override actionDescription = '获取 CSRF Token'; override actionTags = ['系统接口']; - override payloadExample = SystemActionsExamples.GetCSRF.payload; + override payloadExample = {}; + override returnExample = { + token: 123456789 + }; async _handle () { const sKey = await this.core.apis.UserApi.getSKey(); diff --git a/packages/napcat-onebot/action/system/GetCredentials.ts b/packages/napcat-onebot/action/system/GetCredentials.ts index ac89cf82..5b35fbe1 100644 --- a/packages/napcat-onebot/action/system/GetCredentials.ts +++ b/packages/napcat-onebot/action/system/GetCredentials.ts @@ -2,8 +2,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; - export const GetCredentialsPayloadSchema = Type.Object({ domain: Type.String({ description: '需要获取 cookies 的域名' }), }); @@ -21,10 +19,16 @@ export class GetCredentials extends OneBotAction { override actionName = ActionName.GetStatus; override payloadSchema = Type.Object({}); override returnSchema = GetStatusReturnSchema; + override actionSummary = '获取运行状态'; override actionDescription = '获取运行状态'; override actionTags = ['系统接口']; - override payloadExample = ActionExamples.GetStatus.payload; - override returnExample = ActionExamples.GetStatus.return; + override payloadExample = {}; + override returnExample = { + online: true, + good: true, + stat: {} + }; async _handle (): Promise { return { diff --git a/packages/napcat-onebot/action/system/GetSystemMsg.ts b/packages/napcat-onebot/action/system/GetSystemMsg.ts index c5742446..4d7a622d 100644 --- a/packages/napcat-onebot/action/system/GetSystemMsg.ts +++ b/packages/napcat-onebot/action/system/GetSystemMsg.ts @@ -4,8 +4,6 @@ import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; import { OB11NotifySchema } from '../schemas'; -import { ActionExamples } from '../examples'; - export const GetGroupSystemMsgPayloadSchema = Type.Object({ count: Type.Union([Type.Number(), Type.String()], { default: 50, description: '获取的消息数量' }), }); @@ -24,10 +22,17 @@ export class GetGroupSystemMsg extends OneBotAction { const SingleScreenNotifies = await this.core.apis.GroupApi.getSingleScreenNotifies(false, +params.count); diff --git a/packages/napcat-onebot/action/system/GetVersionInfo.ts b/packages/napcat-onebot/action/system/GetVersionInfo.ts index 42d42ec2..44c92c6d 100644 --- a/packages/napcat-onebot/action/system/GetVersionInfo.ts +++ b/packages/napcat-onebot/action/system/GetVersionInfo.ts @@ -11,15 +11,18 @@ const ReturnSchema = Type.Object({ type ReturnType = Static; -import { ActionExamples } from '../examples'; - export default class GetVersionInfo extends OneBotAction { override actionName = ActionName.GetVersionInfo; override returnSchema = ReturnSchema; + override actionSummary = '获取版本信息'; override actionDescription = '获取版本信息'; override actionTags = ['系统接口']; - override payloadExample = ActionExamples.GetVersionInfo.payload; - override returnExample = ActionExamples.GetVersionInfo.return; + override payloadExample = {}; + override returnExample = { + app_name: 'NapCat.Onebot', + protocol_version: 'v11', + app_version: '1.0.0' + }; async _handle (): Promise { return { diff --git a/packages/napcat-onebot/action/system/SetRestart.ts b/packages/napcat-onebot/action/system/SetRestart.ts index df0b666c..8113d69e 100644 --- a/packages/napcat-onebot/action/system/SetRestart.ts +++ b/packages/napcat-onebot/action/system/SetRestart.ts @@ -7,8 +7,11 @@ export class SetRestart extends OneBotAction { override actionName = ActionName.Reboot; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); + override actionSummary = '重启服务'; override actionDescription = '重启服务'; override actionTags = ['系统接口']; + override payloadExample = {}; + override returnExample = null; async _handle () { const result = await WebUiDataRuntime.requestRestartProcess(); diff --git a/packages/napcat-onebot/action/user/GetCookies.ts b/packages/napcat-onebot/action/user/GetCookies.ts index 9a1d28ea..87bd4194 100644 --- a/packages/napcat-onebot/action/user/GetCookies.ts +++ b/packages/napcat-onebot/action/user/GetCookies.ts @@ -2,8 +2,6 @@ import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import { ActionName } from '@/napcat-onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; -import { ActionExamples } from '../examples'; - export const GetCookiesPayloadSchema = Type.Object({ domain: Type.String({ description: '需要获取 cookies 的域名' }), }); @@ -21,10 +19,16 @@ export class GetCookies extends OneBotAction { const ret = await this.core.apis.UserApi.getRecentContactListSnapShot(+payload.count); diff --git a/packages/napcat-onebot/action/user/SendLike.ts b/packages/napcat-onebot/action/user/SendLike.ts index 5c44ec5b..d98735d2 100644 --- a/packages/napcat-onebot/action/user/SendLike.ts +++ b/packages/napcat-onebot/action/user/SendLike.ts @@ -18,7 +18,11 @@ export default class SendLike extends OneBotAction { override actionSummary = '点赞'; override actionDescription = '给指定用户点赞'; override actionTags = ['用户接口']; - override payloadExample = ActionExamples.SendLike.payload; + override payloadExample = { + user_id: '123456', + times: 10 + }; + override returnExample = {}; override errorExamples = [ ...ActionExamples.Common.errors, { code: 1400, description: '点赞失败(频率过快或用户不存在)' } diff --git a/packages/napcat-onebot/action/user/SetFriendAddRequest.ts b/packages/napcat-onebot/action/user/SetFriendAddRequest.ts index bd24b58b..e9f01d42 100644 --- a/packages/napcat-onebot/action/user/SetFriendAddRequest.ts +++ b/packages/napcat-onebot/action/user/SetFriendAddRequest.ts @@ -10,15 +10,19 @@ export const SetFriendAddRequestPayloadSchema = Type.Object({ export type SetFriendAddRequestPayload = Static; -import { ActionExamples } from '../examples'; - export default class SetFriendAddRequest extends OneBotAction { override actionName = ActionName.SetFriendAddRequest; override payloadSchema = SetFriendAddRequestPayloadSchema; override returnSchema = Type.Null(); - override actionDescription = '处理加好友请求'; + override actionSummary = '处理加好友请求'; + override actionDescription = '同意或拒绝加好友请求'; override actionTags = ['用户接口']; - override payloadExample = ActionExamples.SetFriendAddRequest.payload; + override payloadExample = { + flag: 'flag_12345', + approve: true, + remark: '新朋友' + }; + override returnExample = {}; async _handle (payload: SetFriendAddRequestPayload): Promise { const approve = payload.approve?.toString() !== 'false'; diff --git a/packages/napcat-onebot/action/user/SetFriendRemark.ts b/packages/napcat-onebot/action/user/SetFriendRemark.ts index 556e99bc..57009a68 100644 --- a/packages/napcat-onebot/action/user/SetFriendRemark.ts +++ b/packages/napcat-onebot/action/user/SetFriendRemark.ts @@ -15,9 +15,14 @@ export default class SetFriendRemark extends OneBotAction = {}; - export function initSchemas () { const handlers = getAllHandlers(null as any, null as any); handlers.forEach(handler => { @@ -62,63 +61,75 @@ export function generateOpenAPI () { try { initSchemas(); } catch (e) { - console.warn('Init schemas partial failure (expected due to complex imports), proceeding with collected data...'); + console.warn('Init schemas partial failure, proceeding with collected data...'); } const openapi: Record = { openapi: '3.1.0', info: { - title: 'NapCat OneBot 11 接口文档', - description: 'NapCatOneBot11 旨在提供更先进、更统一、更美观的 OneBot 11 协议实现。', + title: 'NapCat OneBot 11 HTTP API', + description: '本文档描述 NapCat OneBot 11 的 HTTP POST 接口协议。所有接口均通过 POST 请求调用,请求体为 JSON 格式。', version: '1.0.0' }, + tags: [ + { name: '消息接口', description: '发送、删除、获取消息相关接口' }, + { name: '群组接口', description: '群组管理、成员管理相关接口' }, + { name: '用户接口', description: '好友管理、个人信息相关接口' }, + { name: '系统接口', description: '状态获取、重启、缓存清理相关接口' }, + { name: '文件接口', description: '文件上传下载、预览相关接口' }, + { name: '系统扩展', description: 'NapCat 特有的系统级扩展功能' }, + { name: '群扩展', description: 'NapCat 特有的群组级扩展功能' }, + { name: '用户扩展', description: 'NapCat 特有的用户级扩展功能' }, + { name: '文件扩展', description: 'NapCat 特有的文件级扩展功能' }, + { name: 'Go-CQHTTP', description: '兼容 Go-CQHTTP 的特定接口' } + ], paths: {} as Record }; for (const [actionName, schemas] of Object.entries(actionSchemas)) { - if (!schemas.payload) continue; - const path = `/${actionName}`; + // 忽略没有定义参数且没有 Summary 的占位接口 + if (!schemas.payload && !schemas.summary) continue; - const cleanPayload = JSON.parse(JSON.stringify(schemas.payload || { type: 'object', properties: {} })); - const cleanReturn = JSON.parse(JSON.stringify(schemas.return || { type: 'object', properties: {} })); + const path = '/' + actionName; + const cleanPayload = schemas.payload ? JSON.parse(JSON.stringify(schemas.payload)) : { type: 'object', properties: {} }; + const cleanReturn = schemas.return ? JSON.parse(JSON.stringify(schemas.return)) : { type: 'object', properties: {} }; - const wrappedPayload = { + // HTTP 响应结构: {"status": "ok", "retcode": 0, "data": ...} + const httpResponseSchema = { type: 'object', properties: { - action: { type: 'string', example: actionName }, - params: cleanPayload, - echo: { type: 'string', example: `${actionName}:1234567890` } - } - }; - - const wrappedReturn = { - type: 'object', - properties: { - status: { type: 'string', example: 'ok' }, - retcode: { type: 'number', example: 0 }, - data: cleanReturn, - message: { type: 'string', example: '' }, - wording: { type: 'string', example: '' }, - echo: { type: 'string', example: `${actionName}:1234567890` } + status: { type: 'string', enum: ['ok', 'async', 'failed'], description: '执行状态', example: 'ok' }, + retcode: { type: 'number', description: '响应码 (0 为成功)', example: 0 }, + data: { ...cleanReturn, description: '响应数据' }, + message: { type: 'string', description: '错误消息', example: '' }, + wording: { type: 'string', description: '提示消息', example: '' } }, - required: ['status', 'retcode', 'data', 'message', 'wording'] + required: ['status', 'retcode', 'data'] }; - const paths = openapi['paths'] as Record; const responses: Record = { '200': { - description: '成功', + description: '成功响应', content: { 'application/json': { - schema: wrappedReturn + schema: httpResponseSchema, + example: { + status: 'ok', + retcode: 0, + data: schemas.returnExample || {}, + message: '', + wording: '' + } } } } }; + // 处理错误示例 if (schemas.errorExamples) { schemas.errorExamples.forEach(error => { - responses[error.code.toString()] = { + const codeStr = error.code.toString(); + responses[codeStr] = { description: error.description, content: { 'application/json': { @@ -137,20 +148,18 @@ export function generateOpenAPI () { }); } + const paths = openapi['paths'] as Record; paths[path] = { post: { summary: schemas.summary || actionName, - description: schemas.description || schemas.summary || actionName, + description: schemas.description || 'API Action: ' + actionName, tags: schemas.tags || ['Default'], requestBody: { + description: 'API 请求参数', content: { 'application/json': { - schema: wrappedPayload, - example: { - action: actionName, - params: schemas.payloadExample || {}, - echo: `${actionName}:1234567890` - } + schema: cleanPayload, + example: schemas.payloadExample || {} } } }, @@ -158,8 +167,42 @@ export function generateOpenAPI () { } }; } - const outputPath = resolve(__dirname, 'openapi.json'); + + const outputDir = resolve(__dirname, 'dist'); + if (!existsSync(outputDir)) { + mkdirSync(outputDir, { recursive: true }); + } + + const outputPath = resolve(outputDir, 'openapi.json'); writeFileSync(outputPath, JSON.stringify(openapi, null, 2)); - console.log(`OpenAPI schema generated at: ${outputPath}`); + console.log('OpenAPI schema (HTTP Format) generated at: ' + outputPath); + + // 生成审计报告 + generateMissingReport(); } -generateOpenAPI(); \ No newline at end of file + +function generateMissingReport() { + const missingReport: string[] = []; + for (const [actionName, schemas] of Object.entries(actionSchemas)) { + const missing: string[] = []; + if (!schemas.summary) missing.push('actionSummary'); + if (!schemas.tags || schemas.tags.length === 0) missing.push('actionTags'); + if (schemas.payloadExample === undefined && schemas.payload) missing.push('payloadExample'); + if (schemas.returnExample === undefined) missing.push('returnExample'); + + if (missing.length > 0) { + missingReport.push('[' + actionName + '] 缺失属性: ' + missing.join(', ')); + } + } + + const reportPath = resolve(__dirname, 'dist', 'missing_props.log'); + if (missingReport.length > 0) { + writeFileSync(reportPath, missingReport.join('\n')); + console.warn('\n检查到 ' + missingReport.length + ' 个接口存在元数据缺失,报告已保存至: ' + reportPath); + } else { + if (existsSync(reportPath)) writeFileSync(reportPath, ''); + console.log('\n所有接口元数据已完整!'); + } +} + +generateOpenAPI(); diff --git a/packages/napcat-schema/package.json b/packages/napcat-schema/package.json index 314d44ca..93a22595 100644 --- a/packages/napcat-schema/package.json +++ b/packages/napcat-schema/package.json @@ -6,7 +6,8 @@ "main": "index.ts", "scripts": { "generate:openapi": "node ./dist/schemas.mjs", - "build:schema": "vite build" + "build:schema": "vite build", + "run": "vite build & node ./dist/schemas.mjs" }, "dependencies": { "@sinclair/typebox": "^0.34.38", From b36efeb4d123c30a213f60c0411c45eb589f8478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 19:39:12 +0800 Subject: [PATCH 14/17] Refactor OpenAPI schema generation to 3.0.1 format Updated the OpenAPI schema output to use version 3.0.1, restructured tags, responses, and examples for better clarity and compatibility, and simplified output file locations. Also removed unused scripts from package.json. --- packages/napcat-schema/index.ts | 144 +++++++++++++++------------- packages/napcat-schema/package.json | 4 +- 2 files changed, 78 insertions(+), 70 deletions(-) diff --git a/packages/napcat-schema/index.ts b/packages/napcat-schema/index.ts index 1af8cbd4..fa9f5ddd 100644 --- a/packages/napcat-schema/index.ts +++ b/packages/napcat-schema/index.ts @@ -65,10 +65,10 @@ export function generateOpenAPI () { } const openapi: Record = { - openapi: '3.1.0', + openapi: '3.0.1', info: { title: 'NapCat OneBot 11 HTTP API', - description: '本文档描述 NapCat OneBot 11 的 HTTP POST 接口协议。所有接口均通过 POST 请求调用,请求体为 JSON 格式。', + description: 'NapCatOneBot11 HTTP POST 接口文档', version: '1.0.0' }, tags: [ @@ -76,108 +76,118 @@ export function generateOpenAPI () { { name: '群组接口', description: '群组管理、成员管理相关接口' }, { name: '用户接口', description: '好友管理、个人信息相关接口' }, { name: '系统接口', description: '状态获取、重启、缓存清理相关接口' }, - { name: '文件接口', description: '文件上传下载、预览相关接口' }, - { name: '系统扩展', description: 'NapCat 特有的系统级扩展功能' }, - { name: '群扩展', description: 'NapCat 特有的群组级扩展功能' }, - { name: '用户扩展', description: 'NapCat 特有的用户级扩展功能' }, - { name: '文件扩展', description: 'NapCat 特有的文件级扩展功能' }, - { name: 'Go-CQHTTP', description: '兼容 Go-CQHTTP 的特定接口' } + { name: '文件接口', description: '文件上传下载、预览相关接口' } ], - paths: {} as Record + paths: {} as Record, + components: { + schemas: {}, + responses: {}, + securitySchemes: {} + }, + servers: [], + security: [] }; for (const [actionName, schemas] of Object.entries(actionSchemas)) { - // 忽略没有定义参数且没有 Summary 的占位接口 if (!schemas.payload && !schemas.summary) continue; const path = '/' + actionName; const cleanPayload = schemas.payload ? JSON.parse(JSON.stringify(schemas.payload)) : { type: 'object', properties: {} }; const cleanReturn = schemas.return ? JSON.parse(JSON.stringify(schemas.return)) : { type: 'object', properties: {} }; - // HTTP 响应结构: {"status": "ok", "retcode": 0, "data": ...} - const httpResponseSchema = { - type: 'object', - properties: { - status: { type: 'string', enum: ['ok', 'async', 'failed'], description: '执行状态', example: 'ok' }, - retcode: { type: 'number', description: '响应码 (0 为成功)', example: 0 }, - data: { ...cleanReturn, description: '响应数据' }, - message: { type: 'string', description: '错误消息', example: '' }, - wording: { type: 'string', description: '提示消息', example: '' } - }, - required: ['status', 'retcode', 'data'] - }; - - const responses: Record = { - '200': { - description: '成功响应', - content: { - 'application/json': { - schema: httpResponseSchema, - example: { - status: 'ok', - retcode: 0, - data: schemas.returnExample || {}, - message: '', - wording: '' - } - } + // 构造响应示例 + const responseExamples: Record = { + 'Success': { + summary: '成功响应', + value: { + status: 'ok', + retcode: 0, + data: schemas.returnExample || {}, + message: '', + wording: '' } } }; - // 处理错误示例 if (schemas.errorExamples) { schemas.errorExamples.forEach(error => { - const codeStr = error.code.toString(); - responses[codeStr] = { - description: error.description, - content: { - 'application/json': { - schema: { - type: 'object', - properties: { - status: { type: 'string', example: 'failed' }, - retcode: { type: 'number', example: error.code }, - data: { type: 'null' }, - message: { type: 'string', example: error.description } - } - } - } + responseExamples['Error_' + error.code] = { + summary: error.description, + value: { + status: 'failed', + retcode: error.code, + data: null, + message: error.description, + wording: error.description } }; }); + } else { + // 默认提供一个通用错误 + responseExamples['Generic_Error'] = { + summary: '通用错误', + value: { + status: 'failed', + retcode: 1400, + data: null, + message: '请求参数错误或业务逻辑执行失败', + wording: '请求参数错误或业务逻辑执行失败' + } + }; } const paths = openapi['paths'] as Record; paths[path] = { post: { summary: schemas.summary || actionName, - description: schemas.description || 'API Action: ' + actionName, - tags: schemas.tags || ['Default'], + deprecated: false, + description: schemas.description || '', + tags: schemas.tags || [], + parameters: [], requestBody: { - description: 'API 请求参数', + description: 'API 参数', content: { 'application/json': { schema: cleanPayload, - example: schemas.payloadExample || {} + examples: { + 'Default': { + summary: '默认请求示例', + value: schemas.payloadExample || {} + } + } } } }, - responses: responses + responses: { + '200': { + description: '业务响应', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + status: { type: 'string', description: '状态 (ok/failed)' }, + retcode: { type: 'number', description: '返回码' }, + data: { ...cleanReturn, description: '数据' }, + message: { type: 'string', description: '消息' }, + wording: { type: 'string', description: '提示' } + }, + required: ['status', 'retcode', 'data'] + }, + examples: responseExamples + } + } + } + }, + security: [] } }; } - const outputDir = resolve(__dirname, 'dist'); - if (!existsSync(outputDir)) { - mkdirSync(outputDir, { recursive: true }); - } - - const outputPath = resolve(outputDir, 'openapi.json'); + const outputPath = resolve(__dirname, 'openapi.json'); writeFileSync(outputPath, JSON.stringify(openapi, null, 2)); - console.log('OpenAPI schema (HTTP Format) generated at: ' + outputPath); + console.log('OpenAPI schema (3.0.1 Format) generated at: ' + outputPath); - // 生成审计报告 generateMissingReport(); } @@ -195,7 +205,7 @@ function generateMissingReport() { } } - const reportPath = resolve(__dirname, 'dist', 'missing_props.log'); + const reportPath = resolve(__dirname, 'missing_props.log'); if (missingReport.length > 0) { writeFileSync(reportPath, missingReport.join('\n')); console.warn('\n检查到 ' + missingReport.length + ' 个接口存在元数据缺失,报告已保存至: ' + reportPath); diff --git a/packages/napcat-schema/package.json b/packages/napcat-schema/package.json index 93a22595..27e62dad 100644 --- a/packages/napcat-schema/package.json +++ b/packages/napcat-schema/package.json @@ -5,9 +5,7 @@ "type": "module", "main": "index.ts", "scripts": { - "generate:openapi": "node ./dist/schemas.mjs", - "build:schema": "vite build", - "run": "vite build & node ./dist/schemas.mjs" + "build:schema": "vite build & node ./dist/schemas.mjs" }, "dependencies": { "@sinclair/typebox": "^0.34.38", From 819224b7882a9271c86ca641e8154f99d05db040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 20:10:43 +0800 Subject: [PATCH 15/17] Fix SendPokePayloadSchema type definitions Corrected the type definitions for user_id and target_id to only allow strings, and fixed a syntax error in group_id. This ensures payload validation is consistent and accurate. Refactor fileset ID API response and schema handling Updated GetFilesetId action to return a structured object with fileset_id and adjusted its return schema accordingly. Improved frontend TypeBox schema parsing to support allOf (intersection) merging and updated API debug component to construct response schemas in a more robust way for object recognition. Refactor OneBot API schema handling to use TypeBox Replaces Zod-based static API schema definitions with dynamic fetching of schemas from the backend using TypeBox. Removes legacy static schema files, updates frontend API debug components to use TypeBox utilities, and adds @sinclair/typebox as a dependency. Backend now exposes a /schemas endpoint for all OneBot actions. Various schema and description fields are updated for clarity and consistency. --- .../action/extends/SetGroupSearch.ts | 4 +- .../action/file/flash/GetFilesetIdByCode.ts | 9 +- .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 6 +- .../action/go-cqhttp/GoCQHTTPSetModelShow.ts | 4 +- .../action/go-cqhttp/UploadGroupFile.ts | 4 +- .../action/go-cqhttp/UploadPrivateFile.ts | 2 +- .../napcat-onebot/action/msg/MarkMsgAsRead.ts | 4 +- packages/napcat-onebot/action/msg/SendMsg.ts | 2 +- .../napcat-onebot/action/packet/SendPoke.ts | 6 +- packages/napcat-schema/index.ts | 6 +- .../napcat-webui-backend/src/api/Debug.ts | 35 + packages/napcat-webui-frontend/package.json | 1 + .../src/components/onebot/api/debug.tsx | 23 +- .../src/const/ob_api/group.ts | 744 ------------------ .../src/const/ob_api/index.ts | 57 +- .../src/const/ob_api/message/group.ts | 84 -- .../src/const/ob_api/message/index.ts | 290 ------- .../src/const/ob_api/message/node.ts | 120 --- .../src/const/ob_api/message/private.ts | 80 -- .../src/const/ob_api/online_status.ts | 335 -------- .../src/const/ob_api/response.ts | 16 - .../src/const/ob_api/system.ts | 366 --------- .../src/const/ob_api/user.ts | 278 ------- .../src/pages/dashboard/debug/http/index.tsx | 56 +- .../src/utils/typebox.ts | 123 +++ pnpm-lock.yaml | 3 + 26 files changed, 268 insertions(+), 2390 deletions(-) delete mode 100644 packages/napcat-webui-frontend/src/const/ob_api/group.ts delete mode 100644 packages/napcat-webui-frontend/src/const/ob_api/message/group.ts delete mode 100644 packages/napcat-webui-frontend/src/const/ob_api/message/index.ts delete mode 100644 packages/napcat-webui-frontend/src/const/ob_api/message/node.ts delete mode 100644 packages/napcat-webui-frontend/src/const/ob_api/message/private.ts delete mode 100644 packages/napcat-webui-frontend/src/const/ob_api/online_status.ts delete mode 100644 packages/napcat-webui-frontend/src/const/ob_api/response.ts delete mode 100644 packages/napcat-webui-frontend/src/const/ob_api/system.ts delete mode 100644 packages/napcat-webui-frontend/src/const/ob_api/user.ts create mode 100644 packages/napcat-webui-frontend/src/utils/typebox.ts diff --git a/packages/napcat-onebot/action/extends/SetGroupSearch.ts b/packages/napcat-onebot/action/extends/SetGroupSearch.ts index f3732ddf..2ab61e81 100644 --- a/packages/napcat-onebot/action/extends/SetGroupSearch.ts +++ b/packages/napcat-onebot/action/extends/SetGroupSearch.ts @@ -4,8 +4,8 @@ import { Static, Type } from '@sinclair/typebox'; const PayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), - no_code_finger_open: Type.Optional(Type.Number({ description: '是否开启无码指纹' })), - no_finger_open: Type.Optional(Type.Number({ description: '是否开启无指纹' })), + no_code_finger_open: Type.Optional(Type.Number({ description: '未知' })), + no_finger_open: Type.Optional(Type.Number({ description: '未知' })), }); type PayloadType = Static; diff --git a/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts b/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts index f0079a3a..ebd8a722 100644 --- a/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts +++ b/packages/napcat-onebot/action/file/flash/GetFilesetIdByCode.ts @@ -8,10 +8,12 @@ export const GetFilesetIdPayloadSchema = Type.Object({ export type GetFilesetIdPayload = Static; -export class GetFilesetId extends OneBotAction { +export class GetFilesetId extends OneBotAction { override actionName = ActionName.GetFilesetId; override payloadSchema = GetFilesetIdPayloadSchema; - override returnSchema = Type.Any({ description: '文件集 ID' }); + override returnSchema = Type.Object({ + fileset_id: Type.String({ description: '文件集 ID' }) + }); override actionSummary = '获取文件集 ID'; override actionTags = ['文件扩展']; override payloadExample = { @@ -24,6 +26,7 @@ export class GetFilesetId extends OneBotAction { async _handle (payload: GetFilesetIdPayload) { // 适配share_link 防止被传 Link无法解析 const code = payload.share_code.includes('=') ? payload.share_code.split('=').slice(1).join('=') : payload.share_code; - return await this.core.apis.FlashApi.fromShareLinkFindSetId(code); + const result = await this.core.apis.FlashApi.fromShareLinkFindSetId(code); + return { fileset_id: result.fileSetId }; } } diff --git a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index 62ca9d88..3cdf1cfb 100644 --- a/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/packages/napcat-onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -14,7 +14,7 @@ export const GoCQHTTPGetModelShowReturnSchema = Type.Array(Type.Object({ model_show: Type.String({ description: '显示名称' }), need_pay: Type.Boolean({ description: '是否需要付费' }), }), -}), { description: '模型显示列表' }); +}), { description: '机型显示列表' }); export type GoCQHTTPGetModelShowReturn = Static; @@ -22,8 +22,8 @@ export class GoCQHTTPGetModelShow extends OneBotAction { override actionName = ActionName.GoCQHTTP_SetModelShow; override payloadSchema = Type.Object({}); override returnSchema = Type.Null(); - override actionSummary = '设置模型显示'; - override actionDescription = '设置当前账号的设备模型显示名称'; + override actionSummary = '设置机型'; + override actionDescription = '设置当前账号的设备机型名称'; override actionTags = ['Go-CQHTTP']; override payloadExample = GoCQHTTPActionsExamples.GoCQHTTPSetModelShow.payload; override returnExample = GoCQHTTPActionsExamples.GoCQHTTPSetModelShow.response; diff --git a/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts b/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts index 72169932..58f3c3f9 100644 --- a/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/packages/napcat-onebot/action/go-cqhttp/UploadGroupFile.ts @@ -9,7 +9,7 @@ import { GoCQHTTPActionsExamples } from './examples'; export const GoCQHTTPUploadGroupFilePayloadSchema = Type.Object({ group_id: Type.String({ description: '群号' }), - file: Type.String({ description: '本地文件路径' }), + file: Type.String({ description: '资源路径或URL' }), name: Type.String({ description: '文件名' }), folder: Type.Optional(Type.String({ description: '父目录 ID' })), folder_id: Type.Optional(Type.String({ description: '父目录 ID (兼容性字段)' })), // 临时扩展 @@ -29,7 +29,7 @@ export default class GoCQHTTPUploadGroupFile extends OneBotAction; diff --git a/packages/napcat-onebot/action/msg/SendMsg.ts b/packages/napcat-onebot/action/msg/SendMsg.ts index 6cfe8c7a..cf07d2f0 100644 --- a/packages/napcat-onebot/action/msg/SendMsg.ts +++ b/packages/napcat-onebot/action/msg/SendMsg.ts @@ -195,7 +195,7 @@ export class SendMsgBase extends OneBotAction { // const music: OB11MessageCustomMusic = messages[0] as OB11MessageCustomMusic; // if (music) { // } - // }\r + // } } // log("send msg:", peer, sendElements) diff --git a/packages/napcat-onebot/action/packet/SendPoke.ts b/packages/napcat-onebot/action/packet/SendPoke.ts index b906a3c6..48682174 100644 --- a/packages/napcat-onebot/action/packet/SendPoke.ts +++ b/packages/napcat-onebot/action/packet/SendPoke.ts @@ -5,9 +5,9 @@ import { Static, Type } from '@sinclair/typebox'; import { PacketActionsExamples } from './examples'; export const SendPokePayloadSchema = Type.Object({ - group_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '群号' })), - user_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '用户QQ' })), - target_id: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: '目标QQ' })), + group_id: Type.Optional(Type.String({ description: '群号' })), + user_id: Type.Optional(Type.String({ description: '用户QQ' })), + target_id: Type.Optional(Type.String({ description: '目标QQ' })), }); export type SendPokePayload = Static; diff --git a/packages/napcat-schema/index.ts b/packages/napcat-schema/index.ts index fa9f5ddd..2d458b13 100644 --- a/packages/napcat-schema/index.ts +++ b/packages/napcat-schema/index.ts @@ -1,6 +1,6 @@ import { getAllHandlers } from '@/napcat-onebot/action/index'; import { AutoRegisterRouter } from '@/napcat-onebot/action/auto-register'; -import { writeFileSync, mkdirSync, existsSync } from 'node:fs'; +import { writeFileSync, existsSync } from 'node:fs'; import { resolve, dirname } from 'node:path'; import { TSchema } from '@sinclair/typebox'; import { fileURLToPath } from 'node:url'; @@ -17,7 +17,7 @@ interface ActionSchemaInfo { tags?: string[]; payloadExample?: unknown; returnExample?: unknown; - errorExamples?: Array<{ code: number, description: string }>; + errorExamples?: Array<{ code: number, description: string; }>; } export const actionSchemas: Record = {}; @@ -191,7 +191,7 @@ export function generateOpenAPI () { generateMissingReport(); } -function generateMissingReport() { +function generateMissingReport () { const missingReport: string[] = []; for (const [actionName, schemas] of Object.entries(actionSchemas)) { const missing: string[] = []; diff --git a/packages/napcat-webui-backend/src/api/Debug.ts b/packages/napcat-webui-backend/src/api/Debug.ts index 95683c17..3a35f9f4 100644 --- a/packages/napcat-webui-backend/src/api/Debug.ts +++ b/packages/napcat-webui-backend/src/api/Debug.ts @@ -12,6 +12,7 @@ import { ActionMap } from '@/napcat-onebot/action'; import { NapCatCore } from '@/napcat-core/index'; import { NapCatOneBot11Adapter } from '@/napcat-onebot/index'; import { OB11EmitEventContent, OB11NetworkReloadType } from '@/napcat-onebot/network/index'; +import { OneBotAction } from '@/napcat-onebot/action/OneBotAction'; import json5 from 'json5'; type ActionNameType = typeof ActionName[keyof typeof ActionName]; @@ -19,6 +20,40 @@ type ActionNameType = typeof ActionName[keyof typeof ActionName]; const router: Router = Router(); const DEFAULT_ADAPTER_NAME = 'debug-primary'; +/** + * 获取所有 Action 的 Schema 信息 + */ +router.get('/schemas', async (_req: Request, res: Response) => { + try { + const obContext = WebUiDataRuntime.getOneBotContext(); + if (!obContext) { + return sendError(res, 'OneBot 未初始化'); + } + const schemas: Record = {}; + + // 遍历 ActionName 中定义的所有路由 + for (const key in ActionName) { + const actionName = (ActionName as any)[key]; + if (actionName === ActionName.Unknown) continue; + + const handler = obContext.actions.get(actionName); + if (handler) { + const action = handler as OneBotAction; + schemas[actionName] = { + description: action.actionSummary || action.actionDescription, + payload: action.payloadSchema, + response: action.returnSchema, + payloadExample: action.payloadExample, + }; + } + } + + sendSuccess(res, schemas); + } catch (error: unknown) { + sendError(res, (error as Error).message); + } +}); + /** * 统一的调试适配器 * 用于注入到 OneBot NetworkManager,接收所有事件并转发给 WebSocket 客户端 diff --git a/packages/napcat-webui-frontend/package.json b/packages/napcat-webui-frontend/package.json index 503f1734..b6a24714 100644 --- a/packages/napcat-webui-frontend/package.json +++ b/packages/napcat-webui-frontend/package.json @@ -55,6 +55,7 @@ "@monaco-editor/loader": "^1.4.0", "@react-aria/visually-hidden": "^3.8.19", "@reduxjs/toolkit": "^2.5.1", + "@sinclair/typebox": "^0.34.41", "@uidotdev/usehooks": "^2.4.1", "@uiw/react-codemirror": "^4.25.4", "@xterm/addon-canvas": "^0.7.0", diff --git a/packages/napcat-webui-frontend/src/components/onebot/api/debug.tsx b/packages/napcat-webui-frontend/src/components/onebot/api/debug.tsx index 36930f9a..aa5b416f 100644 --- a/packages/napcat-webui-frontend/src/components/onebot/api/debug.tsx +++ b/packages/napcat-webui-frontend/src/components/onebot/api/debug.tsx @@ -21,7 +21,8 @@ import PageLoading from '@/components/page_loading'; import { request } from '@/utils/request'; -import { generateDefaultJson, parse } from '@/utils/zod'; +import { BaseResponseSchema, parseTypeBox, generateDefaultFromTypeBox } from '@/utils/typebox'; +import { Type } from '@sinclair/typebox'; import DisplayStruct from './display_struct'; @@ -58,8 +59,16 @@ const OneBotApiDebug = forwardRef((props const [responseHeight, setResponseHeight] = useState(240); const [storedHeight, setStoredHeight] = useLocalStorage('napcat_debug_response_height', 240); - const parsedRequest = parse(data.request); - const parsedResponse = parse(data.response); + const parsedRequest = parseTypeBox(data?.payload); + + // 将返回值的 data 结构包装进 BaseResponseSchema 进行展示 + // 使用解构属性的方式重新构建对象,确保 parseTypeBox 能够识别为 object 类型 + const wrappedResponseSchema = Type.Object({ + ...BaseResponseSchema.properties, + data: data?.response || Type.Any({ description: '数据' }) + }); + + const parsedResponse = parseTypeBox(wrappedResponseSchema); const [backgroundImage] = useLocalStorage(key.backgroundImage, ''); const hasBackground = !!backgroundImage; @@ -75,7 +84,7 @@ const OneBotApiDebug = forwardRef((props // 如果有 adapterName,走后端转发 if (adapterName) { request.post(`/api/Debug/call/${adapterName}`, { - action: path.replace(/^\//, ''), // 去掉开头的 / + action: path, params: parsedRequestBody }, { headers: { @@ -154,7 +163,11 @@ const OneBotApiDebug = forwardRef((props })); useEffect(() => { - setRequestBody(generateDefaultJson(data.request)); + if (data?.payloadExample) { + setRequestBody(JSON.stringify(data.payloadExample, null, 2)); + } else { + setRequestBody(JSON.stringify(generateDefaultFromTypeBox(data?.payload), null, 2)); + } setResponseContent(''); setResponseStatus(null); }, [path]); diff --git a/packages/napcat-webui-frontend/src/const/ob_api/group.ts b/packages/napcat-webui-frontend/src/const/ob_api/group.ts deleted file mode 100644 index 39d69fe0..00000000 --- a/packages/napcat-webui-frontend/src/const/ob_api/group.ts +++ /dev/null @@ -1,744 +0,0 @@ -import { z } from 'zod'; - -import messageNodeSchema from './message/node'; -import { baseResponseSchema, commonResponseDataSchema } from './response'; - -const oneBotHttpApiGroup = { - '/set_group_kick': { - description: '群踢人', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - user_id: z.union([z.string(), z.number()]).describe('QQ 号'), - reject_add_request: z.boolean().describe('拒绝此人的加群请求'), - }), - response: baseResponseSchema, - }, - '/set_group_ban': { - description: '群禁言', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - user_id: z.union([z.string(), z.number()]).describe('QQ 号'), - duration: z.number(), - }), - response: baseResponseSchema, - }, - '/get_group_system_msg': { - description: '获取群系统消息', - request: z.object({}), - response: baseResponseSchema.extend({ - data: z.object({ - InvitedRequest: z - .array( - z - .object({ - request_id: z.string().describe('请求 ID'), - invitor_uin: z.string().describe('邀请人 QQ 号'), - invitor_nick: z.string().describe('邀请人昵称'), - group_id: z.string().describe('群号'), - message: z.string().describe('入群回答'), - group_name: z.string().describe('群名称'), - checked: z.boolean().describe('是否已处理'), - actor: z.string().describe('处理人 QQ 号'), - }) - .describe('邀请入群请求') - ) - .describe('邀请入群请求列表'), - join_requests: z.array( - z.object({ - request_id: z.string().describe('请求 ID'), - requester_uin: z.string().describe('请求人 QQ 号'), - requester_nick: z.string().describe('请求人昵称'), - group_id: z.string().describe('群号'), - message: z.string().describe('入群回答'), - group_name: z.string().describe('群名称'), - checked: z.boolean().describe('是否已处理'), - actor: z.string().describe('处理人 QQ 号'), - }) - ), - }), - }), - }, - '/get_essence_msg_list': { - description: '获取精华消息', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema.extend({ - data: z - .array( - z - .object({ - msg_seq: z.number().describe('消息序号'), - msg_random: z.number().describe('消息随机数'), - sender_id: z.number().describe('发送人 QQ 号'), - sender_nick: z.string().describe('发送人昵称'), - operator_id: z.number().describe('操作人 QQ 号'), - operator_nick: z.string().describe('操作人昵称'), - message_id: z.string().describe('消息 ID'), - operator_time: z.string().describe('操作时间'), - content: z.array(messageNodeSchema), - }) - .describe('精华消息') - ) - .describe('精华消息列表'), - }), - }, - '/set_group_whole_ban': { - description: '全员禁言', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - enable: z.boolean().describe('是否开启'), - }), - response: baseResponseSchema, - }, - '/set_group_portrait': { - description: '设置群头像', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - file: z.string().describe('图片文件路径,服务器本地路径或远程 URL'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/set_group_admin': { - description: '设置群管理', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - user_id: z.union([z.string(), z.number()]).describe('QQ 号'), - enable: z.boolean().describe('是否设置为管理员'), - }), - response: baseResponseSchema, - }, - '/set_essence_msg': { - description: '设置群精华消息', - request: z.object({ - message_id: z.union([z.string(), z.number()]).describe('消息 ID'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - errCode: z.number().describe('错误码'), - errMsg: z.string().describe('错误信息'), - result: z - .object({ - wording: z.string().describe('?'), - digestUin: z.string().describe('?QQ号'), - digestTime: z.number().describe('设置时间?'), - msg: z - .object({ - groupCode: z.string().describe('群号'), - msgSeq: z.number().describe('消息序号'), - msgRandom: z.number().describe('消息随机数'), - msgContent: z.array(messageNodeSchema).describe('消息内容'), - textSize: z.string().describe('文本大小'), - picSize: z.string().describe('图片大小'), - videoSize: z.string().describe('视频大小'), - senderUin: z.string().describe('发送人 QQ 号'), - senderTime: z.number().describe('发送时间'), - addDigestUin: z.string().describe('添加精华消息人 QQ 号'), - addDigestTime: z.number().describe('添加精华消息时间'), - startTime: z.number().describe('开始时间'), - latestMsgSeq: z.number().describe('最新消息序号'), - opType: z.number().describe('操作类型'), - }) - .describe('消息内容'), - errorCode: z.number().describe('错误码'), - }) - .describe('结果'), - }), - }), - }, - '/set_group_card': { - description: '设置群成员名片', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - user_id: z.union([z.string(), z.number()]).describe('QQ 号'), - card: z.string().describe('名片'), - }), - response: baseResponseSchema, - }, - '/delete_essence_msg': { - description: '删除群精华消息', - request: z.object({ - message_id: z.union([z.string(), z.number()]).describe('消息 ID'), - }), - - response: baseResponseSchema.extend({ - data: z.object({ - errCode: z.number().describe('错误码'), - errMsg: z.string().describe('错误信息'), - result: z - .object({ - wording: z.string().describe('?'), - digestUin: z.string().describe('?QQ号'), - digestTime: z.number().describe('设置时间?'), - msg: z.object({ - groupCode: z.string().describe('群号'), - msgSeq: z.number().describe('消息序号'), - msgRandom: z.number().describe('消息随机数'), - msgContent: z.array(messageNodeSchema).describe('消息内容'), - textSize: z.string().describe('文本大小'), - picSize: z.string().describe('图片大小'), - videoSize: z.string().describe('视频大小'), - senderUin: z.string().describe('发送人 QQ 号'), - senderTime: z.number().describe('发送时间'), - addDigestUin: z.string().describe('添加精华消息人 QQ 号'), - addDigestTime: z.number().describe('添加精华消息时间'), - startTime: z.number().describe('开始时间'), - latestMsgSeq: z.number().describe('最新消息序号'), - opType: z.number().describe('操作类型'), - }), - errorCode: z.number().describe('错误码'), - }) - .describe('结果'), - }), - }), - }, - '/set_group_name': { - description: '设置群名称', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - group_name: z.string().describe('群名称'), - }), - response: baseResponseSchema, - }, - '/set_group_leave': { - description: '退出群聊', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema, - }, - '/_send_group_notice': { - description: '发送群公告', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - content: z.string().describe('公告内容'), - image: z.string().optional().describe('图片地址'), - }), - response: baseResponseSchema, - }, - '/_get_group_notice': { - description: '获取群公告', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema.extend({ - data: z.array( - z.object({ - notice_id: z.string().describe('公告 ID'), - sender_id: z.number().describe('发送人 QQ 号'), - publish_time: z.number().describe('发布时间'), - message: z.object({ - text: z.string().describe('文本内容'), - image: z - .array( - z - .object({ - id: z.string().describe('图片 ID'), - height: z.string().describe('高度'), - width: z.string().describe('宽度'), - }) - .describe('图片信息') - ) - .describe('图片内容列表'), - }), - }) - ), - }), - }, - '/set_group_special_title': { - description: '设置群成员专属头衔', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - user_id: z.union([z.string(), z.number()]).describe('QQ 号'), - special_title: z.string().describe('专属头衔内容'), - }), - response: baseResponseSchema, - }, - '/upload_group_file': { - description: '上传群文件', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - file: z.string().describe('文件路径'), - name: z.string().describe('文件名'), - folder_id: z.string().describe('文件夹 ID'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/set_group_add_request': { - description: '处理加群请求', - request: z.object({ - flag: z.string().describe('请求ID'), - approve: z.boolean().describe('是否同意'), - reason: z.string().optional().describe('拒绝理由'), - }), - response: baseResponseSchema, - }, - '/get_group_info': { - description: '获取群信息', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema.extend({ - data: z.object({}), - }), - }, - '/get_group_info_ex': { - description: '获取群信息扩展', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema.extend({ - data: z - .object({ - groupCode: z.string().describe('群号'), - resultCode: z.number().describe('结果码'), - extInfo: z - .object({ - groupInfoExtSeq: z.number().describe('群信息序列号'), - reserve: z.number().describe('?'), - luckyWordId: z.string().describe('幸运字符ID'), - lightCharNum: z.number().describe('?'), - luckyWord: z.string().describe('幸运字符'), - starId: z.number().describe('?'), - essentialMsgSwitch: z.number().describe('精华消息开关'), - todoSeq: z.number().describe('?'), - blacklistExpireTime: z.number().describe('黑名单过期时间'), - isLimitGroupRtc: z.number().describe('是否限制群视频通话'), - companyId: z.number().describe('公司ID'), - hasGroupCustomPortrait: z.number().describe('是否有群自定义头像'), - bindGuildId: z.string().describe('绑定频道ID?'), - groupOwnerId: z - .object({ - memberUin: z.string().describe('群主QQ号'), - memberUid: z.string().describe('群主ID'), - memberQid: z.string().describe('群主QID'), - }) - .describe('群主信息'), - essentialMsgPrivilege: z.number().describe('精华消息权限'), - msgEventSeq: z.string().describe('消息事件序列号'), - inviteRobotSwitch: z.number().describe('邀请机器人开关'), - gangUpId: z.string().describe('?'), - qqMusicMedalSwitch: z.number().describe('QQ音乐勋章开关'), - showPlayTogetherSwitch: z.number().describe('显示一起玩开关'), - groupFlagPro1: z.string()?.describe('群标识1'), - groupBindGuildIds: z - .object({ - guildIds: z.array(z.string()), - }) - .describe('绑定频道ID列表?'), - viewedMsgDisappearTime: z.string().describe('消息消失时间'), - groupExtFlameData: z.object({ - switchState: z.number().describe('开关状态'), - state: z.number().describe('状态'), - dayNums: z.array(z.number()).describe('天数列表'), - version: z.number().describe('版本号'), - updateTime: z.string().describe('更新时间'), - isDisplayDayNum: z.boolean().describe('是否显示天数'), - }), - groupBindGuildSwitch: z.number().describe('绑定频道开关'), - groupAioBindGuildId: z.string().describe('AIO绑定频道ID'), - groupExcludeGuildIds: z - .object({ - guildIds: z.array(z.string()).describe('排除频道ID'), - }) - .describe('排除频道ID列表?'), - fullGroupExpansionSwitch: z.number().describe('全员群扩容开关'), - fullGroupExpansionSeq: z.string().describe('全员群扩容序列号'), - inviteRobotMemberSwitch: z - .number() - .describe('邀请机器人成员开关'), - inviteRobotMemberExamine: z - .number() - .describe('邀请机器人成员审核'), - groupSquareSwitch: z.number().describe('群广场开关'), - }) - .describe('扩展信息'), - }) - .describe('结果'), - }), - }, - '/create_group_file_folder': { - description: '创建群文件夹', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - folder_name: z.string().describe('文件夹名称'), - }), - response: baseResponseSchema.extend({ - data: z - .object({ - result: z - .object({ - retCode: z.number().describe('结果码'), - retMsg: z.string().describe('结果信息'), - clientWording: z.string().describe('客户端提示'), - }) - .describe('结果'), - groupItem: z - .object({ - peerId: z.string().describe('?'), - type: z.string().describe('类型'), - folderInfo: z - .object({ - folderId: z.string().describe('文件夹 ID'), - parentFolderId: z.string().describe('父文件夹 ID'), - folderName: z.string().describe('文件夹名称'), - createTime: z.number().describe('创建时间'), - modifyTime: z.number().describe('修改时间'), - createUin: z.string().describe('创建人 QQ 号'), - creatorName: z.string().describe('创建人昵称'), - totalFileCount: z.string().describe('文件总数'), - modifyUin: z.string().describe('修改人 QQ 号'), - modifyName: z.string().describe('修改人昵称'), - usedSpace: z.string().describe('已使用空间'), - }) - .describe('文件夹信息'), - }) - .describe('群文件夹信息'), - }) - .describe('数据'), - }), - }, - '/delete_group_file': { - description: '删除群文件', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - file_id: z.string().describe('文件 ID'), - }), - response: baseResponseSchema.extend({ - data: z - .object({ - result: z.number().describe('结果码'), - errMsg: z.string().describe('错误信息'), - transGroupFileResult: z - .object({ - result: z - .object({ - retCode: z.number().describe('结果码'), - retMsg: z.string().describe('结果信息'), - clientWording: z.string().describe('客户端提示'), - }) - .describe('结果'), - successFileIdList: z - .array(z.string()) - .describe('成功文件 ID 列表'), - failFileIdList: z.array(z.string()).describe('失败文件 ID 列表'), - }) - .describe('删除群文件结果'), - }) - .describe('结果'), - }), - }, - '/delete_group_folder': { - description: '删除群文件夹', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - folder_id: z.string().describe('文件夹 ID'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - retCode: z.number().describe('结果码'), - retMsg: z.string().describe('结果信息'), - clientWording: z.string().describe('客户端提示'), - }), - }), - }, - '/get_group_file_system_info': { - description: '获取群文件系统信息', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - file_count: z.number().describe('文件总数'), - limit_count: z.number().describe('文件总数限制'), - used_space: z.number().describe('已使用空间'), - total_space: z.number().describe('总空间'), - }), - }), - }, - '/get_group_root_files': { - description: '获取群根目录文件列表', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema.extend({ - data: z.array( - z.object({ - files: z - .array( - z - .object({ - group_id: z.number().describe('群号'), - file_id: z.string().describe('文件 ID'), - file_name: z.string().describe('文件名'), - busid: z.number().describe('?'), - size: z.number().describe('文件大小'), - upload_time: z.number().describe('上传时间'), - dead_time: z.number().describe('过期时间'), - modify_time: z.number().describe('修改时间'), - download_times: z.number().describe('下载次数'), - uploader: z.number().describe('上传人 QQ 号'), - uploader_name: z.string().describe('上传人昵称'), - }) - .describe('文件信息') - ) - .describe('文件列表'), - folders: z - .array( - z - .object({ - group_id: z.number().describe('群号'), - folder_id: z.string().describe('文件夹 ID'), - folder: z.string().describe('文件夹?'), - folder_name: z.string().describe('文件夹名称'), - create_time: z.string().describe('创建时间'), - creator: z.string().describe('创建人 QQ 号'), - creator_name: z.string().describe('创建人昵称'), - total_file_count: z.string().describe('文件总数'), - }) - .describe('文件夹信息') - ) - .describe('文件夹列表'), - }) - ), - }), - }, - '/get_group_files_by_folder': { - description: '获取群子目录文件列表', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - folder_id: z.string().describe('文件夹 ID'), - file_count: z.number().describe('文件数量'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - files: z - .array( - z - .object({ - group_id: z.number().describe('群号'), - file_id: z.string().describe('文件 ID'), - file_name: z.string().describe('文件名'), - busid: z.number().describe('?'), - size: z.number().describe('文件大小'), - upload_time: z.number().describe('上传时间'), - dead_time: z.number().describe('过期时间'), - modify_time: z.number().describe('修改时间'), - download_times: z.number().describe('下载次数'), - uploader: z.number().describe('上传人 QQ 号'), - uploader_name: z.string().describe('上传人昵称'), - }) - .describe('文件信息') - ) - .describe('文件列表'), - folders: z - .array( - z - .object({ - group_id: z.number().describe('群号'), - folder_id: z.string().describe('文件夹 ID'), - folder: z.string().describe('文件夹?'), - folder_name: z.string().describe('文件夹名称'), - create_time: z.string().describe('创建时间'), - creator: z.string().describe('创建人 QQ 号'), - creator_name: z.string().describe('创建人昵称'), - total_file_count: z.string().describe('文件总数'), - }) - .describe('文件夹信息') - ) - .describe('文件夹列表'), - }), - }), - }, - '/get_group_file_url': { - description: '获取群文件下载链接', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - file_id: z.string().describe('文件 ID'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - url: z.string().describe('下载链接'), - }), - }), - }, - '/get_group_list': { - description: '获取群列表', - request: z.object({ - next_token: z.string().optional().describe('下一页标识'), - }), - response: baseResponseSchema.extend({ - data: z.array(z.object({})), - }), - }, - '/get_group_member_info': { - description: '获取群成员信息', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - user_id: z.union([z.string(), z.number()]).describe('QQ 号'), - no_cache: z.boolean().describe('是否不使用缓存'), - }), - response: baseResponseSchema.extend({ - data: z.object({}), - }), - }, - '/get_group_member_list': { - description: '获取群成员列表', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - no_cache: z.boolean().describe('是否不使用缓存'), - }), - response: baseResponseSchema.extend({ - data: z.array(z.object({})), - }), - }, - '/get_group_honor_info': { - description: '获取群荣誉', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema.extend({ - data: z - .object({ - group_id: z.number().describe('群号'), - current_talkative: z - .object({ - user_id: z.number().describe('QQ 号'), - avatar: z.string().describe('头像 URL'), - nickname: z.string().describe('昵称'), - day_count: z.number().describe('天数'), - description: z.string().describe('描述'), - }) - .describe('当前龙王'), - talkative_list: z - .array( - z.object({ - user_id: z.number().describe('QQ 号'), - avatar: z.string().describe('头像 URL'), - nickname: z.string().describe('昵称'), - day_count: z.number().describe('天数'), - description: z.string().describe('描述'), - }) - ) - .describe('龙王榜'), - performer_list: z - .array( - z.object({ - user_id: z.number().describe('QQ 号'), - avatar: z.string().describe('头像 URL'), - nickname: z.string().describe('昵称'), - description: z.string().describe('描述'), - }) - ) - .describe('?'), - legend_list: z.array(z.string()).describe('?'), - emotion_list: z.array(z.string()).describe('?'), - strong_newbie_list: z.array(z.string()).describe('?'), - }) - .describe('群荣誉信息'), - }), - }, - '/get_group_at_all_remain': { - description: '获取群 @全体成员 剩余次数', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - can_at_all: z.boolean().describe('是否可以 @全体成员'), - remain_at_all_count_for_group: z.number().describe('剩余次数(group?)'), - remain_at_all_count_for_uin: z.number().describe('剩余次数(qq?)'), - }), - }), - }, - '/get_group_ignored_notifies': { - description: '获取群过滤系统消息', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - join_requests: z - .array( - z.object({ - request_id: z.string().describe('请求 ID'), - requester_uin: z.string().describe('请求人 QQ 号'), - requester_nick: z.string().describe('请求人昵称'), - group_id: z.string().describe('群号'), - group_name: z.string().describe('群名称'), - checked: z.boolean().describe('是否已处理'), - actor: z.string().describe('处理人 QQ 号'), - }) - ) - .describe('入群请求列表'), - }), - }), - }, - '/set_group_sign': { - description: '设置群打卡', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema, - }, - '/send_group_sign': { - description: '发送群打卡', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema, - }, - '/get_ai_characters': { - description: '获取AI语音人物', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - chat_type: z.union([z.string(), z.number()]).describe('聊天类型'), - }), - response: baseResponseSchema.extend({ - data: z.array( - z.object({ - type: z.string().describe('类型'), - characters: z.array( - z - .object({ - character_id: z.string().describe('人物 ID'), - character_name: z.string().describe('人物名称'), - preview_url: z.string().describe('预览音频地址'), - }) - .describe('人物信息') - ), - }) - ), - }), - }, - '/send_group_ai_record': { - description: '发送群AI语音', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - character: z.string().describe('人物ID'), - text: z.string().describe('文本内容'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - message_id: z.string().describe('消息 ID'), - }), - }), - }, - '/get_ai_record': { - description: '获取AI语音', - request: z.object({ - group_id: z.string().describe('群号'), - character: z.string().describe('人物ID'), - text: z.string().describe('文本内容'), - }), - response: baseResponseSchema.extend({ - data: z.string(), - }), - }, -} as const; - -export default oneBotHttpApiGroup; diff --git a/packages/napcat-webui-frontend/src/const/ob_api/index.ts b/packages/napcat-webui-frontend/src/const/ob_api/index.ts index ab075756..58218c84 100644 --- a/packages/napcat-webui-frontend/src/const/ob_api/index.ts +++ b/packages/napcat-webui-frontend/src/const/ob_api/index.ts @@ -1,34 +1,39 @@ -import { ZodSchema } from 'zod'; +import { TSchema } from '@sinclair/typebox'; -import oneBotHttpApiGroup from './group'; -import oneBotHttpApiMessage from './message'; -import oneBotHttpApiSystem from './system'; -import oneBotHttpApiUser from './user'; +export interface OneBotHttpApiContent { + description?: string; + payload: TSchema; + response: TSchema; + payloadExample?: any; +} -type AllKey = - | keyof typeof oneBotHttpApiUser - | keyof typeof oneBotHttpApiMessage - | keyof typeof oneBotHttpApiGroup - | keyof typeof oneBotHttpApiSystem; +export type OneBotHttpApi = Record; -export type OneBotHttpApi = Record< - AllKey, - { - description?: string - request: ZodSchema - response: ZodSchema +let oneBotHttpApi: OneBotHttpApi = {}; + +export async function fetchOneBotHttpApi (): Promise { + try { + const response = await fetch('/api/Debug/schemas', { + headers: { + 'Authorization': `Bearer ${localStorage.getItem('token')}` + } + }); + const data = await response.json(); + if (data.code === 0) { + oneBotHttpApi = data.data; + return oneBotHttpApi; + } + } catch (error) { + console.error('Failed to fetch OneBot HTTP API schemas:', error); } ->; + return {}; +} -const oneBotHttpApi: OneBotHttpApi = { - ...oneBotHttpApiUser, - ...oneBotHttpApiMessage, - ...oneBotHttpApiGroup, - ...oneBotHttpApiSystem, -} as const; +export function getOneBotHttpApi () { + return oneBotHttpApi; +} -export type OneBotHttpApiPath = keyof OneBotHttpApi; - -export type OneBotHttpApiContent = OneBotHttpApi[OneBotHttpApiPath]; +export type OneBotHttpApiPath = string; export default oneBotHttpApi; + diff --git a/packages/napcat-webui-frontend/src/const/ob_api/message/group.ts b/packages/napcat-webui-frontend/src/const/ob_api/message/group.ts deleted file mode 100644 index f5546e63..00000000 --- a/packages/napcat-webui-frontend/src/const/ob_api/message/group.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { z } from 'zod'; -import type { ZodSchema } from 'zod'; - -import { baseResponseSchema, commonResponseDataSchema } from '../response'; -import messageNodeSchema, { nodeMessage } from './node'; - -const oneBotHttpApiMessageGroup: Record< - string, - { - description?: string - request: ZodSchema - response: ZodSchema - } -> = { - '/send_group_msg': { - description: '发送群消息', - request: z - .object({ - group_id: z - .union([z.string(), z.number()]) - .describe('群号') - .describe('群号'), - message: z.array(messageNodeSchema).describe('消息内容'), - }) - .refine( - (data) => { - const hasReply = data.message.some((item) => item.type === 'reply'); - - if (hasReply) { - return data.message[0].type === 'reply'; - } - - return true; - }, - { - message: - '如果 message 包含 reply 类型的消息,那么只能包含一个,而且排在最前面', - } - ), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/send_group_forward_msg': { - description: '发送群合并转发消息', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - messages: z.array(nodeMessage).describe('消息内容'), - news: z - .array( - z.object({ - text: z.string(), - }) - ) - .describe('?'), - prompt: z.string().describe('外显'), - summary: z.string().describe('底下文本'), - source: z.string().describe('内容'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/forward_group_single_msg': { - description: '消息转发到群', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - message_id: z.union([z.string(), z.number()]).describe('消息 ID'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/group_poke': { - description: '发送戳一戳', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - user_id: z.union([z.string(), z.number()]).describe('对方QQ号'), - }), - response: baseResponseSchema, - }, -}; - -export default oneBotHttpApiMessageGroup; diff --git a/packages/napcat-webui-frontend/src/const/ob_api/message/index.ts b/packages/napcat-webui-frontend/src/const/ob_api/message/index.ts deleted file mode 100644 index 9e624ea8..00000000 --- a/packages/napcat-webui-frontend/src/const/ob_api/message/index.ts +++ /dev/null @@ -1,290 +0,0 @@ -import { z } from 'zod'; - -import { baseResponseSchema, commonResponseDataSchema } from '../response'; -import oneBotHttpApiMessageGroup from './group'; -import messageNodeSchema from './node'; -import oneBotHttpApiMessagePrivate from './private'; - -const fileSchema = z - .object({ - file: z.string().describe('路径或链接'), - url: z.string().describe('路径或链接'), - file_size: z.string().describe('文件大小'), - file_name: z.string().describe('文件名'), - base64: z.string().describe('文件base64编码'), - }) - .describe('文件'); -const messageSchema = z - .object({ - self_id: z.number().describe('自己QQ号'), - user_id: z.number().describe('发送人QQ号'), - time: z.number().describe('发送时间'), - message_id: z.number().describe('消息ID'), - message_seq: z.number().describe('消息序号'), - real_id: z.number().describe('?ID'), - message_type: z.string().describe('消息类型'), - sender: z - .object({ - user_id: z.number().describe('发送人QQ号'), - nickname: z.string().describe('昵称'), - sex: z.enum(['male', 'female', 'unknown']).describe('性别'), - age: z.number().describe('年龄'), - card: z.string().describe('名片'), - role: z.enum(['owner', 'admin', 'member']).describe('角色'), - }) - .describe('发送人信息'), - raw_message: z.string().describe('原始消息'), - font: z.number().describe('字体'), - sub_type: z.string().describe('子类型'), - message: z.array(messageNodeSchema).describe('消息内容'), - message_format: z.string().describe('消息格式'), - post_type: z.string().describe('?'), - message_sent_type: z.string().describe('消息发送类型'), - group_id: z.number().describe('群号'), - }) - .describe('消息'); - -const oneBotHttpApiMessage = { - ...oneBotHttpApiMessagePrivate, - ...oneBotHttpApiMessageGroup, - '/mark_msg_as_read': { - description: '标记消息已读', - request: z - .object({ - group_id: z - .union([z.string(), z.number()]) - .optional() - .describe('群号,与 user_id 二选一'), - user_id: z - .union([z.string(), z.number()]) - .optional() - .describe('用户QQ号,与 group_id 二选一'), - }) - .refine( - (data) => - (data.group_id && !data.user_id) || (!data.group_id && data.user_id), - { - message: 'group_id 和 user_id 必须二选一,且不能同时存在或同时为空', - path: ['group_id', 'user_id'], - } - ), - response: baseResponseSchema, - }, - '/mark_group_msg_as_read': { - description: '标记群消息已读', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - }), - response: baseResponseSchema, - }, - '/mark_private_msg_as_read': { - description: '标记私聊消息已读', - request: z.object({ - user_id: z.union([z.string(), z.number()]).describe('用户QQ号'), - }), - response: baseResponseSchema, - }, - '/_mark_all_as_read': { - description: '标记所有消息已读', - request: z.object({}), - response: baseResponseSchema, - }, - '/delete_msg': { - description: '撤回消息', - request: z.object({ - message_id: z.union([z.string(), z.number()]).describe('消息ID'), - }), - response: baseResponseSchema, - }, - '/get_msg': { - description: '获取消息', - request: z.object({ - message_id: z.union([z.string(), z.number()]).describe('消息ID'), - }), - response: baseResponseSchema.extend({ - data: z.object({}), - }), - }, - '/get_image': { - description: '获取图片', - request: z.object({ - file_id: z.string().describe('文件ID'), - }), - response: baseResponseSchema.extend({ - data: fileSchema, - }), - }, - '/get_record': { - description: '获取语音', - request: z.object({ - file_id: z.string().describe('文件ID'), - out_format: z - .enum(['mp3', 'amr', 'wma', 'm4a', 'spx', 'ogg', 'wav', 'flac']) - .describe('输出格式'), - }), - response: baseResponseSchema.extend({ - data: fileSchema, - }), - }, - '/get_file': { - description: '获取文件', - request: z.object({ - file_id: z.string().describe('文件ID'), - }), - response: baseResponseSchema.extend({ - data: fileSchema, - }), - }, - '/get_group_msg_history': { - description: '获取群消息历史', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群号'), - message_seq: z.union([z.string(), z.number()]).describe('消息序号'), - count: z.number().int().positive().describe('获取数量'), - reverse_order: z.boolean().describe('是否倒序'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - messages: z.array(messageSchema).describe('消息列表'), - }), - }), - }, - '/set_msg_emoji_like': { - description: '贴表情', - request: z.object({ - message_id: z.union([z.string(), z.number()]).describe('消息ID'), - emoji_id: z.number().describe('表情ID'), - set: z.boolean().describe('?'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/get_friend_msg_history': { - description: '获取好友消息历史', - request: z.object({ - user_id: z.union([z.string(), z.number()]).describe('用户QQ号'), - message_seq: z.union([z.string(), z.number()]).describe('消息序号'), - count: z.number().int().positive().describe('获取数量'), - reverse_order: z.boolean().describe('是否倒序'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - messages: z.array(messageSchema), - }), - }), - }, - '/get_recent_contact': { - description: '最近消息列表', - request: z.object({ - count: z.number().int().positive().describe('获取数量'), - }), - response: baseResponseSchema.extend({ - data: z.array( - z.object({ - lastestMsg: messageSchema, - peerUin: z.string().describe('对方QQ号'), - remark: z.string().describe('备注'), - msgTime: z.string().describe('消息时间'), - chatType: z.number().describe('聊天类型'), - msgId: z.string().describe('消息ID'), - sendNickName: z.string().describe('发送人昵称'), - sendMemberName: z.string().describe('发送人?昵称'), - peerName: z.string().describe('对方昵称'), - }) - ), - }), - }, - '/fetch_emoji_like': { - description: '获取贴表情详情', - request: z.object({ - message_id: z.union([z.string(), z.number()]).describe('消息ID'), - emojiId: z.string().describe('表情ID'), - emojiType: z.string().describe('表情类型'), - count: z.number().int().positive().optional().describe('获取数量'), - cookie: z.string().describe('cookie,首次为空,后续为上次返回'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - result: z.number().describe('结果'), - errMsg: z.string().describe('错误信息'), - emojiLikesList: z - .array( - z - .object({ - tinyId: z.string().describe('点击者QQ号'), - nickName: z.string().describe('昵称?'), - headUrl: z.string().describe('头像?'), - }) - .describe('表情点击列表') - ) - .describe('表情点击列表'), - cookie: z.string().describe('cookie'), - isLastPage: z.boolean().describe('是否最后一页'), - isFirstPage: z.boolean().describe('是否第一页'), - }), - }), - }, - '/get_emoji_likes': { - description: '获取贴表情详情列表', - request: z.object({ - message_id: z.union([z.string(), z.number()]).describe('消息ID'), - emojiId: z.string().describe('表情ID'), - emojiType: z.string().describe('表情类型'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - result: z.number().describe('结果'), - errMsg: z.string().describe('错误信息'), - emojiLikesList: z - .array( - z - .object({ - tinyId: z.string().describe('点击者QQ号'), - nickName: z.string().describe('昵称?'), - headUrl: z.string().describe('头像?'), - }) - .describe('表情点击列表') - ) - .describe('表情点击列表'), - }), - }), - }, - '/get_forward_msg': { - description: '获取合并转发消息', - request: z.object({ - message_id: z.union([z.string(), z.number()]).describe('消息ID'), - }), - response: baseResponseSchema.extend({ - data: z.object({}), - }), - }, - '/send_forward_msg': { - description: '发送合并转发消息', - request: z.object({ - group_id: z.union([z.string(), z.number()]).optional().describe('群号'), - user_id: z - .union([z.string(), z.number()]) - .optional() - .describe('用户QQ号'), - messages: z.array(messageNodeSchema).describe('消息内容'), - news: z - .array( - z.object({ - text: z.string(), - }) - ) - .describe('?'), - prompt: z.string().describe('外显'), - summary: z.string().describe('底下文字'), - source: z.string().describe('内容'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema.extend({ - data: z.object({}), - }), - }), - }, -} as const; - -export default oneBotHttpApiMessage; diff --git a/packages/napcat-webui-frontend/src/const/ob_api/message/node.ts b/packages/napcat-webui-frontend/src/const/ob_api/message/node.ts deleted file mode 100644 index c1b93c90..00000000 --- a/packages/napcat-webui-frontend/src/const/ob_api/message/node.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { z } from 'zod'; - -const messageNode = z.union([ - z - .object({ - type: z.literal('text'), - data: z.object({ - text: z.string(), - }), - }) - .describe('文本消息'), - z - .object({ - type: z.literal('at'), - data: z.object({ - qq: z.string(), - }), - }) - .describe('@某人'), - z - .object({ - type: z.literal('image'), - data: z.object({ - file: z.string(), - }), - }) - .describe('图片消息'), - z - .object({ - type: z.literal('face'), - data: z.object({ - id: z.number(), - }), - }) - .describe('表情消息'), - z - .object({ - type: z.literal('json'), - data: z.object({ - data: z.string(), - }), - }) - .describe('json 卡片消息'), - z - .object({ - type: z.literal('record'), - data: z.object({ - file: z.string(), - }), - }) - .describe('语音消息'), - z - .object({ - type: z.literal('video'), - data: z.object({ - file: z.string(), - }), - }) - .describe('视频消息'), - z - .object({ - type: z.literal('reply'), - data: z.object({ - id: z.number().optional(), - seq: z.number().optional(), - }), - }) - .describe('回复消息'), - z - .object({ - type: z.literal('music'), - data: z.union([ - z.object({ - type: z.enum(['qq', '163']), - id: z.string(), - }), - z.object({ - type: z.literal('custom'), - url: z.string(), - audio: z.string(), - title: z.string(), - image: z.string(), - }), - ]), - }) - .describe('音乐消息'), - z - .object({ - type: z.literal('dice'), - }) - .describe('掷骰子'), - z - .object({ - type: z.literal('rps'), - }) - .describe('猜拳'), - z - .object({ - type: z.literal('file'), - data: z.object({ - file: z.string().describe('文件路径,服务器本地或者网络文件均可'), - }), - }) - .describe('发送消息'), -]); - -export const nodeMessage = z - .object({ - type: z.literal('node'), - data: z.object({ - user_id: z.string(), - nickname: z.string(), - content: z.array(messageNode), - }), - }) - .describe('消息节点'); - -const messageNodeSchema = z.union([messageNode, nodeMessage]); - -export default messageNodeSchema; diff --git a/packages/napcat-webui-frontend/src/const/ob_api/message/private.ts b/packages/napcat-webui-frontend/src/const/ob_api/message/private.ts deleted file mode 100644 index 87ff7e11..00000000 --- a/packages/napcat-webui-frontend/src/const/ob_api/message/private.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { z } from 'zod'; -import type { ZodSchema } from 'zod'; - -import { baseResponseSchema, commonResponseDataSchema } from '../response'; -import messageNodeSchema, { nodeMessage } from './node'; - -const oneBotHttpApiMessagePrivate: Record< - string, - { - description?: string - request: ZodSchema - response: ZodSchema - } -> = { - '/send_private_msg': { - description: '发送私聊消息', - request: z - .object({ - user_id: z.union([z.string(), z.number()]).describe('对方QQ号'), - message: z.array(messageNodeSchema).describe('消息内容'), - }) - .refine( - (data) => { - const hasReply = data.message.some((item) => item.type === 'reply'); - - if (hasReply) { - return data.message[0].type === 'reply'; - } - - return true; - }, - { - message: - '如果 message 包含 reply 类型的消息,那么只能包含一个,而且排在最前面', - } - ), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/send_private_forward_msg': { - description: '发送私聊合并转发消息', - request: z.object({ - user_id: z.union([z.string(), z.number()]).describe('对方QQ号'), - messages: z.array(nodeMessage).describe('消息内容'), - news: z - .array( - z.object({ - text: z.string(), - }) - ) - .describe('?'), - prompt: z.string().describe('外显'), - summary: z.string().describe('底下文本'), - source: z.string().describe('内容'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/forward_friend_single_msg': { - description: '消息转发到私聊', - request: z.object({ - user_id: z.union([z.string(), z.number()]).describe('对方QQ号'), - message_id: z.union([z.string(), z.number()]).describe('消息ID'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/group_poke': { - description: '发送私聊戳一戳', - request: z.object({ - user_id: z.union([z.string(), z.number()]).describe('对方QQ号'), - }), - response: baseResponseSchema, - }, -}; - -export default oneBotHttpApiMessagePrivate; diff --git a/packages/napcat-webui-frontend/src/const/ob_api/online_status.ts b/packages/napcat-webui-frontend/src/const/ob_api/online_status.ts deleted file mode 100644 index e1caaa7b..00000000 --- a/packages/napcat-webui-frontend/src/const/ob_api/online_status.ts +++ /dev/null @@ -1,335 +0,0 @@ -import { z } from 'zod'; - -// 定义 set_online_status 的 data 格式 -const onlineStatusDataSchema = z.union([ - // 在线 - z - .object({ - status: z.literal(10), - ext_status: z.literal(0), - battery_status: z.literal(0), - }) - .describe('在线'), - // Q我吧 - z - .object({ - status: z.literal(60), - ext_status: z.literal(0), - battery_status: z.literal(0), - }) - .describe('Q我吧'), - // 离开 - z - .object({ - status: z.literal(30), - ext_status: z.literal(0), - battery_status: z.literal(0), - }) - .describe('离开'), - // 忙碌 - z - .object({ - status: z.literal(50), - ext_status: z.literal(0), - battery_status: z.literal(0), - }) - .describe('忙碌'), - // 请勿打扰 - z - .object({ - status: z.literal(70), - ext_status: z.literal(0), - battery_status: z.literal(0), - }) - .describe('请勿打扰'), - // 隐身 - z - .object({ - status: z.literal(40), - ext_status: z.literal(0), - battery_status: z.literal(0), - }) - .describe('隐身'), - // 听歌中 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1028), - battery_status: z.literal(0), - }) - .describe('听歌中'), - // 春日限定 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2037), - battery_status: z.literal(0), - }) - .describe('春日限定'), - // 一起元梦 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2025), - battery_status: z.literal(0), - }) - .describe('一起元梦'), - // 求星搭子 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2026), - battery_status: z.literal(0), - }) - .describe('求星搭子'), - // 被掏空 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2014), - battery_status: z.literal(0), - }) - .describe('被掏空'), - // 今日天气 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1030), - battery_status: z.literal(0), - }) - .describe('今日天气'), - // 我crash了 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2019), - battery_status: z.literal(0), - }) - .describe('我crash了'), - // 爱你 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2006), - battery_status: z.literal(0), - }) - .describe('爱你'), - // 恋爱中 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1051), - battery_status: z.literal(0), - }) - .describe('恋爱中'), - // 好运锦鲤 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1071), - battery_status: z.literal(0), - }) - .describe('好运锦鲤'), - // 水逆退散 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1201), - battery_status: z.literal(0), - }) - .describe('水逆退散'), - // 嗨到飞起 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1056), - battery_status: z.literal(0), - }) - .describe('嗨到飞起'), - // 元气满满 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1058), - battery_status: z.literal(0), - }) - .describe('元气满满'), - // 宝宝认证 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1070), - battery_status: z.literal(0), - }) - .describe('宝宝认证'), - // 一言难尽 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1063), - battery_status: z.literal(0), - }) - .describe('一言难尽'), - // 难得糊涂 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2001), - battery_status: z.literal(0), - }) - .describe('难得糊涂'), - // emo中 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1401), - battery_status: z.literal(0), - }) - .describe('emo中'), - // 我太难了 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1062), - battery_status: z.literal(0), - }) - .describe('我太难了'), - // 我想开了 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2013), - battery_status: z.literal(0), - }) - .describe('我想开了'), - // 我没事 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1052), - battery_status: z.literal(0), - }) - .describe('我没事'), - // 想静静 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1061), - battery_status: z.literal(0), - }) - .describe('想静静'), - // 悠哉哉 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1059), - battery_status: z.literal(0), - }) - .describe('悠哉哉'), - // 去旅行 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2015), - battery_status: z.literal(0), - }) - .describe('去旅行'), - // 信号弱 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1011), - battery_status: z.literal(0), - }) - .describe('信号弱'), - // 出去浪 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2003), - battery_status: z.literal(0), - }) - .describe('出去浪'), - // 肝作业 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2012), - battery_status: z.literal(0), - }) - .describe('肝作业'), - // 学习中 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1018), - battery_status: z.literal(0), - }) - .describe('学习中'), - // 搬砖中 - z - .object({ - status: z.literal(10), - ext_status: z.literal(2023), - battery_status: z.literal(0), - }) - .describe('搬砖中'), - // 摸鱼中 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1300), - battery_status: z.literal(0), - }) - .describe('摸鱼中'), - // 无聊中 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1060), - battery_status: z.literal(0), - }) - .describe('无聊中'), - // timi中 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1027), - battery_status: z.literal(0), - }) - .describe('timi中'), - // 睡觉中 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1016), - battery_status: z.literal(0), - }) - .describe('睡觉中'), - // 熬夜中 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1032), - battery_status: z.literal(0), - }) - .describe('熬夜中'), - // 追剧中 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1021), - battery_status: z.literal(0), - }) - .describe('追剧中'), - // 我的电量 - z - .object({ - status: z.literal(10), - ext_status: z.literal(1000), - battery_status: z.literal(0), - }) - .describe('我的电量'), -]); - -export default onlineStatusDataSchema; diff --git a/packages/napcat-webui-frontend/src/const/ob_api/response.ts b/packages/napcat-webui-frontend/src/const/ob_api/response.ts deleted file mode 100644 index 7162b99a..00000000 --- a/packages/napcat-webui-frontend/src/const/ob_api/response.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { z } from 'zod'; - -// 通用响应格式 -export const baseResponseSchema = z.object({ - status: z.enum(['ok', 'error']).describe('请求状态'), // 状态 - retcode: z.number().describe('响应🐎'), // 返回码 - data: z.null(), - message: z.string().describe('提示信息'), // 提示信息 - wording: z.string().describe('提示信息(人性化)'), // 人性化提示 - echo: z.string().describe('回显'), // 请求回显内容 -}); - -export const commonResponseDataSchema = z.object({ - result: z.number(), - errMsg: z.string(), -}); diff --git a/packages/napcat-webui-frontend/src/const/ob_api/system.ts b/packages/napcat-webui-frontend/src/const/ob_api/system.ts deleted file mode 100644 index 36a53e34..00000000 --- a/packages/napcat-webui-frontend/src/const/ob_api/system.ts +++ /dev/null @@ -1,366 +0,0 @@ -import { z } from 'zod'; - -import { baseResponseSchema, commonResponseDataSchema } from './response'; - -const oneBotHttpApiSystem = { - '/get_online_clients': { - description: '获取当前账号在线客户端列表', - request: z.object({ - no_cache: z.boolean().optional().describe('是否不使用缓存'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - clients: z.object({}), - }), - }), - }, - '/get_robot_uin_range': { - description: '获取机器人账号范围', - request: z.object({}), - response: baseResponseSchema.extend({ - data: z.array( - z.object({ - minUin: z.string(), - maxUin: z.string(), - }) - ), - }), - }, - '/ocr_image': { - description: 'OCR图片识别', - request: z.object({ - image: z.string(), - }), - response: baseResponseSchema.extend({ - data: z.array( - z.object({ - text: z.string(), - pt1: z.object({ - x: z.string(), - y: z.string(), - }), - pt2: z.object({ - x: z.string(), - y: z.string(), - }), - pt3: z.object({ - x: z.string(), - y: z.string(), - }), - pt4: z.object({ - x: z.string(), - y: z.string(), - }), - charBox: z.array( - z.object({ - charText: z.string(), - charBox: z.object({ - pt1: z.object({ - x: z.string(), - y: z.string(), - }), - pt2: z.object({ - x: z.string(), - y: z.string(), - }), - pt3: z.object({ - x: z.string(), - y: z.string(), - }), - pt4: z.object({ - x: z.string(), - y: z.string(), - }), - }), - }) - ), - score: z.string(), - }) - ), - }), - }, - - '/.ocr_image': { - description: '.OCR图片识别', - request: z.object({ - image: z.string(), - }), - response: baseResponseSchema.extend({ - data: z.array( - z.object({ - text: z.string(), - pt1: z.object({ - x: z.string(), - y: z.string(), - }), - pt2: z.object({ - x: z.string(), - y: z.string(), - }), - pt3: z.object({ - x: z.string(), - y: z.string(), - }), - pt4: z.object({ - x: z.string(), - y: z.string(), - }), - charBox: z.array( - z.object({ - charText: z.string(), - charBox: z.object({ - pt1: z.object({ - x: z.string(), - y: z.string(), - }), - pt2: z.object({ - x: z.string(), - y: z.string(), - }), - pt3: z.object({ - x: z.string(), - y: z.string(), - }), - pt4: z.object({ - x: z.string(), - y: z.string(), - }), - }), - }) - ), - score: z.string(), - }) - ), - }), - }, - '/translate_en2zh': { - description: '英文翻译为中文', - request: z.object({ - words: z.array(z.string()), - }), - response: baseResponseSchema.extend({ - data: z.array(z.string()), - }), - }, - '/get_login_info': { - description: '获取登录号信息', - request: z.object({}), - response: baseResponseSchema.extend({ - data: z.object({ - user_id: z.number(), - nickname: z.string(), - }), - }), - }, - '/set_input_status': { - description: '设置输入状态', - request: z.object({ - eventType: z.union([z.literal(0), z.literal(1)]), - user_id: z.union([z.number(), z.string()]), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/download_file': { - description: '下载文件到缓存目录', - request: z - .object({ - base64: z.string().optional(), - url: z.string().optional(), - thread_count: z.number(), - headers: z.union([z.string(), z.array(z.string())]), - name: z.string().optional(), - }) - .refine( - (data) => (data.base64 && !data.url) || (!data.base64 && data.url), - { - message: 'base64 和 url 必须二选一,且不能同时存在或同时为空', - path: ['base64', 'url'], - } - ), - response: baseResponseSchema.extend({ - data: z.object({ - file: z.string(), - }), - }), - }, - '/get_cookies': { - description: '获取cookies', - request: z.object({ - domain: z.string(), - }), - response: baseResponseSchema.extend({ - data: z.object({ - cookies: z.string(), - bkn: z.string(), - }), - }), - }, - '/.handle_quick_operation': { - description: '.对事件执行快速操作', - request: z.object({ - context: z.object({}), - operation: z.object({}), - }), - response: baseResponseSchema, - }, - '/get_csrf_token': { - description: '获取CSRF Token', - request: z.object({}), - response: baseResponseSchema.extend({ - data: z.object({ - token: z.number(), - }), - }), - }, - '/_del_group_notice': { - description: '_删除群公告', - request: z.object({ - group_id: z.union([z.number(), z.string()]), - notice_id: z.number(), - }), - response: baseResponseSchema, - }, - '/get_credentials': { - description: '获取 QQ 相关接口凭证', - request: z.object({ - domain: z.string(), - }), - response: baseResponseSchema.extend({ - data: z.object({ - cookies: z.string(), - token: z.number(), - }), - }), - }, - '/_get_model_show': { - description: '_获取在线机型', - request: z.object({ - model: z.string(), - }), - response: baseResponseSchema.extend({ - data: z.array( - z.object({ - variants: z.object({ - model_show: z.string(), - need_pay: z.boolean(), - }), - }) - ), - }), - }, - '/_set_model_show': { - description: '_设置在线机型', - request: z.object({ - model: z.string(), - model_show: z.string(), - }), - response: baseResponseSchema, - }, - '/can_send_image': { - description: '检查是否可以发送图片', - request: z.object({}), - response: baseResponseSchema.extend({ - yes: z.boolean(), - }), - }, - '/nc_get_packet_status': { - description: '获取packet状态', - request: z.object({}), - response: baseResponseSchema, - }, - '/can_send_record': { - description: '检查是否可以发送语音', - request: z.object({}), - response: baseResponseSchema.extend({ - yes: z.boolean(), - }), - }, - '/get_status': { - description: '获取状态', - request: z.object({}), - response: baseResponseSchema.extend({ - data: z.object({ - online: z.boolean(), - good: z.boolean(), - stat: z.object({}), - }), - }), - }, - '/nc_get_rkey': { - description: '获取rkey', - request: z.object({}), - response: baseResponseSchema.extend({ - data: z.array( - z.object({ - rkey: z.string(), - ttl: z.string(), - time: z.number(), - type: z.number(), - }) - ), - }), - }, - '/get_version_info': { - description: '获取版本信息', - request: z.object({}), - response: baseResponseSchema.extend({ - data: z.object({ - app_name: z.string(), - protocol_version: z.string(), - app_version: z.string(), - }), - }), - }, - '/get_group_shut_list': { - description: '获取群禁言列表', - request: z.object({ - group_id: z.union([z.number(), z.string()]), - }), - response: baseResponseSchema.extend({ - data: z.object({ - uid: z.string(), - qid: z.string(), - uin: z.string(), - nick: z.string(), - remark: z.string(), - cardType: z.number(), - cardName: z.string(), - role: z.number(), - avatarPath: z.string(), - shutUpTime: z.number(), - isDelete: z.boolean(), - isSpecialConcerned: z.boolean(), - isSpecialShield: z.boolean(), - isRobot: z.boolean(), - groupHonor: z.record(z.number()), - memberRealLevel: z.number(), - memberLevel: z.number(), - globalGroupLevel: z.number(), - globalGroupPoint: z.number(), - memberTitleId: z.number(), - memberSpecialTitle: z.string(), - specialTitleExpireTime: z.string(), - userShowFlag: z.number(), - userShowFlagNew: z.number(), - richFlag: z.number(), - mssVipType: z.number(), - bigClubLevel: z.number(), - bigClubFlag: z.number(), - autoRemark: z.string(), - creditLevel: z.number(), - joinTime: z.number(), - lastSpeakTime: z.number(), - memberFlag: z.number(), - memberFlagExt: z.number(), - memberMobileFlag: z.number(), - memberFlagExt2: z.number(), - isSpecialShielded: z.boolean(), - cardNameId: z.number(), - }), - }), - }, -} as const; - -export default oneBotHttpApiSystem; diff --git a/packages/napcat-webui-frontend/src/const/ob_api/user.ts b/packages/napcat-webui-frontend/src/const/ob_api/user.ts deleted file mode 100644 index ba66bcc8..00000000 --- a/packages/napcat-webui-frontend/src/const/ob_api/user.ts +++ /dev/null @@ -1,278 +0,0 @@ -import { z } from 'zod'; - -import onlineStatusDataSchema from './online_status'; -import { baseResponseSchema, commonResponseDataSchema } from './response'; - -const oneBotHttpApiUser = { - '/set_qq_profile': { - description: '设置账号信息', - request: z.object({ - nickname: z.string().describe('昵称'), - personal_note: z.string().describe('个性签名'), - sex: z.string().optional().describe('性别'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/send_ark_share': { - description: '获取推荐好友/群聊卡片', - request: z - .object({ - group_id: z - .union([z.string(), z.number()]) - .optional() - .describe('群聊ID,与 user_id 二选一'), - user_id: z - .union([z.string(), z.number()]) - .optional() - .describe('用户ID,与 group_id 二选一'), - phone_number: z.string().optional().describe('对方手机号码'), - }) - .refine( - (data) => - (data.group_id && !data.user_id) || (!data.group_id && data.user_id), - { - message: 'group_id 和 user_id 必须二选一,且不能同时存在或同时为空', - path: ['group_id', 'user_id'], // 错误路径 - } - ), - response: baseResponseSchema.extend({ - data: z.object({ - errCode: z.number(), - errMsg: z.string(), - arkJson: z.string(), - }), - }), - }, - '/send_group_ark_share': { - description: '获取推荐群聊卡片', - request: z.object({ - group_id: z.union([z.string(), z.number()]).describe('群聊ID'), - }), - response: baseResponseSchema.extend({ - data: z.string(), - }), - }, - '/set_online_status': { - description: '设置在线状态', - request: z.object({ - data: onlineStatusDataSchema, - }), - response: baseResponseSchema, - }, - '/get_friends_with_category': { - description: '获取好友分组列表', - request: z.object({}), - response: baseResponseSchema.extend({ - data: z.array( - z.object({ - categoryId: z.number(), - categorySortId: z.number(), - categoryName: z.string(), - categoryMbCount: z.number(), - onlineCount: z.number(), - buddyList: z.array( - z.object({ - qid: z.string(), - longNick: z.string(), - birthday_year: z.number(), - birthday_month: z.number(), - birthday_day: z.number(), - age: z.number(), - sex: z.string(), - eMail: z.string(), - phoneNum: z.string(), - categoryId: z.number(), - richTime: z.number(), - richBuffer: z.object({}), - uid: z.string(), - uin: z.string(), - nick: z.string(), - remark: z.string(), - user_id: z.number(), - nickname: z.string(), - level: z.number(), - }) - ), - }) - ), - }), - }, - '/set_qq_avatar': { - description: '设置头像', - request: z.object({ - file: z.string().describe('图片文件路径(服务器本地或者远程均可)'), - }), - response: baseResponseSchema, - }, - '/send_like': { - description: '点赞', - request: z.object({ - user_id: z.union([z.string(), z.number()]).describe('对方QQ号'), - times: z.number().describe('点赞次数'), - }), - response: baseResponseSchema, - }, - '/create_collection': { - description: '创建收藏', - request: z.object({ - rawData: z.string().describe('收藏内容'), - brief: z.string().describe('收藏简介'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/set_friend_add_request': { - description: '处理好友请求', - request: z.object({ - flag: z.string().describe('请求ID'), - approve: z.boolean().describe('是否同意'), - remark: z.string().describe('好友备注'), - }), - response: baseResponseSchema, - }, - '/set_self_longnick': { - description: '设置个性签名', - request: z.object({ - longNick: z.string().describe('签名内容'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/get_stranger_info': { - description: '获取账号信息', - request: z.object({ - user_id: z.union([z.string(), z.number()]).describe('对方QQ号'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - user_id: z.number(), - uid: z.string(), - uin: z.string(), - nickname: z.string(), - age: z.number(), - qid: z.string(), - qqLevel: z.number(), - sex: z.string(), - long_nick: z.string(), - reg_time: z.number(), - is_vip: z.boolean(), - is_years_vip: z.boolean(), - vip_level: z.number(), - remark: z.string(), - status: z.number(), - login_days: z.number(), - }), - }), - }, - '/get_friend_list': { - description: '获取好友列表', - request: z.object({ - no_cache: z.boolean().describe('是否不使用缓存'), - }), - response: baseResponseSchema.extend({ - data: z.array( - z.object({ - qid: z.string(), - longNick: z.string(), - birthday_year: z.number(), - birthday_month: z.number(), - birthday_day: z.number(), - age: z.number(), - sex: z.string(), - eMail: z.string(), - phoneNum: z.string(), - categoryId: z.number(), - richTime: z.number(), - richBuffer: z.object({}), - uid: z.string(), - uin: z.string(), - nick: z.string(), - remark: z.string(), - user_id: z.number(), - nickname: z.string(), - level: z.number(), - }) - ), - }), - }, - '/get_profile_like': { - description: '获取点赞列表', - request: z.object({}), - response: baseResponseSchema.extend({ - data: z.object({ - total_count: z.number(), - new_count: z.number(), - new_nearby_count: z.number(), - last_visit_time: z.number(), - userInfos: z.array( - z.object({ - uid: z.string(), - src: z.number(), - latestTime: z.number(), - count: z.number(), - giftCount: z.number(), - customId: z.number(), - lastCharged: z.number(), - bAvailableCnt: z.number(), - bTodayVotedCnt: z.number(), - nick: z.string(), - gender: z.number(), - age: z.number(), - isFriend: z.boolean(), - isvip: z.boolean(), - isSvip: z.boolean(), - uin: z.number(), - }) - ), - }), - }), - }, - '/fetch_custom_face': { - description: '获取收藏表情', - request: z.object({ - count: z.number().optional().describe('获取数量'), - }), - response: baseResponseSchema.extend({ - data: z.array(z.string()), - }), - }, - '/upload_private_file': { - description: '上传私聊文件', - request: z.object({ - user_id: z.union([z.string(), z.number()]), - file: z.string(), - name: z.string(), - }), - response: baseResponseSchema, - }, - '/delete_friend': { - description: '删除好友', - request: z.object({ - user_id: z.union([z.string(), z.number()]).describe('自己QQ号?'), - friend_id: z.union([z.string(), z.number()]).describe('好友QQ号'), - temp_block: z.boolean().describe('是否加入黑名单'), - temp_both_del: z.boolean().describe('是否双向删除'), - }), - response: baseResponseSchema.extend({ - data: commonResponseDataSchema, - }), - }, - '/nc_get_user_status': { - description: '获取用户在线状态', - request: z.object({ - user_id: z.union([z.string(), z.number()]).describe('对方QQ号'), - }), - response: baseResponseSchema.extend({ - data: z.object({ - status: z.number(), - ext_status: z.number(), - }), - }), - }, -} as const; - -export default oneBotHttpApiUser; diff --git a/packages/napcat-webui-frontend/src/pages/dashboard/debug/http/index.tsx b/packages/napcat-webui-frontend/src/pages/dashboard/debug/http/index.tsx index 0637ed08..589deeaa 100644 --- a/packages/napcat-webui-frontend/src/pages/dashboard/debug/http/index.tsx +++ b/packages/napcat-webui-frontend/src/pages/dashboard/debug/http/index.tsx @@ -6,19 +6,20 @@ import { IoClose } from 'react-icons/io5'; import { TbSearch } from 'react-icons/tb'; import key from '@/const/key'; -import oneBotHttpApi from '@/const/ob_api'; -import type { OneBotHttpApiPath } from '@/const/ob_api'; +import { fetchOneBotHttpApi, OneBotHttpApiPath } from '@/const/ob_api'; +import type { OneBotHttpApi } from '@/const/ob_api'; import OneBotApiDebug from '@/components/onebot/api/debug'; import CommandPalette from '@/components/command_palette'; import type { CommandPaletteCommand, CommandPaletteExecuteMode } from '@/components/command_palette'; -import { generateDefaultJson } from '@/utils/zod'; +import { generateDefaultFromTypeBox } from '@/utils/typebox'; import type { OneBotApiDebugRef } from '@/components/onebot/api/debug'; export default function HttpDebug () { const [activeApi, setActiveApi] = useState(null); const [openApis, setOpenApis] = useState([]); + const [oneBotHttpApi, setOneBotHttpApi] = useState({}); const [backgroundImage] = useLocalStorage(key.backgroundImage, ''); const hasBackground = !!backgroundImage; @@ -40,30 +41,34 @@ export default function HttpDebug () { return () => window.removeEventListener('keydown', handler); }, []); - // Initialize Debug Adapter + // Initialize Debug Adapter and fetch schemas useEffect(() => { let currentAdapterName = ''; - const initAdapter = async () => { + const init = async () => { try { - const response = await fetch('/api/Debug/create', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${localStorage.getItem('token')}` - } - }); - const data = await response.json(); - if (data.code === 0) { - currentAdapterName = data.data.adapterName; - setAdapterName(currentAdapterName); - } + const [apiData] = await Promise.all([ + fetchOneBotHttpApi(), + fetch('/api/Debug/create', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${localStorage.getItem('token')}` + } + }).then(res => res.json()).then(data => { + if (data.code === 0) { + currentAdapterName = data.data.adapterName; + setAdapterName(currentAdapterName); + } + }) + ]); + setOneBotHttpApi(apiData); } catch (error) { - console.error('Failed to create debug adapter:', error); + console.error('Failed to initialize debug:', error); } }; - initAdapter(); + init(); return () => { // 不再主动关闭 adapter,由后端自动管理活跃状态 @@ -92,21 +97,24 @@ export default function HttpDebug () { return Object.keys(oneBotHttpApi).map((p) => { const path = p as OneBotHttpApiPath; const item = oneBotHttpApi[path]; + const displayPath = '/' + path; // 简单分组:按描述里已有分类不可靠,这里只用 path 前缀推断 - const group = path.startsWith('/get_') ? 'GET' : (path.startsWith('/set_') ? 'SET' : 'API'); + const group = path.startsWith('get_') ? 'GET' : (path.startsWith('set_') ? 'SET' : 'API'); return { id: path, - title: item?.description || path, - subtitle: item?.request ? '回车发送 · Shift+Enter 仅打开' : undefined, + title: item?.description || displayPath, + subtitle: item?.payload ? '回车发送 · Shift+Enter 仅打开' : undefined, group, }; }); - }, []); + }, [oneBotHttpApi]); const executeCommand = (commandId: string, mode: CommandPaletteExecuteMode) => { const api = commandId as OneBotHttpApiPath; const item = oneBotHttpApi[api]; - const body = item?.request ? generateDefaultJson(item.request) : '{}'; + const body = item?.payloadExample + ? JSON.stringify(item.payloadExample, null, 2) + : (item?.payload ? JSON.stringify(generateDefaultFromTypeBox(item.payload), null, 2) : '{}'); handleSelectApi(api); // 确保请求参数可见 diff --git a/packages/napcat-webui-frontend/src/utils/typebox.ts b/packages/napcat-webui-frontend/src/utils/typebox.ts new file mode 100644 index 00000000..92f1f048 --- /dev/null +++ b/packages/napcat-webui-frontend/src/utils/typebox.ts @@ -0,0 +1,123 @@ +import { TSchema, Type } from '@sinclair/typebox'; + +export type ParsedSchema = { + name?: string; + type: string | string[]; + optional: boolean; + value?: any; + enum?: any[]; + children?: ParsedSchema[]; + description?: string; +}; + +// 定义基础响应结构 (TypeBox 格式) +export const BaseResponseSchema = Type.Object({ + status: Type.Union([Type.Literal('ok'), Type.Literal('failed')], { description: '状态 (ok/failed)' }), + retcode: Type.Number({ description: '返回码' }), + data: Type.Any({ description: '数据' }), + message: Type.String({ description: '消息' }), + wording: Type.String({ description: '提示' }), + echo: Type.Optional(Type.String({ description: '回显' })), +}); + +export function parseTypeBox (schema: TSchema | undefined, name?: string, isRoot = true): ParsedSchema | ParsedSchema[] { + if (!schema) { + return isRoot ? [] : { name, type: 'unknown', optional: false }; + } + + // 如果是根节点解析,且我们需要将其包装在 BaseResponse 中(通常用于 response) + // 但这里我们根据传入的 schema 决定 + + const description = schema.description; + const optional = false; // TypeBox schema doesn't store optionality in the same way Zod does, usually handled by parent object + + // Handle specific types + const type = schema.type; + + if (schema.const !== undefined) { + return { name, type: 'value', value: schema.const, optional, description }; + } + + if (schema.enum) { + return { name, type: 'enum', enum: schema.enum, optional, description }; + } + + if (schema.anyOf || schema.oneOf) { + const options = (schema.anyOf || schema.oneOf) as TSchema[]; + const children = options.map(opt => parseTypeBox(opt, undefined, false) as ParsedSchema); + return { name, type: 'union', children, optional, description }; + } + + if (schema.allOf) { + const parts = schema.allOf as TSchema[]; + // 如果全是对象,尝试合并属性 + const allProperties: Record = {}; + const allRequired: string[] = []; + let canMerge = true; + parts.forEach(part => { + if (part.type === 'object' && part.properties) { + Object.assign(allProperties, part.properties); + if (part.required) allRequired.push(...part.required); + } else { + canMerge = false; + } + }); + + if (canMerge) { + return parseTypeBox({ ...schema, type: 'object', properties: allProperties, required: allRequired }, name, isRoot); + } + // 无法简单合并,当作联合展示 + const children = parts.map(part => parseTypeBox(part, undefined, false) as ParsedSchema); + return { name, type: 'intersection', children, optional, description }; + } + + if (type === 'object') { + const properties = schema.properties || {}; + const required = schema.required || []; + const children = Object.keys(properties).map(key => { + const child = parseTypeBox(properties[key], key, false) as ParsedSchema; + child.optional = !required.includes(key); + return child; + }); + if (isRoot) return children; + return { name, type: 'object', children, optional, description }; + } + + if (type === 'array') { + const items = schema.items as TSchema; + const child = parseTypeBox(items, undefined, false) as ParsedSchema; + return { name, type: 'array', children: [child], optional, description }; + } + + if (type === 'string') return { name, type: 'string', optional, description }; + if (type === 'number' || type === 'integer') return { name, type: 'number', optional, description }; + if (type === 'boolean') return { name, type: 'boolean', optional, description }; + if (type === 'null') return { name, type: 'null', optional, description }; + + return { name, type: type || 'unknown', optional, description }; +} + +export function generateDefaultFromTypeBox (schema: TSchema | undefined): any { + if (!schema) return {}; + if (schema.const !== undefined) return schema.const; + if (schema.default !== undefined) return schema.default; + if (schema.enum) return schema.enum[0]; + if (schema.anyOf || schema.oneOf) return generateDefaultFromTypeBox((schema.anyOf || schema.oneOf)[0]); + + const type = schema.type; + if (type === 'object') { + const obj: any = {}; + const props = schema.properties || {}; + for (const key in props) { + // Only generate defaults for required properties or if we want a full example + obj[key] = generateDefaultFromTypeBox(props[key]); + } + return obj; + } + if (type === 'array') return []; + if (type === 'string') return ''; + if (type === 'number' || type === 'integer') return 0; + if (type === 'boolean') return false; + if (type === 'null') return null; + return null; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24017d0e..a618952b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -509,6 +509,9 @@ importers: '@reduxjs/toolkit': specifier: ^2.5.1 version: 2.10.1(react-redux@9.2.0(@types/react@19.2.4)(react@19.2.0)(redux@5.0.1))(react@19.2.0) + '@sinclair/typebox': + specifier: ^0.34.41 + version: 0.34.41 '@uidotdev/usehooks': specifier: ^2.4.1 version: 2.4.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) From bb3c1dbb5f97fd4978769bbbd3f15f9da2268e4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 20:33:11 +0800 Subject: [PATCH 16/17] Remove OneBot API navigation list component Deleted nav_list.tsx from the onebot/api components, removing the OneBotApiNavList React component and its related logic. This may be part of a refactor or cleanup to eliminate unused or redundant UI code. --- .../src/components/onebot/api/debug.tsx | 2 +- .../src/components/onebot/api/nav_list.tsx | 182 ------------------ 2 files changed, 1 insertion(+), 183 deletions(-) delete mode 100644 packages/napcat-webui-frontend/src/components/onebot/api/nav_list.tsx diff --git a/packages/napcat-webui-frontend/src/components/onebot/api/debug.tsx b/packages/napcat-webui-frontend/src/components/onebot/api/debug.tsx index aa5b416f..19ecbed9 100644 --- a/packages/napcat-webui-frontend/src/components/onebot/api/debug.tsx +++ b/packages/napcat-webui-frontend/src/components/onebot/api/debug.tsx @@ -320,7 +320,7 @@ const OneBotApiDebug = forwardRef((props )} - diff --git a/packages/napcat-webui-frontend/src/components/onebot/api/nav_list.tsx b/packages/napcat-webui-frontend/src/components/onebot/api/nav_list.tsx deleted file mode 100644 index 7cce84c4..00000000 --- a/packages/napcat-webui-frontend/src/components/onebot/api/nav_list.tsx +++ /dev/null @@ -1,182 +0,0 @@ -import { Input } from '@heroui/input'; -import { useLocalStorage } from '@uidotdev/usehooks'; -import clsx from 'clsx'; -import { AnimatePresence, motion } from 'motion/react'; -import { useMemo, useState } from 'react'; -import { TbChevronRight, TbFolder, TbSearch } from 'react-icons/tb'; - -import key from '@/const/key'; -import oneBotHttpApiGroup from '@/const/ob_api/group'; -import oneBotHttpApiMessage from '@/const/ob_api/message'; -import oneBotHttpApiSystem from '@/const/ob_api/system'; -import oneBotHttpApiUser from '@/const/ob_api/user'; -import type { OneBotHttpApi, OneBotHttpApiPath } from '@/const/ob_api'; - -export interface OneBotApiNavListProps { - data: OneBotHttpApi; - selectedApi: OneBotHttpApiPath; - onSelect: (apiName: OneBotHttpApiPath) => void; - openSideBar: boolean; - onToggle?: (isOpen: boolean) => void; -} - -const OneBotApiNavList: React.FC = (props) => { - const { data, selectedApi, onSelect, openSideBar, onToggle } = props; - const [searchValue, setSearchValue] = useState(''); - const [expandedGroups, setExpandedGroups] = useState([]); - const [backgroundImage] = useLocalStorage(key.backgroundImage, ''); - const hasBackground = !!backgroundImage; - - const groups = useMemo(() => { - const rawGroups = [ - { id: 'user', label: '账号相关', keys: Object.keys(oneBotHttpApiUser) }, - { id: 'message', label: '消息相关', keys: Object.keys(oneBotHttpApiMessage) }, - { id: 'group', label: '群聊相关', keys: Object.keys(oneBotHttpApiGroup) }, - { id: 'system', label: '系统操作', keys: Object.keys(oneBotHttpApiSystem) }, - ]; - - return rawGroups.map(g => { - const apis = g.keys - .filter(k => k in data) - .map(k => ({ path: k as OneBotHttpApiPath, ...data[k as OneBotHttpApiPath] })) - .filter(api => - api.path.toLowerCase().includes(searchValue.toLowerCase()) || - api.description?.toLowerCase().includes(searchValue.toLowerCase()) - ); - return { ...g, apis }; - }).filter(g => g.apis.length > 0); - }, [data, searchValue]); - - const toggleGroup = (id: string) => { - setExpandedGroups(prev => - prev.includes(id) ? prev.filter(i => i !== id) : [...prev, id] - ); - }; - - return ( - <> - {/* Mobile backdrop overlay - below header (z-40) */} - - {openSideBar && ( - onToggle?.(false)} - /> - )} - - - -
-
- } - value={searchValue} - onChange={(e) => setSearchValue(e.target.value)} - onClear={() => setSearchValue('')} - size="sm" - /> -
- -
- {groups.map((group) => { - const isOpen = expandedGroups.includes(group.id) || searchValue.length > 0; - return ( -
- {/* Group Header */} -
toggleGroup(group.id)} - > - - - {group.label} - ({group.apis.length}) -
- - {/* Group Content */} - - {isOpen && ( - - {group.apis.map((api) => { - const isSelected = api.path === selectedApi; - return ( -
onSelect(api.path)} - className={clsx( - 'flex flex-col gap-0.5 px-3 py-2 rounded-lg cursor-pointer transition-all border select-none', - isSelected - ? (hasBackground - ? 'bg-white/10 border-white/20' - : 'bg-primary/10 border-primary/20 shadow-sm') - : 'border-transparent hover:bg-white/10 dark:hover:bg-white/5' - )} - > - - {api.description} - - - {api.path} - -
- ); - })} -
- )} -
-
- ); - })} -
-
-
- - ); -}; - -export default OneBotApiNavList; From 46ff1a64e972bfcb73ecfa06231f0e03f01ce950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 25 Jan 2026 21:06:21 +0800 Subject: [PATCH 17/17] Add action tags to OneBot API schema and update tag name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Included the 'tags' property in the OneBot API schema for both backend and frontend, allowing actions to be categorized. Also updated the action tag from '群扩展' to '群组扩展' in SetGroupSign for consistency. --- packages/napcat-onebot/action/extends/SetGroupSign.ts | 2 +- packages/napcat-webui-backend/src/api/Debug.ts | 1 + packages/napcat-webui-frontend/src/const/ob_api/index.ts | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/napcat-onebot/action/extends/SetGroupSign.ts b/packages/napcat-onebot/action/extends/SetGroupSign.ts index 500c06b1..098cc844 100644 --- a/packages/napcat-onebot/action/extends/SetGroupSign.ts +++ b/packages/napcat-onebot/action/extends/SetGroupSign.ts @@ -16,7 +16,7 @@ class SetGroupSignBase extends GetPacketStatusDepends { override payloadSchema = PayloadSchema; override returnSchema = ReturnSchema; override actionSummary = '设置群签名'; - override actionTags = ['群扩展']; + override actionTags = ['群组扩展']; override payloadExample = { group_id: '123456789' }; diff --git a/packages/napcat-webui-backend/src/api/Debug.ts b/packages/napcat-webui-backend/src/api/Debug.ts index 3a35f9f4..a5d1b1d8 100644 --- a/packages/napcat-webui-backend/src/api/Debug.ts +++ b/packages/napcat-webui-backend/src/api/Debug.ts @@ -44,6 +44,7 @@ router.get('/schemas', async (_req: Request, res: Response) => { payload: action.payloadSchema, response: action.returnSchema, payloadExample: action.payloadExample, + tags: action.actionTags, }; } } diff --git a/packages/napcat-webui-frontend/src/const/ob_api/index.ts b/packages/napcat-webui-frontend/src/const/ob_api/index.ts index 58218c84..8cf0c2b9 100644 --- a/packages/napcat-webui-frontend/src/const/ob_api/index.ts +++ b/packages/napcat-webui-frontend/src/const/ob_api/index.ts @@ -5,6 +5,7 @@ export interface OneBotHttpApiContent { payload: TSchema; response: TSchema; payloadExample?: any; + tags?: string[]; } export type OneBotHttpApi = Record;