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] 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; } }