From 573451badecb96d436ebb112d5433067db8a4f33 Mon Sep 17 00:00:00 2001 From: Nepenthe Date: Wed, 30 Oct 2024 21:07:01 +0800 Subject: [PATCH 001/149] =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/action/file/GetRecord.ts | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/onebot/action/file/GetRecord.ts b/src/onebot/action/file/GetRecord.ts index 742a8b50..c62e1574 100644 --- a/src/onebot/action/file/GetRecord.ts +++ b/src/onebot/action/file/GetRecord.ts @@ -5,9 +5,11 @@ import { promises as fs } from 'fs'; import { decode } from 'silk-wasm'; const FFMPEG_PATH = process.env.FFMPEG_PATH || 'ffmpeg'; -interface Payload extends GetFilePayload { - out_format: 'mp3' | 'amr' | 'wma' | 'm4a' | 'spx' | 'ogg' | 'wav' | 'flac'; -} +const out_format = ['mp3' , 'amr' , 'wma' , 'm4a' , 'spx' , 'ogg' , 'wav' , 'flac']; + +type Payload = { + out_format : string +} & GetFilePayload export default class GetRecord extends GetFileBase { actionName = ActionName.GetRecord; @@ -17,12 +19,19 @@ export default class GetRecord extends GetFileBase { 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)) { + throw new Error('转换失败 out_format 字段可能格式不正确'); + } const pcmFile = `${inputFile}.pcm`; const outputFile = `${inputFile}.${payload.out_format}`; try { await fs.access(inputFile); - await this.decodeFile(inputFile, pcmFile); - await this.convertFile(pcmFile, outputFile, payload.out_format); + try { + await fs.access(outputFile); + } catch (error) { + await this.decodeFile(inputFile, pcmFile); + await this.convertFile(pcmFile, outputFile, payload.out_format); + } const base64Data = await fs.readFile(outputFile, { encoding: 'base64' }); res.file = outputFile; res.url = outputFile; @@ -48,7 +57,8 @@ export default class GetRecord extends GetFileBase { private convertFile(inputFile: string, outputFile: string, format: string): Promise { return new Promise((resolve, reject) => { - const ffmpeg = spawn(FFMPEG_PATH, ['-f', 's16le', '-ar', '24000', '-ac', '1', '-i', inputFile, outputFile]); + const params = format === 'amr' ? ['-f', 's16le', '-ar', '24000', '-ac', '1', '-i', inputFile, '-ar', '8000', '-b:a', '12.2k', outputFile] : ['-f', 's16le', '-ar', '24000', '-ac', '1', '-i', inputFile, outputFile]; + const ffmpeg = spawn(FFMPEG_PATH, params); ffmpeg.on('close', (code) => { if (code === 0) { @@ -63,4 +73,4 @@ export default class GetRecord extends GetFileBase { }); }); } -} \ No newline at end of file +} From 673a175ddf11bb2ea9247bf70e7c4c32164fb65a 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: Wed, 26 Mar 2025 21:51:51 +0800 Subject: [PATCH 002/149] =?UTF-8?q?fix:=20=E7=83=98=E7=84=99raw?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/services/NodeIKernelBuddyService.ts | 2 +- src/onebot/action/user/GetFriendList.ts | 4 ++-- src/onebot/helper/data.ts | 9 +++++++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/core/services/NodeIKernelBuddyService.ts b/src/core/services/NodeIKernelBuddyService.ts index 69dcfb05..dbb98165 100644 --- a/src/core/services/NodeIKernelBuddyService.ts +++ b/src/core/services/NodeIKernelBuddyService.ts @@ -16,7 +16,7 @@ export interface NodeIKernelBuddyService { getBuddyListFromCache(reqType: BuddyListReqType): Promise { override actionName = ActionName.GetFriendList; override payloadSchema = SchemaData; - async _handle(payload: Payload) { + async _handle(_payload: Payload) { //全新逻辑 - return OB11Construct.friends(await this.core.apis.FriendApi.getBuddy(typeof payload.no_cache === 'string' ? payload.no_cache === 'true' : !!payload.no_cache)); + return OB11Construct.friends(await this.core.apis.FriendApi.getBuddy()); } } diff --git a/src/onebot/helper/data.ts b/src/onebot/helper/data.ts index 8fa7f3cd..e0380966 100644 --- a/src/onebot/helper/data.ts +++ b/src/onebot/helper/data.ts @@ -20,9 +20,14 @@ export class OB11Construct { static friends(friends: FriendV2[]): OB11User[] { return friends.map(rawFriend => ({ - ...rawFriend.baseInfo, - ...rawFriend.coreInfo, + birthday_year: rawFriend.baseInfo.birthday_year, + birthday_month: rawFriend.baseInfo.birthday_month, + birthday_day: rawFriend.baseInfo.birthday_day, user_id: parseInt(rawFriend.coreInfo.uin), + age: rawFriend.baseInfo.age, + phone_num: rawFriend.baseInfo.phoneNum, + email: rawFriend.baseInfo.eMail, + category_id: rawFriend.baseInfo.categoryId, nickname: rawFriend.coreInfo.nick ?? '', remark: rawFriend.coreInfo.remark ?? rawFriend.coreInfo.nick, sex: this.sex(rawFriend.baseInfo.sex), From 83e73d984231f0f6555dbab0b4e71814ae4a8740 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: Thu, 27 Mar 2025 12:15:53 +0800 Subject: [PATCH 003/149] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E6=95=B0=E6=8D=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/user.ts | 52 ++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/src/core/apis/user.ts b/src/core/apis/user.ts index 64c1f799..93e81c5e 100644 --- a/src/core/apis/user.ts +++ b/src/core/apis/user.ts @@ -90,7 +90,30 @@ export class NTQQUserApi { () => true, (profile) => profile.uid === uid, ); - const RetUser: User = { + return profile; + } + + async getUserDetailInfo(uid: string): Promise { + let profile = await solveAsyncProblem(async (uid) => this.fetchUserDetailInfo(uid, UserDetailSource.KDB), uid); + if (profile && profile.uin !== '0' && profile.commonExt) { + return { + ...profile.simpleInfo.status, + ...profile.simpleInfo.vasInfo, + ...profile.commonExt, + ...profile.simpleInfo.baseInfo, + ...profile.simpleInfo.coreInfo, + qqLevel: profile.commonExt?.qqLevel, + age: profile.simpleInfo.baseInfo.age, + pendantId: '', + nick: profile.simpleInfo.coreInfo.nick || '', + }; + } + this.context.logger.logDebug('[NapCat] [Mark] getUserDetailInfo Mode1 Failed.'); + profile = await this.fetchUserDetailInfo(uid, UserDetailSource.KSERVER); + if (profile && profile.uin === '0') { + profile.uin = await this.core.apis.UserApi.getUidByUinV2(uid) ?? '0'; + } + return { ...profile.simpleInfo.status, ...profile.simpleInfo.vasInfo, ...profile.commonExt, @@ -101,33 +124,6 @@ export class NTQQUserApi { pendantId: '', nick: profile.simpleInfo.coreInfo.nick || '', }; - return RetUser; - } - - async getUserDetailInfo(uid: string): Promise { - let retUser = await solveAsyncProblem(async (uid) => this.fetchUserDetailInfo(uid, UserDetailSource.KDB), uid); - if (retUser && retUser.uin !== '0') { - return retUser; - } - this.context.logger.logDebug('[NapCat] [Mark] getUserDetailInfo Mode1 Failed.'); - retUser = await this.fetchUserDetailInfo(uid, UserDetailSource.KSERVER); - if (retUser && retUser.uin === '0') { - retUser.uin = await this.core.apis.UserApi.getUidByUinV2(uid) ?? '0'; - } - return retUser; - } - - async getUserDetailInfoV2(uid: string): Promise { - const fallback = new Fallback((user) => FallbackUtil.boolchecker(user, user !== undefined && user.uin !== '0')) - .add(() => this.fetchUserDetailInfo(uid, UserDetailSource.KDB)) - .add(() => this.fetchUserDetailInfo(uid, UserDetailSource.KSERVER)); - const retUser = await fallback.run().then(async (user) => { - if (user && user.uin === '0') { - user.uin = await this.core.apis.UserApi.getUidByUinV2(uid) ?? '0'; - } - return user; - }); - return retUser; } async modifySelfProfile(param: ModifyProfileParams) { From 3e3609e0f2a82776b1113e7060cd465ac1aebf94 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 27 Mar 2025 04:16:25 +0000 Subject: [PATCH 004/149] release: v4.7.9 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 6ac5becc..78fbc7f7 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.8", + "version": "4.7.9", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 7570c1a4..6203c3cd 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.8", + "version": "4.7.9", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 4a8b1eff..b8d30df9 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.8'; +export const napCatVersion = '4.7.9'; From b2e0cab7023d7819e2b15f85fe6d2315a438ed01 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: Thu, 27 Mar 2025 12:35:05 +0800 Subject: [PATCH 005/149] =?UTF-8?q?feat:=20=E5=A5=BD=E5=8F=8B=E7=AD=89?= =?UTF-8?q?=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/user.ts | 4 ++-- src/core/types/user.ts | 1 + src/onebot/action/user/GetFriendList.ts | 20 +++++++++++++++++--- src/onebot/helper/data.ts | 19 +++++++++++++++++-- src/onebot/types/data.ts | 6 ++++++ 5 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/core/apis/user.ts b/src/core/apis/user.ts index 93e81c5e..1bb2ef42 100644 --- a/src/core/apis/user.ts +++ b/src/core/apis/user.ts @@ -93,8 +93,8 @@ export class NTQQUserApi { return profile; } - async getUserDetailInfo(uid: string): Promise { - let profile = await solveAsyncProblem(async (uid) => this.fetchUserDetailInfo(uid, UserDetailSource.KDB), uid); + async getUserDetailInfo(uid: string, no_cache: boolean = false): Promise { + let profile = await solveAsyncProblem(async (uid) => this.fetchUserDetailInfo(uid, no_cache ? UserDetailSource.KSERVER : UserDetailSource.KDB), uid); if (profile && profile.uin !== '0' && profile.commonExt) { return { ...profile.simpleInfo.status, diff --git a/src/core/types/user.ts b/src/core/types/user.ts index f6393ccd..921c709a 100644 --- a/src/core/types/user.ts +++ b/src/core/types/user.ts @@ -207,6 +207,7 @@ interface PhotoWall { // 简单信息 export interface SimpleInfo { + qqLevel?: QQLevel;//临时添加 uid?: string; uin?: string; coreInfo: CoreInfo; diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index de7526c4..0bc4e677 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -15,7 +15,21 @@ export default class GetFriendList extends OneBotAction { override payloadSchema = SchemaData; async _handle(_payload: Payload) { - //全新逻辑 - return OB11Construct.friends(await this.core.apis.FriendApi.getBuddy()); + const buddyMap = await this.core.apis.FriendApi.getBuddyV2SimpleInfoMap(); + + await Promise.all( + Array.from(buddyMap.values()).map(async (buddyInfo) => { + try { + const userDetail = await this.core.apis.UserApi.getUserDetailInfo(buddyInfo.coreInfo.uid); + const data = buddyMap.get(buddyInfo.coreInfo.uid); + if (data) { + data.qqLevel = userDetail.qqLevel; + } + } catch (error) { + this.core.context.logger.logError('获取好友详细信息失败', error); + } + }) + ); + return OB11Construct.friends(Array.from(buddyMap.values())); } -} +} \ No newline at end of file diff --git a/src/onebot/helper/data.ts b/src/onebot/helper/data.ts index e0380966..777a40b5 100644 --- a/src/onebot/helper/data.ts +++ b/src/onebot/helper/data.ts @@ -31,10 +31,25 @@ export class OB11Construct { nickname: rawFriend.coreInfo.nick ?? '', remark: rawFriend.coreInfo.remark ?? rawFriend.coreInfo.nick, sex: this.sex(rawFriend.baseInfo.sex), - level: 0, + level: rawFriend.qqLevel && calcQQLevel(rawFriend.qqLevel) || 0, })); } - + static friend(friends: FriendV2): OB11User { + return { + birthday_year: friends.baseInfo.birthday_year, + birthday_month: friends.baseInfo.birthday_month, + birthday_day: friends.baseInfo.birthday_day, + user_id: parseInt(friends.coreInfo.uin), + age: friends.baseInfo.age, + phone_num: friends.baseInfo.phoneNum, + email: friends.baseInfo.eMail, + category_id: friends.baseInfo.categoryId, + nickname: friends.coreInfo.nick ?? '', + remark: friends.coreInfo.remark ?? friends.coreInfo.nick, + sex: this.sex(friends.baseInfo.sex), + level: 0, + }; + } static groupMemberRole(role: number): OB11GroupMemberRole | undefined { return { 4: OB11GroupMemberRole.owner, diff --git a/src/onebot/types/data.ts b/src/onebot/types/data.ts index 2957e22a..e03974af 100644 --- a/src/onebot/types/data.ts +++ b/src/onebot/types/data.ts @@ -1,4 +1,10 @@ export interface OB11User { + birthday_year?: number; // 生日 + birthday_month?: number; // 生日 + birthday_day?: number; // 生日 + phone_num?: string; // 手机号 + email?: string; // 邮箱 + category_id?: number; // 分组ID user_id: number; // 用户ID nickname: string; // 昵称 remark?: string; // 备注 From 31f0f527b73b5ef0764d2b56ff82ffe69d970fbe Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 27 Mar 2025 04:36:54 +0000 Subject: [PATCH 006/149] release: v4.7.10 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 78fbc7f7..b759a2c9 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.9", + "version": "4.7.10", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 6203c3cd..b9703bd2 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.9", + "version": "4.7.10", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index b8d30df9..26d6a84e 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.9'; +export const napCatVersion = '4.7.10'; From 556c8b24c0cc588a614680badb586a6f7cd84a26 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: Fri, 28 Mar 2025 16:55:19 +0800 Subject: [PATCH 007/149] fix --- launcher/qqnt.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/launcher/qqnt.json b/launcher/qqnt.json index 549b8c76..74d47b93 100644 --- a/launcher/qqnt.json +++ b/launcher/qqnt.json @@ -1,9 +1,9 @@ { "name": "qq-chat", - "version": "9.9.18-32793", - "verHash": "d43f097e", - "linuxVersion": "3.2.16-32793", - "linuxVerHash": "ee4bd910", + "version": "9.9.18-32869", + "verHash": "e735296c", + "linuxVersion": "3.2.16-32869", + "linuxVerHash": "4c192ba9", "private": true, "description": "QQ", "productName": "QQ", @@ -34,9 +34,9 @@ "vuex@4.1.0": "patches/vuex@4.1.0.patch" } }, - "buildVersion": "32793", + "buildVersion": "32869", "isPureShell": true, "isByteCodeShell": true, "platform": "win32", "eleArch": "x64" -} \ No newline at end of file +} From 26cfaac3bde6bf5e65be7f15b8b0193cdc0b5647 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: Sat, 29 Mar 2025 10:50:27 +0800 Subject: [PATCH 008/149] =?UTF-8?q?fix:=20=E5=A2=9E=E5=BC=BA=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/network/websocket-client.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/onebot/network/websocket-client.ts b/src/onebot/network/websocket-client.ts index 34fd6502..132a868e 100644 --- a/src/onebot/network/websocket-client.ts +++ b/src/onebot/network/websocket-client.ts @@ -37,7 +37,13 @@ export class OB11WebSocketClientAdapter extends IOB11NetworkAdapter ', error); + + } + } close() { From ba71d7ad033ef1fbb8d690787d40a494020e74da Mon Sep 17 00:00:00 2001 From: bietiaop <1527109126@qq.com> Date: Sat, 29 Mar 2025 21:26:34 +0800 Subject: [PATCH 009/149] fix: #908 --- napcat.webui/src/pages/web_login.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/napcat.webui/src/pages/web_login.tsx b/napcat.webui/src/pages/web_login.tsx index e2b4ca44..3f9a53eb 100644 --- a/napcat.webui/src/pages/web_login.tsx +++ b/napcat.webui/src/pages/web_login.tsx @@ -79,6 +79,7 @@ export default function WebLoginPage() { Date: Tue, 1 Apr 2025 19:54:01 +0800 Subject: [PATCH 010/149] feat: no_cache --- src/onebot/action/go-cqhttp/GetStrangerInfo.ts | 4 +++- src/onebot/action/group/GetGroupMemberInfo.ts | 2 +- src/onebot/action/user/GetFriendList.ts | 4 ++-- src/onebot/index.ts | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index c8d53b0a..796f67f3 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -7,6 +7,7 @@ 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 }), }); type Payload = Static; @@ -16,10 +17,11 @@ export default class GoCQHTTPGetStrangerInfo extends OneBotAction { const [member, info] = await Promise.all([ this.core.apis.GroupApi.getGroupMemberEx(payload.group_id.toString(), uid, isNocache), - this.core.apis.UserApi.getUserDetailInfo(uid), + this.core.apis.UserApi.getUserDetailInfo(uid, isNocache), ]); if (!member || !groupMember) throw new Error(`群(${payload.group_id})成员${payload.user_id}不存在`); diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index 0bc4e677..6850f0f6 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -16,11 +16,11 @@ export default class GetFriendList extends OneBotAction { async _handle(_payload: Payload) { 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( Array.from(buddyMap.values()).map(async (buddyInfo) => { try { - const userDetail = await this.core.apis.UserApi.getUserDetailInfo(buddyInfo.coreInfo.uid); + const userDetail = await this.core.apis.UserApi.getUserDetailInfo(buddyInfo.coreInfo.uid, isNocache); const data = buddyMap.get(buddyInfo.coreInfo.uid); if (data) { data.qqLevel = userDetail.qqLevel; diff --git a/src/onebot/index.ts b/src/onebot/index.ts index 78b25397..4fb0089c 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -100,7 +100,7 @@ export class NapCatOneBot11Adapter { const selfInfo = this.core.selfInfo; const ob11Config = this.configLoader.configData; - this.core.apis.UserApi.getUserDetailInfo(selfInfo.uid) + this.core.apis.UserApi.getUserDetailInfo(selfInfo.uid, false) .then((user) => { selfInfo.nick = user.nick; this.context.logger.setLogSelfInfo(selfInfo); From f180c7698f2a56f351f66c1eac3f4df65eba7409 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: Tue, 1 Apr 2025 20:22:46 +0800 Subject: [PATCH 011/149] =?UTF-8?q?feat:=20=E6=96=87=E4=BB=B6=E6=B8=85?= =?UTF-8?q?=E7=90=86quene?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/clean-task.ts | 229 +++++++++++++++++++++++++++++++++++++++ src/onebot/api/msg.ts | 29 ++--- 2 files changed, 244 insertions(+), 14 deletions(-) create mode 100644 src/common/clean-task.ts diff --git a/src/common/clean-task.ts b/src/common/clean-task.ts new file mode 100644 index 00000000..56c8567e --- /dev/null +++ b/src/common/clean-task.ts @@ -0,0 +1,229 @@ +import fs from 'fs'; +// generate Claude 3.7 Sonet Thinking + +interface FileRecord { + filePath: string; + addedTime: number; + retries: number; +} + +interface CleanupTask { + fileRecord: FileRecord; + timer: NodeJS.Timeout; +} + +class CleanupQueue { + private tasks: Map = new Map(); + private readonly MAX_RETRIES = 3; + private isProcessing: boolean = false; + private pendingOperations: Array<() => void> = []; + + /** + * 执行队列中的待处理操作,确保异步安全 + */ + private executeNextOperation(): void { + if (this.pendingOperations.length === 0) { + this.isProcessing = false; + return; + } + + this.isProcessing = true; + const operation = this.pendingOperations.shift(); + operation?.(); + + // 使用 setImmediate 允许事件循环继续,防止阻塞 + setImmediate(() => this.executeNextOperation()); + } + + /** + * 安全执行操作,防止竞态条件 + * @param operation 要执行的操作 + */ + private safeExecute(operation: () => void): void { + this.pendingOperations.push(operation); + if (!this.isProcessing) { + this.executeNextOperation(); + } + } + + /** + * 检查文件是否存在 + * @param filePath 文件路径 + * @returns 文件是否存在 + */ + private fileExists(filePath: string): boolean { + try { + return fs.existsSync(filePath); + } catch (error) { + //console.log(`检查文件存在出错: ${filePath}`, error); + return false; + } + } + + /** + * 添加文件到清理队列 + * @param filePath 文件路径 + * @param cleanupDelay 清理延迟时间(毫秒) + */ + addFile(filePath: string, cleanupDelay: number): void { + this.safeExecute(() => { + // 如果文件已在队列中,取消原来的计时器 + if (this.tasks.has(filePath)) { + this.cancelCleanup(filePath); + } + + // 创建新的文件记录 + const fileRecord: FileRecord = { + filePath, + addedTime: Date.now(), + retries: 0 + }; + + // 设置计时器 + const timer = setTimeout(() => { + this.cleanupFile(fileRecord, cleanupDelay); + }, cleanupDelay); + + // 添加到任务队列 + this.tasks.set(filePath, { fileRecord, timer }); + }); + } + + /** + * 批量添加文件到清理队列 + * @param filePaths 文件路径数组 + * @param cleanupDelay 清理延迟时间(毫秒) + */ + addFiles(filePaths: string[], cleanupDelay: number): void { + this.safeExecute(() => { + for (const filePath of filePaths) { + // 内部直接处理,不通过 safeExecute 以保证批量操作的原子性 + if (this.tasks.has(filePath)) { + // 取消已有的计时器,但不使用 cancelCleanup 方法以避免重复的安全检查 + const existingTask = this.tasks.get(filePath); + if (existingTask) { + clearTimeout(existingTask.timer); + } + } + + const fileRecord: FileRecord = { + filePath, + addedTime: Date.now(), + retries: 0 + }; + + const timer = setTimeout(() => { + this.cleanupFile(fileRecord, cleanupDelay); + }, cleanupDelay); + + this.tasks.set(filePath, { fileRecord, timer }); + } + }); + } + + /** + * 清理文件 + * @param record 文件记录 + * @param delay 延迟时间,用于重试 + */ + private cleanupFile(record: FileRecord, delay: number): void { + this.safeExecute(() => { + // 首先检查文件是否存在,不存在则视为清理成功 + if (!this.fileExists(record.filePath)) { + //console.log(`文件已不存在,跳过清理: ${record.filePath}`); + this.tasks.delete(record.filePath); + return; + } + + try { + // 尝试删除文件 + fs.unlinkSync(record.filePath); + // 删除成功,从队列中移除任务 + this.tasks.delete(record.filePath); + } catch (error) { + const err = error as NodeJS.ErrnoException; + + // 明确处理文件不存在的情况 + if (err.code === 'ENOENT') { + //console.log(`文件在删除时不存在,视为清理成功: ${record.filePath}`); + this.tasks.delete(record.filePath); + return; + } + + // 文件没有访问权限等情况 + if (err.code === 'EACCES' || err.code === 'EPERM') { + //console.error(`没有权限删除文件: ${record.filePath}`, err); + } + + // 其他删除失败情况,考虑重试 + if (record.retries < this.MAX_RETRIES - 1) { + // 还有重试机会,增加重试次数 + record.retries++; + //console.log(`清理文件失败,将重试(${record.retries}/${this.MAX_RETRIES}): ${record.filePath}`); + + // 设置相同的延迟时间再次尝试 + const timer = setTimeout(() => { + this.cleanupFile(record, delay); + }, delay); + + // 更新任务 + this.tasks.set(record.filePath, { fileRecord: record, timer }); + } else { + // 已达到最大重试次数,从队列中移除任务 + this.tasks.delete(record.filePath); + //console.error(`清理文件失败,已达最大重试次数(${this.MAX_RETRIES}): ${record.filePath}`, error); + } + } + }); + } + + /** + * 取消文件的清理任务 + * @param filePath 文件路径 + * @returns 是否成功取消 + */ + cancelCleanup(filePath: string): boolean { + let cancelled = false; + this.safeExecute(() => { + const task = this.tasks.get(filePath); + if (task) { + clearTimeout(task.timer); + this.tasks.delete(filePath); + cancelled = true; + } + }); + return cancelled; + } + + /** + * 获取队列中的文件数量 + * @returns 文件数量 + */ + getQueueSize(): number { + return this.tasks.size; + } + + /** + * 获取所有待清理的文件 + * @returns 文件路径数组 + */ + getPendingFiles(): string[] { + return Array.from(this.tasks.keys()); + } + + /** + * 清空所有清理任务 + */ + clearAll(): void { + this.safeExecute(() => { + // 取消所有定时器 + for (const task of this.tasks.values()) { + clearTimeout(task.timer); + } + this.tasks.clear(); + //console.log('已清空所有清理任务'); + }); + } +} + +export const cleanTaskQueue = new CleanupQueue(); \ No newline at end of file diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 73519ff1..595c1736 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -34,7 +34,7 @@ import { EventType } from '@/onebot/event/OneBotEvent'; import { encodeCQCode } from '@/onebot/helper/cqcode'; import { uriToLocalFile } from '@/common/file'; import { RequestUtil } from '@/common/request'; -import fsPromise, { constants } from 'node:fs/promises'; +import fsPromise from 'node:fs/promises'; import { OB11FriendAddNoticeEvent } from '@/onebot/event/notice/OB11FriendAddNoticeEvent'; import { ForwardMsgBuilder } from '@/common/forward-msg-builder'; import { NapProtoMsg } from '@napneko/nap-proto-core'; @@ -45,6 +45,7 @@ import { OB11GroupAdminNoticeEvent } from '../event/notice/OB11GroupAdminNoticeE import { GroupChange, GroupChangeInfo, GroupInvite, PushMsgBody } from '@/core/packet/transformer/proto'; import { OB11GroupRequestEvent } from '../event/request/OB11GroupRequest'; import { LRUCache } from '@/common/lru-cache'; +import { cleanTaskQueue } from '@/common/clean-task'; type RawToOb11Converters = { [Key in keyof MessageElement as Key extends `${string}Element` ? Key : never]: ( @@ -970,7 +971,7 @@ export class OneBotMsgApi { }); const timeout = 10000 + (totalSize / 1024 / 256 * 1000); - + cleanTaskQueue.addFiles(deleteAfterSentFiles, timeout); try { const returnMsg = await this.core.apis.MsgApi.sendMsg(peer, sendElements, timeout); if (!returnMsg) throw new Error('发送消息失败'); @@ -983,18 +984,18 @@ export class OneBotMsgApi { } catch (error) { throw new Error((error as Error).message); } finally { - setTimeout(async () => { - const deletePromises = deleteAfterSentFiles.map(async file => { - try { - if (await fsPromise.access(file, constants.W_OK).then(() => true).catch(() => false)) { - await fsPromise.unlink(file); - } - } catch (e) { - this.core.context.logger.logError('发送消息删除文件失败', e); - } - }); - await Promise.all(deletePromises); - }, 60000); + // setTimeout(async () => { + // const deletePromises = deleteAfterSentFiles.map(async file => { + // try { + // if (await fsPromise.access(file, constants.W_OK).then(() => true).catch(() => false)) { + // await fsPromise.unlink(file); + // } + // } catch (e) { + // this.core.context.logger.logError('发送消息删除文件失败', e); + // } + // }); + // await Promise.all(deletePromises); + // }, 60000); } } From 291e2fd8fd0b313a6eff0fccc4cbcc0d5bb53e84 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: Tue, 1 Apr 2025 20:33:14 +0800 Subject: [PATCH 012/149] feat: 33800 --- src/core/external/appid.json | 8 ++++++++ src/core/external/offset.json | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/core/external/appid.json b/src/core/external/appid.json index 26a18c18..078ac7f1 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -226,5 +226,13 @@ "9.9.18-33139": { "appid": 537273874, "qua": "V1_WIN_NQ_9.9.18_33139_GW_B" + }, + "9.9.18-33800": { + "appid": 537273974, + "qua": "V1_WIN_NQ_9.9.18_33800_GW_B" + }, + "3.2.16-33800": { + "appid": 537274009, + "qua": "V1_LNX_NQ_3.2.16_33800_GW_B" } } \ No newline at end of file diff --git a/src/core/external/offset.json b/src/core/external/offset.json index 224d6026..0a4b0cc5 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -302,5 +302,17 @@ "3.2.16-33139-arm64": { "send": "7262BB0", "recv": "72664E0" + }, + "9.9.18-33800-x64": { + "send": "39F5870", + "recv": "39FA070" + }, + "3.2.16-33800-x64": { + "send": "A634F60", + "recv": "A638980" + }, + "3.2.16-33800-arm64": { + "send": "7262BB0", + "recv": "72664E0" } } \ No newline at end of file From 53a7ce2e46709fcf8e1f90717627790dc07b2360 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: Tue, 1 Apr 2025 20:43:46 +0800 Subject: [PATCH 013/149] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96webui?= =?UTF-8?q?=E5=BF=AB=E9=80=9F=E7=99=BB=E5=BD=95&=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=95=B4=E4=BD=93=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shell/base.ts | 5 +++++ src/webui/index.ts | 25 +++++++++++++------------ src/webui/src/helper/Data.ts | 10 ++++++++++ src/webui/src/types/data.d.ts | 1 + 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/shell/base.ts b/src/shell/base.ts index 51c730aa..0d5ada4a 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -222,6 +222,11 @@ async function handleLoginInner(context: { isLogined: boolean }, logger: LogWrap }`); } loginService.getQRCodePicture(); + try { + await WebUiDataRuntime.runWebUiConfigQuickFunction(); + } catch (error) { + logger.logError('WebUi 快速登录失败 执行失败', error); + } } loginService.getLoginList().then((res) => { diff --git a/src/webui/index.ts b/src/webui/index.ts index 716e84fc..17423d52 100644 --- a/src/webui/index.ts +++ b/src/webui/index.ts @@ -50,20 +50,21 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp logger.log('[NapCat] [WebUi] Current WebUi is not run.'); return; } - setTimeout(async () => { - let autoLoginAccount = process.env['NAPCAT_QUICK_ACCOUNT'] || WebUiConfig.getAutoLoginAccount(); - if (autoLoginAccount) { - try { - const { result, message } = await WebUiDataRuntime.requestQuickLogin(autoLoginAccount); - if (!result) { - throw new Error(message); + WebUiDataRuntime.setWebUiConfigQuickFunction( + async () => { + let autoLoginAccount = process.env['NAPCAT_QUICK_ACCOUNT'] || WebUiConfig.getAutoLoginAccount(); + if (autoLoginAccount) { + try { + const { result, message } = await WebUiDataRuntime.requestQuickLogin(autoLoginAccount); + if (!result) { + throw new Error(message); + } + console.log(`[NapCat] [WebUi] Auto login account: ${autoLoginAccount}`); + } catch (error) { + console.log(`[NapCat] [WebUi] Auto login account failed.` + error); } - console.log(`[NapCat] [WebUi] Auto login account: ${autoLoginAccount}`); - } catch (error) { - console.log(`[NapCat] [WebUi] Auto login account failed.` + error); } - } - }, 30000); + }); // ------------注册中间件------------ // 使用express的json中间件 app.use(express.json()); diff --git a/src/webui/src/helper/Data.ts b/src/webui/src/helper/Data.ts index bafc5ba5..c151f003 100644 --- a/src/webui/src/helper/Data.ts +++ b/src/webui/src/helper/Data.ts @@ -25,6 +25,9 @@ const LoginRuntime: LoginRuntimeType = { NewQQLoginList: [], }, packageJson: packageJson, + WebUiConfigQuickFunction: async () => { + return; + } }; export const WebUiDataRuntime = { @@ -118,4 +121,11 @@ export const WebUiDataRuntime = { getQQVersion() { return LoginRuntime.QQVersion; }, + + setWebUiConfigQuickFunction(func: LoginRuntimeType['WebUiConfigQuickFunction']): void { + LoginRuntime.WebUiConfigQuickFunction = func; + }, + runWebUiConfigQuickFunction: async function () { + await LoginRuntime.WebUiConfigQuickFunction(); + } }; diff --git a/src/webui/src/types/data.d.ts b/src/webui/src/types/data.d.ts index fb9a644e..d881a4b0 100644 --- a/src/webui/src/types/data.d.ts +++ b/src/webui/src/types/data.d.ts @@ -9,6 +9,7 @@ interface LoginRuntimeType { QQLoginUin: string; QQLoginInfo: SelfInfo; QQVersion: string; + WebUiConfigQuickFunction: () => Promise; NapCatHelper: { onQuickLoginRequested: (uin: string) => Promise<{ result: boolean; message: string }>; onOB11ConfigChanged: (ob11: OneBotConfig) => Promise; From 258a1dda5e60fa3127ca77edd42bfdb5297b44ff Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Tue, 1 Apr 2025 12:44:06 +0000 Subject: [PATCH 014/149] release: v4.7.11 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index b759a2c9..932d376c 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.10", + "version": "4.7.11", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index b9703bd2..b43adaf8 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.10", + "version": "4.7.11", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 26d6a84e..824b4b03 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.10'; +export const napCatVersion = '4.7.11'; From 640252d391917f0cdc674a8d91ebe0f7af518678 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: Wed, 2 Apr 2025 10:05:57 +0800 Subject: [PATCH 015/149] =?UTF-8?q?fix:=20=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E5=90=8E=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shell/base.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/shell/base.ts b/src/shell/base.ts index 0d5ada4a..aee90f66 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -139,6 +139,7 @@ async function handleLogin( loginListener.onLoginConnected = () => { waitForNetworkConnection(loginService, logger).then(() => { handleLoginInner(context, logger, loginService, quickLoginUin, historyLoginList).then().catch(e => logger.logError(e)); + loginListener.onLoginConnected = () => { }; }); } loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => { From ac26a9914371149dc17c8122db716512efb57e75 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: Wed, 2 Apr 2025 10:49:48 +0800 Subject: [PATCH 016/149] fix: type --- src/common/file.ts | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/common/file.ts b/src/common/file.ts index 4133cf7b..c75bcce4 100644 --- a/src/common/file.ts +++ b/src/common/file.ts @@ -76,7 +76,7 @@ export function calculateFileMD5(filePath: string): Promise { const stream = fs.createReadStream(filePath); const hash = crypto.createHash('md5'); - stream.on('data', (data: Buffer) => { + stream.on('data', (data) => { // 当读取到数据时,更新哈希对象的状态 hash.update(data); }); @@ -182,28 +182,28 @@ export async function uriToLocalFile(dir: string, uri: string, filename: string const filePath = path.join(dir, filename); switch (UriType) { - case FileUriType.Local: { - const fileExt = path.extname(HandledUri); - const localFileName = path.basename(HandledUri, fileExt) + fileExt; - const tempFilePath = path.join(dir, filename + fileExt); - fs.copyFileSync(HandledUri, tempFilePath); - return { success: true, errMsg: '', fileName: localFileName, path: tempFilePath }; - } + case FileUriType.Local: { + const fileExt = path.extname(HandledUri); + const localFileName = path.basename(HandledUri, fileExt) + fileExt; + const tempFilePath = path.join(dir, filename + fileExt); + fs.copyFileSync(HandledUri, tempFilePath); + return { success: true, errMsg: '', fileName: localFileName, path: tempFilePath }; + } - case FileUriType.Remote: { - const buffer = await httpDownload({ url: HandledUri, headers: headers ?? {} }); - fs.writeFileSync(filePath, buffer); - return { success: true, errMsg: '', fileName: filename, path: filePath }; - } + case FileUriType.Remote: { + const buffer = await httpDownload({ url: HandledUri, headers: headers ?? {} }); + fs.writeFileSync(filePath, buffer); + return { success: true, errMsg: '', fileName: filename, path: filePath }; + } - case FileUriType.Base64: { - const base64 = HandledUri.replace(/^base64:\/\//, ''); - const base64Buffer = Buffer.from(base64, 'base64'); - fs.writeFileSync(filePath, base64Buffer); - return { success: true, errMsg: '', fileName: filename, path: filePath }; - } + case FileUriType.Base64: { + const base64 = HandledUri.replace(/^base64:\/\//, ''); + const base64Buffer = Buffer.from(base64, 'base64'); + fs.writeFileSync(filePath, base64Buffer); + return { success: true, errMsg: '', fileName: filename, path: filePath }; + } - default: - return { success: false, errMsg: `识别URL失败, uri= ${uri}`, fileName: '', path: '' }; + default: + return { success: false, errMsg: `识别URL失败, uri= ${uri}`, fileName: '', path: '' }; } } From c4cbac4331b579719405f7775819224e6ab9f153 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: Wed, 2 Apr 2025 11:51:51 +0800 Subject: [PATCH 017/149] fix: #918 --- src/common/ffmpeg-worker.ts | 197 +++++++++++++++++++++++++++++++----- src/common/ffmpeg.ts | 2 +- src/common/worker.ts | 5 +- src/core/apis/file.ts | 34 ++++--- src/onebot/api/msg.ts | 2 +- 5 files changed, 196 insertions(+), 44 deletions(-) diff --git a/src/common/ffmpeg-worker.ts b/src/common/ffmpeg-worker.ts index 40228a8d..d56abdba 100644 --- a/src/common/ffmpeg-worker.ts +++ b/src/common/ffmpeg-worker.ts @@ -16,6 +16,9 @@ export function recvTask(cb: (taskData: T) => Promise) { } }); } +export function sendLog(_log: string) { + //parentPort?.postMessage({ log }); +} class FFmpegService { public static async extractThumbnail(videoPath: string, thumbnailPath: string): Promise { const ffmpegInstance = await FFmpeg.create({ core: '@ffmpeg.wasm/core-mt' }); @@ -107,35 +110,175 @@ class FFmpegService { } } } - public static async getVideoInfo(videoPath: string, thumbnailPath: string): Promise { - await FFmpegService.extractThumbnail(videoPath, thumbnailPath); - const fileType = (await fileTypeFromFile(videoPath))?.ext ?? 'mp4'; - const inputFileName = `${randomUUID()}.${fileType}`; - const ffmpegInstance = await FFmpeg.create({ core: '@ffmpeg.wasm/core-mt' }); - ffmpegInstance.fs.writeFile(inputFileName, readFileSync(videoPath)); - ffmpegInstance.setLogging(true); - let duration = 60; - ffmpegInstance.setLogger((_level, ...msg) => { - const message = msg.join(' '); - const durationMatch = message.match(/Duration: (\d+):(\d+):(\d+\.\d+)/); - if (durationMatch) { - const hours = parseInt(durationMatch[1] ?? '0', 10); - const minutes = parseInt(durationMatch[2] ?? '0', 10); - const seconds = parseFloat(durationMatch[3] ?? '0'); - duration = hours * 3600 + minutes * 60 + seconds; - } - }); - await ffmpegInstance.run('-i', inputFileName); - const image = imageSize(thumbnailPath); - ffmpegInstance.fs.unlink(inputFileName); - const fileSize = statSync(videoPath).size; + const startTime = Date.now(); + sendLog(`开始获取视频信息: ${videoPath}`); + + // 创建一个超时包装函数 + const withTimeout = (promise: Promise, timeoutMs: number, taskName: string): Promise => { + return Promise.race([ + promise, + new Promise((_, reject) => { + setTimeout(() => reject(new Error(`任务超时: ${taskName} (${timeoutMs}ms)`)), timeoutMs); + }) + ]); + }; + + // 并行执行多个任务 + const [fileInfo, durationInfo] = await Promise.all([ + // 任务1: 获取文件信息和提取缩略图 + (async () => { + sendLog(`开始任务1: 获取文件信息和提取缩略图`); + + // 获取文件信息 (并行) + const fileInfoStartTime = Date.now(); + const [fileType, fileSize] = await Promise.all([ + withTimeout(fileTypeFromFile(videoPath), 10000, '获取文件类型') + .then(result => { + sendLog(`获取文件类型完成,耗时: ${Date.now() - fileInfoStartTime}ms`); + return result; + }), + (async () => { + const result = statSync(videoPath).size; + sendLog(`获取文件大小完成,耗时: ${Date.now() - fileInfoStartTime}ms`); + return result; + })() + ]); + + // 直接实现缩略图提取 (不调用extractThumbnail方法) + const thumbStartTime = Date.now(); + sendLog(`开始提取缩略图`); + + const ffmpegInstance = await withTimeout( + FFmpeg.create({ core: '@ffmpeg.wasm/core-mt' }), + 15000, + '创建FFmpeg实例(缩略图)' + ); + + const videoFileName = `${randomUUID()}.mp4`; + const outputFileName = `${randomUUID()}.jpg`; + + try { + // 写入视频文件到FFmpeg + const writeFileStartTime = Date.now(); + ffmpegInstance.fs.writeFile(videoFileName, readFileSync(videoPath)); + sendLog(`写入视频文件到FFmpeg完成,耗时: ${Date.now() - writeFileStartTime}ms`); + + // 提取缩略图 + const extractStartTime = Date.now(); + const code = await withTimeout( + ffmpegInstance.run('-i', videoFileName, '-ss', '00:00:01.000', '-vframes', '1', outputFileName), + 30000, + '提取缩略图' + ); + sendLog(`FFmpeg提取缩略图命令执行完成,耗时: ${Date.now() - extractStartTime}ms`); + + if (code !== 0) { + throw new Error('Error extracting thumbnail: FFmpeg process exited with code ' + code); + } + + // 读取并保存缩略图 + const saveStartTime = Date.now(); + const thumbnail = ffmpegInstance.fs.readFile(outputFileName); + writeFileSync(thumbnailPath, thumbnail); + sendLog(`读取并保存缩略图完成,耗时: ${Date.now() - saveStartTime}ms`); + + // 获取缩略图尺寸 + const imageSizeStartTime = Date.now(); + const image = imageSize(thumbnailPath); + sendLog(`获取缩略图尺寸完成,耗时: ${Date.now() - imageSizeStartTime}ms`); + + sendLog(`提取缩略图完成,总耗时: ${Date.now() - thumbStartTime}ms`); + + return { + format: fileType?.ext ?? 'mp4', + size: fileSize, + width: image.width ?? 100, + height: image.height ?? 100 + }; + } finally { + // 清理资源 + try { + ffmpegInstance.fs.unlink(outputFileName); + } catch (error) { + sendLog(`清理输出文件失败: ${(error as Error).message}`); + } + + try { + ffmpegInstance.fs.unlink(videoFileName); + } catch (error) { + sendLog(`清理视频文件失败: ${(error as Error).message}`); + } + } + })(), + + // 任务2: 获取视频时长 + (async () => { + const task2StartTime = Date.now(); + sendLog(`开始任务2: 获取视频时长`); + + // 创建FFmpeg实例 + const ffmpegCreateStartTime = Date.now(); + const ffmpegInstance = await withTimeout( + FFmpeg.create({ core: '@ffmpeg.wasm/core-mt' }), + 15000, + '创建FFmpeg实例(时长)' + ); + sendLog(`创建FFmpeg实例完成,耗时: ${Date.now() - ffmpegCreateStartTime}ms`); + + const inputFileName = `${randomUUID()}.mp4`; + + try { + // 写入文件 + const writeStartTime = Date.now(); + ffmpegInstance.fs.writeFile(inputFileName, readFileSync(videoPath)); + sendLog(`写入文件到FFmpeg完成,耗时: ${Date.now() - writeStartTime}ms`); + + ffmpegInstance.setLogging(true); + let duration = 60; // 默认值 + + ffmpegInstance.setLogger((_level, ...msg) => { + const message = msg.join(' '); + const durationMatch = message.match(/Duration: (\d+):(\d+):(\d+\.\d+)/); + if (durationMatch) { + const hours = parseInt(durationMatch[1] ?? '0', 10); + const minutes = parseInt(durationMatch[2] ?? '0', 10); + const seconds = parseFloat(durationMatch[3] ?? '0'); + duration = hours * 3600 + minutes * 60 + seconds; + } + }); + + // 执行FFmpeg + const runStartTime = Date.now(); + await withTimeout( + ffmpegInstance.run('-i', inputFileName), + 20000, + '获取视频时长' + ); + sendLog(`执行FFmpeg命令完成,耗时: ${Date.now() - runStartTime}ms`); + + sendLog(`任务2(获取视频时长)完成,总耗时: ${Date.now() - task2StartTime}ms`); + return { time: duration }; + } finally { + try { + ffmpegInstance.fs.unlink(inputFileName); + } catch (error) { + sendLog(`清理输入文件失败: ${(error as Error).message}`); + } + } + })() + ]); + + // 合并结果并返回 + const totalDuration = Date.now() - startTime; + sendLog(`获取视频信息完成,总耗时: ${totalDuration}ms`); + return { - width: image.width ?? 100, - height: image.height ?? 100, - time: duration, - format: fileType, - size: fileSize, + width: fileInfo.width, + height: fileInfo.height, + time: durationInfo.time, + format: fileInfo.format, + size: fileInfo.size, filePath: videoPath }; } diff --git a/src/common/ffmpeg.ts b/src/common/ffmpeg.ts index 737c761a..22497d6e 100644 --- a/src/common/ffmpeg.ts +++ b/src/common/ffmpeg.ts @@ -30,7 +30,7 @@ export class FFmpegService { } public static async getVideoInfo(videoPath: string, thumbnailPath: string): Promise { - const result = await await runTask(getWorkerPath(), { method: 'getVideoInfo', args: [videoPath, thumbnailPath] }); + const result = await runTask(getWorkerPath(), { method: 'getVideoInfo', args: [videoPath, thumbnailPath] }); return result; } } diff --git a/src/common/worker.ts b/src/common/worker.ts index 55e55cd8..da5c1321 100644 --- a/src/common/worker.ts +++ b/src/common/worker.ts @@ -5,8 +5,11 @@ export async function runTask(workerScript: string, taskData: T): Promise< try { return await new Promise((resolve, reject) => { worker.on('message', (result: R) => { + if ((result as any)?.log) { + console.error('Worker Log--->:', (result as { log: string }).log); + } if ((result as any)?.error) { - reject(new Error((result as { error: string }).error)); + reject(new Error("Worker error: " + (result as { error: string }).error)); } resolve(result); }); diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index f058a15a..4c848695 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -44,7 +44,7 @@ export class NTQQFileApi { 'https://ss.xingzhige.com/music_card/rkey', // 国内 'https://secret-service.bietiaop.com/rkeys',//国内 ], - this.context.logger + this.context.logger ); } @@ -188,17 +188,23 @@ export class NTQQFileApi { const thumbDir = path.replace(`${pathLib.sep}Ori${pathLib.sep}`, `${pathLib.sep}Thumb${pathLib.sep}`); fs.mkdirSync(pathLib.dirname(thumbDir), { recursive: true }); const thumbPath = pathLib.join(pathLib.dirname(thumbDir), `${md5}_0.png`); - try { - videoInfo = await FFmpegService.getVideoInfo(filePath, thumbPath); - } catch { - fs.writeFileSync(thumbPath, Buffer.from(defaultVideoThumbB64, 'base64')); - } if (_diyThumbPath) { try { await this.copyFile(_diyThumbPath, thumbPath); } catch (e) { this.context.logger.logError('复制自定义缩略图失败', e); } + } else { + try { + videoInfo = await FFmpegService.getVideoInfo(filePath, thumbPath); + if (!fs.existsSync(thumbPath)) { + this.context.logger.logError('获取视频缩略图失败', new Error('缩略图不存在')); + throw new Error('获取视频缩略图失败'); + } + } catch (e) { + this.context.logger.logError('获取视频信息失败', e); + fs.writeFileSync(thumbPath, Buffer.from(defaultVideoThumbB64, 'base64')); + } } context.deleteAfterSentFiles.push(thumbPath); const thumbSize = (await fsPromises.stat(thumbPath)).size; @@ -301,18 +307,18 @@ export class NTQQFileApi { element.elementType === ElementType.FILE ) { switch (element.elementType) { - case ElementType.PIC: + case ElementType.PIC: element.picElement!.sourcePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.VIDEO: + break; + case ElementType.VIDEO: element.videoElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.PTT: + break; + case ElementType.PTT: element.pttElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.FILE: + break; + case ElementType.FILE: element.fileElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; + break; } elementIndex++; } diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 595c1736..49accdc7 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -971,7 +971,6 @@ export class OneBotMsgApi { }); const timeout = 10000 + (totalSize / 1024 / 256 * 1000); - cleanTaskQueue.addFiles(deleteAfterSentFiles, timeout); try { const returnMsg = await this.core.apis.MsgApi.sendMsg(peer, sendElements, timeout); if (!returnMsg) throw new Error('发送消息失败'); @@ -984,6 +983,7 @@ export class OneBotMsgApi { } catch (error) { throw new Error((error as Error).message); } finally { + cleanTaskQueue.addFiles(deleteAfterSentFiles, timeout); // setTimeout(async () => { // const deletePromises = deleteAfterSentFiles.map(async file => { // try { From da58c6bec0aefd1cd0f9fdc653ff140367ef9c50 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Wed, 2 Apr 2025 03:54:37 +0000 Subject: [PATCH 018/149] release: v4.7.12 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 932d376c..c31367dd 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.11", + "version": "4.7.12", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index b43adaf8..55d4813a 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.11", + "version": "4.7.12", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 824b4b03..eecef778 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.11'; +export const napCatVersion = '4.7.12'; From d9b33b5439b61f27290b366fc17061f429082a09 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: Wed, 2 Apr 2025 11:58:56 +0800 Subject: [PATCH 019/149] fix: file clean --- src/core/apis/file.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index 4c848695..33562d3c 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -182,6 +182,7 @@ export class NTQQFileApi { filePath = newFilePath; const { fileName: _fileName, path, fileSize, md5 } = await this.core.apis.FileApi.uploadFile(filePath, ElementType.VIDEO); + context.deleteAfterSentFiles.push(_fileName); if (fileSize === 0) { throw new Error('文件异常,大小为0'); } From 24cf7c01f803b1a75eeb0c3c4bcd97b859400196 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: Wed, 2 Apr 2025 12:04:05 +0800 Subject: [PATCH 020/149] =?UTF-8?q?fix:=20=E6=B8=85=E7=90=86=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/file.ts | 4 ++-- src/onebot/api/msg.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index 33562d3c..7d5a768b 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -182,7 +182,7 @@ export class NTQQFileApi { filePath = newFilePath; const { fileName: _fileName, path, fileSize, md5 } = await this.core.apis.FileApi.uploadFile(filePath, ElementType.VIDEO); - context.deleteAfterSentFiles.push(_fileName); + context.deleteAfterSentFiles.push(path); if (fileSize === 0) { throw new Error('文件异常,大小为0'); } @@ -231,7 +231,7 @@ export class NTQQFileApi { }, }; } - async createValidSendPttElement(pttPath: string): Promise { + async createValidSendPttElement(context: SendMessageContext, pttPath: string): Promise { const { converted, path: silkPath, duration } = await encodeSilk(pttPath, this.core.NapCatTempPath, this.core.context.logger); if (!silkPath) { diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 49accdc7..dd94c8e8 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -555,7 +555,7 @@ export class OneBotMsgApi { }, [OB11MessageDataType.voice]: async (sendMsg, context) => - this.core.apis.FileApi.createValidSendPttElement( + this.core.apis.FileApi.createValidSendPttElement(context, (await this.handleOb11FileLikeMessage(sendMsg, context)).path), [OB11MessageDataType.json]: async ({ data: { data } }) => ({ From 2b319bd6940018e60966f879dca9813bb335a2d0 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Wed, 2 Apr 2025 04:05:02 +0000 Subject: [PATCH 021/149] release: v4.7.13 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index c31367dd..4df1ba5e 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.12", + "version": "4.7.13", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 55d4813a..451b55f3 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.12", + "version": "4.7.13", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index eecef778..373e8812 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.12'; +export const napCatVersion = '4.7.13'; From f7a500a8cfe95f9fd31b9929abf40097e828c9ea 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: Wed, 2 Apr 2025 21:30:25 +0800 Subject: [PATCH 022/149] feat: GroupMemberTitle --- package.json | 2 +- src/core/apis/file.ts | 2 +- src/onebot/api/msg.ts | 81 +++++++++++++++++++++ src/onebot/event/notice/GroupMemberTitle.ts | 16 ++++ 4 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 src/onebot/event/notice/GroupMemberTitle.ts diff --git a/package.json b/package.json index 451b55f3..f3351ef5 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "vite": "^6.0.1", "vite-plugin-cp": "^4.0.8", "vite-tsconfig-paths": "^5.1.0", - "napcat.protobuf": "^1.1.3", + "napcat.protobuf": "^1.1.4", "winston": "^3.17.0", "compressing": "^1.10.1" }, diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index 7d5a768b..b40ab667 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -231,7 +231,7 @@ export class NTQQFileApi { }, }; } - async createValidSendPttElement(context: SendMessageContext, pttPath: string): Promise { + async createValidSendPttElement(_context: SendMessageContext, pttPath: string): Promise { const { converted, path: silkPath, duration } = await encodeSilk(pttPath, this.core.NapCatTempPath, this.core.context.logger); if (!silkPath) { diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index dd94c8e8..f8dd1a9b 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -46,6 +46,8 @@ import { GroupChange, GroupChangeInfo, GroupInvite, PushMsgBody } from '@/core/p import { OB11GroupRequestEvent } from '../event/request/OB11GroupRequest'; import { LRUCache } from '@/common/lru-cache'; import { cleanTaskQueue } from '@/common/clean-task'; +import { PBString, PBUint64, ProtoBuf, ProtoBufBase, ProtoBufIn, UnWrap } from 'napcat.protobuf/src/protobuf'; +import { GroupMemberTitle } from '../event/notice/GroupMemberTitle'; type RawToOb11Converters = { [Key in keyof MessageElement as Key extends `${string}Element` ? Key : never]: ( @@ -713,6 +715,56 @@ export class OneBotMsgApi { this.obContext = obContext; this.core = core; } + /** + * 解析带有JSON标记的文本 + * @param text 要解析的文本 + * @returns 解析后的结果数组,每个元素包含类型(text或json)和内容 + */ + parseTextWithJson(text: string) { + // 匹配<{...}>格式的JSON + const regex = /<(\{.*?\})>/g; + const parts: Array<{ type: 'text' | 'json', content: string | object }> = []; + let lastIndex = 0; + let match; + + // 查找所有匹配项 + while ((match = regex.exec(text)) !== null) { + // 添加匹配前的文本 + if (match.index > lastIndex) { + parts.push({ + type: 'text', + content: text.substring(lastIndex, match.index) + }); + } + + // 添加JSON部分 + try { + const jsonContent = JSON.parse(match[1] ?? ''); + parts.push({ + type: 'json', + content: jsonContent + }); + } catch (e) { + // 如果JSON解析失败,作为普通文本处理 + parts.push({ + type: 'text', + content: match[0] + }); + } + + lastIndex = regex.lastIndex; + } + + // 添加最后一部分文本 + if (lastIndex < text.length) { + parts.push({ + type: 'text', + content: text.substring(lastIndex) + }); + } + + return parts; + } async parsePrivateMsgEvent(msg: RawMessage, grayTipElement: GrayTipElement) { if (grayTipElement.subElementType == NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_JSON) { @@ -1213,6 +1265,35 @@ export class OneBotMsgApi { ); } else if (SysMessage.contentHead.type == 528 && SysMessage.contentHead.subType == 39 && SysMessage.body?.msgContent) { return await this.obContext.apis.UserApi.parseLikeEvent(SysMessage.body?.msgContent); + } else if (SysMessage.contentHead.type == 732 && SysMessage.contentHead.subType == 16 && SysMessage.body?.msgContent) { + let data_wrap = PBString(2); + let user_wrap = PBUint64(5); + let group_wrap = PBUint64(4); + + ProtoBuf(class extends ProtoBufBase { + group = group_wrap; + content = ProtoBufIn(5, { data: data_wrap, user: user_wrap }); + }).decode(SysMessage.body?.msgContent.slice(7)); + let xml_data = UnWrap(data_wrap); + let group = UnWrap(group_wrap).toString(); + //let user = UnWrap(user_wrap).toString(); + const parsedParts = this.parseTextWithJson(xml_data); + //解析JSON + if (parsedParts[1] && parsedParts[3]) { + let set_user_id: string = (parsedParts[1].content as { data: string }).data; + let uid = await this.core.apis.UserApi.getUidByUinV2(set_user_id); + await this.core.apis.GroupApi.refreshGroupMemberCachePartial(group, uid); + //let json_data_1_url_search = new URL((parsedParts[3].content as { url: string }).url).searchParams; + //let is_new: boolean = json_data_1_url_search.get('isnew') === '1'; + let new_tittle: string = (parsedParts[3].content as { text: string }).text; + //console.log(group, set_user_id, is_new, new_tittle); + return new GroupMemberTitle( + this.core, + +group, + +set_user_id, + new_tittle + ); + } } return undefined; } diff --git a/src/onebot/event/notice/GroupMemberTitle.ts b/src/onebot/event/notice/GroupMemberTitle.ts new file mode 100644 index 00000000..79235ad5 --- /dev/null +++ b/src/onebot/event/notice/GroupMemberTitle.ts @@ -0,0 +1,16 @@ +import { OB11GroupNoticeEvent } from './OB11GroupNoticeEvent'; +import { NapCatCore } from '@/core'; + + +export class GroupMemberTitle extends OB11GroupNoticeEvent { + notice_type = 'title'; + sub_type: 'set' | 'unset' = 'set'; + title: string = ''; + + constructor(core: NapCatCore, groupId: number, userId: number, title: string) { + super(core, groupId, userId); + this.group_id = groupId; + this.user_id = userId; + this.title = title; + } +} From 7ec61f089d73379d1759f7379cb9ad56fdbbb750 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: Wed, 2 Apr 2025 21:40:10 +0800 Subject: [PATCH 023/149] fix --- src/onebot/api/msg.ts | 66 +++++++++++---------- src/onebot/event/notice/GroupMemberTitle.ts | 16 ----- 2 files changed, 35 insertions(+), 47 deletions(-) delete mode 100644 src/onebot/event/notice/GroupMemberTitle.ts diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index f8dd1a9b..c8b5035e 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -46,8 +46,6 @@ import { GroupChange, GroupChangeInfo, GroupInvite, PushMsgBody } from '@/core/p import { OB11GroupRequestEvent } from '../event/request/OB11GroupRequest'; import { LRUCache } from '@/common/lru-cache'; import { cleanTaskQueue } from '@/common/clean-task'; -import { PBString, PBUint64, ProtoBuf, ProtoBufBase, ProtoBufIn, UnWrap } from 'napcat.protobuf/src/protobuf'; -import { GroupMemberTitle } from '../event/notice/GroupMemberTitle'; type RawToOb11Converters = { [Key in keyof MessageElement as Key extends `${string}Element` ? Key : never]: ( @@ -1265,36 +1263,42 @@ export class OneBotMsgApi { ); } else if (SysMessage.contentHead.type == 528 && SysMessage.contentHead.subType == 39 && SysMessage.body?.msgContent) { return await this.obContext.apis.UserApi.parseLikeEvent(SysMessage.body?.msgContent); - } else if (SysMessage.contentHead.type == 732 && SysMessage.contentHead.subType == 16 && SysMessage.body?.msgContent) { - let data_wrap = PBString(2); - let user_wrap = PBUint64(5); - let group_wrap = PBUint64(4); + } + // else if (SysMessage.contentHead.type == 732 && SysMessage.contentHead.subType == 16 && SysMessage.body?.msgContent) { + // let data_wrap = PBString(2); + // let user_wrap = PBUint64(5); + // let group_wrap = PBUint64(4); - ProtoBuf(class extends ProtoBufBase { - group = group_wrap; - content = ProtoBufIn(5, { data: data_wrap, user: user_wrap }); - }).decode(SysMessage.body?.msgContent.slice(7)); - let xml_data = UnWrap(data_wrap); - let group = UnWrap(group_wrap).toString(); - //let user = UnWrap(user_wrap).toString(); - const parsedParts = this.parseTextWithJson(xml_data); - //解析JSON - if (parsedParts[1] && parsedParts[3]) { - let set_user_id: string = (parsedParts[1].content as { data: string }).data; - let uid = await this.core.apis.UserApi.getUidByUinV2(set_user_id); - await this.core.apis.GroupApi.refreshGroupMemberCachePartial(group, uid); - //let json_data_1_url_search = new URL((parsedParts[3].content as { url: string }).url).searchParams; - //let is_new: boolean = json_data_1_url_search.get('isnew') === '1'; - let new_tittle: string = (parsedParts[3].content as { text: string }).text; - //console.log(group, set_user_id, is_new, new_tittle); - return new GroupMemberTitle( - this.core, - +group, - +set_user_id, - new_tittle - ); - } - } + // ProtoBuf(class extends ProtoBufBase { + // group = group_wrap; + // content = ProtoBufIn(5, { data: data_wrap, user: user_wrap }); + // }).decode(SysMessage.body?.msgContent.slice(7)); + // let xml_data = UnWrap(data_wrap); + // let group = UnWrap(group_wrap).toString(); + // //let user = UnWrap(user_wrap).toString(); + // const parsedParts = this.parseTextWithJson(xml_data); + // //解析JSON + // if (parsedParts[1] && parsedParts[3]) { + // let set_user_id: string = (parsedParts[1].content as { data: string }).data; + // let uid = await this.core.apis.UserApi.getUidByUinV2(set_user_id); + // let new_tittle: string = (parsedParts[3].content as { text: string }).text; + // console.log(this.core.apis.GroupApi.groupMemberCache.get(group)?.get(uid)?.memberSpecialTitle, new_tittle) + // if (this.core.apis.GroupApi.groupMemberCache.get(group)?.get(uid)?.memberSpecialTitle == new_tittle) { + // return; + // } + // await this.core.apis.GroupApi.refreshGroupMemberCachePartial(group, uid); + // //let json_data_1_url_search = new URL((parsedParts[3].content as { url: string }).url).searchParams; + // //let is_new: boolean = json_data_1_url_search.get('isnew') === '1'; + + // //console.log(group, set_user_id, is_new, new_tittle); + // return new GroupMemberTitle( + // this.core, + // +group, + // +set_user_id, + // new_tittle + // ); + // } + // } return undefined; } } diff --git a/src/onebot/event/notice/GroupMemberTitle.ts b/src/onebot/event/notice/GroupMemberTitle.ts deleted file mode 100644 index 79235ad5..00000000 --- a/src/onebot/event/notice/GroupMemberTitle.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { OB11GroupNoticeEvent } from './OB11GroupNoticeEvent'; -import { NapCatCore } from '@/core'; - - -export class GroupMemberTitle extends OB11GroupNoticeEvent { - notice_type = 'title'; - sub_type: 'set' | 'unset' = 'set'; - title: string = ''; - - constructor(core: NapCatCore, groupId: number, userId: number, title: string) { - super(core, groupId, userId); - this.group_id = groupId; - this.user_id = userId; - this.title = title; - } -} From 4fb8e6a4da74c01fcb17e058b4f1f71982a4eb46 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: Thu, 3 Apr 2025 14:44:59 +0800 Subject: [PATCH 024/149] fix: typo --- src/core/packet/context/operationContext.ts | 4 ++-- src/core/packet/transformer/action/SetSpecialTitle.ts | 6 +++--- .../{SetSpecialTittle.ts => SetSpecialTitle.ts} | 4 ++-- src/onebot/action/index.ts | 4 ++-- src/onebot/action/router.ts | 2 +- src/onebot/api/msg.ts | 10 +++++----- 6 files changed, 15 insertions(+), 15 deletions(-) rename src/onebot/action/extends/{SetSpecialTittle.ts => SetSpecialTitle.ts} (85%) diff --git a/src/core/packet/context/operationContext.ts b/src/core/packet/context/operationContext.ts index d69955c6..4b11a155 100644 --- a/src/core/packet/context/operationContext.ts +++ b/src/core/packet/context/operationContext.ts @@ -68,8 +68,8 @@ export class PacketOperationContext { } } - async SetGroupSpecialTitle(groupUin: number, uid: string, tittle: string) { - const req = trans.SetSpecialTitle.build(groupUin, uid, tittle); + async SetGroupSpecialTitle(groupUin: number, uid: string, title: string) { + const req = trans.SetSpecialTitle.build(groupUin, uid, title); await this.context.client.sendOidbPacket(req); } diff --git a/src/core/packet/transformer/action/SetSpecialTitle.ts b/src/core/packet/transformer/action/SetSpecialTitle.ts index 9edeb008..3d75fb36 100644 --- a/src/core/packet/transformer/action/SetSpecialTitle.ts +++ b/src/core/packet/transformer/action/SetSpecialTitle.ts @@ -8,14 +8,14 @@ class SetSpecialTitle extends PacketTransformer super(); } - build(groupCode: number, uid: string, tittle: string): OidbPacket { + build(groupCode: number, uid: string, title: string): OidbPacket { const oidb_0x8FC_2 = new NapProtoMsg(proto.OidbSvcTrpcTcp0X8FC_2).encode({ groupUin: +groupCode, body: { targetUid: uid, - specialTitle: tittle, + specialTitle: title, expiredTime: -1, - uinName: tittle + uinName: title } }); return OidbBase.build(0x8FC, 2, oidb_0x8FC_2, false, false); diff --git a/src/onebot/action/extends/SetSpecialTittle.ts b/src/onebot/action/extends/SetSpecialTitle.ts similarity index 85% rename from src/onebot/action/extends/SetSpecialTittle.ts rename to src/onebot/action/extends/SetSpecialTitle.ts index e344180b..7d68ff36 100644 --- a/src/onebot/action/extends/SetSpecialTittle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -10,8 +10,8 @@ const SchemaData = Type.Object({ type Payload = Static; -export class SetSpecialTittle extends GetPacketStatusDepends { - override actionName = ActionName.SetSpecialTittle; +export class SetSpecialTitle extends GetPacketStatusDepends { + override actionName = ActionName.SetSpecialTitle; override payloadSchema = SchemaData; async _handle(payload: Payload) { diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index fd2f74f9..f053d5a2 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -81,7 +81,7 @@ import { GetGroupSystemMsg } from './system/GetSystemMsg'; import { GroupPoke } from './group/GroupPoke'; import { GetUserStatus } from './extends/GetUserStatus'; import { GetRkey } from './extends/GetRkey'; -import { SetSpecialTittle } from './extends/SetSpecialTittle'; +import { SetSpecialTitle } from './extends/SetSpecialTitle'; import { GetGroupShutList } from './group/GetGroupShutList'; import { GetGroupMemberList } from './group/GetGroupMemberList'; import { GetGroupFileUrl } from '@/onebot/action/file/GetGroupFileUrl'; @@ -215,7 +215,7 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new FriendPoke(obContext, core), new GetUserStatus(obContext, core), new GetRkey(obContext, core), - new SetSpecialTittle(obContext, core), + new SetSpecialTitle(obContext, core), new SetDiyOnlineStatus(obContext, core), // new UploadForwardMsg(obContext, core), new GetGroupShutList(obContext, core), diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index 51b3892e..dc580600 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -31,7 +31,7 @@ export const ActionName = { SetGroupCard: 'set_group_card', SetGroupName: 'set_group_name', SetGroupLeave: 'set_group_leave', - SetSpecialTittle: 'set_group_special_title', + SetSpecialTitle: 'set_group_special_title', SetFriendAddRequest: 'set_friend_add_request', SetGroupAddRequest: 'set_group_add_request', GetLoginInfo: 'get_login_info', diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index c8b5035e..70095c41 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -1281,21 +1281,21 @@ export class OneBotMsgApi { // if (parsedParts[1] && parsedParts[3]) { // let set_user_id: string = (parsedParts[1].content as { data: string }).data; // let uid = await this.core.apis.UserApi.getUidByUinV2(set_user_id); - // let new_tittle: string = (parsedParts[3].content as { text: string }).text; - // console.log(this.core.apis.GroupApi.groupMemberCache.get(group)?.get(uid)?.memberSpecialTitle, new_tittle) - // if (this.core.apis.GroupApi.groupMemberCache.get(group)?.get(uid)?.memberSpecialTitle == new_tittle) { + // let new_title: string = (parsedParts[3].content as { text: string }).text; + // console.log(this.core.apis.GroupApi.groupMemberCache.get(group)?.get(uid)?.memberSpecialTitle, new_title) + // if (this.core.apis.GroupApi.groupMemberCache.get(group)?.get(uid)?.memberSpecialTitle == new_title) { // return; // } // await this.core.apis.GroupApi.refreshGroupMemberCachePartial(group, uid); // //let json_data_1_url_search = new URL((parsedParts[3].content as { url: string }).url).searchParams; // //let is_new: boolean = json_data_1_url_search.get('isnew') === '1'; - // //console.log(group, set_user_id, is_new, new_tittle); + // //console.log(group, set_user_id, is_new, new_title); // return new GroupMemberTitle( // this.core, // +group, // +set_user_id, - // new_tittle + // new_title // ); // } // } From 2807ff59277570c842760a20feac6a36e33bc781 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: Thu, 3 Apr 2025 14:46:56 +0800 Subject: [PATCH 025/149] =?UTF-8?q?fix:=20=E5=88=B7=E6=96=B0=E7=BE=A4?= =?UTF-8?q?=E5=A4=B4=E8=A1=94=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/api/group.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/onebot/api/group.ts b/src/onebot/api/group.ts index 6f2f4314..19d2b58c 100644 --- a/src/onebot/api/group.ts +++ b/src/onebot/api/group.ts @@ -151,14 +151,15 @@ export class OneBotGroupApi { async parseOtherJsonEvent(msg: RawMessage, jsonStr: string, context: InstanceContext) { const json = JSON.parse(jsonStr); const type = json.items[json.items.length - 1]?.txt; + await this.core.apis.GroupApi.refreshGroupMemberCachePartial(msg.peerUid, msg.senderUid); if (type === '头衔') { const memberUin = json.items[1].param[0]; const title = json.items[3].txt; context.logger.logDebug('收到群成员新头衔消息', json); return new OB11GroupTitleEvent( this.core, - parseInt(msg.peerUid), - parseInt(memberUin), + +msg.peerUid, + +memberUin, title, ); } else if (type === '移出') { From f602bbb0cf4aac65305597d11e405a7965c0b735 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: Thu, 3 Apr 2025 14:52:33 +0800 Subject: [PATCH 026/149] =?UTF-8?q?fix:=20=E5=90=AF=E7=94=A8=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=BC=BA=E5=88=B6=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/action/OneBotAction.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebot/action/OneBotAction.ts b/src/onebot/action/OneBotAction.ts index e4ec6ebf..909040cb 100644 --- a/src/onebot/action/OneBotAction.ts +++ b/src/onebot/action/OneBotAction.ts @@ -43,7 +43,7 @@ export abstract class OneBotAction { protected async check(payload: PayloadType): Promise { if (this.payloadSchema) { - this.validate = new Ajv({ allowUnionTypes: true, useDefaults: true }).compile(this.payloadSchema); + this.validate = new Ajv({ allowUnionTypes: true, useDefaults: true, coerceTypes: true }).compile(this.payloadSchema); } if (this.validate && !this.validate(payload)) { const errors = this.validate.errors as ErrorObject[]; From a44104d8f75327c8cccc7bf892a2a1b9bfbbb6b5 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: Thu, 3 Apr 2025 15:03:00 +0800 Subject: [PATCH 027/149] Update OneBotAction.ts --- src/onebot/action/OneBotAction.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/onebot/action/OneBotAction.ts b/src/onebot/action/OneBotAction.ts index 909040cb..628c4cf0 100644 --- a/src/onebot/action/OneBotAction.ts +++ b/src/onebot/action/OneBotAction.ts @@ -4,6 +4,7 @@ import { NapCatCore } from '@/core'; import { NapCatOneBot11Adapter, OB11Return } from '@/onebot'; import { NetworkAdapterConfig } from '../config/config'; +import { TSchema } from '@sinclair/typebox'; export class OB11Response { private static createResponse(data: T, status: string, retcode: number, message: string = '', echo: unknown = null): OB11Return { return { @@ -33,7 +34,7 @@ export abstract class OneBotAction { actionName: typeof ActionName[keyof typeof ActionName] = ActionName.Unknown; core: NapCatCore; private validate?: ValidateFunction = undefined; - payloadSchema?: unknown = undefined; + payloadSchema?: TSchema = undefined; obContext: NapCatOneBot11Adapter; constructor(obContext: NapCatOneBot11Adapter, core: NapCatCore) { From 863a953ae1c22ef578cd046134e034768131afca 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: Thu, 3 Apr 2025 15:06:34 +0800 Subject: [PATCH 028/149] style: lint --- src/onebot/action/OneBotAction.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebot/action/OneBotAction.ts b/src/onebot/action/OneBotAction.ts index 628c4cf0..818169e2 100644 --- a/src/onebot/action/OneBotAction.ts +++ b/src/onebot/action/OneBotAction.ts @@ -3,8 +3,8 @@ import Ajv, { ErrorObject, ValidateFunction } from 'ajv'; import { NapCatCore } from '@/core'; import { NapCatOneBot11Adapter, OB11Return } from '@/onebot'; import { NetworkAdapterConfig } from '../config/config'; - import { TSchema } from '@sinclair/typebox'; + export class OB11Response { private static createResponse(data: T, status: string, retcode: number, message: string = '', echo: unknown = null): OB11Return { return { From 3cf502fea3c08ea186714f818341564892f3692b Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Fri, 4 Apr 2025 01:59:31 +0800 Subject: [PATCH 029/149] chore: improve log output for protocol fetch with multiple messages --- src/onebot/api/msg.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 70095c41..86e943eb 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -373,7 +373,8 @@ export class OneBotMsgApi { try { multiMsgs = await this.core.apis.PacketApi.pkt.operation.FetchForwardMsg(element.resId); } catch (e) { - this.core.context.logger.logError('Protocol FetchForwardMsg fallback failed!', e); + this.core.context.logger.logError(`Protocol FetchForwardMsg fallback failed! + element = ${JSON.stringify(element)} , error=${e})`); return null; } } @@ -1263,7 +1264,7 @@ export class OneBotMsgApi { ); } else if (SysMessage.contentHead.type == 528 && SysMessage.contentHead.subType == 39 && SysMessage.body?.msgContent) { return await this.obContext.apis.UserApi.parseLikeEvent(SysMessage.body?.msgContent); - } + } // else if (SysMessage.contentHead.type == 732 && SysMessage.contentHead.subType == 16 && SysMessage.body?.msgContent) { // let data_wrap = PBString(2); // let user_wrap = PBUint64(5); From b32efa91311cf0de4feaa2a3db62068a703d6baa 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: Sat, 5 Apr 2025 11:45:21 +0800 Subject: [PATCH 030/149] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/helper/rkey.ts | 80 +++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/src/core/helper/rkey.ts b/src/core/helper/rkey.ts index ecc3634d..5425279c 100644 --- a/src/core/helper/rkey.ts +++ b/src/core/helper/rkey.ts @@ -7,6 +7,11 @@ interface ServerRkeyData { expired_time: number; } +interface UrlFailureInfo { + count: number; + lastTimestamp: number; +} + export class RkeyManager { serverUrl: string[] = []; logger: LogWrapper; @@ -15,8 +20,7 @@ export class RkeyManager { private_rkey: '', expired_time: 0, }; - private failureCount: number = 0; - private lastFailureTimestamp: number = 0; + private urlFailures: Map = new Map(); private readonly FAILURE_LIMIT: number = 8; private readonly ONE_DAY: number = 24 * 60 * 60 * 1000; @@ -26,34 +30,74 @@ export class RkeyManager { } async getRkey() { - const now = new Date().getTime(); - if (now - this.lastFailureTimestamp > this.ONE_DAY) { - this.failureCount = 0; // 重置失败计数器 - } - - if (this.failureCount >= this.FAILURE_LIMIT) { - this.logger.logError('[Rkey] 服务存在异常, 图片使用FallBack机制'); - throw new Error('获取rkey失败次数过多,请稍后再试'); + const availableUrls = this.getAvailableUrls(); + if (availableUrls.length === 0) { + this.logger.logError('[Rkey] 所有服务均已禁用, 图片使用FallBack机制'); + throw new Error('获取rkey失败:所有服务URL均已被禁用'); } if (this.isExpired()) { try { await this.refreshRkey(); } catch (e) { - throw new Error(`${e}`);//外抛 + throw new Error(`${e}`); } } return this.rkeyData; } + private getAvailableUrls(): string[] { + return this.serverUrl.filter(url => !this.isUrlDisabled(url)); + } + + private isUrlDisabled(url: string): boolean { + const failureInfo = this.urlFailures.get(url); + if (!failureInfo) return false; + + const now = new Date().getTime(); + // 如果已经过了一天,重置失败计数 + if (now - failureInfo.lastTimestamp > this.ONE_DAY) { + failureInfo.count = 0; + this.urlFailures.set(url, failureInfo); + return false; + } + + return failureInfo.count >= this.FAILURE_LIMIT; + } + + private updateUrlFailure(url: string) { + const now = new Date().getTime(); + const failureInfo = this.urlFailures.get(url) || { count: 0, lastTimestamp: 0 }; + + // 如果已经过了一天,重置失败计数 + if (now - failureInfo.lastTimestamp > this.ONE_DAY) { + failureInfo.count = 1; + } else { + failureInfo.count++; + } + + failureInfo.lastTimestamp = now; + this.urlFailures.set(url, failureInfo); + + if (failureInfo.count >= this.FAILURE_LIMIT) { + this.logger.logError(`[Rkey] URL ${url} 已被禁用,失败次数达到 ${this.FAILURE_LIMIT} 次`); + } + } + isExpired(): boolean { const now = new Date().getTime() / 1000; return now > this.rkeyData.expired_time; } async refreshRkey() { - //刷新rkey - for (const url of this.serverUrl) { + const availableUrls = this.getAvailableUrls(); + + if (availableUrls.length === 0) { + this.logger.logError('[Rkey] 所有服务均已禁用'); + throw new Error('获取rkey失败:所有服务URL均已被禁用'); + } + + for (const url of availableUrls) { try { const temp = await RequestUtil.HttpGetJson(url, 'GET'); this.rkeyData = { @@ -61,15 +105,13 @@ export class RkeyManager { private_rkey: temp.private_rkey.slice(6), expired_time: temp.expired_time }; - this.failureCount = 0; return; } catch (e) { this.logger.logError(`[Rkey] 异常服务 ${url} 异常 / `, e); - this.failureCount++; - this.lastFailureTimestamp = new Date().getTime(); - //是否为最后一个url - if (url === this.serverUrl[this.serverUrl.length - 1]) { - throw new Error(`获取rkey失败: ${e}`);//外抛 + this.updateUrlFailure(url); + + if (url === availableUrls[availableUrls.length - 1]) { + throw new Error(`获取rkey失败: ${e}`); } } } From 9f72196414220293a34c214adc8ab7c9cee0a1e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 09:33:04 +0000 Subject: [PATCH 031/149] chore(deps-dev): bump vite-plugin-cp from 4.0.8 to 6.0.0 Bumps [vite-plugin-cp](https://github.com/fengxinming/vite-plugins/tree/HEAD/packages/vite-plugin-cp) from 4.0.8 to 6.0.0. - [Commits](https://github.com/fengxinming/vite-plugins/commits/HEAD/packages/vite-plugin-cp) --- updated-dependencies: - dependency-name: vite-plugin-cp dependency-version: 6.0.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f3351ef5..ba5bfe53 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "typescript": "^5.3.3", "typescript-eslint": "^8.13.0", "vite": "^6.0.1", - "vite-plugin-cp": "^4.0.8", + "vite-plugin-cp": "^6.0.0", "vite-tsconfig-paths": "^5.1.0", "napcat.protobuf": "^1.1.4", "winston": "^3.17.0", From 68f5deedff6cbbc0f02439542c1a38f5a469d6b4 Mon Sep 17 00:00:00 2001 From: Clansty Date: Tue, 8 Apr 2025 02:48:48 +0800 Subject: [PATCH 032/149] =?UTF-8?q?feat:=20=E7=A7=BB=E5=8A=A8=E7=BE=A4?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/packet/context/operationContext.ts | 7 ++++ .../transformer/action/MoveGroupFile.ts | 35 +++++++++++++++++++ src/core/packet/transformer/action/index.ts | 1 + src/onebot/action/extends/MoveGroupFile.ts | 32 +++++++++++++++++ src/onebot/action/index.ts | 2 ++ src/onebot/action/router.ts | 1 + 6 files changed, 78 insertions(+) create mode 100644 src/core/packet/transformer/action/MoveGroupFile.ts create mode 100644 src/onebot/action/extends/MoveGroupFile.ts diff --git a/src/core/packet/context/operationContext.ts b/src/core/packet/context/operationContext.ts index 4b11a155..9e32daaa 100644 --- a/src/core/packet/context/operationContext.ts +++ b/src/core/packet/context/operationContext.ts @@ -154,6 +154,13 @@ export class PacketOperationContext { return res.result.resId; } + async MoveGroupFile(groupUin: number, fileUUID: string, currentParentDirectory: string, targetParentDirectory: string) { + const req = trans.MoveGroupFile.build(groupUin, fileUUID, currentParentDirectory, targetParentDirectory); + const resp = await this.context.client.sendOidbPacket(req, true); + const res = trans.MoveGroupFile.parse(resp); + return res.move.retCode; + } + async GetGroupFileUrl(groupUin: number, fileUUID: string) { const req = trans.DownloadGroupFile.build(groupUin, fileUUID); const resp = await this.context.client.sendOidbPacket(req, true); diff --git a/src/core/packet/transformer/action/MoveGroupFile.ts b/src/core/packet/transformer/action/MoveGroupFile.ts new file mode 100644 index 00000000..47e1ec47 --- /dev/null +++ b/src/core/packet/transformer/action/MoveGroupFile.ts @@ -0,0 +1,35 @@ +import * as proto from '@/core/packet/transformer/proto'; +import { NapProtoMsg } from '@napneko/nap-proto-core'; +import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base'; +import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; + +class MoveGroupFile extends PacketTransformer { + constructor() { + super(); + } + + build(groupUin: number, fileUUID: string, currentParentDirectory: string, targetParentDirectory: string): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ + move: { + groupUin: groupUin, + appId: 5, + busId: 102, + fileId: fileUUID, + parentDirectory: currentParentDirectory, + targetDirectory: targetParentDirectory, + } + }); + return OidbBase.build(0x6D6, 5, body, true, false); + } + + parse(data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); + if (res.move.retCode !== 0) { + throw new Error(`sendGroupFileMoveReq error: ${res.move.clientWording} (code=${res.move.retCode})`); + } + return res; + } +} + +export default new MoveGroupFile(); diff --git a/src/core/packet/transformer/action/index.ts b/src/core/packet/transformer/action/index.ts index 7f0987d6..317b7167 100644 --- a/src/core/packet/transformer/action/index.ts +++ b/src/core/packet/transformer/action/index.ts @@ -6,3 +6,4 @@ export { default as GetStrangerInfo } from './GetStrangerInfo'; export { default as SendPoke } from './SendPoke'; export { default as SetSpecialTitle } from './SetSpecialTitle'; export { default as ImageOCR } from './ImageOCR'; +export { default as MoveGroupFile } from './MoveGroupFile'; diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts new file mode 100644 index 00000000..af71b339 --- /dev/null +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -0,0 +1,32 @@ +import { ActionName } from '@/onebot/action/router'; +import { FileNapCatOneBotUUID } from '@/common/file-uuid'; +import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; +import { Static, Type } from '@sinclair/typebox'; + +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + file_id: Type.String(), + current_parent_directory: Type.String(), + target_parent_directory: Type.String(), +}); + +type Payload = Static; + +interface MoveGroupFileResponse { + retcode: number; +} + +export class MoveGroupFile extends GetPacketStatusDepends { + override actionName = ActionName.GOCQHTTP_MoveGroupFile; + override payloadSchema = SchemaData; + + async _handle(payload: Payload) { + const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file_id) || FileNapCatOneBotUUID.decodeModelId(payload.file_id); + if (contextMsgFile?.fileUUID) { + return { + retcode: await this.core.apis.PacketApi.pkt.operation.MoveGroupFile(+payload.group_id, contextMsgFile.fileUUID, payload.current_parent_directory, payload.target_parent_directory) + }; + } + throw new Error('real fileUUID not found!'); + } +} diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index f053d5a2..67fce31d 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -109,6 +109,7 @@ import { ClickInlineKeyboardButton } from './extends/ClickInlineKeyboardButton'; import { GetPrivateFileUrl } from './file/GetPrivateFileUrl'; import { GetUnidirectionalFriendList } from './extends/GetUnidirectionalFriendList'; import SetGroupRemark from './extends/SetGroupRemark'; +import { MoveGroupFile } from './extends/MoveGroupFile'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -132,6 +133,7 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new SetGroupSign(obContext, core), new SendGroupSign(obContext, core), new GetClientkey(obContext, core), + new MoveGroupFile(obContext, core), // onebot11 new SendLike(obContext, core), new GetMsg(obContext, core), diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index dc580600..88329e75 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -85,6 +85,7 @@ export const ActionName = { GoCQHTTP_GetGroupRootFiles: 'get_group_root_files', GoCQHTTP_GetGroupFilesByFolder: 'get_group_files_by_folder', GOCQHTTP_GetGroupFileUrl: 'get_group_file_url', + GOCQHTTP_MoveGroupFile: 'move_group_file', GOCQHTTP_UploadPrivateFile: 'upload_private_file', // GOCQHTTP_ReloadEventFilter : 'reload_event_filter', GoCQHTTP_DownloadFile: 'download_file', From 4180c2d754952d115dba121b4fe3124e5d8cde56 Mon Sep 17 00:00:00 2001 From: Clansty Date: Tue, 8 Apr 2025 04:40:34 +0800 Subject: [PATCH 033/149] =?UTF-8?q?feat:=20=E7=BE=A4=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=BD=AC=E5=AD=98=E6=B0=B8=E4=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/group.ts | 4 +++ .../services/NodeIKernelRichMediaService.ts | 12 ++++++- src/onebot/action/extends/MoveGroupFile.ts | 2 +- src/onebot/action/extends/TransGroupFile.ts | 34 +++++++++++++++++++ src/onebot/action/index.ts | 2 ++ src/onebot/action/router.ts | 4 ++- 6 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/onebot/action/extends/TransGroupFile.ts diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 80555d98..423e1e2d 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -218,6 +218,10 @@ export class NTQQGroupApi { return this.context.session.getRichMediaService().deleteGroupFolder(groupCode, folderId); } + async transGroupFile(groupCode: string, fileId: string) { + return this.context.session.getRichMediaService().transGroupFile(groupCode, fileId); + } + async addGroupEssence(groupCode: string, msgId: string) { const MsgData = await this.context.session.getMsgService().getMsgsIncludeSelf({ chatType: 2, diff --git a/src/core/services/NodeIKernelRichMediaService.ts b/src/core/services/NodeIKernelRichMediaService.ts index 83ebeaf8..684ea9ab 100644 --- a/src/core/services/NodeIKernelRichMediaService.ts +++ b/src/core/services/NodeIKernelRichMediaService.ts @@ -200,7 +200,17 @@ export interface NodeIKernelRichMediaService { moveGroupFile(arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown, arg5: unknown): unknown; - transGroupFile(arg1: unknown, arg2: unknown): unknown; + transGroupFile(groupCode: string, fileId: string): Promise; searchGroupFile( keywords: Array, diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index af71b339..8de368d0 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -17,7 +17,7 @@ interface MoveGroupFileResponse { } export class MoveGroupFile extends GetPacketStatusDepends { - override actionName = ActionName.GOCQHTTP_MoveGroupFile; + override actionName = ActionName.MoveGroupFile; override payloadSchema = SchemaData; async _handle(payload: Payload) { diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts new file mode 100644 index 00000000..35b3275a --- /dev/null +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -0,0 +1,34 @@ +import { ActionName } from '@/onebot/action/router'; +import { FileNapCatOneBotUUID } from '@/common/file-uuid'; +import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; +import { Static, Type } from '@sinclair/typebox'; + +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + file_id: Type.String(), +}); + +type Payload = Static; + +interface TransGroupFileResponse { + ok: boolean; +} + +export class TransGroupFile extends GetPacketStatusDepends { + override actionName = ActionName.TransGroupFile; + override payloadSchema = SchemaData; + + async _handle(payload: Payload) { + const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file_id) || FileNapCatOneBotUUID.decodeModelId(payload.file_id); + if (contextMsgFile?.fileUUID) { + const result = await this.core.apis.GroupApi.transGroupFile(payload.group_id.toString(), contextMsgFile.fileUUID); + if (result.transGroupFileResult.result.retCode === 0) { + return { + ok: true + }; + } + throw new Error(result.transGroupFileResult.result.retMsg); + } + throw new Error('real fileUUID not found!'); + } +} diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index 67fce31d..b5e1e09d 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -110,6 +110,7 @@ import { GetPrivateFileUrl } from './file/GetPrivateFileUrl'; import { GetUnidirectionalFriendList } from './extends/GetUnidirectionalFriendList'; import SetGroupRemark from './extends/SetGroupRemark'; import { MoveGroupFile } from './extends/MoveGroupFile'; +import { TransGroupFile } from './extends/TransGroupFile'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -134,6 +135,7 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new SendGroupSign(obContext, core), new GetClientkey(obContext, core), new MoveGroupFile(obContext, core), + new TransGroupFile(obContext, core), // onebot11 new SendLike(obContext, core), new GetMsg(obContext, core), diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index 88329e75..200fe84e 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -85,7 +85,6 @@ export const ActionName = { GoCQHTTP_GetGroupRootFiles: 'get_group_root_files', GoCQHTTP_GetGroupFilesByFolder: 'get_group_files_by_folder', GOCQHTTP_GetGroupFileUrl: 'get_group_file_url', - GOCQHTTP_MoveGroupFile: 'move_group_file', GOCQHTTP_UploadPrivateFile: 'upload_private_file', // GOCQHTTP_ReloadEventFilter : 'reload_event_filter', GoCQHTTP_DownloadFile: 'download_file', @@ -131,6 +130,9 @@ export const ActionName = { GetRkey: 'nc_get_rkey', GetGroupShutList: 'get_group_shut_list', + MoveGroupFile: 'move_group_file', + TransGroupFile: 'trans_group_file', + GetGuildList: 'get_guild_list', GetGuildProfile: 'get_guild_service_profile', From 31eb09edeff81efe226fc17d9cc823783e91e6ea Mon Sep 17 00:00:00 2001 From: Clansty Date: Tue, 8 Apr 2025 05:14:53 +0800 Subject: [PATCH 034/149] =?UTF-8?q?feat:=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E7=BE=A4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/packet/context/operationContext.ts | 7 ++++ .../transformer/action/RenameGroupFile.ts | 34 +++++++++++++++++++ src/core/packet/transformer/action/index.ts | 1 + src/onebot/action/extends/MoveGroupFile.ts | 5 +-- src/onebot/action/extends/RenameGroupFile.ts | 33 ++++++++++++++++++ src/onebot/action/index.ts | 2 ++ src/onebot/action/router.ts | 1 + 7 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 src/core/packet/transformer/action/RenameGroupFile.ts create mode 100644 src/onebot/action/extends/RenameGroupFile.ts diff --git a/src/core/packet/context/operationContext.ts b/src/core/packet/context/operationContext.ts index 9e32daaa..0e558058 100644 --- a/src/core/packet/context/operationContext.ts +++ b/src/core/packet/context/operationContext.ts @@ -161,6 +161,13 @@ export class PacketOperationContext { return res.move.retCode; } + async RenameGroupFile(groupUin: number, fileUUID: string, currentParentDirectory: string, newName: string) { + const req = trans.RenameGroupFile.build(groupUin, fileUUID, currentParentDirectory, newName); + const resp = await this.context.client.sendOidbPacket(req, true); + const res = trans.RenameGroupFile.parse(resp); + return res.rename.retCode; + } + async GetGroupFileUrl(groupUin: number, fileUUID: string) { const req = trans.DownloadGroupFile.build(groupUin, fileUUID); const resp = await this.context.client.sendOidbPacket(req, true); diff --git a/src/core/packet/transformer/action/RenameGroupFile.ts b/src/core/packet/transformer/action/RenameGroupFile.ts new file mode 100644 index 00000000..2cbaeacd --- /dev/null +++ b/src/core/packet/transformer/action/RenameGroupFile.ts @@ -0,0 +1,34 @@ +import * as proto from '@/core/packet/transformer/proto'; +import { NapProtoMsg } from '@napneko/nap-proto-core'; +import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base'; +import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; + +class RenameGroupFile extends PacketTransformer { + constructor() { + super(); + } + + build(groupUin: number, fileUUID: string, currentParentDirectory: string, newName: string): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ + rename: { + groupUin: groupUin, + busId: 102, + fileId: fileUUID, + parentFolder: currentParentDirectory, + newFileName: newName, + } + }); + return OidbBase.build(0x6D6, 4, body, true, false); + } + + parse(data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); + if (res.rename.retCode !== 0) { + throw new Error(`sendGroupFileRenameReq error: ${res.rename.clientWording} (code=${res.rename.retCode})`); + } + return res; + } +} + +export default new RenameGroupFile(); diff --git a/src/core/packet/transformer/action/index.ts b/src/core/packet/transformer/action/index.ts index 317b7167..03af3f35 100644 --- a/src/core/packet/transformer/action/index.ts +++ b/src/core/packet/transformer/action/index.ts @@ -7,3 +7,4 @@ export { default as SendPoke } from './SendPoke'; export { default as SetSpecialTitle } from './SetSpecialTitle'; export { default as ImageOCR } from './ImageOCR'; export { default as MoveGroupFile } from './MoveGroupFile'; +export { default as RenameGroupFile } from './RenameGroupFile'; diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index 8de368d0..110551bc 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -13,7 +13,7 @@ const SchemaData = Type.Object({ type Payload = Static; interface MoveGroupFileResponse { - retcode: number; + ok: boolean; } export class MoveGroupFile extends GetPacketStatusDepends { @@ -23,8 +23,9 @@ export class MoveGroupFile extends GetPacketStatusDepends; + +interface RenameGroupFileResponse { + ok: boolean; +} + +export class RenameGroupFile extends GetPacketStatusDepends { + override actionName = ActionName.RenameGroupFile; + override payloadSchema = SchemaData; + + async _handle(payload: Payload) { + const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file_id) || FileNapCatOneBotUUID.decodeModelId(payload.file_id); + if (contextMsgFile?.fileUUID) { + await this.core.apis.PacketApi.pkt.operation.RenameGroupFile(+payload.group_id, contextMsgFile.fileUUID, payload.current_parent_directory, payload.new_name); + return { + ok: true, + }; + } + throw new Error('real fileUUID not found!'); + } +} diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index b5e1e09d..86f4f08a 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -111,6 +111,7 @@ import { GetUnidirectionalFriendList } from './extends/GetUnidirectionalFriendLi import SetGroupRemark from './extends/SetGroupRemark'; import { MoveGroupFile } from './extends/MoveGroupFile'; import { TransGroupFile } from './extends/TransGroupFile'; +import { RenameGroupFile } from './extends/RenameGroupFile'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -135,6 +136,7 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new SendGroupSign(obContext, core), new GetClientkey(obContext, core), new MoveGroupFile(obContext, core), + new RenameGroupFile(obContext, core), new TransGroupFile(obContext, core), // onebot11 new SendLike(obContext, core), diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index 200fe84e..2c41ffb3 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -132,6 +132,7 @@ export const ActionName = { MoveGroupFile: 'move_group_file', TransGroupFile: 'trans_group_file', + RenameGroupFile: 'rename_group_file', GetGuildList: 'get_guild_list', GetGuildProfile: 'get_guild_service_profile', From bd8bbf76ab86c2321a2d60841a0e57b7685b8620 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: Tue, 8 Apr 2025 09:42:28 +0800 Subject: [PATCH 035/149] feat: moveGroupFile --- src/core/services/NodeIKernelRichMediaService.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/core/services/NodeIKernelRichMediaService.ts b/src/core/services/NodeIKernelRichMediaService.ts index 684ea9ab..85c267f3 100644 --- a/src/core/services/NodeIKernelRichMediaService.ts +++ b/src/core/services/NodeIKernelRichMediaService.ts @@ -198,14 +198,24 @@ export interface NodeIKernelRichMediaService { renameGroupFile(arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown, arg5: unknown): unknown; - moveGroupFile(arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown, arg5: unknown): unknown; + moveGroupFile(groupCode: string, busId: Array, fileList: Array, currentParentDirectory: string, targetParentDirectory: string): Promise, + failFileIdList: Array + } + }>; transGroupFile(groupCode: string, fileId: string): Promise Date: Tue, 8 Apr 2025 10:12:18 +0800 Subject: [PATCH 036/149] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=20fetchUserDetailInfo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/msg.ts | 2 +- src/core/services/NodeIKernelProfileService.ts | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/core/apis/msg.ts b/src/core/apis/msg.ts index 51b67951..5dd4d969 100644 --- a/src/core/apis/msg.ts +++ b/src/core/apis/msg.ts @@ -12,7 +12,7 @@ export class NTQQMsgApi { this.context = context; this.core = core; } - + async clickInlineKeyboardButton(...params: Parameters) { return this.context.session.getMsgService().clickInlineKeyboardButton(...params); } diff --git a/src/core/services/NodeIKernelProfileService.ts b/src/core/services/NodeIKernelProfileService.ts index 3a017050..8b07773a 100644 --- a/src/core/services/NodeIKernelProfileService.ts +++ b/src/core/services/NodeIKernelProfileService.ts @@ -1,5 +1,5 @@ import { AnyCnameRecord } from 'node:dns'; -import { BizKey, ModifyProfileParams, NodeIKernelProfileListener, ProfileBizType, SimpleInfo, UserDetailInfoByUin, UserDetailSource } from '@/core'; +import { BizKey, ModifyProfileParams, NodeIKernelProfileListener, ProfileBizType, SimpleInfo, UserDetailInfoByUin, UserDetailInfoListenerArg, UserDetailSource } from '@/core'; import { GeneralCallResult } from '@/core/services/common'; export interface NodeIKernelProfileService { @@ -15,7 +15,13 @@ export interface NodeIKernelProfileService { getCoreAndBaseInfo(callfrom: string, uids: string[]): Promise>; - fetchUserDetailInfo(trace: string, uids: string[], source: UserDetailSource, bizType: ProfileBizType[]): Promise; + fetchUserDetailInfo(trace: string, uids: string[], source: UserDetailSource, bizType: ProfileBizType[]): Promise detail + detail: Map, + } + >; addKernelProfileListener(listener: NodeIKernelProfileListener): number; From d6cf6d120a3274e5cab8d2d6e8dd1c42aab6023b 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: Thu, 10 Apr 2025 09:00:00 +0800 Subject: [PATCH 037/149] feat: group_all_shut --- src/onebot/action/group/GetGroupInfo.ts | 1 + src/onebot/helper/data.ts | 1 + src/onebot/types/data.ts | 1 + 3 files changed, 3 insertions(+) diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index 98dbcecf..dd0a40bc 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -20,6 +20,7 @@ class GetGroupInfo extends OneBotAction { const data = await this.core.apis.GroupApi.fetchGroupDetail(payload.group_id.toString()); return { ...data, + group_all_shut: data.shutUpAllTimestamp > 0 ? -1 : 0, group_remark: '', group_id: +payload.group_id, group_name: data.groupName, diff --git a/src/onebot/helper/data.ts b/src/onebot/helper/data.ts index 777a40b5..d9b0c0fa 100644 --- a/src/onebot/helper/data.ts +++ b/src/onebot/helper/data.ts @@ -93,6 +93,7 @@ export class OB11Construct { static group(group: Group): OB11Group { return { + group_all_shut: (+group.groupShutupExpireTime > 0 )? -1 : 0, group_remark: group.remarkName, group_id: +group.groupCode, group_name: group.groupName, diff --git a/src/onebot/types/data.ts b/src/onebot/types/data.ts index e03974af..32e9bbb8 100644 --- a/src/onebot/types/data.ts +++ b/src/onebot/types/data.ts @@ -63,6 +63,7 @@ export interface OB11GroupMember { } export interface OB11Group { + group_all_shut: number; // 群全员禁言 group_remark: string; // 群备注 group_id: number; // 群ID group_name: string; // 群名称 From 61f065c0c682b0a25a400d86b8f182aa840319f0 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: Thu, 10 Apr 2025 18:54:18 +0800 Subject: [PATCH 038/149] =?UTF-8?q?feat:=20rkey=E6=A0=87=E5=87=86=E5=8C=96?= =?UTF-8?q?&rkey=20server=E5=A2=9E=E5=BC=BA&=E7=AE=80=E5=8C=96rkey?= =?UTF-8?q?=E7=AB=AF=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/file.ts | 4 +-- src/core/helper/rkey.ts | 16 ++++++++-- src/onebot/action/index.ts | 4 +++ src/onebot/action/packet/GetRkeyEx.ts | 18 +++++++++++ src/onebot/action/packet/GetRkeyServer.ts | 38 +++++++++++++++++++++++ src/onebot/action/router.ts | 2 ++ 6 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 src/onebot/action/packet/GetRkeyEx.ts create mode 100644 src/onebot/action/packet/GetRkeyServer.ts diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index b40ab667..616ccb71 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -41,8 +41,8 @@ export class NTQQFileApi { this.context = context; this.core = core; this.rkeyManager = new RkeyManager([ - 'https://ss.xingzhige.com/music_card/rkey', // 国内 - 'https://secret-service.bietiaop.com/rkeys',//国内 + 'https://secret-service.bietiaop.com/rkeys', + 'http://ss.xingzhige.com/music_card/rkey', ], this.context.logger ); diff --git a/src/core/helper/rkey.ts b/src/core/helper/rkey.ts index 5425279c..47f748d4 100644 --- a/src/core/helper/rkey.ts +++ b/src/core/helper/rkey.ts @@ -6,7 +6,13 @@ interface ServerRkeyData { private_rkey: string; expired_time: number; } - +interface OneBotApiRet { + status: string, + retcode: number, + data: ServerRkeyData, + message: string, + wording: string, +} interface UrlFailureInfo { count: number; lastTimestamp: number; @@ -21,7 +27,7 @@ export class RkeyManager { expired_time: 0, }; private urlFailures: Map = new Map(); - private readonly FAILURE_LIMIT: number = 8; + private readonly FAILURE_LIMIT: number = 4; private readonly ONE_DAY: number = 24 * 60 * 60 * 1000; constructor(serverUrl: string[], logger: LogWrapper) { @@ -99,7 +105,11 @@ export class RkeyManager { for (const url of availableUrls) { try { - const temp = await RequestUtil.HttpGetJson(url, 'GET'); + let temp = await RequestUtil.HttpGetJson(url, 'GET'); + if ('retcode' in temp) { + // 支持Onebot Ret风格 + temp = (temp as unknown as OneBotApiRet).data; + } this.rkeyData = { group_rkey: temp.group_rkey.slice(6), private_rkey: temp.private_rkey.slice(6), diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index 86f4f08a..b2d8ef9b 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -112,10 +112,14 @@ import SetGroupRemark from './extends/SetGroupRemark'; import { MoveGroupFile } from './extends/MoveGroupFile'; import { TransGroupFile } from './extends/TransGroupFile'; import { RenameGroupFile } from './extends/RenameGroupFile'; +import { GetRkeyServer } from './packet/GetRkeyServer'; +import { GetRkeyEx } from './packet/GetRkeyEx'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { const actionHandlers = [ + new GetRkeyEx(obContext, core), + new GetRkeyServer(obContext, core), new SetGroupRemark(obContext, core), new GetGroupInfoEx(obContext, core), new FetchEmojiLike(obContext, core), diff --git a/src/onebot/action/packet/GetRkeyEx.ts b/src/onebot/action/packet/GetRkeyEx.ts new file mode 100644 index 00000000..d330b8ee --- /dev/null +++ b/src/onebot/action/packet/GetRkeyEx.ts @@ -0,0 +1,18 @@ +import { ActionName } from '@/onebot/action/router'; +import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; + +export class GetRkeyEx extends GetPacketStatusDepends { + override actionName = ActionName.GetRkeyEx; + + async _handle() { + let rkeys = await this.core.apis.PacketApi.pkt.operation.FetchRkey(); + return rkeys.map(rkey => { + return { + type: rkey.type === 10 ? "private" : "group", + rkey: rkey.rkey, + created_at: rkey.time, + ttl: rkey.ttl, + }; + }); + } +} \ No newline at end of file diff --git a/src/onebot/action/packet/GetRkeyServer.ts b/src/onebot/action/packet/GetRkeyServer.ts new file mode 100644 index 00000000..96129dc0 --- /dev/null +++ b/src/onebot/action/packet/GetRkeyServer.ts @@ -0,0 +1,38 @@ +import { ActionName } from '@/onebot/action/router'; +import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; + +export class GetRkeyServer extends GetPacketStatusDepends { + override actionName = ActionName.GetRkeyServer; + + private rkeyCache: { + private_rkey?: string; + group_rkey?: string; + expired_time?: number; + name: string; + } | null = null; + private expiryTime: number | null = null; + + async _handle() { + // 检查缓存是否有效 + if (this.expiryTime && this.expiryTime > Math.floor(Date.now() / 1000) && this.rkeyCache) { + return this.rkeyCache; + } + + // 获取新的 Rkey + let rkeys = await this.core.apis.PacketApi.pkt.operation.FetchRkey(); + let privateRkeyItem = rkeys.filter(rkey => rkey.type === 10)[0]; + let groupRkeyItem = rkeys.filter(rkey => rkey.type === 20)[0]; + + this.expiryTime = Math.floor(Date.now() / 1000) + 3600; // 假设缓存有效期为 1 小时 + + // 更新缓存 + this.rkeyCache = { + private_rkey: privateRkeyItem ? privateRkeyItem.rkey : undefined, + group_rkey: groupRkeyItem ? groupRkeyItem.rkey : undefined, + expired_time: this.expiryTime, + name: "NapCat 4" + }; + + return this.rkeyCache; + } +} \ No newline at end of file diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index 2c41ffb3..d25723eb 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -10,6 +10,8 @@ export interface InvalidCheckResult { } export const ActionName = { + GetRkeyEx: 'get_rkey', + GetRkeyServer: 'get_rkey_server', SetGroupRemark: 'set_group_remark', NapCat_GetPrivateFileUrl: 'get_private_file_url', ClickInlineKeyboardButton: 'click_inline_keyboard_button', From a8fb48fb507d812311cacf3a1febf2daf49b21e7 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 10 Apr 2025 10:55:24 +0000 Subject: [PATCH 039/149] release: v4.7.14 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 4df1ba5e..29042d6c 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.13", + "version": "4.7.14", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index ba5bfe53..60965488 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.13", + "version": "4.7.14", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 373e8812..97aa465d 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.13'; +export const napCatVersion = '4.7.14'; From ace4da2297c796cd2f8ba9291835d694bccbd67d 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: Thu, 10 Apr 2025 18:59:49 +0800 Subject: [PATCH 040/149] =?UTF-8?q?fix:=20rkey=20server=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/action/packet/GetRkeyServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebot/action/packet/GetRkeyServer.ts b/src/onebot/action/packet/GetRkeyServer.ts index 96129dc0..ebfa7049 100644 --- a/src/onebot/action/packet/GetRkeyServer.ts +++ b/src/onebot/action/packet/GetRkeyServer.ts @@ -23,7 +23,7 @@ export class GetRkeyServer extends GetPacketStatusDepends rkey.type === 10)[0]; let groupRkeyItem = rkeys.filter(rkey => rkey.type === 20)[0]; - this.expiryTime = Math.floor(Date.now() / 1000) + 3600; // 假设缓存有效期为 1 小时 + this.expiryTime = Math.floor(Date.now() / 1000) + Math.min(+groupRkeyItem!.ttl.toString(),+privateRkeyItem!.ttl.toString()); // 更新缓存 this.rkeyCache = { From 386b884f1bf7d593bf1a1ad424ed7ebf5813e084 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 10 Apr 2025 11:00:12 +0000 Subject: [PATCH 041/149] release: v4.7.15 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 29042d6c..0ca654c0 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.14", + "version": "4.7.15", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 60965488..2c9f65ef 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.14", + "version": "4.7.15", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 97aa465d..e29fe0eb 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.14'; +export const napCatVersion = '4.7.15'; From 3d2decb0ecef90467d2d9fae8b6ef5efbb326be0 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: Fri, 11 Apr 2025 12:47:25 +0800 Subject: [PATCH 042/149] feat: 34231 --- src/core/external/appid.json | 8 ++++++++ src/core/external/offset.json | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/core/external/appid.json b/src/core/external/appid.json index 078ac7f1..7cb91704 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -234,5 +234,13 @@ "3.2.16-33800": { "appid": 537274009, "qua": "V1_LNX_NQ_3.2.16_33800_GW_B" + }, + "9.9.19-34231": { + "appid": 537279209, + "qua": "V1_WIN_NQ_9.9.19_34231_GW_B" + }, + "3.2.17-34231": { + "appid": 537279245, + "qua": "V1_LNX_NQ_3.2.17_34231_GW_B" } } \ No newline at end of file diff --git a/src/core/external/offset.json b/src/core/external/offset.json index 0a4b0cc5..aef27d77 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -314,5 +314,17 @@ "3.2.16-33800-arm64": { "send": "7262BB0", "recv": "72664E0" + }, + "9.9.19-34231-x64": { + "send": "3BD73D0", + "recv": "3BDBBD0" + }, + "3.2.17-34231-x64": { + "send": "AD787E0", + "recv": "AD7C200" + }, + "3.2.17-34231-arm64": { + "send": "770CDC0", + "recv": "77106F0" } } \ No newline at end of file From 108897f6ad32b14f9d1009706523f9a4aa09cea7 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: Fri, 11 Apr 2025 14:18:12 +0800 Subject: [PATCH 043/149] =?UTF-8?q?feat:=20shell=20=E8=83=BD=E5=8A=9B=20la?= =?UTF-8?q?uncher-user-34231?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- launcher/NapCatWinBootHook_34231.dll | Bin 0 -> 19968 bytes launcher/launcher-user-34231.bat | 32 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 launcher/NapCatWinBootHook_34231.dll create mode 100644 launcher/launcher-user-34231.bat diff --git a/launcher/NapCatWinBootHook_34231.dll b/launcher/NapCatWinBootHook_34231.dll new file mode 100644 index 0000000000000000000000000000000000000000..4c023a7a1dfce8ca8bddb68b032bee4705adc205 GIT binary patch literal 19968 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 literal 0 HcmV?d00001 diff --git a/launcher/launcher-user-34231.bat b/launcher/launcher-user-34231.bat new file mode 100644 index 00000000..1684507e --- /dev/null +++ b/launcher/launcher-user-34231.bat @@ -0,0 +1,32 @@ +@echo off +chcp 65001 +set NAPCAT_PATCH_PACKAGE=%cd%\qqnt.json +set NAPCAT_LOAD_PATH=%cd%\loadNapCat.js +set NAPCAT_INJECT_PATH=%cd%\NapCatWinBootHook_34231.dll +set NAPCAT_LAUNCHER_PATH=%cd%\NapCatWinBootMain.exe +set NAPCAT_MAIN_PATH=%cd%\napcat.mjs +:loop_read +for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ" /v "UninstallString"') do ( + set RetString=%%b + goto :napcat_boot +) + +:napcat_boot +for %%a in ("%RetString%") do ( + set "pathWithoutUninstall=%%~dpa" +) + +SET QQPath=%pathWithoutUninstall%QQ.exe + +if not exist "%QQpath%" ( + echo provided QQ path is invalid + pause + exit /b +) + +set NAPCAT_MAIN_PATH=%NAPCAT_MAIN_PATH:\=/% +echo (async () =^> {await import("file:///%NAPCAT_MAIN_PATH%")})() > "%NAPCAT_LOAD_PATH%" + +"%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%" %1 + +pause \ No newline at end of file From 407d8d1fd2c07440cc5840b27d25a5814d3ec0c1 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: Fri, 11 Apr 2025 14:20:27 +0800 Subject: [PATCH 044/149] feat: 34231 --- launcher/ReadMe.txt | 1 + launcher/launcher-win10-user-34231.bat | 33 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 launcher/ReadMe.txt create mode 100644 launcher/launcher-win10-user-34231.bat diff --git a/launcher/ReadMe.txt b/launcher/ReadMe.txt new file mode 100644 index 00000000..47c90bb4 --- /dev/null +++ b/launcher/ReadMe.txt @@ -0,0 +1 @@ +带有34231数字的是指QQ 9.9.19-34231 适配的启动脚本 \ No newline at end of file diff --git a/launcher/launcher-win10-user-34231.bat b/launcher/launcher-win10-user-34231.bat new file mode 100644 index 00000000..3942b28b --- /dev/null +++ b/launcher/launcher-win10-user-34231.bat @@ -0,0 +1,33 @@ +@echo off +chcp 65001 +set NAPCAT_PATCH_PACKAGE=%cd%\qqnt.json +set NAPCAT_LOAD_PATH=%cd%\loadNapCat.js +set NAPCAT_INJECT_PATH=%cd%\NapCatWinBootHook_34231.dll +set NAPCAT_LAUNCHER_PATH=%cd%\NapCatWinBootMain.exe +set NAPCAT_MAIN_PATH=%cd%\napcat.mjs +:loop_read +for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ" /v "UninstallString"') do ( + set RetString=%%b + goto :napcat_boot +) + +:napcat_boot +for %%a in ("%RetString%") do ( + set "pathWithoutUninstall=%%~dpa" +) + +SET QQPath=%pathWithoutUninstall%QQ.exe + +if not exist "%QQpath%" ( + echo provided QQ path is invalid + pause + exit /b +) +set NAPCAT_MAIN_PATH=%NAPCAT_MAIN_PATH:\=/% +echo (async () =^> {await import("file:///%NAPCAT_MAIN_PATH%")})() > "%NAPCAT_LOAD_PATH%" + +"%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%" %1 + +REM "%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%" 123456 + +pause \ No newline at end of file From 0664b9af842dfbae1d86cc35447105ed568d210e Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Fri, 11 Apr 2025 06:21:19 +0000 Subject: [PATCH 045/149] release: v4.7.16 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 0ca654c0..270f5a16 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.15", + "version": "4.7.16", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 2c9f65ef..270361f8 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.15", + "version": "4.7.16", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index e29fe0eb..27374b3d 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.15'; +export const napCatVersion = '4.7.16'; From a6be54937c7cfa15632e98f228158a20473635ac 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: Fri, 11 Apr 2025 14:40:22 +0800 Subject: [PATCH 046/149] =?UTF-8?q?feat:=20=E5=88=A0=E6=8E=89=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E7=9A=84=E5=90=AF=E5=8A=A8=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- launcher/NapCatWinBootHook.dll | Bin 17920 -> 20480 bytes launcher/NapCatWinBootHook_34231.dll | Bin 19968 -> 0 bytes launcher/launcher-win10-user-34231.bat | 33 ------------------------- 3 files changed, 33 deletions(-) delete mode 100644 launcher/NapCatWinBootHook_34231.dll delete mode 100644 launcher/launcher-win10-user-34231.bat diff --git a/launcher/NapCatWinBootHook.dll b/launcher/NapCatWinBootHook.dll index d7393fac8b80ebd196669f3c4d68ca0fa98cf70d..b1692a7334264e9b1608c69824647bad96a6133b 100644 GIT binary patch literal 20480 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 X6+p}3-ov(U<$nv=zd!$jHSm7`%06hN literal 17920 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 diff --git a/launcher/NapCatWinBootHook_34231.dll b/launcher/NapCatWinBootHook_34231.dll deleted file mode 100644 index 4c023a7a1dfce8ca8bddb68b032bee4705adc205..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19968 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 diff --git a/launcher/launcher-win10-user-34231.bat b/launcher/launcher-win10-user-34231.bat deleted file mode 100644 index 3942b28b..00000000 --- a/launcher/launcher-win10-user-34231.bat +++ /dev/null @@ -1,33 +0,0 @@ -@echo off -chcp 65001 -set NAPCAT_PATCH_PACKAGE=%cd%\qqnt.json -set NAPCAT_LOAD_PATH=%cd%\loadNapCat.js -set NAPCAT_INJECT_PATH=%cd%\NapCatWinBootHook_34231.dll -set NAPCAT_LAUNCHER_PATH=%cd%\NapCatWinBootMain.exe -set NAPCAT_MAIN_PATH=%cd%\napcat.mjs -:loop_read -for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ" /v "UninstallString"') do ( - set RetString=%%b - goto :napcat_boot -) - -:napcat_boot -for %%a in ("%RetString%") do ( - set "pathWithoutUninstall=%%~dpa" -) - -SET QQPath=%pathWithoutUninstall%QQ.exe - -if not exist "%QQpath%" ( - echo provided QQ path is invalid - pause - exit /b -) -set NAPCAT_MAIN_PATH=%NAPCAT_MAIN_PATH:\=/% -echo (async () =^> {await import("file:///%NAPCAT_MAIN_PATH%")})() > "%NAPCAT_LOAD_PATH%" - -"%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%" %1 - -REM "%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%" 123456 - -pause \ No newline at end of file From b9ec8ac9b19a9c6cbb3a9a3d01b9504242c6025a 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: Fri, 11 Apr 2025 15:12:32 +0800 Subject: [PATCH 047/149] =?UTF-8?q?feat:=20LL=20Framework=E9=80=82?= =?UTF-8?q?=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- external/LiteLoaderWrapper.zip | Bin 68745 -> 70046 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/external/LiteLoaderWrapper.zip b/external/LiteLoaderWrapper.zip index 990c0c5b5db01467155a5e87ea96f936d9ac13e7..9861a5a12e93aa9fe4261cea03e5c4e5601ea5ce 100644 GIT binary patch delta 33296 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 U<}HAMvA+JKqk)0#J-@yBf1Ct3q5uE@ delta 32215 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 From 176691bb9689805a5b7363e72191211147afd191 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Fri, 11 Apr 2025 07:12:53 +0000 Subject: [PATCH 048/149] release: v4.7.17 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 270f5a16..39ee29a5 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.16", + "version": "4.7.17", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 270361f8..78ee1f37 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.16", + "version": "4.7.17", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 27374b3d..59dc0e91 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.16'; +export const napCatVersion = '4.7.17'; From 749f1dfcf9929c6c498fc5de72aa640e26adde7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=87=E9=87=8C?= <920113370213@njust.edu.cn> Date: Fri, 11 Apr 2025 22:03:28 +0800 Subject: [PATCH 049/149] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 服务器到期了呜呜呜 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 19a9a00c..de22ec47 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ _Modern protocol-side framework implemented based on NTQQ._ | Docs | [![Github.IO](https://img.shields.io/badge/docs%20on-Github.IO-orange)](https://napneko.github.io/) | [![Cloudflare.Worker](https://img.shields.io/badge/docs%20on-Cloudflare.Worker-black)](https://doc.napneko.icu/) | [![Cloudflare.HKServer](https://img.shields.io/badge/docs%20on-Cloudflare.HKServer-informational)](https://napcat.napneko.icu/) | |:-:|:-:|:-:|:-:| -| Docs | [![Cloudflare.Pages](https://img.shields.io/badge/docs%20on-Cloudflare.Pages-blue)](https://napneko.pages.dev/) | [![Server.Other](https://img.shields.io/badge/docs%20on-Server.Other-green)](https://docs.napcat.cyou/) | [![NapCat.Wiki](https://img.shields.io/badge/docs%20on-NapCat.Wiki-red)](https://www.napcat.wiki) | -|:-:|:-:|:-:|:-:| +| Docs | [![Cloudflare.Pages](https://img.shields.io/badge/docs%20on-Cloudflare.Pages-blue)](https://napneko.pages.dev/) | [![NapCat.Wiki](https://img.shields.io/badge/docs%20on-NapCat.Wiki-red)](https://www.napcat.wiki) | +|:-:|:-:|:-:| | Contact | [![QQ Group#1](https://img.shields.io/badge/QQ%20Group%231-Join-blue)](https://qm.qq.com/q/I6LU87a0Yq) | [![QQ Group#2](https://img.shields.io/badge/QQ%20Group%232-Join-blue)](https://qm.qq.com/q/HaRcfrHpUk) | [![Telegram](https://img.shields.io/badge/Telegram-MelodicMoonlight-blue)](https://t.me/MelodicMoonlight) | |:-:|:-:|:-:|:-:| From 19479b4b3c6a0cff21eddbb85c785c03fdff4f9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=87=E9=87=8C?= <920113370213@njust.edu.cn> Date: Sat, 12 Apr 2025 00:09:19 +0800 Subject: [PATCH 050/149] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 换成美国vps --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index de22ec47..36ebce93 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ _Modern protocol-side framework implemented based on NTQQ._ | Docs | [![Github.IO](https://img.shields.io/badge/docs%20on-Github.IO-orange)](https://napneko.github.io/) | [![Cloudflare.Worker](https://img.shields.io/badge/docs%20on-Cloudflare.Worker-black)](https://doc.napneko.icu/) | [![Cloudflare.HKServer](https://img.shields.io/badge/docs%20on-Cloudflare.HKServer-informational)](https://napcat.napneko.icu/) | |:-:|:-:|:-:|:-:| -| Docs | [![Cloudflare.Pages](https://img.shields.io/badge/docs%20on-Cloudflare.Pages-blue)](https://napneko.pages.dev/) | [![NapCat.Wiki](https://img.shields.io/badge/docs%20on-NapCat.Wiki-red)](https://www.napcat.wiki) | -|:-:|:-:|:-:| +| Docs | [![Cloudflare.Pages](https://img.shields.io/badge/docs%20on-Cloudflare.Pages-blue)](https://napneko.pages.dev/) | [![Server.Other](https://img.shields.io/badge/docs%20on-Server.Other-green)](https://napcat.cyou/) | [![NapCat.Wiki](https://img.shields.io/badge/docs%20on-NapCat.Wiki-red)](https://www.napcat.wiki) | +|:-:|:-:|:-:|:-:| | Contact | [![QQ Group#1](https://img.shields.io/badge/QQ%20Group%231-Join-blue)](https://qm.qq.com/q/I6LU87a0Yq) | [![QQ Group#2](https://img.shields.io/badge/QQ%20Group%232-Join-blue)](https://qm.qq.com/q/HaRcfrHpUk) | [![Telegram](https://img.shields.io/badge/Telegram-MelodicMoonlight-blue)](https://t.me/MelodicMoonlight) | |:-:|:-:|:-:|:-:| From 4d292a75fa62ef6240a39e7e9b0df5fd1253774e 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: Sat, 12 Apr 2025 11:36:46 +0800 Subject: [PATCH 051/149] fix --- launcher/ReadMe.txt | 1 - launcher/launcher-user-34231.bat | 32 -------------------------------- 2 files changed, 33 deletions(-) delete mode 100644 launcher/ReadMe.txt delete mode 100644 launcher/launcher-user-34231.bat diff --git a/launcher/ReadMe.txt b/launcher/ReadMe.txt deleted file mode 100644 index 47c90bb4..00000000 --- a/launcher/ReadMe.txt +++ /dev/null @@ -1 +0,0 @@ -带有34231数字的是指QQ 9.9.19-34231 适配的启动脚本 \ No newline at end of file diff --git a/launcher/launcher-user-34231.bat b/launcher/launcher-user-34231.bat deleted file mode 100644 index 1684507e..00000000 --- a/launcher/launcher-user-34231.bat +++ /dev/null @@ -1,32 +0,0 @@ -@echo off -chcp 65001 -set NAPCAT_PATCH_PACKAGE=%cd%\qqnt.json -set NAPCAT_LOAD_PATH=%cd%\loadNapCat.js -set NAPCAT_INJECT_PATH=%cd%\NapCatWinBootHook_34231.dll -set NAPCAT_LAUNCHER_PATH=%cd%\NapCatWinBootMain.exe -set NAPCAT_MAIN_PATH=%cd%\napcat.mjs -:loop_read -for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ" /v "UninstallString"') do ( - set RetString=%%b - goto :napcat_boot -) - -:napcat_boot -for %%a in ("%RetString%") do ( - set "pathWithoutUninstall=%%~dpa" -) - -SET QQPath=%pathWithoutUninstall%QQ.exe - -if not exist "%QQpath%" ( - echo provided QQ path is invalid - pause - exit /b -) - -set NAPCAT_MAIN_PATH=%NAPCAT_MAIN_PATH:\=/% -echo (async () =^> {await import("file:///%NAPCAT_MAIN_PATH%")})() > "%NAPCAT_LOAD_PATH%" - -"%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%" %1 - -pause \ No newline at end of file From dd00d4c8a513381aa44bf81f8c049aec964bd621 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: Sat, 12 Apr 2025 11:59:29 +0800 Subject: [PATCH 052/149] =?UTF-8?q?fix:=20=E5=B0=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/api/group.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/onebot/api/group.ts b/src/onebot/api/group.ts index 19d2b58c..bfe0f037 100644 --- a/src/onebot/api/group.ts +++ b/src/onebot/api/group.ts @@ -114,7 +114,6 @@ export class OneBotGroupApi { async parseCardChangedEvent(msg: RawMessage) { if (msg.senderUin && msg.senderUin !== '0') { const member = await this.core.apis.GroupApi.getGroupMember(msg.peerUid, msg.senderUin); - await this.core.apis.GroupApi.refreshGroupMemberCachePartial(msg.peerUid, msg.senderUid); if (member && member.cardName !== msg.sendMemberName) { const newCardName = msg.sendMemberName ?? ''; const event = new OB11GroupCardEvent(this.core, parseInt(msg.peerUid), parseInt(msg.senderUin), newCardName, member.cardName); @@ -130,7 +129,6 @@ export class OneBotGroupApi { async parsePaiYiPai(msg: RawMessage, jsonStr: string) { const json = JSON.parse(jsonStr); - //判断业务类型 //Poke事件 const pokedetail: Array<{ uid: string }> = json.items; From e3f965a9d6d84141453dfdab48e4d2a91d6b29a8 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sat, 12 Apr 2025 04:04:09 +0000 Subject: [PATCH 053/149] release: v4.7.18 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 39ee29a5..fceb616f 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.17", + "version": "4.7.18", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 78ee1f37..1dcc58a6 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.17", + "version": "4.7.18", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 59dc0e91..414812e4 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.17'; +export const napCatVersion = '4.7.18'; From a5e53a713b1e9ea030cfa59ff063992fb26afcce 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: Sat, 12 Apr 2025 12:23:38 +0800 Subject: [PATCH 054/149] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BAwin=20?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- launcher/NapCatWinBootMain.exe | Bin 31232 -> 35328 bytes src/shell/napcat.ts | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/launcher/NapCatWinBootMain.exe b/launcher/NapCatWinBootMain.exe index 9501691cff77d5244e000b11e6e43af0e14250a0..60c4920a9e59e0f41872953e221b2e0e85c83656 100644 GIT binary patch literal 35328 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 { + console.log(`已连接到命名管道: ${pipePath}`); + process.stdout.write = ( + chunk: any, + encoding?: BufferEncoding | (() => void), + cb?: () => void + ): boolean => { + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + return pipeSocket.write(chunk, encoding as BufferEncoding, cb); + }; + console.log(`stdout 已重定向到命名管道: ${pipePath}`); + }); + + pipeSocket.on('error', (err) => { + console.log(`连接命名管道 ${pipePath} 时出错:`, err); + }); + + pipeSocket.on('end', () => { + console.log('命名管道连接已关闭'); + }); + + } catch (error) { + console.log(`尝试连接命名管道 ${pipePath} 时发生异常:`, error); + } +} NCoreInitShell(); \ No newline at end of file From d4ab191f3408f6ce874e11adc99ec9b6b2b7122d Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sat, 12 Apr 2025 04:25:39 +0000 Subject: [PATCH 055/149] release: v4.7.19 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index fceb616f..f0d008e5 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.18", + "version": "4.7.19", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 1dcc58a6..27a5b2aa 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.18", + "version": "4.7.19", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 414812e4..9e02e587 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.18'; +export const napCatVersion = '4.7.19'; From 2147c4ffee796104ea628da9e74dc0e942e102da 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, 13 Apr 2025 20:05:11 +0800 Subject: [PATCH 056/149] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E5=88=B0zod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 11 +- src/common/config-base.ts | 37 +- src/common/ffmpeg-worker.ts | 26 +- src/common/file.ts | 40 +- src/common/worker.ts | 2 +- src/core/apis/file.ts | 18 +- src/core/helper/config.ts | 25 +- src/core/types/webapi.ts | 2 +- src/onebot/action/OneBotAction.ts | 35 +- .../extends/ClickInlineKeyboardButton.ts | 19 +- src/onebot/action/extends/CreateCollection.ts | 10 +- src/onebot/action/extends/FetchCustomFace.ts | 8 +- src/onebot/action/extends/FetchEmojiLike.ts | 16 +- src/onebot/action/extends/GetAiCharacters.ts | 10 +- .../action/extends/GetCollectionList.ts | 10 +- src/onebot/action/extends/GetGroupInfoEx.ts | 10 +- src/onebot/action/extends/GetMiniAppArk.ts | 56 +- src/onebot/action/extends/GetProfileLike.ts | 12 +- .../extends/GetUnidirectionalFriendList.ts | 2 +- src/onebot/action/extends/GetUserStatus.ts | 10 +- src/onebot/action/extends/MoveGroupFile.ts | 14 +- src/onebot/action/extends/OCRImage.ts | 8 +- src/onebot/action/extends/RenameGroupFile.ts | 14 +- src/onebot/action/extends/SendPacket.ts | 15 +- .../action/extends/SetDiyOnlineStatus.ts | 12 +- src/onebot/action/extends/SetGroupRemark.ts | 10 +- src/onebot/action/extends/SetGroupSign.ts | 8 +- src/onebot/action/extends/SetInputStatus.ts | 10 +- src/onebot/action/extends/SetLongNick.ts | 8 +- src/onebot/action/extends/SetOnlineStatus.ts | 12 +- src/onebot/action/extends/SetQQAvatar.ts | 8 +- src/onebot/action/extends/SetSpecialTitle.ts | 12 +- src/onebot/action/extends/ShareContact.ts | 18 +- src/onebot/action/extends/TransGroupFile.ts | 10 +- .../action/extends/TranslateEnWordToZn.ts | 8 +- src/onebot/action/file/GetFile.ts | 10 +- src/onebot/action/file/GetGroupFileUrl.ts | 10 +- src/onebot/action/file/GetPrivateFileUrl.ts | 8 +- .../action/go-cqhttp/CreateGroupFileFolder.ts | 10 +- .../action/go-cqhttp/DeleteGroupFile.ts | 10 +- .../action/go-cqhttp/DeleteGroupFileFolder.ts | 12 +- src/onebot/action/go-cqhttp/DownloadFile.ts | 14 +- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 11 +- .../action/go-cqhttp/GetFriendMsgHistory.ts | 15 +- .../action/go-cqhttp/GetGroupAtAllRemain.ts | 8 +- .../go-cqhttp/GetGroupFileSystemInfo.ts | 8 +- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 14 +- .../action/go-cqhttp/GetGroupHonorInfo.ts | 14 +- .../action/go-cqhttp/GetGroupMsgHistory.ts | 14 +- .../action/go-cqhttp/GetGroupRootFiles.ts | 10 +- .../action/go-cqhttp/GetStrangerInfo.ts | 10 +- .../go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 8 +- .../action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 14 +- .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 8 +- .../action/go-cqhttp/SendGroupNotice.ts | 22 +- .../action/go-cqhttp/SetGroupPortrait.ts | 10 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 12 +- .../action/go-cqhttp/UploadGroupFile.ts | 16 +- .../action/go-cqhttp/UploadPrivateFile.ts | 12 +- src/onebot/action/group/DelEssenceMsg.ts | 8 +- src/onebot/action/group/DelGroupNotice.ts | 10 +- src/onebot/action/group/GetAiRecord.ts | 12 +- src/onebot/action/group/GetGroupEssence.ts | 8 +- src/onebot/action/group/GetGroupInfo.ts | 8 +- src/onebot/action/group/GetGroupList.ts | 8 +- src/onebot/action/group/GetGroupMemberInfo.ts | 12 +- src/onebot/action/group/GetGroupMemberList.ts | 10 +- src/onebot/action/group/GetGroupNotice.ts | 8 +- src/onebot/action/group/GetGroupShutList.ts | 8 +- src/onebot/action/group/GroupPoke.ts | 10 +- src/onebot/action/group/SendGroupAiRecord.ts | 12 +- src/onebot/action/group/SetEssenceMsg.ts | 8 +- src/onebot/action/group/SetGroupAddRequest.ts | 12 +- src/onebot/action/group/SetGroupAdmin.ts | 12 +- src/onebot/action/group/SetGroupBan.ts | 12 +- src/onebot/action/group/SetGroupCard.ts | 12 +- src/onebot/action/group/SetGroupKick.ts | 12 +- src/onebot/action/group/SetGroupLeave.ts | 10 +- src/onebot/action/group/SetGroupName.ts | 10 +- src/onebot/action/group/SetGroupWholeBan.ts | 10 +- src/onebot/action/msg/DeleteMsg.ts | 8 +- src/onebot/action/msg/ForwardSingleMsg.ts | 12 +- src/onebot/action/msg/GetMsg.ts | 8 +- src/onebot/action/msg/MarkMsgAsRead.ts | 12 +- src/onebot/action/msg/SetMsgEmojiLike.ts | 12 +- src/onebot/action/packet/GetRkeyEx.ts | 2 +- src/onebot/action/packet/GetRkeyServer.ts | 2 +- src/onebot/action/packet/SendPoke.ts | 10 +- src/onebot/action/system/GetCredentials.ts | 8 +- src/onebot/action/user/FriendPoke.ts | 8 +- src/onebot/action/user/GetCookies.ts | 8 +- src/onebot/action/user/GetFriendList.ts | 8 +- src/onebot/action/user/GetRecentContact.ts | 8 +- src/onebot/action/user/SendLike.ts | 10 +- src/onebot/action/user/SetFriendAddRequest.ts | 12 +- src/onebot/api/msg.ts | 36 +- src/onebot/config/config.ts | 167 +++--- src/onebot/config/index.ts | 5 +- src/shell/base.ts | 4 +- src/webui/src/helper/config.ts | 24 +- src/webui/src/types/theme.ts | 514 +++++++++--------- 101 files changed, 951 insertions(+), 945 deletions(-) diff --git a/package.json b/package.json index 27a5b2aa..5533687d 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,6 @@ "@napneko/nap-proto-core": "^0.0.4", "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/plugin-typescript": "^12.1.2", - "@sinclair/typebox": "^0.34.9", "@types/cors": "^2.8.17", "@types/express": "^5.0.0", "@types/multer": "^1.4.12", @@ -39,9 +38,9 @@ "@types/ws": "^8.5.12", "@typescript-eslint/eslint-plugin": "^8.3.0", "@typescript-eslint/parser": "^8.3.0", - "ajv": "^8.13.0", "async-mutex": "^0.5.0", "commander": "^13.0.0", + "compressing": "^1.10.1", "cors": "^2.8.5", "esbuild": "0.25.0", "eslint": "^9.14.0", @@ -54,19 +53,19 @@ "image-size": "^1.1.1", "json5": "^2.2.3", "multer": "^1.4.5-lts.1", + "napcat.protobuf": "^1.1.4", "typescript": "^5.3.3", "typescript-eslint": "^8.13.0", "vite": "^6.0.1", "vite-plugin-cp": "^6.0.0", "vite-tsconfig-paths": "^5.1.0", - "napcat.protobuf": "^1.1.4", - "winston": "^3.17.0", - "compressing": "^1.10.1" + "winston": "^3.17.0" }, "dependencies": { "@ffmpeg.wasm/core-mt": "^0.13.2", "express": "^5.0.0", "silk-wasm": "^3.6.1", - "ws": "^8.18.0" + "ws": "^8.18.0", + "zod": "^3.24.2" } } diff --git a/src/common/config-base.ts b/src/common/config-base.ts index 8f39a4b0..ed5e5540 100644 --- a/src/common/config-base.ts +++ b/src/common/config-base.ts @@ -2,22 +2,20 @@ import path from 'node:path'; import fs from 'node:fs'; import type { NapCatCore } from '@/core'; import json5 from 'json5'; -import Ajv, { AnySchema, ValidateFunction } from 'ajv'; +import { z } from 'zod'; export abstract class ConfigBase { name: string; core: NapCatCore; configPath: string; configData: T = {} as T; - ajv: Ajv; - validate: ValidateFunction; + schema: z.ZodType; - protected constructor(name: string, core: NapCatCore, configPath: string, ConfigSchema: AnySchema) { + protected constructor(name: string, core: NapCatCore, configPath: string, schema: z.ZodType) { this.name = name; this.core = core; this.configPath = configPath; - this.ajv = new Ajv({ useDefaults: true, coerceTypes: true }); - this.validate = this.ajv.compile(ConfigSchema); + this.schema = schema; fs.mkdirSync(this.configPath, { recursive: true }); this.read(); } @@ -42,11 +40,16 @@ export abstract class ConfigBase { private loadConfig(configPath: string): T { try { - let newConfigData = json5.parse(fs.readFileSync(configPath, 'utf-8')); - this.validate(newConfigData); - this.configData = newConfigData; - this.core.context.logger.logDebug(`[Core] [Config] 配置文件${configPath}加载`, this.configData); - return this.configData; + let configData = json5.parse(fs.readFileSync(configPath, 'utf-8')); + const result = this.schema.safeParse(configData); + + if (result.success) { + this.configData = result.data; + this.core.context.logger.logDebug(`[Core] [Config] 配置文件${configPath}加载`, this.configData); + return this.configData; + } else { + throw new Error(`配置文件验证失败: ${result.error.message}`); + } } catch (e: unknown) { this.handleError(e, '读取配置文件时发生错误'); return {} as T; @@ -55,10 +58,14 @@ export abstract class ConfigBase { save(newConfigData: T = this.configData): void { const configPath = this.getConfigPath(this.core.selfInfo.uin); - this.validate(newConfigData); - this.configData = newConfigData; try { - fs.writeFileSync(configPath, JSON.stringify(this.configData, null, 2)); + const result = this.schema.safeParse(newConfigData); + if (result.success) { + this.configData = result.data; + fs.writeFileSync(configPath, JSON.stringify(this.configData, null, 2)); + } else { + throw new Error(`配置文件验证失败: ${result.error.message}`); + } } catch (e: unknown) { this.handleError(e, `保存配置文件 ${configPath} 时发生错误:`); } @@ -67,6 +74,8 @@ export abstract class ConfigBase { private handleError(e: unknown, message: string): void { if (e instanceof SyntaxError) { this.core.context.logger.logError('[Core] [Config] 操作配置文件格式错误,请检查配置文件:', e.message); + } else if (e instanceof z.ZodError) { + this.core.context.logger.logError('[Core] [Config] 配置文件验证错误:', e.message); } else { this.core.context.logger.logError(`[Core] [Config] ${message}:`, (e as Error).message); } diff --git a/src/common/ffmpeg-worker.ts b/src/common/ffmpeg-worker.ts index d56abdba..095776d1 100644 --- a/src/common/ffmpeg-worker.ts +++ b/src/common/ffmpeg-worker.ts @@ -128,7 +128,7 @@ class FFmpegService { const [fileInfo, durationInfo] = await Promise.all([ // 任务1: 获取文件信息和提取缩略图 (async () => { - sendLog(`开始任务1: 获取文件信息和提取缩略图`); + sendLog('开始任务1: 获取文件信息和提取缩略图'); // 获取文件信息 (并行) const fileInfoStartTime = Date.now(); @@ -147,7 +147,7 @@ class FFmpegService { // 直接实现缩略图提取 (不调用extractThumbnail方法) const thumbStartTime = Date.now(); - sendLog(`开始提取缩略图`); + sendLog('开始提取缩略图'); const ffmpegInstance = await withTimeout( FFmpeg.create({ core: '@ffmpeg.wasm/core-mt' }), @@ -215,7 +215,7 @@ class FFmpegService { // 任务2: 获取视频时长 (async () => { const task2StartTime = Date.now(); - sendLog(`开始任务2: 获取视频时长`); + sendLog('开始任务2: 获取视频时长'); // 创建FFmpeg实例 const ffmpegCreateStartTime = Date.now(); @@ -291,16 +291,16 @@ interface FFmpegTask { } export default async function handleFFmpegTask({ method, args }: FFmpegTask): Promise { switch (method) { - case 'extractThumbnail': - return await FFmpegService.extractThumbnail(...args as [string, string]); - case 'convertFile': - return await FFmpegService.convertFile(...args as [string, string, string]); - case 'convert': - return await FFmpegService.convert(...args as [string, string]); - case 'getVideoInfo': - return await FFmpegService.getVideoInfo(...args as [string, string]); - default: - throw new Error(`Unknown method: ${method}`); + case 'extractThumbnail': + return await FFmpegService.extractThumbnail(...args as [string, string]); + case 'convertFile': + return await FFmpegService.convertFile(...args as [string, string, string]); + case 'convert': + return await FFmpegService.convert(...args as [string, string]); + case 'getVideoInfo': + return await FFmpegService.getVideoInfo(...args as [string, string]); + default: + throw new Error(`Unknown method: ${method}`); } } recvTask(async ({ method, args }: FFmpegTask) => { diff --git a/src/common/file.ts b/src/common/file.ts index c75bcce4..d323dac9 100644 --- a/src/common/file.ts +++ b/src/common/file.ts @@ -182,28 +182,28 @@ export async function uriToLocalFile(dir: string, uri: string, filename: string const filePath = path.join(dir, filename); switch (UriType) { - case FileUriType.Local: { - const fileExt = path.extname(HandledUri); - const localFileName = path.basename(HandledUri, fileExt) + fileExt; - const tempFilePath = path.join(dir, filename + fileExt); - fs.copyFileSync(HandledUri, tempFilePath); - return { success: true, errMsg: '', fileName: localFileName, path: tempFilePath }; - } + case FileUriType.Local: { + const fileExt = path.extname(HandledUri); + const localFileName = path.basename(HandledUri, fileExt) + fileExt; + const tempFilePath = path.join(dir, filename + fileExt); + fs.copyFileSync(HandledUri, tempFilePath); + return { success: true, errMsg: '', fileName: localFileName, path: tempFilePath }; + } - case FileUriType.Remote: { - const buffer = await httpDownload({ url: HandledUri, headers: headers ?? {} }); - fs.writeFileSync(filePath, buffer); - return { success: true, errMsg: '', fileName: filename, path: filePath }; - } + case FileUriType.Remote: { + const buffer = await httpDownload({ url: HandledUri, headers: headers ?? {} }); + fs.writeFileSync(filePath, buffer); + return { success: true, errMsg: '', fileName: filename, path: filePath }; + } - case FileUriType.Base64: { - const base64 = HandledUri.replace(/^base64:\/\//, ''); - const base64Buffer = Buffer.from(base64, 'base64'); - fs.writeFileSync(filePath, base64Buffer); - return { success: true, errMsg: '', fileName: filename, path: filePath }; - } + case FileUriType.Base64: { + const base64 = HandledUri.replace(/^base64:\/\//, ''); + const base64Buffer = Buffer.from(base64, 'base64'); + fs.writeFileSync(filePath, base64Buffer); + return { success: true, errMsg: '', fileName: filename, path: filePath }; + } - default: - return { success: false, errMsg: `识别URL失败, uri= ${uri}`, fileName: '', path: '' }; + default: + return { success: false, errMsg: `识别URL失败, uri= ${uri}`, fileName: '', path: '' }; } } diff --git a/src/common/worker.ts b/src/common/worker.ts index da5c1321..1e2bc0b7 100644 --- a/src/common/worker.ts +++ b/src/common/worker.ts @@ -9,7 +9,7 @@ export async function runTask(workerScript: string, taskData: T): Promise< console.error('Worker Log--->:', (result as { log: string }).log); } if ((result as any)?.error) { - reject(new Error("Worker error: " + (result as { error: string }).error)); + reject(new Error('Worker error: ' + (result as { error: string }).error)); } resolve(result); }); diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index 616ccb71..2f66490a 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -44,7 +44,7 @@ export class NTQQFileApi { 'https://secret-service.bietiaop.com/rkeys', 'http://ss.xingzhige.com/music_card/rkey', ], - this.context.logger + this.context.logger ); } @@ -308,18 +308,18 @@ export class NTQQFileApi { element.elementType === ElementType.FILE ) { switch (element.elementType) { - case ElementType.PIC: + case ElementType.PIC: element.picElement!.sourcePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.VIDEO: + break; + case ElementType.VIDEO: element.videoElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.PTT: + break; + case ElementType.PTT: element.pttElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.FILE: + break; + case ElementType.FILE: element.fileElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; + break; } elementIndex++; } diff --git a/src/core/helper/config.ts b/src/core/helper/config.ts index 0c2540c1..6c230056 100644 --- a/src/core/helper/config.ts +++ b/src/core/helper/config.ts @@ -1,22 +1,21 @@ import { ConfigBase } from '@/common/config-base'; import { NapCatCore } from '@/core'; -import { Type, Static } from '@sinclair/typebox'; -import { AnySchema } from 'ajv'; +import { z } from 'zod'; -export const NapcatConfigSchema = Type.Object({ - fileLog: Type.Boolean({ default: false }), - consoleLog: Type.Boolean({ default: true }), - fileLogLevel: Type.String({ default: 'debug' }), - consoleLogLevel: Type.String({ default: 'info' }), - packetBackend: Type.String({ default: 'auto' }), - packetServer: Type.String({ default: '' }), - o3HookMode: Type.Number({ default: 0 }), +export const NapcatConfigSchema = z.object({ + fileLog: z.boolean().default(false), + consoleLog: z.boolean().default(true), + fileLogLevel: z.string().default('debug'), + consoleLogLevel: z.string().default('info'), + packetBackend: z.string().default('auto'), + packetServer: z.string().default(''), + o3HookMode: z.number().default(0), }); -export type NapcatConfig = Static; +export type NapcatConfig = z.infer; export class NapCatConfigLoader extends ConfigBase { - constructor(core: NapCatCore, configPath: string, schema: AnySchema) { + constructor(core: NapCatCore, configPath: string, schema: z.ZodType) { super('napcat', core, configPath, schema); } -} +} \ No newline at end of file diff --git a/src/core/types/webapi.ts b/src/core/types/webapi.ts index c689d860..c9771cba 100644 --- a/src/core/types/webapi.ts +++ b/src/core/types/webapi.ts @@ -115,7 +115,7 @@ export interface GroupEssenceMsg { add_digest_uin: string; add_digest_nick: string; add_digest_time: number; - msg_content: unknown[]; + msg_content: { msg_type: number, text?: string, image_url?: string }[]; can_be_removed: true; } diff --git a/src/onebot/action/OneBotAction.ts b/src/onebot/action/OneBotAction.ts index 818169e2..240ea5e8 100644 --- a/src/onebot/action/OneBotAction.ts +++ b/src/onebot/action/OneBotAction.ts @@ -1,9 +1,8 @@ import { ActionName, BaseCheckResult } from './router'; -import Ajv, { ErrorObject, ValidateFunction } from 'ajv'; import { NapCatCore } from '@/core'; import { NapCatOneBot11Adapter, OB11Return } from '@/onebot'; import { NetworkAdapterConfig } from '../config/config'; -import { TSchema } from '@sinclair/typebox'; +import { z } from 'zod'; export class OB11Response { private static createResponse(data: T, status: string, retcode: number, message: string = '', echo: unknown = null): OB11Return { @@ -33,8 +32,7 @@ export class OB11Response { export abstract class OneBotAction { actionName: typeof ActionName[keyof typeof ActionName] = ActionName.Unknown; core: NapCatCore; - private validate?: ValidateFunction = undefined; - payloadSchema?: TSchema = undefined; + payloadSchema?: z.ZodType = undefined; obContext: NapCatOneBot11Adapter; constructor(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -42,19 +40,30 @@ export abstract class OneBotAction { this.core = core; } - protected async check(payload: PayloadType): Promise { - if (this.payloadSchema) { - this.validate = new Ajv({ allowUnionTypes: true, useDefaults: true, coerceTypes: true }).compile(this.payloadSchema); + protected async check(payload: unknown): Promise { + if (!this.payloadSchema) { + return { valid: true }; } - if (this.validate && !this.validate(payload)) { - const errors = this.validate.errors as ErrorObject[]; - const errorMessages = errors.map(e => `Key: ${e.instancePath.split('/').slice(1).join('.')}, Message: ${e.message}`); + + try { + // 使用 zod 验证并转换数据 + this.payloadSchema.parse(payload); + return { valid: true }; + } catch (error) { + if (error instanceof z.ZodError) { + const errorMessages = error.errors.map(e => + `Key: ${e.path.join('.')}, Message: ${e.message}` + ); + return { + valid: false, + message: errorMessages.join('\n') || '未知错误', + }; + } return { valid: false, - message: errorMessages.join('\n') ?? '未知错误', + message: '验证过程中发生未知错误' }; } - return { valid: true }; } public async handle(payload: PayloadType, adaptername: string, config: NetworkAdapterConfig): Promise> { @@ -86,4 +95,4 @@ export abstract class OneBotAction { } abstract _handle(payload: PayloadType, adaptername: string, config: NetworkAdapterConfig): Promise; -} +} \ No newline at end of file diff --git a/src/onebot/action/extends/ClickInlineKeyboardButton.ts b/src/onebot/action/extends/ClickInlineKeyboardButton.ts index f27acfb2..4e7983f3 100644 --- a/src/onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/src/onebot/action/extends/ClickInlineKeyboardButton.ts @@ -1,16 +1,15 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '../OneBotAction'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + group_id: z.string(), + bot_appid: z.string(), + button_id: z.string().default(''), + callback_data: z.string().default(''), + msg_seq: z.string().default('10086'), }); - -type Payload = Static; +type Payload = z.infer; export class ClickInlineKeyboardButton extends OneBotAction { override actionName = ActionName.ClickInlineKeyboardButton; @@ -25,6 +24,6 @@ export class ClickInlineKeyboardButton extends OneBotAction { callback_data: payload.callback_data, dmFlag: 0, chatType: 2 - }) + }); } } diff --git a/src/onebot/action/extends/CreateCollection.ts b/src/onebot/action/extends/CreateCollection.ts index 3f9c841f..ee682241 100644 --- a/src/onebot/action/extends/CreateCollection.ts +++ b/src/onebot/action/extends/CreateCollection.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Type, Static } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - rawData: Type.String(), - brief: Type.String(), +const SchemaData = z.object({ + rawData: z.string(), + brief: z.string(), }); -type Payload = Static; +type Payload = z.infer; export class CreateCollection extends OneBotAction { override actionName = ActionName.CreateCollection; diff --git a/src/onebot/action/extends/FetchCustomFace.ts b/src/onebot/action/extends/FetchCustomFace.ts index f2850097..78b1800d 100644 --- a/src/onebot/action/extends/FetchCustomFace.ts +++ b/src/onebot/action/extends/FetchCustomFace.ts @@ -1,12 +1,12 @@ -import { Type, Static } from '@sinclair/typebox'; +import { z } from 'zod'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -const SchemaData = Type.Object({ - count: Type.Union([Type.Number(), Type.String()], { default: 48 }), +const SchemaData = z.object({ + count: z.number().default(48), }); -type Payload = Static; +type Payload = z.infer; export class FetchCustomFace extends OneBotAction { override actionName = ActionName.FetchCustomFace; diff --git a/src/onebot/action/extends/FetchEmojiLike.ts b/src/onebot/action/extends/FetchEmojiLike.ts index 39bab1a7..83749d0e 100644 --- a/src/onebot/action/extends/FetchEmojiLike.ts +++ b/src/onebot/action/extends/FetchEmojiLike.ts @@ -1,17 +1,17 @@ -import { Type, Static } from '@sinclair/typebox'; +import { z } from 'zod'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { type NTQQMsgApi } from '@/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 }), +const SchemaData = z.object({ + message_id: z.string(), + emojiId: z.string(), + emojiType: z.string(), + count: z.number().default(20), }); -type Payload = Static; +type Payload = z.infer; export class FetchEmojiLike extends OneBotAction>> { override actionName = ActionName.FetchEmojiLike; @@ -23,7 +23,7 @@ export class FetchEmojiLike extends OneBotAction; +type Payload = z.infer; interface GetAiCharactersResponse { type: string; diff --git a/src/onebot/action/extends/GetCollectionList.ts b/src/onebot/action/extends/GetCollectionList.ts index 2de4305f..47fb9c4e 100644 --- a/src/onebot/action/extends/GetCollectionList.ts +++ b/src/onebot/action/extends/GetCollectionList.ts @@ -1,14 +1,14 @@ import { type NTQQCollectionApi } from '@/core/apis/collection'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Type, Static } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - category: Type.Union([Type.Number(), Type.String()]), - count: Type.Union([Type.Union([Type.Number(), Type.String()])], { default: 1 }), +const SchemaData = z.object({ + category: z.number(), + count: z.number().default(1), }); -type Payload = Static; +type Payload = z.infer; export class GetCollectionList extends OneBotAction>> { override actionName = ActionName.GetCollectionList; diff --git a/src/onebot/action/extends/GetGroupInfoEx.ts b/src/onebot/action/extends/GetGroupInfoEx.ts index c566a105..b38f92f8 100644 --- a/src/onebot/action/extends/GetGroupInfoEx.ts +++ b/src/onebot/action/extends/GetGroupInfoEx.ts @@ -1,17 +1,17 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Type, Static } from '@sinclair/typebox'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +import { z } from 'zod'; +const SchemaData = z.object({ + group_id: z.string(), }); -type Payload = Static; +type Payload = z.infer; export class GetGroupInfoEx extends OneBotAction { override actionName = ActionName.GetGroupInfoEx; override payloadSchema = SchemaData; async _handle(payload: Payload) { - return (await this.core.apis.GroupApi.getGroupExtFE0Info([payload.group_id.toString()])).result.groupExtInfos.get(payload.group_id.toString()); + return (await this.core.apis.GroupApi.getGroupExtFE0Info([payload.group_id])).result.groupExtInfos.get(payload.group_id); } } diff --git a/src/onebot/action/extends/GetMiniAppArk.ts b/src/onebot/action/extends/GetMiniAppArk.ts index 6ab90445..e4d3c1c5 100644 --- a/src/onebot/action/extends/GetMiniAppArk.ts +++ b/src/onebot/action/extends/GetMiniAppArk.ts @@ -2,38 +2,38 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { MiniAppInfo, MiniAppInfoHelper } from '@/core/packet/utils/helper/miniAppHelper'; import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from '@/core/packet/entities/miniApp'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = 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()])) +const SchemaData = z.union([ + z.object({ + type: z.union([z.literal('bili'), z.literal('weibo')]), + title: z.string(), + desc: z.string(), + picUrl: z.string(), + jumpUrl: z.string(), + webUrl: z.string().optional(), + rawArkData: z.string().optional() }), - 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()])) + z.object({ + title: z.string(), + desc: z.string(), + picUrl: z.string(), + jumpUrl: z.string(), + iconUrl: z.string(), + webUrl: z.string().optional(), + appId: z.string(), + scene: z.union([z.number(), z.string()]), + templateType: z.union([z.number(), z.string()]), + businessType: z.union([z.number(), z.string()]), + verType: z.union([z.number(), z.string()]), + shareType: z.union([z.number(), z.string()]), + versionId: z.string(), + sdkId: z.string(), + withShareTicket: z.union([z.number(), z.string()]), + rawArkData: z.string().optional() }) ]); -type Payload = Static; +type Payload = z.infer; export class GetMiniAppArk extends GetPacketStatusDepends; +type Payload = z.infer; export class GetProfileLike extends OneBotAction { uint64_uin: self_id, uint64_top: 0, uint32_req_num: 99, - bytes_cookies: "" + bytes_cookies: '' }; const packed_data = await this.pack_data(JSON.stringify(req_json)); const data = Buffer.from(packed_data).toString('hex'); diff --git a/src/onebot/action/extends/GetUserStatus.ts b/src/onebot/action/extends/GetUserStatus.ts index 3987c81a..c090cc3a 100644 --- a/src/onebot/action/extends/GetUserStatus.ts +++ b/src/onebot/action/extends/GetUserStatus.ts @@ -1,18 +1,18 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), +const SchemaData = z.object({ + user_id: z.number(), }); -type Payload = Static; +type Payload = z.infer; export class GetUserStatus extends GetPacketStatusDepends { override actionName = ActionName.GetUserStatus; override payloadSchema = SchemaData; async _handle(payload: Payload) { - return await this.core.apis.PacketApi.pkt.operation.GetStrangerStatus(+payload.user_id); + return await this.core.apis.PacketApi.pkt.operation.GetStrangerStatus(payload.user_id); } } diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index 110551bc..31856e09 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -1,16 +1,16 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + file_id: z.string(), + current_parent_directory: z.string(), + target_parent_directory: z.string(), }); -type Payload = Static; +type Payload = z.infer; interface MoveGroupFileResponse { ok: boolean; diff --git a/src/onebot/action/extends/OCRImage.ts b/src/onebot/action/extends/OCRImage.ts index 3b45c64e..73776de8 100644 --- a/src/onebot/action/extends/OCRImage.ts +++ b/src/onebot/action/extends/OCRImage.ts @@ -2,14 +2,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { checkFileExist, uriToLocalFile } from '@/common/file'; import fs from 'fs'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; import { GeneralCallResultStatus } from '@/core'; -const SchemaData = Type.Object({ - image: Type.String(), +const SchemaData = z.object({ + image: z.string(), }); -type Payload = Static; +type Payload = z.infer; class OCRImageBase extends OneBotAction { override payloadSchema = SchemaData; diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index a567ea55..69b4e9f6 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -1,16 +1,16 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + file_id: z.string(), + current_parent_directory: z.string(), + new_name: z.string(), }); -type Payload = Static; +type Payload = z.infer; interface RenameGroupFileResponse { ok: boolean; diff --git a/src/onebot/action/extends/SendPacket.ts b/src/onebot/action/extends/SendPacket.ts index 479b10f7..a43b894e 100644 --- a/src/onebot/action/extends/SendPacket.ts +++ b/src/onebot/action/extends/SendPacket.ts @@ -1,22 +1,21 @@ import { PacketHexStr } from '@/core/packet/transformer/base'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - cmd: Type.String(), - data: Type.String(), - rsp: Type.Union([Type.String(), Type.Boolean()], { default: true }), +const SchemaData = z.object({ + cmd: z.string(), + data: z.string(), + rsp: z.boolean().default(true), }); -type Payload = Static; +type Payload = z.infer; export class SendPacket extends GetPacketStatusDepends { override payloadSchema = SchemaData; override actionName = ActionName.SendPacket; async _handle(payload: Payload) { - 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: payload.data as PacketHexStr }, rsp); + const data = await this.core.apis.PacketApi.pkt.operation.sendPacket({ cmd: payload.cmd, data: payload.data as PacketHexStr }, payload.rsp); return typeof data === 'object' ? data.toString('hex') : undefined; } } diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index 82e903ca..2c1110ac 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + face_id: z.union([z.number(), z.string()]),// 参考 face_config.json 的 QSid + face_type: z.union([z.number(), z.string()]).default('1'), + wording: z.string().default(' '), }); -type Payload = Static; +type Payload = z.infer; export class SetDiyOnlineStatus extends OneBotAction { override actionName = ActionName.SetDiyOnlineStatus; diff --git a/src/onebot/action/extends/SetGroupRemark.ts b/src/onebot/action/extends/SetGroupRemark.ts index a8dbf5a9..cd26beb3 100644 --- a/src/onebot/action/extends/SetGroupRemark.ts +++ b/src/onebot/action/extends/SetGroupRemark.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.String(), - remark: Type.String(), +const SchemaData = z.object({ + group_id: z.string(), + remark: z.string(), }); -type Payload = Static; +type Payload = z.infer; export default class SetGroupRemark extends OneBotAction { override actionName = ActionName.SetGroupRemark; diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index 716aca22..9bc0775a 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -1,12 +1,12 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), }); -type Payload = Static; +type Payload = z.infer; class SetGroupSignBase extends GetPacketStatusDepends { override payloadSchema = SchemaData; diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index 448c00ff..df8cfef5 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { ChatType } from '@/core'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), - event_type: Type.Number(), +const SchemaData = z.object({ + user_id: z.union([z.number(), z.string()]), + event_type: z.number(), }); -type Payload = Static; +type Payload = z.infer; export class SetInputStatus extends OneBotAction { override actionName = ActionName.SetInputStatus; diff --git a/src/onebot/action/extends/SetLongNick.ts b/src/onebot/action/extends/SetLongNick.ts index 5169bada..4403d607 100644 --- a/src/onebot/action/extends/SetLongNick.ts +++ b/src/onebot/action/extends/SetLongNick.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - longNick: Type.String(), +const SchemaData = z.object({ + longNick: z.string(), }); -type Payload = Static; +type Payload = z.infer; export class SetLongNick extends OneBotAction { override actionName = ActionName.SetLongNick; diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index 6e1782e9..999ee261 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + status: z.union([z.number(), z.string()]), + ext_status: z.union([z.number(), z.string()]), + battery_status: z.union([z.number(), z.string()]), }); -type Payload = Static; +type Payload = z.infer; export class SetOnlineStatus extends OneBotAction { override actionName = ActionName.SetOnlineStatus; diff --git a/src/onebot/action/extends/SetQQAvatar.ts b/src/onebot/action/extends/SetQQAvatar.ts index c4e019aa..5fb8b50f 100644 --- a/src/onebot/action/extends/SetQQAvatar.ts +++ b/src/onebot/action/extends/SetQQAvatar.ts @@ -2,13 +2,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import fs from 'node:fs/promises'; import { checkFileExist, uriToLocalFile } from '@/common/file'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - file: Type.String(), +const SchemaData = z.object({ + file: z.string(), }); -type Payload = Static; +type Payload = z.infer; export default class SetAvatar extends OneBotAction { override actionName = ActionName.SetQQAvatar; diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index 7d68ff36..2efe2727 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -1,14 +1,14 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + special_title: z.string({ default: '' }), }); -type Payload = Static; +type Payload = z.infer; export class SetSpecialTitle extends GetPacketStatusDepends { override actionName = ActionName.SetSpecialTitle; diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index 22c8654b..edf18ecb 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -1,15 +1,15 @@ import { GeneralCallResult } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), - group_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), - phoneNumber: Type.String({ default: '' }), +const SchemaData = z.object({ + user_id: z.union([z.number(), z.string()]).optional(), + group_id: z.union([z.number(), z.string()]).optional(), + phoneNumber: z.string().default(''), }); -type Payload = Static; +type Payload = z.infer; export class SharePeer extends OneBotAction; +type PayloadGroupEx = z.infer; export class ShareGroupEx extends OneBotAction { override actionName = ActionName.ShareGroupEx; diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index 35b3275a..746c190d 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -1,14 +1,14 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - file_id: Type.String(), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + file_id: z.string(), }); -type Payload = Static; +type Payload = z.infer; interface TransGroupFileResponse { ok: boolean; diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index 2edb8b83..46a59408 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - words: Type.Array(Type.String()), +const SchemaData = z.object({ + words: Type.Array(z.string()), }); -type Payload = Static; +type Payload = z.infer; export class TranslateEnWordToZn extends OneBotAction | null> { override actionName = ActionName.TranslateEnWordToZn; diff --git a/src/onebot/action/file/GetFile.ts b/src/onebot/action/file/GetFile.ts index 853261cd..d2d87fa1 100644 --- a/src/onebot/action/file/GetFile.ts +++ b/src/onebot/action/file/GetFile.ts @@ -3,7 +3,7 @@ import fs from 'fs/promises'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { ActionName } from '@/onebot/action/router'; import { OB11MessageImage, OB11MessageVideo } from '@/onebot/types'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; export interface GetFileResponse { file?: string; // path @@ -13,13 +13,13 @@ export interface GetFileResponse { base64?: string; } -const GetFileBase_PayloadSchema = Type.Object({ - file: Type.Optional(Type.String()), - file_id: Type.Optional(Type.String()) +const GetFileBase_PayloadSchema = z.object({ + file: z.string().optional(), + file_id: z.string().optional(), }); -export type GetFilePayload = Static; +export type GetFilePayload = z.infer; export class GetFileBase extends OneBotAction { override payloadSchema = GetFileBase_PayloadSchema; diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index 0ae7d314..ebf28021 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -1,14 +1,14 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - file_id: Type.String(), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + file_id: z.string(), }); -type Payload = Static; +type Payload = z.infer; interface GetGroupFileUrlResponse { url?: string; diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts index f592cc08..4504cc20 100644 --- a/src/onebot/action/file/GetPrivateFileUrl.ts +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -1,13 +1,13 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - file_id: Type.String(), +const SchemaData = z.object({ + file_id: z.string(), }); -type Payload = Static; +type Payload = z.infer; interface GetPrivateFileUrlResponse { url?: string; diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 760929ea..4a0dea63 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - folder_name: Type.String(), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + folder_name: z.string(), }); -type Payload = Static; +type Payload = z.infer; interface ResponseType{ result:unknown; groupItem:unknown; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index 7db532a3..84343f54 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -2,15 +2,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - file_id: Type.String(), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + file_id: z.string(), }); -type Payload = Static; +type Payload = z.infer; export class DeleteGroupFile extends OneBotAction>> { override actionName = ActionName.GOCQHTTP_DeleteGroupFile; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 818c10a0..6e12986b 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -1,15 +1,15 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; import { NTQQGroupApi } from '@/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 SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + folder_id: z.string().optional(), + folder: z.string().optional(), }); -type Payload = Static; +type Payload = z.infer; export class DeleteGroupFileFolder extends OneBotAction>['groupFileCommonResult']> { override actionName = ActionName.GoCQHTTP_DeleteGroupFileFolder; diff --git a/src/onebot/action/go-cqhttp/DownloadFile.ts b/src/onebot/action/go-cqhttp/DownloadFile.ts index 32fabfb5..30e9685f 100644 --- a/src/onebot/action/go-cqhttp/DownloadFile.ts +++ b/src/onebot/action/go-cqhttp/DownloadFile.ts @@ -4,20 +4,20 @@ import fs from 'fs'; import { join as joinPath } from 'node:path'; import { calculateFileMD5, uriToLocalFile } from '@/common/file'; import { randomUUID } from 'crypto'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; 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 SchemaData = z.object({ + url: z.string().optional(), + base64: z.string().optional(), + name: z.string().optional(), + headers: z.union([z.string(), z.array(z.string())]).optional(), }); -type Payload = Static; +type Payload = z.infer; export default class GoCQHTTPDownloadFile extends OneBotAction { override actionName = ActionName.GoCQHTTP_DownloadFile; diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index 5552229b..89e9cb60 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -2,15 +2,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OB11Message, OB11MessageData, OB11MessageDataType, OB11MessageForward, OB11MessageNodePlain as OB11MessageNode } from '@/onebot'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; -import { Static, Type } from '@sinclair/typebox'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - message_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), - id: Type.Optional(Type.Union([Type.Number(), Type.String()])), +const SchemaData = z.object({ + message_id: z.union([z.number(), z.string()]).optional(), + id: z.union([z.number(), z.string()]).optional(), }); - -type Payload = Static; +type Payload = z.infer; export class GoCQHTTPGetForwardMsgAction extends OneBotAction; +type Payload = z.infer; export default class GetFriendMsgHistory extends OneBotAction { override actionName = ActionName.GetFriendMsgHistory; diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 5d4939d2..28d63901 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]) +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]) }); -type Payload = Static; +type Payload = z.infer; interface ResponseType { can_at_all: boolean; remain_at_all_count_for_group: number; diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 9f740732..8d966d35 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]) +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]) }); -type Payload = Static; +type Payload = z.infer; export class GetGroupFileSystemInfo extends OneBotAction; +type Payload = z.infer; export class GetGroupFilesByFolder extends OneBotAction[], diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index 9ead4af2..1194b67f 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -1,16 +1,16 @@ +import { WebHonorType } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { WebHonorType } from '@/core/types'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - type: Type.Optional(Type.Enum(WebHonorType)) +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + type: z.nativeEnum(WebHonorType).optional() }); -type Payload = Static; +type Payload = z.infer; -export class GetGroupHonorInfo extends OneBotAction> { +export class GetGroupHonorInfo extends OneBotAction { override actionName = ActionName.GetGroupHonorInfo; override payloadSchema = SchemaData; diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index e2fdf4e8..f2eb4044 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -3,22 +3,22 @@ import { OB11Message } from '@/onebot'; import { ActionName } from '@/onebot/action/router'; import { ChatType, Peer } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; interface Response { messages: OB11Message[]; } -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - message_seq: Type.Optional(Type.Union([Type.Number(), Type.String()])), - count: Type.Union([Type.Number(), Type.String()], { default: 20 }), - reverseOrder: Type.Optional(Type.Union([Type.Boolean(), Type.String()])) +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + message_seq: z.union([z.number(), z.string()]).optional(), + count: z.union([z.number(), z.string()]).default(20), + reverseOrder: z.union([z.boolean(), z.string()]).optional() }); -type Payload = Static; +type Payload = z.infer; export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction { diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index a4c1c916..b990aec8 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -3,14 +3,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { OB11GroupFile, OB11GroupFileFolder } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - file_count: Type.Union([Type.Number(), Type.String()], { default: 50 }), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + file_count: z.union([z.number(), z.string()]).default(50), }); -type Payload = Static; +type Payload = z.infer; export class GetGroupRootFiles extends OneBotAction; +type Payload = z.infer; export default class GoCQHTTPGetStrangerInfo extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetStrangerInfo; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index 29a9b502..dfded410 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - url: Type.String(), +const SchemaData = z.object({ + url: z.string(), }); -type Payload = Static; +type Payload = z.infer; export class GoCQHTTPCheckUrlSafely extends OneBotAction { override actionName = ActionName.GoCQHTTP_CheckUrlSafely; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index adc02cf9..e7ce50c4 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -1,15 +1,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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()), +const SchemaData = z.object({ + friend_id: z.union([z.string(), z.number()]).optional(), + user_id: z.union([z.string(), z.number()]).optional(), + temp_block: z.boolean().optional(), + temp_both_del: z.boolean().optional(), }); -type Payload = Static; +type Payload = z.infer; export class GoCQHTTPDeleteFriend extends OneBotAction { override actionName = ActionName.GoCQHTTP_DeleteFriend; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index 453db746..1e839fe3 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - model: Type.String(), +const SchemaData = z.object({ + model: z.string(), }); -type Payload = Static; +type Payload = z.infer; export class GoCQHTTPGetModelShow extends OneBotAction; +type Payload = z.infer; export class SendGroupNotice extends OneBotAction { override actionName = ActionName.GoCQHTTP_SendGroupNotice; diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index bfe0997f..765c9897 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -1,15 +1,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { checkFileExistV2, uriToLocalFile } from '@/common/file'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; -const SchemaData = Type.Object({ - file: Type.String(), - group_id: Type.Union([Type.Number(), Type.String()]) +const SchemaData = z.object({ + file: z.string(), + group_id: z.union([z.number(), z.string()]) }); -type Payload = Static; +type Payload = z.infer; export default class SetGroupPortrait extends OneBotAction { override actionName = ActionName.SetGroupPortrait; diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index 976d87b5..c85e4aa4 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -1,15 +1,15 @@ import { NTQQUserApi } from '@/core/apis'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - nickname: Type.String(), - personal_note: Type.Optional(Type.String()), - sex: Type.Optional(Type.Union([Type.Number(), Type.String()])), // 传Sex值?建议传0 +const SchemaData = z.object({ + nickname: z.string(), + personal_note: z.string().optional(), + sex: z.union([z.number(), z.string()]).optional(), // 传Sex值?建议传0 }); -type Payload = Static; +type Payload = z.infer; export class SetQQProfile extends OneBotAction> | null> { override actionName = ActionName.SetQQProfile; override payloadSchema = SchemaData; diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index 906d7e91..39327cde 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -4,17 +4,17 @@ import { ChatType, Peer } from '@/core/types'; import fs from 'fs'; import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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()),//临时扩展 +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + file: z.string(), + name: z.string(), + folder: z.string().optional(), + folder_id: z.string().optional(),//临时扩展 }); -type Payload = Static; +type Payload = z.infer; export default class GoCQHTTPUploadGroupFile extends OneBotAction { override actionName = ActionName.GoCQHTTP_UploadGroupFile; diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index f17e3edf..8cee2010 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -5,15 +5,15 @@ import fs from 'fs'; import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), - file: Type.String(), - name: Type.String(), +const SchemaData = z.object({ + user_id: z.union([z.number(), z.string()]), + file: z.string(), + name: z.string(), }); -type Payload = Static; +type Payload = z.infer; export default class GoCQHTTPUploadPrivateFile extends OneBotAction { override actionName = ActionName.GOCQHTTP_UploadPrivateFile; diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index ccb20a58..b799b651 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - message_id: Type.Union([Type.Number(), Type.String()]), +const SchemaData = z.object({ + message_id: z.union([z.number(), z.string()]), }); -type Payload = Static; +type Payload = z.infer; export default class DelEssenceMsg extends OneBotAction { override actionName = ActionName.DelEssenceMsg; override payloadSchema = SchemaData; diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index 04f9cbea..bd2dae0a 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - notice_id: Type.String() +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + notice_id: z.string() }); -type Payload = Static; +type Payload = z.infer; export class DelGroupNotice extends OneBotAction { override actionName = ActionName.DelGroupNotice; diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index 0eeac7ab..ba30f9d9 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -1,15 +1,15 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - character: Type.String(), - group_id: Type.Union([Type.Number(), Type.String()]), - text: Type.String(), +const SchemaData = z.object({ + character: z.string(), + group_id: z.union([z.number(), z.string()]), + text: z.string(), }); -type Payload = Static; +type Payload = z.infer; export class GetAiRecord extends GetPacketStatusDepends { override actionName = ActionName.GetAiRecord; diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 91deb65c..9ce8c310 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -3,14 +3,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import crypto from 'crypto'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), }); -type Payload = Static; +type Payload = z.infer; export class GetGroupEssence extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetEssenceMsg; diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index dd0a40bc..2bb5ff72 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -2,13 +2,13 @@ import { OB11Group } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), }); -type Payload = Static; +type Payload = z.infer; class GetGroupInfo extends OneBotAction { override actionName = ActionName.GetGroupInfo; diff --git a/src/onebot/action/group/GetGroupList.ts b/src/onebot/action/group/GetGroupList.ts index 251b79aa..5ed487b9 100644 --- a/src/onebot/action/group/GetGroupList.ts +++ b/src/onebot/action/group/GetGroupList.ts @@ -2,13 +2,13 @@ import { OB11Group } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const SchemaData = z.object({ + no_cache: z.boolean().default(false), }); -type Payload = Static; +type Payload = z.infer; class GetGroupList extends OneBotAction { override actionName = ActionName.GetGroupList; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index 03938f27..75834049 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -2,15 +2,15 @@ import { OB11GroupMember } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + no_cache: z.boolean().default(false), }); -type Payload = Static; +type Payload = z.infer; class GetGroupMemberInfo extends OneBotAction { override actionName = ActionName.GetGroupMemberInfo; diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 41e028bf..efd5073c 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -2,15 +2,15 @@ import { OB11GroupMember } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; import { GroupMember } from '@/core'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])) +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + no_cache: z.boolean().default(false) }); -type Payload = Static; +type Payload = z.infer; export class GetGroupMemberList extends OneBotAction { override actionName = ActionName.GetGroupMemberList; diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index fe952557..317d712c 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -1,7 +1,7 @@ import { WebApiGroupNoticeFeed } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; interface GroupNotice { sender_id: number; publish_time: number; @@ -16,11 +16,11 @@ interface GroupNotice { }; } -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), }); -type Payload = Static; +type Payload = z.infer; type ApiGroupNotice = GroupNotice & WebApiGroupNoticeFeed; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index 05ab27de..3e82f5e3 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -1,13 +1,13 @@ import { ShutUpGroupMember } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), }); -type Payload = Static; +type Payload = z.infer; export class GetGroupShutList extends OneBotAction { override actionName = ActionName.GetGroupShutList; diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index 8dcc8815..c318211c 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -1,13 +1,13 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - user_id: Type.Union([Type.Number(), Type.String()]), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), }); -type Payload = Static; +type Payload = z.infer; export class GroupPoke extends GetPacketStatusDepends { override actionName = ActionName.GroupPoke; diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index 7cfd5f85..1e0c3a03 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -1,15 +1,15 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - character: Type.String(), - group_id: Type.Union([Type.Number(), Type.String()]), - text: Type.String(), +const SchemaData = z.object({ + character: z.string(), + group_id: z.union([z.number(), z.string()]), + text: z.string(), }); -type Payload = Static; +type Payload = z.infer; export class SendGroupAiRecord extends GetPacketStatusDepends; +type Payload = z.infer; export default class SetEssenceMsg extends OneBotAction { override actionName = ActionName.SetEssenceMsg; diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index 8cd69bcd..8a5834e0 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -1,15 +1,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupRequestOperateTypes } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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()])), +const SchemaData = z.object({ + flag: z.union([z.string(), z.number()]), + approve: z.boolean().default(true), + reason: z.union([z.string(), z.null()]).default(' '), }); -type Payload = Static; +type Payload = z.infer; export default class SetGroupAddRequest extends OneBotAction { override actionName = ActionName.SetGroupAddRequest; diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index ee70edfb..6ad18f06 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -1,15 +1,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupMemberRole } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + enable: z.boolean().default(false), }); -type Payload = Static; +type Payload = z.infer; export default class SetGroupAdmin extends OneBotAction { override actionName = ActionName.SetGroupAdmin; diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index 3f30aa1f..4312e628 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + duration: z.union([z.number(), z.string()]).default(0), }); -type Payload = Static; +type Payload = z.infer; export default class SetGroupBan extends OneBotAction { override actionName = ActionName.SetGroupBan; diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index 2e825c68..bd45f957 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + card: z.string().optional(), }); -type Payload = Static; +type Payload = z.infer; export default class SetGroupCard extends OneBotAction { override actionName = ActionName.SetGroupCard; diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index 7b57d48c..3967ad96 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + reject_add_request: z.union([z.boolean(), z.string()]).optional(), }); -type Payload = Static; +type Payload = z.infer; export default class SetGroupKick extends OneBotAction { override actionName = ActionName.SetGroupKick; diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index 4d9a4083..6930af12 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - is_dismiss: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + is_dismiss: z.boolean().optional(), }); -type Payload = Static; +type Payload = z.infer; export default class SetGroupLeave extends OneBotAction { override actionName = ActionName.SetGroupLeave; diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index cde09908..d19e9782 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - group_name: Type.String(), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + group_name: z.string(), }); -type Payload = Static; +type Payload = z.infer; export default class SetGroupName extends OneBotAction { override actionName = ActionName.SetGroupName; diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index a4c84c44..dc1ee1a3 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - enable: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const SchemaData = z.object({ + group_id: z.union([z.number(), z.string()]), + enable: z.union([z.boolean(), z.string()]).optional(), }); -type Payload = Static; +type Payload = z.infer; export default class SetGroupWholeBan extends OneBotAction { override actionName = ActionName.SetGroupWholeBan; diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index a4b27aa2..9aa67a30 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -1,13 +1,13 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - message_id: Type.Union([Type.Number(), Type.String()]), +const SchemaData = z.object({ + message_id: z.union([z.number(), z.string()]), }); -type Payload = Static; +type Payload = z.infer; class DeleteMsg extends OneBotAction { override actionName = ActionName.DeleteMsg; diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index 7156159c..bc2f5546 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -2,15 +2,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ChatType, Peer } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + message_id: z.union([z.number(), z.string()]), + group_id: z.string().optional(), + user_id: z.string().optional(), }); -type Payload = Static; +type Payload = z.infer; class ForwardSingleMsg extends OneBotAction { protected async getTargetPeer(payload: Payload): Promise { diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index 08b2e955..28cc629a 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -3,16 +3,16 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { RawMessage } from '@/core'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; export type ReturnDataType = OB11Message -const SchemaData = Type.Object({ - message_id: Type.Union([Type.Number(), Type.String()]), +const SchemaData = z.object({ + message_id: z.union([z.number(), z.string()]), }); -type Payload = Static; +type Payload = z.infer; class GetMsg extends OneBotAction { override actionName = ActionName.GetMsg; diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index f36a653a..98f5a9cf 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -2,15 +2,15 @@ import { ChatType, Peer } from '@/core/types'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + user_id: z.union([z.string(), z.number()]).optional(), + group_id: z.union([z.string(), z.number()]).optional(), + message_id: z.union([z.string(), z.number()]).optional(), }); -type PlayloadType = Static; +type PlayloadType = z.infer; class MarkMsgAsRead extends OneBotAction { async getPeer(payload: PlayloadType): Promise { diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index 02ce4e01..b7ddf580 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -1,15 +1,15 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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 SchemaData = z.object({ + message_id: z.union([z.number(), z.string()]), + emoji_id: z.union([z.number(), z.string()]), + set: z.boolean().optional(), }); -type Payload = Static; +type Payload = z.infer; export class SetMsgEmojiLike extends OneBotAction { override actionName = ActionName.SetMsgEmojiLike; diff --git a/src/onebot/action/packet/GetRkeyEx.ts b/src/onebot/action/packet/GetRkeyEx.ts index d330b8ee..ca95dfbd 100644 --- a/src/onebot/action/packet/GetRkeyEx.ts +++ b/src/onebot/action/packet/GetRkeyEx.ts @@ -8,7 +8,7 @@ export class GetRkeyEx extends GetPacketStatusDepends { let rkeys = await this.core.apis.PacketApi.pkt.operation.FetchRkey(); return rkeys.map(rkey => { return { - type: rkey.type === 10 ? "private" : "group", + type: rkey.type === 10 ? 'private' : 'group', rkey: rkey.rkey, created_at: rkey.time, ttl: rkey.ttl, diff --git a/src/onebot/action/packet/GetRkeyServer.ts b/src/onebot/action/packet/GetRkeyServer.ts index ebfa7049..17e04c35 100644 --- a/src/onebot/action/packet/GetRkeyServer.ts +++ b/src/onebot/action/packet/GetRkeyServer.ts @@ -30,7 +30,7 @@ export class GetRkeyServer extends GetPacketStatusDepends; +type Payload = z.infer; export class SendPoke extends GetPacketStatusDepends { override actionName = ActionName.SendPoke; diff --git a/src/onebot/action/system/GetCredentials.ts b/src/onebot/action/system/GetCredentials.ts index 90ef79ca..a8d50e16 100644 --- a/src/onebot/action/system/GetCredentials.ts +++ b/src/onebot/action/system/GetCredentials.ts @@ -1,17 +1,17 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; interface Response { cookies: string, token: number } -const SchemaData = Type.Object({ - domain: Type.String() +const SchemaData = z.object({ + domain: z.string() }); -type Payload = Static; +type Payload = z.infer; export class GetCredentials extends OneBotAction { diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index e447a987..644763eb 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -1,12 +1,12 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]) +const SchemaData = z.object({ + user_id: z.union([z.number(), z.string()]) }); -type Payload = Static; +type Payload = z.infer; export class FriendPoke extends GetPacketStatusDepends { override actionName = ActionName.FriendPoke; diff --git a/src/onebot/action/user/GetCookies.ts b/src/onebot/action/user/GetCookies.ts index 00773fe3..bc3e34e0 100644 --- a/src/onebot/action/user/GetCookies.ts +++ b/src/onebot/action/user/GetCookies.ts @@ -1,16 +1,16 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; interface Response { cookies: string, bkn: string } -const SchemaData = Type.Object({ - domain: Type.String() +const SchemaData = z.object({ + domain: z.string() }); -type Payload = Static; +type Payload = z.infer; export class GetCookies extends OneBotAction { override actionName = ActionName.GetCookies; diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index 6850f0f6..227ca12f 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -2,13 +2,13 @@ import { OB11User } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), +const SchemaData = z.object({ + no_cache: z.boolean().optional(), }); -type Payload = Static; +type Payload = z.infer; export default class GetFriendList extends OneBotAction { override actionName = ActionName.GetFriendList; diff --git a/src/onebot/action/user/GetRecentContact.ts b/src/onebot/action/user/GetRecentContact.ts index 91f25484..01b3fc0f 100644 --- a/src/onebot/action/user/GetRecentContact.ts +++ b/src/onebot/action/user/GetRecentContact.ts @@ -2,13 +2,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - count: Type.Union([Type.Number(), Type.String()], { default: 10 }), +const SchemaData = z.object({ + count: z.number().default(10), }); -type Payload = Static; +type Payload = z.infer; export default class GetRecentContact extends OneBotAction { override actionName = ActionName.GetRecentContact; diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 828b46a5..04b719c0 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -const SchemaData = Type.Object({ - times: Type.Union([Type.Number(), Type.String()], { default: 1 }), - user_id: Type.Union([Type.Number(), Type.String()]) +const SchemaData = z.object({ + times: z.union([z.number(), z.string()]).default(1), + user_id: z.union([z.number(), z.string()]) }); -type Payload = Static; +type Payload = z.infer; export default class SendLike extends OneBotAction { override actionName = ActionName.SendLike; diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index bda5964a..72551a9e 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { Static, Type } from '@sinclair/typebox'; +import { z } from 'zod'; -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()) +const SchemaData = z.object({ + flag: z.union([z.string(), z.number()]), + approve: z.union([z.string(), z.boolean()]).default(true), + remark: z.union([z.string(), z.null()]).nullable().optional() }); -type Payload = Static; +type Payload = z.infer; export default class SetFriendAddRequest extends OneBotAction { override actionName = ActionName.SetFriendAddRequest; diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 86e943eb..107a66cc 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -1000,16 +1000,16 @@ export class OneBotMsgApi { const calculateTotalSize = async (elements: SendMessageElement[]): Promise => { const sizePromises = elements.map(async element => { switch (element.elementType) { - case ElementType.PTT: - return (await fsPromise.stat(element.pttElement.filePath)).size; - case ElementType.FILE: - return (await fsPromise.stat(element.fileElement.filePath)).size; - case ElementType.VIDEO: - return (await fsPromise.stat(element.videoElement.filePath)).size; - case ElementType.PIC: - return (await fsPromise.stat(element.picElement.sourcePath)).size; - default: - return 0; + case ElementType.PTT: + return (await fsPromise.stat(element.pttElement.filePath)).size; + case ElementType.FILE: + return (await fsPromise.stat(element.fileElement.filePath)).size; + case ElementType.VIDEO: + return (await fsPromise.stat(element.videoElement.filePath)).size; + case ElementType.PIC: + return (await fsPromise.stat(element.picElement.sourcePath)).size; + default: + return 0; } }); const sizes = await Promise.all(sizePromises); @@ -1099,14 +1099,14 @@ export class OneBotMsgApi { groupChangDecreseType2String(type: number): GroupDecreaseSubType { switch (type) { - case 130: - return 'leave'; - case 131: - return 'kick'; - case 3: - return 'kick_me'; - default: - return 'kick'; + case 130: + return 'leave'; + case 131: + return 'kick'; + case 3: + return 'kick_me'; + default: + return 'kick'; } } diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index cfa9c4a1..ffc29339 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,108 +1,107 @@ -import { Type, Static } from '@sinclair/typebox'; -import Ajv from 'ajv'; +import { z } from 'zod'; -const HttpServerConfigSchema = Type.Object({ - name: Type.String({ default: 'http-server' }), - enable: Type.Boolean({ default: false }), - port: Type.Number({ default: 3000 }), - host: Type.String({ default: '0.0.0.0' }), - enableCors: Type.Boolean({ default: true }), - enableWebsocket: Type.Boolean({ default: true }), - messagePostFormat: Type.String({ default: 'array' }), - token: Type.String({ default: '' }), - debug: Type.Boolean({ default: false }) +const HttpServerConfigSchema = z.object({ + name: z.string().default('http-server'), + enable: z.boolean().default(false), + port: z.number().default(3000), + host: z.string().default('0.0.0.0'), + enableCors: z.boolean().default(true), + enableWebsocket: z.boolean().default(true), + messagePostFormat: z.string().default('array'), + token: z.string().default(''), + debug: z.boolean().default(false) }); -const HttpSseServerConfigSchema = Type.Object({ - name: Type.String({ default: 'http-sse-server' }), - enable: Type.Boolean({ default: false }), - port: Type.Number({ default: 3000 }), - host: Type.String({ default: '0.0.0.0' }), - enableCors: Type.Boolean({ default: true }), - enableWebsocket: Type.Boolean({ default: true }), - messagePostFormat: Type.String({ default: 'array' }), - token: Type.String({ default: '' }), - debug: Type.Boolean({ default: false }), - reportSelfMessage: Type.Boolean({ default: false }) +const HttpSseServerConfigSchema = z.object({ + name: z.string().default('http-sse-server'), + enable: z.boolean().default(false), + port: z.number().default(3000), + host: z.string().default('0.0.0.0'), + enableCors: z.boolean().default(true), + enableWebsocket: z.boolean().default(true), + messagePostFormat: z.string().default('array'), + token: z.string().default(''), + debug: z.boolean().default(false), + reportSelfMessage: z.boolean().default(false) }); -const HttpClientConfigSchema = Type.Object({ - name: Type.String({ default: 'http-client' }), - enable: Type.Boolean({ default: false }), - url: Type.String({ default: 'http://localhost:8080' }), - messagePostFormat: Type.String({ default: 'array' }), - reportSelfMessage: Type.Boolean({ default: false }), - token: Type.String({ default: '' }), - debug: Type.Boolean({ default: false }) +const HttpClientConfigSchema = z.object({ + name: z.string().default('http-client'), + enable: z.boolean().default(false), + url: z.string().default('http://localhost:8080'), + messagePostFormat: z.string().default('array'), + reportSelfMessage: z.boolean().default(false), + token: z.string().default(''), + debug: z.boolean().default(false) }); -const WebsocketServerConfigSchema = Type.Object({ - name: Type.String({ default: 'websocket-server' }), - enable: Type.Boolean({ default: false }), - host: Type.String({ default: '0.0.0.0' }), - port: Type.Number({ default: 3001 }), - messagePostFormat: Type.String({ default: 'array' }), - reportSelfMessage: Type.Boolean({ default: false }), - token: Type.String({ default: '' }), - enableForcePushEvent: Type.Boolean({ default: true }), - debug: Type.Boolean({ default: false }), - heartInterval: Type.Number({ default: 30000 }) +const WebsocketServerConfigSchema = z.object({ + name: z.string().default('websocket-server'), + enable: z.boolean().default(false), + host: z.string().default('0.0.0.0'), + port: z.number().default(3001), + messagePostFormat: z.string().default('array'), + reportSelfMessage: z.boolean().default(false), + token: z.string().default(''), + enableForcePushEvent: z.boolean().default(true), + debug: z.boolean().default(false), + heartInterval: z.number().default(30000) }); -const WebsocketClientConfigSchema = Type.Object({ - name: Type.String({ default: 'websocket-client' }), - enable: Type.Boolean({ default: false }), - url: Type.String({ default: 'ws://localhost:8082' }), - messagePostFormat: Type.String({ default: 'array' }), - reportSelfMessage: Type.Boolean({ default: false }), - reconnectInterval: Type.Number({ default: 5000 }), - token: Type.String({ default: '' }), - debug: Type.Boolean({ default: false }), - heartInterval: Type.Number({ default: 30000 }) +const WebsocketClientConfigSchema = z.object({ + name: z.string().default('websocket-client'), + enable: z.boolean().default(false), + url: z.string().default('ws://localhost:8082'), + messagePostFormat: z.string().default('array'), + reportSelfMessage: z.boolean().default(false), + reconnectInterval: z.number().default(5000), + token: z.string().default(''), + debug: z.boolean().default(false), + heartInterval: z.number().default(30000) }); -const PluginConfigSchema = Type.Object({ - name: Type.String({ default: 'plugin' }), - enable: Type.Boolean({ default: false }), - messagePostFormat: Type.String({ default: 'array' }), - reportSelfMessage: Type.Boolean({ default: false }), - debug: Type.Boolean({ default: false }), +const PluginConfigSchema = z.object({ + name: z.string().default('plugin'), + enable: z.boolean().default(false), + messagePostFormat: z.string().default('array'), + reportSelfMessage: z.boolean().default(false), + debug: z.boolean().default(false), }); -const NetworkConfigSchema = Type.Object({ - httpServers: Type.Array(HttpServerConfigSchema, { default: [] }), - httpSseServers: Type.Array(HttpSseServerConfigSchema, { default: [] }), - httpClients: Type.Array(HttpClientConfigSchema, { default: [] }), - websocketServers: Type.Array(WebsocketServerConfigSchema, { default: [] }), - websocketClients: Type.Array(WebsocketClientConfigSchema, { default: [] }), - plugins: Type.Array(PluginConfigSchema, { default: [] }) -}, { default: {} }); +const NetworkConfigSchema = z.object({ + httpServers: z.array(HttpServerConfigSchema).default([]), + httpSseServers: z.array(HttpSseServerConfigSchema).default([]), + httpClients: z.array(HttpClientConfigSchema).default([]), + websocketServers: z.array(WebsocketServerConfigSchema).default([]), + websocketClients: z.array(WebsocketClientConfigSchema).default([]), + plugins: z.array(PluginConfigSchema).default([]) +}).default({}); -export const OneBotConfigSchema = Type.Object({ +export const OneBotConfigSchema = z.object({ network: NetworkConfigSchema, - musicSignUrl: Type.String({ default: '' }), - enableLocalFile2Url: Type.Boolean({ default: false }), - parseMultMsg: Type.Boolean({ default: false }) + musicSignUrl: z.string().default(''), + enableLocalFile2Url: z.boolean().default(false), + parseMultMsg: z.boolean().default(false) }); -export type OneBotConfig = Static; -export type HttpServerConfig = Static; -export type HttpSseServerConfig = Static; -export type HttpClientConfig = Static; -export type WebsocketServerConfig = Static; -export type WebsocketClientConfig = Static; -export type PluginConfig = Static; +export type OneBotConfig = z.infer; +export type HttpServerConfig = z.infer; +export type HttpSseServerConfig = z.infer; +export type HttpClientConfig = z.infer; +export type WebsocketServerConfig = z.infer; +export type WebsocketClientConfig = z.infer; +export type PluginConfig = z.infer; export type NetworkAdapterConfig = HttpServerConfig | HttpSseServerConfig | HttpClientConfig | WebsocketServerConfig | WebsocketClientConfig | PluginConfig; export type NetworkConfigKey = keyof OneBotConfig['network']; - export function loadConfig(config: Partial): OneBotConfig { - const ajv = new Ajv({ useDefaults: true, coerceTypes: true }); - const validate = ajv.compile(OneBotConfigSchema); - const valid = validate(config); - if (!valid) { - throw new Error(ajv.errorsText(validate.errors)); + try { + return OneBotConfigSchema.parse(config); + } catch (error) { + if (error instanceof z.ZodError) { + throw new Error(error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ')); + } + throw error; } - return config as OneBotConfig; } \ No newline at end of file diff --git a/src/onebot/config/index.ts b/src/onebot/config/index.ts index 2c1f8221..7e40d5d0 100644 --- a/src/onebot/config/index.ts +++ b/src/onebot/config/index.ts @@ -1,10 +1,11 @@ import { ConfigBase } from '@/common/config-base'; import type { NapCatCore } from '@/core'; import { OneBotConfig } from './config'; -import { AnySchema } from 'ajv'; +import { z } from 'zod'; + export class OB11ConfigLoader extends ConfigBase { - constructor(core: NapCatCore, configPath: string, schema: AnySchema) { + constructor(core: NapCatCore, configPath: string, schema: z.ZodType) { super('onebot11', core, configPath, schema); } } diff --git a/src/shell/base.ts b/src/shell/base.ts index aee90f66..0ca81a7b 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -141,7 +141,7 @@ async function handleLogin( handleLoginInner(context, logger, loginService, quickLoginUin, historyLoginList).then().catch(e => logger.logError(e)); loginListener.onLoginConnected = () => { }; }); - } + }; loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => { WebUiDataRuntime.setQQLoginQrcodeURL(qrcodeUrl); @@ -220,7 +220,7 @@ async function handleLoginInner(context: { isLogined: boolean }, logger: LogWrap logger.log(`可用于快速登录的 QQ:\n${historyLoginList .map((u, index) => `${index + 1}. ${u.uin} ${u.nickName}`) .join('\n') - }`); + }`); } loginService.getQRCodePicture(); try { diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index a21b3639..d6455c68 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -1,33 +1,27 @@ import { webUiPathWrapper } from '@/webui'; -import { Type, Static } from '@sinclair/typebox'; -import Ajv from 'ajv'; import fs, { constants } from 'node:fs/promises'; - import { resolve } from 'node:path'; - import { deepMerge } from '../utils/object'; import { themeType } from '../types/theme'; - -// 限制尝试端口的次数,避免死循环 - +import { z } from 'zod'; // 定义配置的类型 -const WebUiConfigSchema = Type.Object({ - host: Type.String({ default: '0.0.0.0' }), - port: Type.Number({ default: 6099 }), - token: Type.String({ default: 'napcat' }), - loginRate: Type.Number({ default: 10 }), - autoLoginAccount: Type.String({ default: '' }), +const WebUiConfigSchema = z.object({ + host: z.string().default('0.0.0.0'), + port: z.number().default(6099), + token: z.string().default('napcat'), + loginRate: z.number().default(10), + autoLoginAccount: z.string().default(''), theme: themeType, }); -export type WebUiConfigType = Static; +export type WebUiConfigType = z.infer; // 读取当前目录下名为 webui.json 的配置文件,如果不存在则创建初始化配置文件 export class WebUiConfigWrapper { WebUiConfigData: WebUiConfigType | undefined = undefined; private validateAndApplyDefaults(config: Partial): WebUiConfigType { - new Ajv({ coerceTypes: true, useDefaults: true }).compile(WebUiConfigSchema)(config); + config = WebUiConfigSchema.parse(config); return config as WebUiConfigType; } diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index 593eb96c..f265a0bc 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -1,260 +1,260 @@ -import { Type } from '@sinclair/typebox'; +import { z } from 'zod'; -export const themeType = Type.Object( +export const themeType = z.object( { - dark: Type.Record(Type.String(), Type.String()), - light: Type.Record(Type.String(), Type.String()), - }, - { - default: { - dark: { - '--heroui-background': '0 0% 0%', - '--heroui-foreground-50': '240 5.88% 10%', - '--heroui-foreground-100': '240 3.7% 15.88%', - '--heroui-foreground-200': '240 5.26% 26.08%', - '--heroui-foreground-300': '240 5.2% 33.92%', - '--heroui-foreground-400': '240 3.83% 46.08%', - '--heroui-foreground-500': '240 5.03% 64.9%', - '--heroui-foreground-600': '240 4.88% 83.92%', - '--heroui-foreground-700': '240 5.88% 90%', - '--heroui-foreground-800': '240 4.76% 95.88%', - '--heroui-foreground-900': '0 0% 98.04%', - '--heroui-foreground': '210 5.56% 92.94%', - '--heroui-focus': '212.01999999999998 100% 46.67%', - '--heroui-overlay': '0 0% 0%', - '--heroui-divider': '0 0% 100%', - '--heroui-divider-opacity': '0.15', - '--heroui-content1': '240 5.88% 10%', - '--heroui-content1-foreground': '0 0% 98.04%', - '--heroui-content2': '240 3.7% 15.88%', - '--heroui-content2-foreground': '240 4.76% 95.88%', - '--heroui-content3': '240 5.26% 26.08%', - '--heroui-content3-foreground': '240 5.88% 90%', - '--heroui-content4': '240 5.2% 33.92%', - '--heroui-content4-foreground': '240 4.88% 83.92%', - '--heroui-default-50': '240 5.88% 10%', - '--heroui-default-100': '240 3.7% 15.88%', - '--heroui-default-200': '240 5.26% 26.08%', - '--heroui-default-300': '240 5.2% 33.92%', - '--heroui-default-400': '240 3.83% 46.08%', - '--heroui-default-500': '240 5.03% 64.9%', - '--heroui-default-600': '240 4.88% 83.92%', - '--heroui-default-700': '240 5.88% 90%', - '--heroui-default-800': '240 4.76% 95.88%', - '--heroui-default-900': '0 0% 98.04%', - '--heroui-default-foreground': '0 0% 100%', - '--heroui-default': '240 5.26% 26.08%', - '--heroui-danger-50': '301.89 82.61% 22.55%', - '--heroui-danger-100': '308.18 76.39% 28.24%', - '--heroui-danger-200': '313.85 70.65% 36.08%', - '--heroui-danger-300': '319.73 65.64% 44.51%', - '--heroui-danger-400': '325.82 69.62% 53.53%', - '--heroui-danger-500': '331.82 75% 65.49%', - '--heroui-danger-600': '337.84 83.46% 73.92%', - '--heroui-danger-700': '343.42 90.48% 83.53%', - '--heroui-danger-800': '350.53 90.48% 91.76%', - '--heroui-danger-900': '324 90.91% 95.69%', - '--heroui-danger-foreground': '0 0% 100%', - '--heroui-danger': '325.82 69.62% 53.53%', - '--heroui-primary-50': '340 84.91% 10.39%', - '--heroui-primary-100': '339.33 86.54% 20.39%', - '--heroui-primary-200': '339.11 85.99% 30.78%', - '--heroui-primary-300': '339 86.54% 40.78%', - '--heroui-primary-400': '339.2 90.36% 51.18%', - '--heroui-primary-500': '339 90% 60.78%', - '--heroui-primary-600': '339.11 90.6% 70.78%', - '--heroui-primary-700': '339.33 90% 80.39%', - '--heroui-primary-800': '340 91.84% 90.39%', - '--heroui-primary-900': '339.13 92% 95.1%', - '--heroui-primary-foreground': '0 0% 100%', - '--heroui-primary': '339.2 90.36% 51.18%', - '--heroui-secondary-50': '270 66.67% 9.41%', - '--heroui-secondary-100': '270 66.67% 18.82%', - '--heroui-secondary-200': '270 66.67% 28.24%', - '--heroui-secondary-300': '270 66.67% 37.65%', - '--heroui-secondary-400': '270 66.67% 47.06%', - '--heroui-secondary-500': '270 59.26% 57.65%', - '--heroui-secondary-600': '270 59.26% 68.24%', - '--heroui-secondary-700': '270 59.26% 78.82%', - '--heroui-secondary-800': '270 59.26% 89.41%', - '--heroui-secondary-900': '270 61.54% 94.9%', - '--heroui-secondary-foreground': '0 0% 100%', - '--heroui-secondary': '270 59.26% 57.65%', - '--heroui-success-50': '145.71 77.78% 8.82%', - '--heroui-success-100': '146.2 79.78% 17.45%', - '--heroui-success-200': '145.79 79.26% 26.47%', - '--heroui-success-300': '146.01 79.89% 35.1%', - '--heroui-success-400': '145.96 79.46% 43.92%', - '--heroui-success-500': '146.01 62.45% 55.1%', - '--heroui-success-600': '145.79 62.57% 66.47%', - '--heroui-success-700': '146.2 61.74% 77.45%', - '--heroui-success-800': '145.71 61.4% 88.82%', - '--heroui-success-900': '146.67 64.29% 94.51%', - '--heroui-success-foreground': '0 0% 0%', - '--heroui-success': '145.96 79.46% 43.92%', - '--heroui-warning-50': '37.14 75% 10.98%', - '--heroui-warning-100': '37.14 75% 21.96%', - '--heroui-warning-200': '36.96 73.96% 33.14%', - '--heroui-warning-300': '37.01 74.22% 44.12%', - '--heroui-warning-400': '37.03 91.27% 55.1%', - '--heroui-warning-500': '37.01 91.26% 64.12%', - '--heroui-warning-600': '36.96 91.24% 73.14%', - '--heroui-warning-700': '37.14 91.3% 81.96%', - '--heroui-warning-800': '37.14 91.3% 90.98%', - '--heroui-warning-900': '54.55 91.67% 95.29%', - '--heroui-warning-foreground': '0 0% 0%', - '--heroui-warning': '37.03 91.27% 55.1%', - '--heroui-code-background': '240 5.56% 7.06%', - '--heroui-strong': '190.14 94.67% 44.12%', - '--heroui-code-mdx': '190.14 94.67% 44.12%', - '--heroui-divider-weight': '1px', - '--heroui-disabled-opacity': '.5', - '--heroui-font-size-tiny': '0.75rem', - '--heroui-font-size-small': '0.875rem', - '--heroui-font-size-medium': '1rem', - '--heroui-font-size-large': '1.125rem', - '--heroui-line-height-tiny': '1rem', - '--heroui-line-height-small': '1.25rem', - '--heroui-line-height-medium': '1.5rem', - '--heroui-line-height-large': '1.75rem', - '--heroui-radius-small': '8px', - '--heroui-radius-medium': '12px', - '--heroui-radius-large': '14px', - '--heroui-border-width-small': '1px', - '--heroui-border-width-medium': '2px', - '--heroui-border-width-large': '3px', - '--heroui-box-shadow-small': - '0px 0px 5px 0px rgba(0, 0, 0, .05), 0px 2px 10px 0px rgba(0, 0, 0, .2), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', - '--heroui-box-shadow-medium': - '0px 0px 15px 0px rgba(0, 0, 0, .06), 0px 2px 30px 0px rgba(0, 0, 0, .22), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', - '--heroui-box-shadow-large': - '0px 0px 30px 0px rgba(0, 0, 0, .07), 0px 30px 60px 0px rgba(0, 0, 0, .26), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', - '--heroui-hover-opacity': '.9', - }, - light: { - '--heroui-background': '0 0% 100%', - '--heroui-foreground-50': '240 5.88% 95%', - '--heroui-foreground-100': '240 3.7% 90%', - '--heroui-foreground-200': '240 5.26% 80%', - '--heroui-foreground-300': '240 5.2% 70%', - '--heroui-foreground-400': '240 3.83% 60%', - '--heroui-foreground-500': '240 5.03% 50%', - '--heroui-foreground-600': '240 4.88% 40%', - '--heroui-foreground-700': '240 5.88% 30%', - '--heroui-foreground-800': '240 4.76% 20%', - '--heroui-foreground-900': '0 0% 10%', - '--heroui-foreground': '210 5.56% 7.06%', - '--heroui-focus': '212.01999999999998 100% 53.33%', - '--heroui-overlay': '0 0% 100%', - '--heroui-divider': '0 0% 0%', - '--heroui-divider-opacity': '0.85', - '--heroui-content1': '240 5.88% 95%', - '--heroui-content1-foreground': '0 0% 10%', - '--heroui-content2': '240 3.7% 90%', - '--heroui-content2-foreground': '240 4.76% 20%', - '--heroui-content3': '240 5.26% 80%', - '--heroui-content3-foreground': '240 5.88% 30%', - '--heroui-content4': '240 5.2% 70%', - '--heroui-content4-foreground': '240 4.88% 40%', - '--heroui-default-50': '240 5.88% 95%', - '--heroui-default-100': '240 3.7% 90%', - '--heroui-default-200': '240 5.26% 80%', - '--heroui-default-300': '240 5.2% 70%', - '--heroui-default-400': '240 3.83% 60%', - '--heroui-default-500': '240 5.03% 50%', - '--heroui-default-600': '240 4.88% 40%', - '--heroui-default-700': '240 5.88% 30%', - '--heroui-default-800': '240 4.76% 20%', - '--heroui-default-900': '0 0% 10%', - '--heroui-default-foreground': '0 0% 0%', - '--heroui-default': '240 5.26% 80%', - '--heroui-danger-50': '324 90.91% 95.69%', - '--heroui-danger-100': '350.53 90.48% 91.76%', - '--heroui-danger-200': '343.42 90.48% 83.53%', - '--heroui-danger-300': '337.84 83.46% 73.92%', - '--heroui-danger-400': '331.82 75% 65.49%', - '--heroui-danger-500': '325.82 69.62% 53.53%', - '--heroui-danger-600': '319.73 65.64% 44.51%', - '--heroui-danger-700': '313.85 70.65% 36.08%', - '--heroui-danger-800': '308.18 76.39% 28.24%', - '--heroui-danger-900': '301.89 82.61% 22.55%', - '--heroui-danger-foreground': '0 0% 100%', - '--heroui-danger': '325.82 69.62% 53.53%', - '--heroui-primary-50': '339.13 92% 95.1%', - '--heroui-primary-100': '340 91.84% 90.39%', - '--heroui-primary-200': '339.33 90% 80.39%', - '--heroui-primary-300': '339.11 90.6% 70.78%', - '--heroui-primary-400': '339 90% 60.78%', - '--heroui-primary-500': '339.2 90.36% 51.18%', - '--heroui-primary-600': '339 86.54% 40.78%', - '--heroui-primary-700': '339.11 85.99% 30.78%', - '--heroui-primary-800': '339.33 86.54% 20.39%', - '--heroui-primary-900': '340 84.91% 10.39%', - '--heroui-primary-foreground': '0 0% 100%', - '--heroui-primary': '339.2 90.36% 51.18%', - '--heroui-secondary-50': '270 61.54% 94.9%', - '--heroui-secondary-100': '270 59.26% 89.41%', - '--heroui-secondary-200': '270 59.26% 78.82%', - '--heroui-secondary-300': '270 59.26% 68.24%', - '--heroui-secondary-400': '270 59.26% 57.65%', - '--heroui-secondary-500': '270 66.67% 47.06%', - '--heroui-secondary-600': '270 66.67% 37.65%', - '--heroui-secondary-700': '270 66.67% 28.24%', - '--heroui-secondary-800': '270 66.67% 18.82%', - '--heroui-secondary-900': '270 66.67% 9.41%', - '--heroui-secondary-foreground': '0 0% 100%', - '--heroui-secondary': '270 66.67% 47.06%', - '--heroui-success-50': '146.67 64.29% 94.51%', - '--heroui-success-100': '145.71 61.4% 88.82%', - '--heroui-success-200': '146.2 61.74% 77.45%', - '--heroui-success-300': '145.79 62.57% 66.47%', - '--heroui-success-400': '146.01 62.45% 55.1%', - '--heroui-success-500': '145.96 79.46% 43.92%', - '--heroui-success-600': '146.01 79.89% 35.1%', - '--heroui-success-700': '145.79 79.26% 26.47%', - '--heroui-success-800': '146.2 79.78% 17.45%', - '--heroui-success-900': '145.71 77.78% 8.82%', - '--heroui-success-foreground': '0 0% 0%', - '--heroui-success': '145.96 79.46% 43.92%', - '--heroui-warning-50': '54.55 91.67% 95.29%', - '--heroui-warning-100': '37.14 91.3% 90.98%', - '--heroui-warning-200': '37.14 91.3% 81.96%', - '--heroui-warning-300': '36.96 91.24% 73.14%', - '--heroui-warning-400': '37.01 91.26% 64.12%', - '--heroui-warning-500': '37.03 91.27% 55.1%', - '--heroui-warning-600': '37.01 74.22% 44.12%', - '--heroui-warning-700': '36.96 73.96% 33.14%', - '--heroui-warning-800': '37.14 75% 21.96%', - '--heroui-warning-900': '37.14 75% 10.98%', - '--heroui-warning-foreground': '0 0% 0%', - '--heroui-warning': '37.03 91.27% 55.1%', - '--heroui-code-background': '221.25 17.39% 18.04%', - '--heroui-strong': '316.95 100% 65.29%', - '--heroui-code-mdx': '316.95 100% 65.29%', - '--heroui-divider-weight': '1px', - '--heroui-disabled-opacity': '.5', - '--heroui-font-size-tiny': '0.75rem', - '--heroui-font-size-small': '0.875rem', - '--heroui-font-size-medium': '1rem', - '--heroui-font-size-large': '1.125rem', - '--heroui-line-height-tiny': '1rem', - '--heroui-line-height-small': '1.25rem', - '--heroui-line-height-medium': '1.5rem', - '--heroui-line-height-large': '1.75rem', - '--heroui-radius-small': '8px', - '--heroui-radius-medium': '12px', - '--heroui-radius-large': '14px', - '--heroui-border-width-small': '1px', - '--heroui-border-width-medium': '2px', - '--heroui-border-width-large': '3px', - '--heroui-box-shadow-small': - '0px 0px 5px 0px rgba(0, 0, 0, .02), 0px 2px 10px 0px rgba(0, 0, 0, .06), 0px 0px 1px 0px rgba(0, 0, 0, .3)', - '--heroui-box-shadow-medium': - '0px 0px 15px 0px rgba(0, 0, 0, .03), 0px 2px 30px 0px rgba(0, 0, 0, .08), 0px 0px 1px 0px rgba(0, 0, 0, .3)', - '--heroui-box-shadow-large': - '0px 0px 30px 0px rgba(0, 0, 0, .04), 0px 30px 60px 0px rgba(0, 0, 0, .12), 0px 0px 1px 0px rgba(0, 0, 0, .3)', - '--heroui-hover-opacity': '.8', - }, - }, + // dark: Type.Record(Type.String(), Type.String()), + // light: Type.Record(Type.String(), Type.String()), + dark: z.record(z.string(), z.string()), + light: z.record(z.string(), z.string()), } -); +).default({ + dark: { + '--heroui-background': '0 0% 0%', + '--heroui-foreground-50': '240 5.88% 10%', + '--heroui-foreground-100': '240 3.7% 15.88%', + '--heroui-foreground-200': '240 5.26% 26.08%', + '--heroui-foreground-300': '240 5.2% 33.92%', + '--heroui-foreground-400': '240 3.83% 46.08%', + '--heroui-foreground-500': '240 5.03% 64.9%', + '--heroui-foreground-600': '240 4.88% 83.92%', + '--heroui-foreground-700': '240 5.88% 90%', + '--heroui-foreground-800': '240 4.76% 95.88%', + '--heroui-foreground-900': '0 0% 98.04%', + '--heroui-foreground': '210 5.56% 92.94%', + '--heroui-focus': '212.01999999999998 100% 46.67%', + '--heroui-overlay': '0 0% 0%', + '--heroui-divider': '0 0% 100%', + '--heroui-divider-opacity': '0.15', + '--heroui-content1': '240 5.88% 10%', + '--heroui-content1-foreground': '0 0% 98.04%', + '--heroui-content2': '240 3.7% 15.88%', + '--heroui-content2-foreground': '240 4.76% 95.88%', + '--heroui-content3': '240 5.26% 26.08%', + '--heroui-content3-foreground': '240 5.88% 90%', + '--heroui-content4': '240 5.2% 33.92%', + '--heroui-content4-foreground': '240 4.88% 83.92%', + '--heroui-default-50': '240 5.88% 10%', + '--heroui-default-100': '240 3.7% 15.88%', + '--heroui-default-200': '240 5.26% 26.08%', + '--heroui-default-300': '240 5.2% 33.92%', + '--heroui-default-400': '240 3.83% 46.08%', + '--heroui-default-500': '240 5.03% 64.9%', + '--heroui-default-600': '240 4.88% 83.92%', + '--heroui-default-700': '240 5.88% 90%', + '--heroui-default-800': '240 4.76% 95.88%', + '--heroui-default-900': '0 0% 98.04%', + '--heroui-default-foreground': '0 0% 100%', + '--heroui-default': '240 5.26% 26.08%', + '--heroui-danger-50': '301.89 82.61% 22.55%', + '--heroui-danger-100': '308.18 76.39% 28.24%', + '--heroui-danger-200': '313.85 70.65% 36.08%', + '--heroui-danger-300': '319.73 65.64% 44.51%', + '--heroui-danger-400': '325.82 69.62% 53.53%', + '--heroui-danger-500': '331.82 75% 65.49%', + '--heroui-danger-600': '337.84 83.46% 73.92%', + '--heroui-danger-700': '343.42 90.48% 83.53%', + '--heroui-danger-800': '350.53 90.48% 91.76%', + '--heroui-danger-900': '324 90.91% 95.69%', + '--heroui-danger-foreground': '0 0% 100%', + '--heroui-danger': '325.82 69.62% 53.53%', + '--heroui-primary-50': '340 84.91% 10.39%', + '--heroui-primary-100': '339.33 86.54% 20.39%', + '--heroui-primary-200': '339.11 85.99% 30.78%', + '--heroui-primary-300': '339 86.54% 40.78%', + '--heroui-primary-400': '339.2 90.36% 51.18%', + '--heroui-primary-500': '339 90% 60.78%', + '--heroui-primary-600': '339.11 90.6% 70.78%', + '--heroui-primary-700': '339.33 90% 80.39%', + '--heroui-primary-800': '340 91.84% 90.39%', + '--heroui-primary-900': '339.13 92% 95.1%', + '--heroui-primary-foreground': '0 0% 100%', + '--heroui-primary': '339.2 90.36% 51.18%', + '--heroui-secondary-50': '270 66.67% 9.41%', + '--heroui-secondary-100': '270 66.67% 18.82%', + '--heroui-secondary-200': '270 66.67% 28.24%', + '--heroui-secondary-300': '270 66.67% 37.65%', + '--heroui-secondary-400': '270 66.67% 47.06%', + '--heroui-secondary-500': '270 59.26% 57.65%', + '--heroui-secondary-600': '270 59.26% 68.24%', + '--heroui-secondary-700': '270 59.26% 78.82%', + '--heroui-secondary-800': '270 59.26% 89.41%', + '--heroui-secondary-900': '270 61.54% 94.9%', + '--heroui-secondary-foreground': '0 0% 100%', + '--heroui-secondary': '270 59.26% 57.65%', + '--heroui-success-50': '145.71 77.78% 8.82%', + '--heroui-success-100': '146.2 79.78% 17.45%', + '--heroui-success-200': '145.79 79.26% 26.47%', + '--heroui-success-300': '146.01 79.89% 35.1%', + '--heroui-success-400': '145.96 79.46% 43.92%', + '--heroui-success-500': '146.01 62.45% 55.1%', + '--heroui-success-600': '145.79 62.57% 66.47%', + '--heroui-success-700': '146.2 61.74% 77.45%', + '--heroui-success-800': '145.71 61.4% 88.82%', + '--heroui-success-900': '146.67 64.29% 94.51%', + '--heroui-success-foreground': '0 0% 0%', + '--heroui-success': '145.96 79.46% 43.92%', + '--heroui-warning-50': '37.14 75% 10.98%', + '--heroui-warning-100': '37.14 75% 21.96%', + '--heroui-warning-200': '36.96 73.96% 33.14%', + '--heroui-warning-300': '37.01 74.22% 44.12%', + '--heroui-warning-400': '37.03 91.27% 55.1%', + '--heroui-warning-500': '37.01 91.26% 64.12%', + '--heroui-warning-600': '36.96 91.24% 73.14%', + '--heroui-warning-700': '37.14 91.3% 81.96%', + '--heroui-warning-800': '37.14 91.3% 90.98%', + '--heroui-warning-900': '54.55 91.67% 95.29%', + '--heroui-warning-foreground': '0 0% 0%', + '--heroui-warning': '37.03 91.27% 55.1%', + '--heroui-code-background': '240 5.56% 7.06%', + '--heroui-strong': '190.14 94.67% 44.12%', + '--heroui-code-mdx': '190.14 94.67% 44.12%', + '--heroui-divider-weight': '1px', + '--heroui-disabled-opacity': '.5', + '--heroui-font-size-tiny': '0.75rem', + '--heroui-font-size-small': '0.875rem', + '--heroui-font-size-medium': '1rem', + '--heroui-font-size-large': '1.125rem', + '--heroui-line-height-tiny': '1rem', + '--heroui-line-height-small': '1.25rem', + '--heroui-line-height-medium': '1.5rem', + '--heroui-line-height-large': '1.75rem', + '--heroui-radius-small': '8px', + '--heroui-radius-medium': '12px', + '--heroui-radius-large': '14px', + '--heroui-border-width-small': '1px', + '--heroui-border-width-medium': '2px', + '--heroui-border-width-large': '3px', + '--heroui-box-shadow-small': + '0px 0px 5px 0px rgba(0, 0, 0, .05), 0px 2px 10px 0px rgba(0, 0, 0, .2), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', + '--heroui-box-shadow-medium': + '0px 0px 15px 0px rgba(0, 0, 0, .06), 0px 2px 30px 0px rgba(0, 0, 0, .22), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', + '--heroui-box-shadow-large': + '0px 0px 30px 0px rgba(0, 0, 0, .07), 0px 30px 60px 0px rgba(0, 0, 0, .26), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', + '--heroui-hover-opacity': '.9', + }, + light: { + '--heroui-background': '0 0% 100%', + '--heroui-foreground-50': '240 5.88% 95%', + '--heroui-foreground-100': '240 3.7% 90%', + '--heroui-foreground-200': '240 5.26% 80%', + '--heroui-foreground-300': '240 5.2% 70%', + '--heroui-foreground-400': '240 3.83% 60%', + '--heroui-foreground-500': '240 5.03% 50%', + '--heroui-foreground-600': '240 4.88% 40%', + '--heroui-foreground-700': '240 5.88% 30%', + '--heroui-foreground-800': '240 4.76% 20%', + '--heroui-foreground-900': '0 0% 10%', + '--heroui-foreground': '210 5.56% 7.06%', + '--heroui-focus': '212.01999999999998 100% 53.33%', + '--heroui-overlay': '0 0% 100%', + '--heroui-divider': '0 0% 0%', + '--heroui-divider-opacity': '0.85', + '--heroui-content1': '240 5.88% 95%', + '--heroui-content1-foreground': '0 0% 10%', + '--heroui-content2': '240 3.7% 90%', + '--heroui-content2-foreground': '240 4.76% 20%', + '--heroui-content3': '240 5.26% 80%', + '--heroui-content3-foreground': '240 5.88% 30%', + '--heroui-content4': '240 5.2% 70%', + '--heroui-content4-foreground': '240 4.88% 40%', + '--heroui-default-50': '240 5.88% 95%', + '--heroui-default-100': '240 3.7% 90%', + '--heroui-default-200': '240 5.26% 80%', + '--heroui-default-300': '240 5.2% 70%', + '--heroui-default-400': '240 3.83% 60%', + '--heroui-default-500': '240 5.03% 50%', + '--heroui-default-600': '240 4.88% 40%', + '--heroui-default-700': '240 5.88% 30%', + '--heroui-default-800': '240 4.76% 20%', + '--heroui-default-900': '0 0% 10%', + '--heroui-default-foreground': '0 0% 0%', + '--heroui-default': '240 5.26% 80%', + '--heroui-danger-50': '324 90.91% 95.69%', + '--heroui-danger-100': '350.53 90.48% 91.76%', + '--heroui-danger-200': '343.42 90.48% 83.53%', + '--heroui-danger-300': '337.84 83.46% 73.92%', + '--heroui-danger-400': '331.82 75% 65.49%', + '--heroui-danger-500': '325.82 69.62% 53.53%', + '--heroui-danger-600': '319.73 65.64% 44.51%', + '--heroui-danger-700': '313.85 70.65% 36.08%', + '--heroui-danger-800': '308.18 76.39% 28.24%', + '--heroui-danger-900': '301.89 82.61% 22.55%', + '--heroui-danger-foreground': '0 0% 100%', + '--heroui-danger': '325.82 69.62% 53.53%', + '--heroui-primary-50': '339.13 92% 95.1%', + '--heroui-primary-100': '340 91.84% 90.39%', + '--heroui-primary-200': '339.33 90% 80.39%', + '--heroui-primary-300': '339.11 90.6% 70.78%', + '--heroui-primary-400': '339 90% 60.78%', + '--heroui-primary-500': '339.2 90.36% 51.18%', + '--heroui-primary-600': '339 86.54% 40.78%', + '--heroui-primary-700': '339.11 85.99% 30.78%', + '--heroui-primary-800': '339.33 86.54% 20.39%', + '--heroui-primary-900': '340 84.91% 10.39%', + '--heroui-primary-foreground': '0 0% 100%', + '--heroui-primary': '339.2 90.36% 51.18%', + '--heroui-secondary-50': '270 61.54% 94.9%', + '--heroui-secondary-100': '270 59.26% 89.41%', + '--heroui-secondary-200': '270 59.26% 78.82%', + '--heroui-secondary-300': '270 59.26% 68.24%', + '--heroui-secondary-400': '270 59.26% 57.65%', + '--heroui-secondary-500': '270 66.67% 47.06%', + '--heroui-secondary-600': '270 66.67% 37.65%', + '--heroui-secondary-700': '270 66.67% 28.24%', + '--heroui-secondary-800': '270 66.67% 18.82%', + '--heroui-secondary-900': '270 66.67% 9.41%', + '--heroui-secondary-foreground': '0 0% 100%', + '--heroui-secondary': '270 66.67% 47.06%', + '--heroui-success-50': '146.67 64.29% 94.51%', + '--heroui-success-100': '145.71 61.4% 88.82%', + '--heroui-success-200': '146.2 61.74% 77.45%', + '--heroui-success-300': '145.79 62.57% 66.47%', + '--heroui-success-400': '146.01 62.45% 55.1%', + '--heroui-success-500': '145.96 79.46% 43.92%', + '--heroui-success-600': '146.01 79.89% 35.1%', + '--heroui-success-700': '145.79 79.26% 26.47%', + '--heroui-success-800': '146.2 79.78% 17.45%', + '--heroui-success-900': '145.71 77.78% 8.82%', + '--heroui-success-foreground': '0 0% 0%', + '--heroui-success': '145.96 79.46% 43.92%', + '--heroui-warning-50': '54.55 91.67% 95.29%', + '--heroui-warning-100': '37.14 91.3% 90.98%', + '--heroui-warning-200': '37.14 91.3% 81.96%', + '--heroui-warning-300': '36.96 91.24% 73.14%', + '--heroui-warning-400': '37.01 91.26% 64.12%', + '--heroui-warning-500': '37.03 91.27% 55.1%', + '--heroui-warning-600': '37.01 74.22% 44.12%', + '--heroui-warning-700': '36.96 73.96% 33.14%', + '--heroui-warning-800': '37.14 75% 21.96%', + '--heroui-warning-900': '37.14 75% 10.98%', + '--heroui-warning-foreground': '0 0% 0%', + '--heroui-warning': '37.03 91.27% 55.1%', + '--heroui-code-background': '221.25 17.39% 18.04%', + '--heroui-strong': '316.95 100% 65.29%', + '--heroui-code-mdx': '316.95 100% 65.29%', + '--heroui-divider-weight': '1px', + '--heroui-disabled-opacity': '.5', + '--heroui-font-size-tiny': '0.75rem', + '--heroui-font-size-small': '0.875rem', + '--heroui-font-size-medium': '1rem', + '--heroui-font-size-large': '1.125rem', + '--heroui-line-height-tiny': '1rem', + '--heroui-line-height-small': '1.25rem', + '--heroui-line-height-medium': '1.5rem', + '--heroui-line-height-large': '1.75rem', + '--heroui-radius-small': '8px', + '--heroui-radius-medium': '12px', + '--heroui-radius-large': '14px', + '--heroui-border-width-small': '1px', + '--heroui-border-width-medium': '2px', + '--heroui-border-width-large': '3px', + '--heroui-box-shadow-small': + '0px 0px 5px 0px rgba(0, 0, 0, .02), 0px 2px 10px 0px rgba(0, 0, 0, .06), 0px 0px 1px 0px rgba(0, 0, 0, .3)', + '--heroui-box-shadow-medium': + '0px 0px 15px 0px rgba(0, 0, 0, .03), 0px 2px 30px 0px rgba(0, 0, 0, .08), 0px 0px 1px 0px rgba(0, 0, 0, .3)', + '--heroui-box-shadow-large': + '0px 0px 30px 0px rgba(0, 0, 0, .04), 0px 30px 60px 0px rgba(0, 0, 0, .12), 0px 0px 1px 0px rgba(0, 0, 0, .3)', + '--heroui-hover-opacity': '.8', + }, + +}) From 45d6ebf08416a57aeb9607e7f1a8719b25943199 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, 13 Apr 2025 20:06:30 +0800 Subject: [PATCH 057/149] package->dev --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 5533687d..6b4fe5ed 100644 --- a/package.json +++ b/package.json @@ -59,13 +59,13 @@ "vite": "^6.0.1", "vite-plugin-cp": "^6.0.0", "vite-tsconfig-paths": "^5.1.0", - "winston": "^3.17.0" + "winston": "^3.17.0", + "zod": "^3.24.2" }, "dependencies": { "@ffmpeg.wasm/core-mt": "^0.13.2", "express": "^5.0.0", "silk-wasm": "^3.6.1", - "ws": "^8.18.0", - "zod": "^3.24.2" + "ws": "^8.18.0" } -} +} \ No newline at end of file From 7a42f8c26ff429d27876d27dde62794f85b28663 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, 13 Apr 2025 20:14:35 +0800 Subject: [PATCH 058/149] =?UTF-8?q?fix:=20=E4=BF=AE=E6=8E=89=E6=BC=8F?= =?UTF-8?q?=E6=8E=89=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/action/extends/SetSpecialTitle.ts | 2 +- src/onebot/action/extends/TranslateEnWordToZn.ts | 2 +- src/webui/src/types/theme.ts | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index 2efe2727..6193f2e2 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -5,7 +5,7 @@ import { z } from 'zod'; const SchemaData = z.object({ group_id: z.union([z.number(), z.string()]), user_id: z.union([z.number(), z.string()]), - special_title: z.string({ default: '' }), + special_title: z.string().default(''), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index 46a59408..7d360652 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - words: Type.Array(z.string()), + words: z.array(z.string()), }); type Payload = z.infer; diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index f265a0bc..2c224023 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -2,8 +2,6 @@ import { z } from 'zod'; export const themeType = z.object( { - // dark: Type.Record(Type.String(), Type.String()), - // light: Type.Record(Type.String(), Type.String()), dark: z.record(z.string(), z.string()), light: z.record(z.string(), z.string()), } From 7ecdd63befc63c64ee3fc32d9fbb156a8c2be098 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, 13 Apr 2025 20:33:25 +0800 Subject: [PATCH 059/149] =?UTF-8?q?feat:=20=E5=8C=BA=E5=88=86resId?= =?UTF-8?q?=E5=92=8C=E6=99=AE=E9=80=9A=E6=B6=88=E6=81=AFId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 64 +++++++++++--------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index 89e9cb60..7cb5ac14 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -4,10 +4,11 @@ import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; import { z } from 'zod'; +import { isNumeric } from '@/common/helper'; const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]).optional(), - id: z.union([z.number(), z.string()]).optional(), + message_id: z.string().optional(), + id: z.string().optional(), }); type Payload = z.infer; @@ -52,19 +53,21 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { + // 2. 定义辅助函数 - 创建伪转发消息对象 + const createFakeForwardMsg = (resId: string): RawMessage => { return { chatType: ChatType.KCHATTYPEGROUP, elements: [{ elementType: ElementType.MULTIFORWARD, elementId: '', multiForwardMsgElement: { - resId: res_id, + resId: resId, fileName: '', xmlContent: '', } @@ -95,8 +98,9 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { - const ob = (await this.obContext.apis.MsgApi.parseMessageV2(fakeForwardMsg(res_id)))?.arrayMsg; + // 3. 定义协议回退逻辑函数 + const protocolFallbackLogic = async (resId: string) => { + const ob = (await this.obContext.apis.MsgApi.parseMessageV2(createFakeForwardMsg(resId)))?.arrayMsg; if (ob) { return { messages: (ob?.message?.[0] as OB11MessageForward)?.data?.content @@ -104,31 +108,37 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction 0) { + const singleMsg = data.msgList[0]; + if (!singleMsg) { + throw new Error('消息不存在或已过期'); + } + // 6. 解析消息内容 + const resMsg = (await this.obContext.apis.MsgApi.parseMessageV2(singleMsg))?.arrayMsg; - // return { message: resMsg }; + const forwardContent = (resMsg?.message?.[0] as OB11MessageForward)?.data?.content; + if (forwardContent) { + return { messages: forwardContent }; + } + } + } + // 说明消息已过期或者为内层消息 NapCat 一次返回不处理内层消息 + throw new Error('消息已过期或者为内层消息,无法获取转发消息'); } } From 6e38e748b8c6657d562e424658649ac90a0bead8 Mon Sep 17 00:00:00 2001 From: Clansty Date: Mon, 14 Apr 2025 05:40:11 +0800 Subject: [PATCH 060/149] fix: isReverseOrder --- src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index f8bed60d..a375296e 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -34,7 +34,7 @@ export default class GetFriendMsgHistory extends OneBotAction const hasMessageSeq = !payload.message_seq ? !!payload.message_seq : !(payload.message_seq?.toString() === '' || payload.message_seq?.toString() === '0'); const startMsgId = hasMessageSeq ? (MessageUnique.getMsgIdAndPeerByShortId(+payload.message_seq!)?.MsgId ?? payload.message_seq!.toString()) : '0'; const msgList = hasMessageSeq ? - (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; + (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, isReverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; if (msgList.length === 0) throw new Error(`消息${payload.message_seq}不存在`); //翻转消息 if (isReverseOrder) msgList.reverse(); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index f2eb4044..5eed6ff5 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -33,7 +33,7 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction Date: Mon, 14 Apr 2025 13:25:00 +0800 Subject: [PATCH 061/149] readme: new --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 36ebce93..c842eb60 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,6 @@ _Modern protocol-side framework implemented based on NTQQ._ + [Lagrange](https://github.com/LagrangeDev/Lagrange.Core) 对本项目的大力支持 参考部分代码 已获授权 -+ [LLOneBot](https://github.com/LLOneBot/LLOneBot) 相关的开发曾参与本项目部分开发 - + 不过最最重要的 还是需要感谢屏幕前的你哦~ --- @@ -60,3 +58,7 @@ _Modern protocol-side framework implemented based on NTQQ._ 2. 项目其余逻辑代码采用[本仓库开源许可](./LICENSE). **本仓库仅用于提高易用性,实现消息推送类功能,此外,禁止任何项目未经仓库主作者授权基于 NapCat 代码开发。使用请遵守当地法律法规,由此造成的问题由使用者和提供违规使用教程者负责。** + +## Warnings + +[某框架抄袭部分分析](https://napneko.github.io/other/about-copy) From 40b06daf1e91b9dd483201d22863cab6934ea91f 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: Mon, 14 Apr 2025 21:44:25 +0800 Subject: [PATCH 062/149] fix --- src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts | 8 ++------ src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index a375296e..de4044d5 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -13,7 +13,7 @@ const SchemaData = z.object({ user_id: z.union([z.number(), z.string()]), message_seq: z.union([z.number(), z.string()]).optional(), count: z.union([z.number(), z.string()]).default(20), - reverseOrder: z.union([z.boolean(), z.string()]).optional() + reverseOrder: z.boolean().default(false) }); @@ -26,18 +26,14 @@ export default class GetFriendMsgHistory extends OneBotAction async _handle(payload: Payload, _adapter: string, config: NetworkAdapterConfig): Promise { //处理参数 const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); - - const isReverseOrder = typeof payload.reverseOrder === 'string' ? payload.reverseOrder === 'true' : !!payload.reverseOrder; if (!uid) throw new Error(`记录${payload.user_id}不存在`); const friend = await this.core.apis.FriendApi.isBuddy(uid); const peer = { chatType: friend ? ChatType.KCHATTYPEC2C : ChatType.KCHATTYPETEMPC2CFROMGROUP, peerUid: uid }; const hasMessageSeq = !payload.message_seq ? !!payload.message_seq : !(payload.message_seq?.toString() === '' || payload.message_seq?.toString() === '0'); const startMsgId = hasMessageSeq ? (MessageUnique.getMsgIdAndPeerByShortId(+payload.message_seq!)?.MsgId ?? payload.message_seq!.toString()) : '0'; const msgList = hasMessageSeq ? - (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, isReverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; + (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, payload.reverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; if (msgList.length === 0) throw new Error(`消息${payload.message_seq}不存在`); - //翻转消息 - if (isReverseOrder) msgList.reverse(); //转换序号 await Promise.all(msgList.map(async msg => { msg.id = MessageUnique.createUniqueMsgId({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index 5eed6ff5..91cc93bd 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -14,7 +14,7 @@ const SchemaData = z.object({ group_id: z.union([z.number(), z.string()]), message_seq: z.union([z.number(), z.string()]).optional(), count: z.union([z.number(), z.string()]).default(20), - reverseOrder: z.union([z.boolean(), z.string()]).optional() + reverseOrder: z.boolean().default(false) }); @@ -26,17 +26,13 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction { - //处理参数 - const isReverseOrder = typeof payload.reverseOrder === 'string' ? payload.reverseOrder === 'true' : !!payload.reverseOrder; 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'); //拉取消息 const startMsgId = hasMessageSeq ? (MessageUnique.getMsgIdAndPeerByShortId(+payload.message_seq!)?.MsgId ?? payload.message_seq!.toString()) : '0'; const msgList = hasMessageSeq ? - (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, isReverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; + (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, payload.reverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; if (msgList.length === 0) throw new Error(`消息${payload.message_seq}不存在`); - //翻转消息 - if (isReverseOrder) msgList.reverse(); //转换序号 await Promise.all(msgList.map(async msg => { msg.id = MessageUnique.createUniqueMsgId({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId); From 9257a6cfdebca597fa6e699199d4c0475ab72197 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Mon, 14 Apr 2025 14:37:43 +0000 Subject: [PATCH 063/149] release: v4.7.20 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index f0d008e5..9c75de46 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.19", + "version": "4.7.20", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 6b4fe5ed..1c490938 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.19", + "version": "4.7.20", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 9e02e587..d2cdb017 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.19'; +export const napCatVersion = '4.7.20'; From dd895d7c177825d9395ebbdc79926fa4133f3e8d 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: Tue, 15 Apr 2025 12:25:37 +0800 Subject: [PATCH 064/149] fix:coerce --- src/core/helper/config.ts | 14 +-- .../extends/ClickInlineKeyboardButton.ts | 10 +- src/onebot/action/extends/CreateCollection.ts | 4 +- src/onebot/action/extends/FetchCustomFace.ts | 2 +- src/onebot/action/extends/FetchEmojiLike.ts | 8 +- src/onebot/action/extends/GetAiCharacters.ts | 4 +- .../action/extends/GetCollectionList.ts | 4 +- src/onebot/action/extends/GetGroupInfoEx.ts | 2 +- src/onebot/action/extends/GetMiniAppArk.ts | 44 ++++---- src/onebot/action/extends/GetProfileLike.ts | 6 +- src/onebot/action/extends/GetUserStatus.ts | 2 +- src/onebot/action/extends/MoveGroupFile.ts | 8 +- src/onebot/action/extends/OCRImage.ts | 2 +- src/onebot/action/extends/RenameGroupFile.ts | 8 +- src/onebot/action/extends/SendPacket.ts | 6 +- .../action/extends/SetDiyOnlineStatus.ts | 6 +- src/onebot/action/extends/SetGroupRemark.ts | 4 +- src/onebot/action/extends/SetGroupSign.ts | 2 +- src/onebot/action/extends/SetInputStatus.ts | 4 +- src/onebot/action/extends/SetLongNick.ts | 2 +- src/onebot/action/extends/SetOnlineStatus.ts | 6 +- src/onebot/action/extends/SetQQAvatar.ts | 2 +- src/onebot/action/extends/SetSpecialTitle.ts | 6 +- src/onebot/action/extends/ShareContact.ts | 8 +- src/onebot/action/extends/TransGroupFile.ts | 4 +- .../action/extends/TranslateEnWordToZn.ts | 2 +- src/onebot/action/file/GetFile.ts | 4 +- src/onebot/action/file/GetGroupFileUrl.ts | 4 +- src/onebot/action/file/GetPrivateFileUrl.ts | 2 +- .../action/go-cqhttp/CreateGroupFileFolder.ts | 4 +- .../action/go-cqhttp/DeleteGroupFile.ts | 4 +- .../action/go-cqhttp/DeleteGroupFileFolder.ts | 6 +- src/onebot/action/go-cqhttp/DownloadFile.ts | 8 +- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 4 +- .../action/go-cqhttp/GetFriendMsgHistory.ts | 8 +- .../action/go-cqhttp/GetGroupAtAllRemain.ts | 2 +- .../go-cqhttp/GetGroupFileSystemInfo.ts | 2 +- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 8 +- .../action/go-cqhttp/GetGroupHonorInfo.ts | 2 +- .../action/go-cqhttp/GetGroupMsgHistory.ts | 8 +- .../action/go-cqhttp/GetGroupRootFiles.ts | 4 +- .../action/go-cqhttp/GetStrangerInfo.ts | 4 +- .../go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 2 +- .../action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 8 +- .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 2 +- .../action/go-cqhttp/SendGroupNotice.ts | 16 +-- .../action/go-cqhttp/SetGroupPortrait.ts | 4 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 6 +- .../action/go-cqhttp/UploadGroupFile.ts | 10 +- .../action/go-cqhttp/UploadPrivateFile.ts | 6 +- src/onebot/action/group/DelEssenceMsg.ts | 2 +- src/onebot/action/group/DelGroupNotice.ts | 4 +- src/onebot/action/group/GetAiRecord.ts | 6 +- src/onebot/action/group/GetGroupEssence.ts | 2 +- src/onebot/action/group/GetGroupInfo.ts | 2 +- src/onebot/action/group/GetGroupList.ts | 2 +- src/onebot/action/group/GetGroupMemberInfo.ts | 6 +- src/onebot/action/group/GetGroupMemberList.ts | 4 +- src/onebot/action/group/GetGroupNotice.ts | 2 +- src/onebot/action/group/GetGroupShutList.ts | 2 +- src/onebot/action/group/GroupPoke.ts | 4 +- src/onebot/action/group/SendGroupAiRecord.ts | 6 +- src/onebot/action/group/SetEssenceMsg.ts | 2 +- src/onebot/action/group/SetGroupAddRequest.ts | 6 +- src/onebot/action/group/SetGroupAdmin.ts | 6 +- src/onebot/action/group/SetGroupBan.ts | 6 +- src/onebot/action/group/SetGroupCard.ts | 6 +- src/onebot/action/group/SetGroupKick.ts | 6 +- src/onebot/action/group/SetGroupLeave.ts | 4 +- src/onebot/action/group/SetGroupName.ts | 4 +- src/onebot/action/group/SetGroupWholeBan.ts | 4 +- src/onebot/action/msg/DeleteMsg.ts | 2 +- src/onebot/action/msg/ForwardSingleMsg.ts | 6 +- src/onebot/action/msg/GetMsg.ts | 2 +- src/onebot/action/msg/MarkMsgAsRead.ts | 6 +- src/onebot/action/msg/SetMsgEmojiLike.ts | 6 +- src/onebot/action/packet/SendPoke.ts | 4 +- src/onebot/action/system/GetCredentials.ts | 2 +- src/onebot/action/user/FriendPoke.ts | 2 +- src/onebot/action/user/GetCookies.ts | 2 +- src/onebot/action/user/GetFriendList.ts | 2 +- src/onebot/action/user/GetRecentContact.ts | 2 +- src/onebot/action/user/SendLike.ts | 4 +- src/onebot/action/user/SetFriendAddRequest.ts | 6 +- src/onebot/config/config.ts | 106 +++++++++--------- src/onebot/index.ts | 3 +- src/webui/src/helper/config.ts | 10 +- src/webui/src/types/theme.ts | 4 +- 88 files changed, 277 insertions(+), 276 deletions(-) diff --git a/src/core/helper/config.ts b/src/core/helper/config.ts index 6c230056..94cfbeb5 100644 --- a/src/core/helper/config.ts +++ b/src/core/helper/config.ts @@ -3,13 +3,13 @@ import { NapCatCore } from '@/core'; import { z } from 'zod'; export const NapcatConfigSchema = z.object({ - fileLog: z.boolean().default(false), - consoleLog: z.boolean().default(true), - fileLogLevel: z.string().default('debug'), - consoleLogLevel: z.string().default('info'), - packetBackend: z.string().default('auto'), - packetServer: z.string().default(''), - o3HookMode: z.number().default(0), + fileLog: z.coerce.boolean().default(false), + consoleLog: z.coerce.boolean().default(true), + fileLogLevel: z.coerce.string().default('debug'), + consoleLogLevel: z.coerce.string().default('info'), + packetBackend: z.coerce.string().default('auto'), + packetServer: z.coerce.string().default(''), + o3HookMode: z.coerce.number().default(0), }); export type NapcatConfig = z.infer; diff --git a/src/onebot/action/extends/ClickInlineKeyboardButton.ts b/src/onebot/action/extends/ClickInlineKeyboardButton.ts index 4e7983f3..c06947cf 100644 --- a/src/onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/src/onebot/action/extends/ClickInlineKeyboardButton.ts @@ -3,11 +3,11 @@ import { OneBotAction } from '../OneBotAction'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.string(), - bot_appid: z.string(), - button_id: z.string().default(''), - callback_data: z.string().default(''), - msg_seq: z.string().default('10086'), + group_id: z.coerce.string(), + bot_appid: z.coerce.string(), + button_id: z.coerce.string().default(''), + callback_data: z.coerce.string().default(''), + msg_seq: z.coerce.string().default('10086'), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/CreateCollection.ts b/src/onebot/action/extends/CreateCollection.ts index ee682241..e1c5903b 100644 --- a/src/onebot/action/extends/CreateCollection.ts +++ b/src/onebot/action/extends/CreateCollection.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - rawData: z.string(), - brief: z.string(), + rawData: z.coerce.string(), + brief: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchCustomFace.ts b/src/onebot/action/extends/FetchCustomFace.ts index 78b1800d..cd7d7645 100644 --- a/src/onebot/action/extends/FetchCustomFace.ts +++ b/src/onebot/action/extends/FetchCustomFace.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; const SchemaData = z.object({ - count: z.number().default(48), + count: z.coerce.number().default(48), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchEmojiLike.ts b/src/onebot/action/extends/FetchEmojiLike.ts index 83749d0e..11505d9a 100644 --- a/src/onebot/action/extends/FetchEmojiLike.ts +++ b/src/onebot/action/extends/FetchEmojiLike.ts @@ -5,10 +5,10 @@ import { MessageUnique } from '@/common/message-unique'; import { type NTQQMsgApi } from '@/core/apis'; const SchemaData = z.object({ - message_id: z.string(), - emojiId: z.string(), - emojiType: z.string(), - count: z.number().default(20), + message_id: z.coerce.string(), + emojiId: z.coerce.string(), + emojiType: z.coerce.string(), + count: z.coerce.number().default(20), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetAiCharacters.ts b/src/onebot/action/extends/GetAiCharacters.ts index f889e76d..e2f2045a 100644 --- a/src/onebot/action/extends/GetAiCharacters.ts +++ b/src/onebot/action/extends/GetAiCharacters.ts @@ -4,8 +4,8 @@ import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.string(), - chat_type: z.number().default(1), + group_id: z.coerce.string(), + chat_type: z.coerce.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetCollectionList.ts b/src/onebot/action/extends/GetCollectionList.ts index 47fb9c4e..4399c349 100644 --- a/src/onebot/action/extends/GetCollectionList.ts +++ b/src/onebot/action/extends/GetCollectionList.ts @@ -4,8 +4,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - category: z.number(), - count: z.number().default(1), + category: z.coerce.number(), + count: z.coerce.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetGroupInfoEx.ts b/src/onebot/action/extends/GetGroupInfoEx.ts index b38f92f8..4dcd05ee 100644 --- a/src/onebot/action/extends/GetGroupInfoEx.ts +++ b/src/onebot/action/extends/GetGroupInfoEx.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.string(), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetMiniAppArk.ts b/src/onebot/action/extends/GetMiniAppArk.ts index e4d3c1c5..699d6661 100644 --- a/src/onebot/action/extends/GetMiniAppArk.ts +++ b/src/onebot/action/extends/GetMiniAppArk.ts @@ -7,30 +7,30 @@ import { z } from 'zod'; const SchemaData = z.union([ z.object({ type: z.union([z.literal('bili'), z.literal('weibo')]), - title: z.string(), - desc: z.string(), - picUrl: z.string(), - jumpUrl: z.string(), - webUrl: z.string().optional(), - rawArkData: z.string().optional() + title: z.coerce.string(), + desc: z.coerce.string(), + picUrl: z.coerce.string(), + jumpUrl: z.coerce.string(), + webUrl: z.coerce.string().optional(), + rawArkData: z.coerce.string().optional() }), z.object({ - title: z.string(), - desc: z.string(), - picUrl: z.string(), - jumpUrl: z.string(), - iconUrl: z.string(), - webUrl: z.string().optional(), - appId: z.string(), - scene: z.union([z.number(), z.string()]), - templateType: z.union([z.number(), z.string()]), - businessType: z.union([z.number(), z.string()]), - verType: z.union([z.number(), z.string()]), - shareType: z.union([z.number(), z.string()]), - versionId: z.string(), - sdkId: z.string(), - withShareTicket: z.union([z.number(), z.string()]), - rawArkData: z.string().optional() + title: z.coerce.string(), + desc: z.coerce.string(), + picUrl: z.coerce.string(), + jumpUrl: z.coerce.string(), + iconUrl: z.coerce.string(), + webUrl: z.coerce.string().optional(), + appId: z.coerce.string(), + scene: z.union([z.coerce.number(), z.coerce.string()]), + templateType: z.union([z.coerce.number(), z.coerce.string()]), + businessType: z.union([z.coerce.number(), z.coerce.string()]), + verType: z.union([z.coerce.number(), z.coerce.string()]), + shareType: z.union([z.coerce.number(), z.coerce.string()]), + versionId: z.coerce.string(), + sdkId: z.coerce.string(), + withShareTicket: z.union([z.coerce.number(), z.coerce.string()]), + rawArkData: z.coerce.string().optional() }) ]); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index e9b75812..7e727a7a 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.string().optional(), - start: z.number().default(0), - count: z.number().default(10), + user_id: z.coerce.string().optional(), + start: z.coerce.number().default(0), + count: z.coerce.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetUserStatus.ts b/src/onebot/action/extends/GetUserStatus.ts index c090cc3a..7fe274e8 100644 --- a/src/onebot/action/extends/GetUserStatus.ts +++ b/src/onebot/action/extends/GetUserStatus.ts @@ -3,7 +3,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.number(), + user_id: z.coerce.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index 31856e09..7e8e6f89 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -4,10 +4,10 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_id: z.string(), - current_parent_directory: z.string(), - target_parent_directory: z.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + file_id: z.coerce.string(), + current_parent_directory: z.coerce.string(), + target_parent_directory: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/OCRImage.ts b/src/onebot/action/extends/OCRImage.ts index 73776de8..d3dd45a8 100644 --- a/src/onebot/action/extends/OCRImage.ts +++ b/src/onebot/action/extends/OCRImage.ts @@ -6,7 +6,7 @@ import { z } from 'zod'; import { GeneralCallResultStatus } from '@/core'; const SchemaData = z.object({ - image: z.string(), + image: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index 69b4e9f6..918bcfd2 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -4,10 +4,10 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_id: z.string(), - current_parent_directory: z.string(), - new_name: z.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + file_id: z.coerce.string(), + current_parent_directory: z.coerce.string(), + new_name: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SendPacket.ts b/src/onebot/action/extends/SendPacket.ts index a43b894e..ac23b9c4 100644 --- a/src/onebot/action/extends/SendPacket.ts +++ b/src/onebot/action/extends/SendPacket.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - cmd: z.string(), - data: z.string(), - rsp: z.boolean().default(true), + cmd: z.coerce.string(), + data: z.coerce.string(), + rsp: z.coerce.boolean().default(true), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index 2c1110ac..c7962d62 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - face_id: z.union([z.number(), z.string()]),// 参考 face_config.json 的 QSid - face_type: z.union([z.number(), z.string()]).default('1'), - wording: z.string().default(' '), + face_id: z.union([z.coerce.number(), z.coerce.string()]),// 参考 face_config.json 的 QSid + face_type: z.union([z.coerce.number(), z.coerce.string()]).default('1'), + wording: z.coerce.string().default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupRemark.ts b/src/onebot/action/extends/SetGroupRemark.ts index cd26beb3..a6e5edaf 100644 --- a/src/onebot/action/extends/SetGroupRemark.ts +++ b/src/onebot/action/extends/SetGroupRemark.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.string(), - remark: z.string(), + group_id: z.coerce.string(), + remark: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index 9bc0775a..67687b34 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), + group_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index df8cfef5..397957e6 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -4,8 +4,8 @@ import { ChatType } from '@/core'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.number(), z.string()]), - event_type: z.number(), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + event_type: z.coerce.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetLongNick.ts b/src/onebot/action/extends/SetLongNick.ts index 4403d607..be68fea2 100644 --- a/src/onebot/action/extends/SetLongNick.ts +++ b/src/onebot/action/extends/SetLongNick.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - longNick: z.string(), + longNick: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index 999ee261..53051824 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - status: z.union([z.number(), z.string()]), - ext_status: z.union([z.number(), z.string()]), - battery_status: z.union([z.number(), z.string()]), + status: z.union([z.coerce.number(), z.coerce.string()]), + ext_status: z.union([z.coerce.number(), z.coerce.string()]), + battery_status: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetQQAvatar.ts b/src/onebot/action/extends/SetQQAvatar.ts index 5fb8b50f..eee209c8 100644 --- a/src/onebot/action/extends/SetQQAvatar.ts +++ b/src/onebot/action/extends/SetQQAvatar.ts @@ -5,7 +5,7 @@ import { checkFileExist, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; const SchemaData = z.object({ - file: z.string(), + file: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index 6193f2e2..88c81e4f 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -3,9 +3,9 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - special_title: z.string().default(''), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + special_title: z.coerce.string().default(''), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index edf18ecb..6194b445 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.number(), z.string()]).optional(), - group_id: z.union([z.number(), z.string()]).optional(), - phoneNumber: z.string().default(''), + user_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), + group_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), + phoneNumber: z.coerce.string().default(''), }); type Payload = z.infer; @@ -29,7 +29,7 @@ export class SharePeer extends OneBotAction; diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index 746c190d..c7b1f7bf 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -4,8 +4,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_id: z.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + file_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index 7d360652..bc4977b2 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - words: z.array(z.string()), + words: z.array(z.coerce.string()), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetFile.ts b/src/onebot/action/file/GetFile.ts index d2d87fa1..8d373676 100644 --- a/src/onebot/action/file/GetFile.ts +++ b/src/onebot/action/file/GetFile.ts @@ -14,8 +14,8 @@ export interface GetFileResponse { } const GetFileBase_PayloadSchema = z.object({ - file: z.string().optional(), - file_id: z.string().optional(), + file: z.coerce.string().optional(), + file_id: z.coerce.string().optional(), }); diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index ebf28021..f191a112 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -4,8 +4,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_id: z.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + file_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts index 4504cc20..f2ea65e3 100644 --- a/src/onebot/action/file/GetPrivateFileUrl.ts +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - file_id: z.string(), + file_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 4a0dea63..900e7b74 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - folder_name: z.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + folder_name: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index 84343f54..80c71247 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -6,8 +6,8 @@ import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_id: z.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + file_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 6e12986b..94e5ade5 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -4,9 +4,9 @@ import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - folder_id: z.string().optional(), - folder: z.string().optional(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + folder_id: z.coerce.string().optional(), + folder: z.coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DownloadFile.ts b/src/onebot/action/go-cqhttp/DownloadFile.ts index 30e9685f..a5fb7222 100644 --- a/src/onebot/action/go-cqhttp/DownloadFile.ts +++ b/src/onebot/action/go-cqhttp/DownloadFile.ts @@ -11,10 +11,10 @@ interface FileResponse { } const SchemaData = z.object({ - url: z.string().optional(), - base64: z.string().optional(), - name: z.string().optional(), - headers: z.union([z.string(), z.array(z.string())]).optional(), + url: z.coerce.string().optional(), + base64: z.coerce.string().optional(), + name: z.coerce.string().optional(), + headers: z.union([z.coerce.string(), z.array(z.coerce.string())]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index 7cb5ac14..e85546fe 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -7,8 +7,8 @@ import { z } from 'zod'; import { isNumeric } from '@/common/helper'; const SchemaData = z.object({ - message_id: z.string().optional(), - id: z.string().optional(), + message_id: z.coerce.string().optional(), + id: z.coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index de4044d5..1a585561 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -10,10 +10,10 @@ interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - user_id: z.union([z.number(), z.string()]), - message_seq: z.union([z.number(), z.string()]).optional(), - count: z.union([z.number(), z.string()]).default(20), - reverseOrder: z.boolean().default(false) + user_id: z.union([z.coerce.number(), z.coerce.string()]), + message_seq: z.union([z.coerce.number(), z.coerce.string()]).optional(), + count: z.union([z.coerce.number(), z.coerce.string()]).default(20), + reverseOrder: z.coerce.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 28d63901..cad70698 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]) + group_id: z.union([z.coerce.number(), z.coerce.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 8d966d35..81e78e27 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]) + group_id: z.union([z.coerce.number(), z.coerce.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index 5d08bafb..e366fef3 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -5,10 +5,10 @@ import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - folder_id: z.string().optional(), - folder: z.string().optional(), - file_count: z.union([z.number(), z.string()]).default(50), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + folder_id: z.coerce.string().optional(), + folder: z.coerce.string().optional(), + file_count: z.union([z.coerce.number(), z.coerce.string()]).default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index 1194b67f..749b9412 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), + group_id: z.union([z.coerce.number(), z.coerce.string()]), type: z.nativeEnum(WebHonorType).optional() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index 91cc93bd..fff77c91 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -11,10 +11,10 @@ interface Response { } const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - message_seq: z.union([z.number(), z.string()]).optional(), - count: z.union([z.number(), z.string()]).default(20), - reverseOrder: z.boolean().default(false) + group_id: z.union([z.coerce.number(), z.coerce.string()]), + message_seq: z.union([z.coerce.number(), z.coerce.string()]).optional(), + count: z.union([z.coerce.number(), z.coerce.string()]).default(20), + reverseOrder: z.coerce.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index b990aec8..737d54ec 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -6,8 +6,8 @@ import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_count: z.union([z.number(), z.string()]).default(50), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + file_count: z.union([z.coerce.number(), z.coerce.string()]).default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index 8ac5aae4..e0faf91d 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -6,8 +6,8 @@ import { calcQQLevel } from '@/common/helper'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.number(), z.string()]), - no_cache: z.boolean().default(false), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + no_cache: z.coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index dfded410..0f4d4424 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - url: z.string(), + url: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index e7ce50c4..3643e5d2 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -3,10 +3,10 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - friend_id: z.union([z.string(), z.number()]).optional(), - user_id: z.union([z.string(), z.number()]).optional(), - temp_block: z.boolean().optional(), - temp_both_del: z.boolean().optional(), + friend_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), + user_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), + temp_block: z.coerce.boolean().optional(), + temp_both_del: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index 1e839fe3..ea791d3e 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - model: z.string(), + model: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SendGroupNotice.ts b/src/onebot/action/go-cqhttp/SendGroupNotice.ts index 4f81313a..b8df9c9c 100644 --- a/src/onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/src/onebot/action/go-cqhttp/SendGroupNotice.ts @@ -5,14 +5,14 @@ import { unlink } from 'node:fs/promises'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - content: z.string(), - image: z.string().optional(), - pinned: z.union([z.number(), z.string()]).default(0), - type: z.union([z.number(), z.string()]).default(1), - confirm_required: z.union([z.number(), z.string()]).default(1), - is_show_edit_card: z.union([z.number(), z.string()]).default(0), - tip_window_type: z.union([z.number(), z.string()]).default(0), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + content: z.coerce.string(), + image: z.coerce.string().optional(), + pinned: z.union([z.coerce.number(), z.coerce.string()]).default(0), + type: z.union([z.coerce.number(), z.coerce.string()]).default(1), + confirm_required: z.union([z.coerce.number(), z.coerce.string()]).default(1), + is_show_edit_card: z.union([z.coerce.number(), z.coerce.string()]).default(0), + tip_window_type: z.union([z.coerce.number(), z.coerce.string()]).default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index 765c9897..c82b11b2 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -5,8 +5,8 @@ import { z } from 'zod'; import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; const SchemaData = z.object({ - file: z.string(), - group_id: z.union([z.number(), z.string()]) + file: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index c85e4aa4..40ca8fe3 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - nickname: z.string(), - personal_note: z.string().optional(), - sex: z.union([z.number(), z.string()]).optional(), // 传Sex值?建议传0 + nickname: z.coerce.string(), + personal_note: z.coerce.string().optional(), + sex: z.union([z.coerce.number(), z.coerce.string()]).optional(), // 传Sex值?建议传0 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index 39327cde..e9903f0f 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -7,11 +7,11 @@ import { SendMessageContext } from '@/onebot/api'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file: z.string(), - name: z.string(), - folder: z.string().optional(), - folder_id: z.string().optional(),//临时扩展 + group_id: z.union([z.coerce.number(), z.coerce.string()]), + file: z.coerce.string(), + name: z.coerce.string(), + folder: z.coerce.string().optional(), + folder_id: z.coerce.string().optional(),//临时扩展 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index 8cee2010..f43a3223 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -8,9 +8,9 @@ import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.number(), z.string()]), - file: z.string(), - name: z.string(), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + file: z.coerce.string(), + name: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index b799b651..644e5dbf 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]), + message_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index bd2dae0a..5668414c 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - notice_id: z.string() + group_id: z.union([z.coerce.number(), z.coerce.string()]), + notice_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index ba30f9d9..86deeca0 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -4,9 +4,9 @@ import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; const SchemaData = z.object({ - character: z.string(), - group_id: z.union([z.number(), z.string()]), - text: z.string(), + character: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + text: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 9ce8c310..4f284e6f 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -7,7 +7,7 @@ import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), + group_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index 2bb5ff72..1b8a3e64 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -5,7 +5,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), + group_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupList.ts b/src/onebot/action/group/GetGroupList.ts index 5ed487b9..0b219646 100644 --- a/src/onebot/action/group/GetGroupList.ts +++ b/src/onebot/action/group/GetGroupList.ts @@ -5,7 +5,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - no_cache: z.boolean().default(false), + no_cache: z.coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index 75834049..ac14e3a9 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -5,9 +5,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - no_cache: z.boolean().default(false), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + no_cache: z.coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index efd5073c..3afca128 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -6,8 +6,8 @@ import { z } from 'zod'; import { GroupMember } from '@/core'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - no_cache: z.boolean().default(false) + group_id: z.union([z.coerce.number(), z.coerce.string()]), + no_cache: z.coerce.boolean().default(false) }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index 317d712c..2a1cf2cf 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -17,7 +17,7 @@ interface GroupNotice { } const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), + group_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index 3e82f5e3..e48d25ae 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), + group_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index c318211c..084effb1 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -3,8 +3,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index 1e0c3a03..88ed5118 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -4,9 +4,9 @@ import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; const SchemaData = z.object({ - character: z.string(), - group_id: z.union([z.number(), z.string()]), - text: z.string(), + character: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + text: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetEssenceMsg.ts b/src/onebot/action/group/SetEssenceMsg.ts index a75d27a3..998f3e0b 100644 --- a/src/onebot/action/group/SetEssenceMsg.ts +++ b/src/onebot/action/group/SetEssenceMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]), + message_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index 8a5834e0..1bae2c48 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - flag: z.union([z.string(), z.number()]), - approve: z.boolean().default(true), - reason: z.union([z.string(), z.null()]).default(' '), + flag: z.union([z.coerce.string(), z.coerce.number()]), + approve: z.coerce.boolean().default(true), + reason: z.union([z.coerce.string(), z.null()]).default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index 6ad18f06..97afba3b 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - enable: z.boolean().default(false), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + enable: z.coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index 4312e628..37fe0484 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - duration: z.union([z.number(), z.string()]).default(0), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + duration: z.union([z.coerce.number(), z.coerce.string()]).default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index bd45f957..1d4e59ca 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - card: z.string().optional(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + card: z.coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index 3967ad96..98fa39e8 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - reject_add_request: z.union([z.boolean(), z.string()]).optional(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + reject_add_request: z.union([z.coerce.boolean(), z.coerce.string()]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index 6930af12..3cf7cd31 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - is_dismiss: z.boolean().optional(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + is_dismiss: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index d19e9782..61ebc27c 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -4,8 +4,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - group_name: z.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_name: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index dc1ee1a3..75ce019c 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - enable: z.union([z.boolean(), z.string()]).optional(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + enable: z.union([z.coerce.boolean(), z.coerce.string()]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index 9aa67a30..e6a345d7 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]), + message_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index bc2f5546..b2a5f940 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -5,9 +5,9 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]), - group_id: z.string().optional(), - user_id: z.string().optional(), + message_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string().optional(), + user_id: z.coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index 28cc629a..da324844 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -9,7 +9,7 @@ import { NetworkAdapterConfig } from '@/onebot/config/config'; export type ReturnDataType = OB11Message const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]), + message_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index 98f5a9cf..65506445 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -5,9 +5,9 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.string(), z.number()]).optional(), - group_id: z.union([z.string(), z.number()]).optional(), - message_id: z.union([z.string(), z.number()]).optional(), + user_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), + group_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), + message_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), }); type PlayloadType = z.infer; diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index b7ddf580..7f4e173a 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -4,9 +4,9 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]), - emoji_id: z.union([z.number(), z.string()]), - set: z.boolean().optional(), + message_id: z.union([z.coerce.number(), z.coerce.string()]), + emoji_id: z.union([z.coerce.number(), z.coerce.string()]), + set: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/packet/SendPoke.ts b/src/onebot/action/packet/SendPoke.ts index 7334219f..c362cc8f 100644 --- a/src/onebot/action/packet/SendPoke.ts +++ b/src/onebot/action/packet/SendPoke.ts @@ -3,8 +3,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]).optional(), - user_id: z.union([z.number(), z.string()]), + group_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), + user_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/system/GetCredentials.ts b/src/onebot/action/system/GetCredentials.ts index a8d50e16..0d6a72fb 100644 --- a/src/onebot/action/system/GetCredentials.ts +++ b/src/onebot/action/system/GetCredentials.ts @@ -8,7 +8,7 @@ interface Response { } const SchemaData = z.object({ - domain: z.string() + domain: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index 644763eb..625eaa16 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -3,7 +3,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.number(), z.string()]) + user_id: z.union([z.coerce.number(), z.coerce.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetCookies.ts b/src/onebot/action/user/GetCookies.ts index bc3e34e0..82df5bcc 100644 --- a/src/onebot/action/user/GetCookies.ts +++ b/src/onebot/action/user/GetCookies.ts @@ -7,7 +7,7 @@ interface Response { } const SchemaData = z.object({ - domain: z.string() + domain: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index 227ca12f..e804bf1c 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -5,7 +5,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - no_cache: z.boolean().optional(), + no_cache: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetRecentContact.ts b/src/onebot/action/user/GetRecentContact.ts index 01b3fc0f..b79d7aec 100644 --- a/src/onebot/action/user/GetRecentContact.ts +++ b/src/onebot/action/user/GetRecentContact.ts @@ -5,7 +5,7 @@ import { NetworkAdapterConfig } from '@/onebot/config/config'; import { z } from 'zod'; const SchemaData = z.object({ - count: z.number().default(10), + count: z.coerce.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 04b719c0..215d2440 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - times: z.union([z.number(), z.string()]).default(1), - user_id: z.union([z.number(), z.string()]) + times: z.union([z.coerce.number(), z.coerce.string()]).default(1), + user_id: z.union([z.coerce.number(), z.coerce.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index 72551a9e..070901c9 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - flag: z.union([z.string(), z.number()]), - approve: z.union([z.string(), z.boolean()]).default(true), - remark: z.union([z.string(), z.null()]).nullable().optional() + flag: z.union([z.coerce.string(), z.coerce.number()]), + approve: z.union([z.coerce.string(), z.coerce.boolean()]).default(true), + remark: z.union([z.coerce.string(), z.null()]).nullable().optional() }); type Payload = z.infer; diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index ffc29339..9a9b8a00 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,71 +1,71 @@ import { z } from 'zod'; const HttpServerConfigSchema = z.object({ - name: z.string().default('http-server'), - enable: z.boolean().default(false), - port: z.number().default(3000), - host: z.string().default('0.0.0.0'), - enableCors: z.boolean().default(true), - enableWebsocket: z.boolean().default(true), - messagePostFormat: z.string().default('array'), - token: z.string().default(''), - debug: z.boolean().default(false) + name: z.coerce.string().default('http-server'), + enable: z.coerce.boolean().default(false), + port: z.coerce.number().default(3000), + host: z.coerce.string().default('0.0.0.0'), + enableCors: z.coerce.boolean().default(true), + enableWebsocket: z.coerce.boolean().default(true), + messagePostFormat: z.coerce.string().default('array'), + token: z.coerce.string().default(''), + debug: z.coerce.boolean().default(false) }); const HttpSseServerConfigSchema = z.object({ - name: z.string().default('http-sse-server'), - enable: z.boolean().default(false), - port: z.number().default(3000), - host: z.string().default('0.0.0.0'), - enableCors: z.boolean().default(true), - enableWebsocket: z.boolean().default(true), - messagePostFormat: z.string().default('array'), - token: z.string().default(''), - debug: z.boolean().default(false), - reportSelfMessage: z.boolean().default(false) + name: z.coerce.string().default('http-sse-server'), + enable: z.coerce.boolean().default(false), + port: z.coerce.number().default(3000), + host: z.coerce.string().default('0.0.0.0'), + enableCors: z.coerce.boolean().default(true), + enableWebsocket: z.coerce.boolean().default(true), + messagePostFormat: z.coerce.string().default('array'), + token: z.coerce.string().default(''), + debug: z.coerce.boolean().default(false), + reportSelfMessage: z.coerce.boolean().default(false) }); const HttpClientConfigSchema = z.object({ - name: z.string().default('http-client'), - enable: z.boolean().default(false), - url: z.string().default('http://localhost:8080'), - messagePostFormat: z.string().default('array'), - reportSelfMessage: z.boolean().default(false), - token: z.string().default(''), - debug: z.boolean().default(false) + name: z.coerce.string().default('http-client'), + enable: z.coerce.boolean().default(false), + url: z.coerce.string().default('http://localhost:8080'), + messagePostFormat: z.coerce.string().default('array'), + reportSelfMessage: z.coerce.boolean().default(false), + token: z.coerce.string().default(''), + debug: z.coerce.boolean().default(false) }); const WebsocketServerConfigSchema = z.object({ - name: z.string().default('websocket-server'), - enable: z.boolean().default(false), - host: z.string().default('0.0.0.0'), - port: z.number().default(3001), - messagePostFormat: z.string().default('array'), - reportSelfMessage: z.boolean().default(false), - token: z.string().default(''), - enableForcePushEvent: z.boolean().default(true), - debug: z.boolean().default(false), - heartInterval: z.number().default(30000) + name: z.coerce.string().default('websocket-server'), + enable: z.coerce.boolean().default(false), + host: z.coerce.string().default('0.0.0.0'), + port: z.coerce.number().default(3001), + messagePostFormat: z.coerce.string().default('array'), + reportSelfMessage: z.coerce.boolean().default(false), + token: z.coerce.string().default(''), + enableForcePushEvent: z.coerce.boolean().default(true), + debug: z.coerce.boolean().default(false), + heartInterval: z.coerce.number().default(30000) }); const WebsocketClientConfigSchema = z.object({ - name: z.string().default('websocket-client'), - enable: z.boolean().default(false), - url: z.string().default('ws://localhost:8082'), - messagePostFormat: z.string().default('array'), - reportSelfMessage: z.boolean().default(false), - reconnectInterval: z.number().default(5000), - token: z.string().default(''), - debug: z.boolean().default(false), - heartInterval: z.number().default(30000) + name: z.coerce.string().default('websocket-client'), + enable: z.coerce.boolean().default(false), + url: z.coerce.string().default('ws://localhost:8082'), + messagePostFormat: z.coerce.string().default('array'), + reportSelfMessage: z.coerce.boolean().default(false), + reconnectInterval: z.coerce.number().default(5000), + token: z.coerce.string().default(''), + debug: z.coerce.boolean().default(false), + heartInterval: z.coerce.number().default(30000) }); const PluginConfigSchema = z.object({ - name: z.string().default('plugin'), - enable: z.boolean().default(false), - messagePostFormat: z.string().default('array'), - reportSelfMessage: z.boolean().default(false), - debug: z.boolean().default(false), + name: z.coerce.string().default('plugin'), + enable: z.coerce.boolean().default(false), + messagePostFormat: z.coerce.string().default('array'), + reportSelfMessage: z.coerce.boolean().default(false), + debug: z.coerce.boolean().default(false), }); const NetworkConfigSchema = z.object({ @@ -79,9 +79,9 @@ const NetworkConfigSchema = z.object({ export const OneBotConfigSchema = z.object({ network: NetworkConfigSchema, - musicSignUrl: z.string().default(''), - enableLocalFile2Url: z.boolean().default(false), - parseMultMsg: z.boolean().default(false) + musicSignUrl: z.coerce.string().default(''), + enableLocalFile2Url: z.coerce.boolean().default(false), + parseMultMsg: z.coerce.boolean().default(false) }); export type OneBotConfig = z.infer; diff --git a/src/onebot/index.ts b/src/onebot/index.ts index 4fb0089c..b6a05962 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -50,6 +50,7 @@ import { import { OB11Message } from './types'; import { IOB11NetworkAdapter } from '@/onebot/network/adapter'; import { OB11HttpSSEServerAdapter } from './network/http-server-sse'; +import { ZodType } from 'zod'; //OneBot实现类 export class NapCatOneBot11Adapter { @@ -66,7 +67,7 @@ export class NapCatOneBot11Adapter { constructor(core: NapCatCore, context: InstanceContext, pathWrapper: NapCatPathWrapper) { this.core = core; this.context = context; - this.configLoader = new OB11ConfigLoader(core, pathWrapper.configPath, OneBotConfigSchema); + this.configLoader = new OB11ConfigLoader(core, pathWrapper.configPath, OneBotConfigSchema as ZodType); this.apis = { GroupApi: new OneBotGroupApi(this, core), UserApi: new OneBotUserApi(this, core), diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index d6455c68..06562859 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -6,11 +6,11 @@ import { themeType } from '../types/theme'; import { z } from 'zod'; // 定义配置的类型 const WebUiConfigSchema = z.object({ - host: z.string().default('0.0.0.0'), - port: z.number().default(6099), - token: z.string().default('napcat'), - loginRate: z.number().default(10), - autoLoginAccount: z.string().default(''), + host: z.coerce.string().default('0.0.0.0'), + port: z.coerce.number().default(6099), + token: z.coerce.string().default('napcat'), + loginRate: z.coerce.number().default(10), + autoLoginAccount: z.coerce.string().default(''), theme: themeType, }); diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index 2c224023..dcbe3a47 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -2,8 +2,8 @@ import { z } from 'zod'; export const themeType = z.object( { - dark: z.record(z.string(), z.string()), - light: z.record(z.string(), z.string()), + dark: z.record(z.coerce.string(), z.coerce.string()), + light: z.record(z.coerce.string(), z.coerce.string()), } ).default({ dark: { From 06538b912277d9ba61e82fb5a8cedd997db1a620 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Tue, 15 Apr 2025 04:25:59 +0000 Subject: [PATCH 065/149] release: v4.7.21 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 9c75de46..e565a67f 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.20", + "version": "4.7.21", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 1c490938..cdc91b35 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.20", + "version": "4.7.21", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index d2cdb017..3e674b92 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.20'; +export const napCatVersion = '4.7.21'; From 941978b5783255a05b91e12d3d22b9c1794e91bd 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: Tue, 15 Apr 2025 12:34:33 +0800 Subject: [PATCH 066/149] fix: checker --- src/onebot/action/extends/MoveGroupFile.ts | 2 +- src/onebot/action/extends/RenameGroupFile.ts | 2 +- src/onebot/action/extends/SetDiyOnlineStatus.ts | 4 ++-- src/onebot/action/extends/SetGroupSign.ts | 2 +- src/onebot/action/extends/SetInputStatus.ts | 2 +- src/onebot/action/extends/SetOnlineStatus.ts | 6 +++--- src/onebot/action/extends/SetSpecialTitle.ts | 4 ++-- src/onebot/action/extends/ShareContact.ts | 6 +++--- src/onebot/action/extends/TransGroupFile.ts | 2 +- src/onebot/action/file/GetGroupFileUrl.ts | 2 +- src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts | 2 +- src/onebot/action/go-cqhttp/DeleteGroupFile.ts | 2 +- src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts | 2 +- src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts | 6 +++--- src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts | 2 +- .../action/go-cqhttp/GetGroupFileSystemInfo.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts | 4 ++-- src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts | 6 +++--- src/onebot/action/go-cqhttp/GetGroupRootFiles.ts | 4 ++-- src/onebot/action/go-cqhttp/GetStrangerInfo.ts | 2 +- src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 4 ++-- src/onebot/action/go-cqhttp/SendGroupNotice.ts | 12 ++++++------ src/onebot/action/go-cqhttp/SetGroupPortrait.ts | 2 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 2 +- src/onebot/action/go-cqhttp/UploadGroupFile.ts | 2 +- src/onebot/action/go-cqhttp/UploadPrivateFile.ts | 2 +- src/onebot/action/group/DelEssenceMsg.ts | 4 ++-- src/onebot/action/group/DelGroupNotice.ts | 2 +- src/onebot/action/group/GetAiRecord.ts | 2 +- src/onebot/action/group/GetGroupEssence.ts | 2 +- src/onebot/action/group/GetGroupInfo.ts | 2 +- src/onebot/action/group/GetGroupMemberInfo.ts | 4 ++-- src/onebot/action/group/GetGroupMemberList.ts | 2 +- src/onebot/action/group/GetGroupNotice.ts | 2 +- src/onebot/action/group/GetGroupShutList.ts | 2 +- src/onebot/action/group/GroupPoke.ts | 4 ++-- src/onebot/action/group/SendGroupAiRecord.ts | 2 +- src/onebot/action/group/SetEssenceMsg.ts | 2 +- src/onebot/action/group/SetGroupAddRequest.ts | 4 ++-- src/onebot/action/group/SetGroupAdmin.ts | 4 ++-- src/onebot/action/group/SetGroupBan.ts | 6 +++--- src/onebot/action/group/SetGroupCard.ts | 4 ++-- src/onebot/action/group/SetGroupKick.ts | 6 +++--- src/onebot/action/group/SetGroupLeave.ts | 2 +- src/onebot/action/group/SetGroupName.ts | 2 +- src/onebot/action/group/SetGroupWholeBan.ts | 4 ++-- src/onebot/action/msg/DeleteMsg.ts | 2 +- src/onebot/action/msg/ForwardSingleMsg.ts | 2 +- src/onebot/action/msg/GetMsg.ts | 4 ++-- src/onebot/action/msg/MarkMsgAsRead.ts | 6 +++--- src/onebot/action/msg/SetMsgEmojiLike.ts | 4 ++-- src/onebot/action/packet/SendPoke.ts | 4 ++-- src/onebot/action/user/FriendPoke.ts | 2 +- src/onebot/action/user/SendLike.ts | 4 ++-- src/onebot/action/user/SetFriendAddRequest.ts | 6 +++--- 56 files changed, 93 insertions(+), 93 deletions(-) diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index 7e8e6f89..05c92220 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), file_id: z.coerce.string(), current_parent_directory: z.coerce.string(), target_parent_directory: z.coerce.string(), diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index 918bcfd2..06bb1f48 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), file_id: z.coerce.string(), current_parent_directory: z.coerce.string(), new_name: z.coerce.string(), diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index c7962d62..df36e0be 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - face_id: z.union([z.coerce.number(), z.coerce.string()]),// 参考 face_config.json 的 QSid - face_type: z.union([z.coerce.number(), z.coerce.string()]).default('1'), + face_id: z.coerce.string(),// 参考 face_config.json 的 QSid + face_type: z.coerce.string().default('1'), wording: z.coerce.string().default(' '), }); diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index 67687b34..3d22da22 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index 397957e6..76324901 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -4,7 +4,7 @@ import { ChatType } from '@/core'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.coerce.string(), event_type: z.coerce.number(), }); diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index 53051824..10101b9a 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - status: z.union([z.coerce.number(), z.coerce.string()]), - ext_status: z.union([z.coerce.number(), z.coerce.string()]), - battery_status: z.union([z.coerce.number(), z.coerce.string()]), + status: z.coerce.number(), + ext_status: z.coerce.number(), + battery_status: z.coerce.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index 88c81e4f..2665a373 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -3,8 +3,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), + user_id: z.coerce.string(), special_title: z.coerce.string().default(''), }); diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index 6194b445..d1419683 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -4,8 +4,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), - group_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), + user_id: z.coerce.string().optional(), + group_id: z.coerce.string().optional(), phoneNumber: z.coerce.string().default(''), }); @@ -29,7 +29,7 @@ export class SharePeer extends OneBotAction; diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index c7b1f7bf..2c1da8c9 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), file_id: z.coerce.string(), }); diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index f191a112..ea475659 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), file_id: z.coerce.string(), }); diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 900e7b74..f1f4c8ff 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), folder_name: z.coerce.string(), }); diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index 80c71247..54b5ff6f 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -6,7 +6,7 @@ import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), file_id: z.coerce.string(), }); diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 94e5ade5..44c7767e 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -4,7 +4,7 @@ import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), folder_id: z.coerce.string().optional(), folder: z.coerce.string().optional(), }); diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index 1a585561..08500dee 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -10,9 +10,9 @@ interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]), - message_seq: z.union([z.coerce.number(), z.coerce.string()]).optional(), - count: z.union([z.coerce.number(), z.coerce.string()]).default(20), + user_id: z.coerce.string(), + message_seq: z.coerce.string().optional(), + count: z.coerce.number().default(20), reverseOrder: z.coerce.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index cad70698..c5ff5d3c 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]) + group_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 81e78e27..7f9cc99f 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]) + group_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index e366fef3..f0431963 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -5,10 +5,10 @@ import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), folder_id: z.coerce.string().optional(), folder: z.coerce.string().optional(), - file_count: z.union([z.coerce.number(), z.coerce.string()]).default(50), + file_count: z.coerce.number().default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index 749b9412..9f30542a 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), type: z.nativeEnum(WebHonorType).optional() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index fff77c91..f9328d7f 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -11,9 +11,9 @@ interface Response { } const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - message_seq: z.union([z.coerce.number(), z.coerce.string()]).optional(), - count: z.union([z.coerce.number(), z.coerce.string()]).default(20), + group_id: z.coerce.string(), + message_seq: z.coerce.string().optional(), + count: z.coerce.number().default(20), reverseOrder: z.coerce.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index 737d54ec..9604e804 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -6,8 +6,8 @@ import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - file_count: z.union([z.coerce.number(), z.coerce.string()]).default(50), + group_id: z.coerce.string(), + file_count: z.coerce.number().default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index e0faf91d..480daa8d 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -6,7 +6,7 @@ import { calcQQLevel } from '@/common/helper'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.coerce.string(), no_cache: z.coerce.boolean().default(false), }); diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index 3643e5d2..f828306a 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - friend_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), - user_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), + friend_id: z.coerce.string().optional(), + user_id: z.coerce.string().optional(), temp_block: z.coerce.boolean().optional(), temp_both_del: z.coerce.boolean().optional(), }); diff --git a/src/onebot/action/go-cqhttp/SendGroupNotice.ts b/src/onebot/action/go-cqhttp/SendGroupNotice.ts index b8df9c9c..e51c2355 100644 --- a/src/onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/src/onebot/action/go-cqhttp/SendGroupNotice.ts @@ -5,14 +5,14 @@ import { unlink } from 'node:fs/promises'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), content: z.coerce.string(), image: z.coerce.string().optional(), - pinned: z.union([z.coerce.number(), z.coerce.string()]).default(0), - type: z.union([z.coerce.number(), z.coerce.string()]).default(1), - confirm_required: z.union([z.coerce.number(), z.coerce.string()]).default(1), - is_show_edit_card: z.union([z.coerce.number(), z.coerce.string()]).default(0), - tip_window_type: z.union([z.coerce.number(), z.coerce.string()]).default(0), + pinned: z.coerce.number().default(0), + type: z.coerce.number().default(1), + confirm_required: z.coerce.number().default(1), + is_show_edit_card: z.coerce.number().default(0), + tip_window_type: z.coerce.number().default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index c82b11b2..5c9e7091 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -6,7 +6,7 @@ import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; const SchemaData = z.object({ file: z.coerce.string(), - group_id: z.union([z.coerce.number(), z.coerce.string()]) + group_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index 40ca8fe3..e7832fbc 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -6,7 +6,7 @@ import { z } from 'zod'; const SchemaData = z.object({ nickname: z.coerce.string(), personal_note: z.coerce.string().optional(), - sex: z.union([z.coerce.number(), z.coerce.string()]).optional(), // 传Sex值?建议传0 + sex: z.coerce.string().optional(), // 传Sex值?建议传0 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index e9903f0f..32f63065 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -7,7 +7,7 @@ import { SendMessageContext } from '@/onebot/api'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), file: z.coerce.string(), name: z.coerce.string(), folder: z.coerce.string().optional(), diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index f43a3223..83379916 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -8,7 +8,7 @@ import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.coerce.string(), file: z.coerce.string(), name: z.coerce.string(), }); diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index 644e5dbf..5f6490cc 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), + message_id: z.coerce.string(), }); type Payload = z.infer; @@ -16,7 +16,7 @@ export default class DelEssenceMsg extends OneBotAction { const msg = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id); if (!msg) { const data = this.core.apis.GroupApi.essenceLRU.getValue(+payload.message_id); - if(!data) throw new Error('消息不存在'); + 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 }; return await this.core.apis.GroupApi.removeGroupEssenceBySeq(group_id, msg_seq, msg_random); } diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index 5668414c..11d23234 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), notice_id: z.coerce.string() }); diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index 86deeca0..8837551f 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -5,7 +5,7 @@ import { z } from 'zod'; const SchemaData = z.object({ character: z.coerce.string(), - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), text: z.coerce.string(), }); diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 4f284e6f..9b46eb40 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -7,7 +7,7 @@ import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index 1b8a3e64..d9695061 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -5,7 +5,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index ac14e3a9..79f9c4e7 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -5,8 +5,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), + user_id: z.coerce.string(), no_cache: z.coerce.boolean().default(false), }); diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 3afca128..6e0aac63 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -6,7 +6,7 @@ import { z } from 'zod'; import { GroupMember } from '@/core'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), no_cache: z.coerce.boolean().default(false) }); diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index 2a1cf2cf..50dd50b5 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -17,7 +17,7 @@ interface GroupNotice { } const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index e48d25ae..ba24fea1 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index 084effb1..a0efd74f 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -3,8 +3,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), + user_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index 88ed5118..d845e793 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -5,7 +5,7 @@ import { z } from 'zod'; const SchemaData = z.object({ character: z.coerce.string(), - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), text: z.coerce.string(), }); diff --git a/src/onebot/action/group/SetEssenceMsg.ts b/src/onebot/action/group/SetEssenceMsg.ts index 998f3e0b..80b7df56 100644 --- a/src/onebot/action/group/SetEssenceMsg.ts +++ b/src/onebot/action/group/SetEssenceMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), + message_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index 1bae2c48..a2fcb662 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - flag: z.union([z.coerce.string(), z.coerce.number()]), + flag: z.coerce.string(), approve: z.coerce.boolean().default(true), - reason: z.union([z.coerce.string(), z.null()]).default(' '), + reason: z.coerce.string().nullable().default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index 97afba3b..d9e91397 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -4,8 +4,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), + user_id: z.coerce.string(), enable: z.coerce.boolean().default(false), }); diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index 37fe0484..cb146e9d 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), - duration: z.union([z.coerce.number(), z.coerce.string()]).default(0), + group_id: z.coerce.string(), + user_id: z.coerce.string(), + duration: z.coerce.number().default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index 1d4e59ca..a3a61ee5 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), + user_id: z.coerce.string(), card: z.coerce.string().optional(), }); diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index 98fa39e8..9aa31341 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), - reject_add_request: z.union([z.coerce.boolean(), z.coerce.string()]).optional(), + group_id: z.coerce.string(), + user_id: z.coerce.string(), + reject_add_request: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index 3cf7cd31..a830ad78 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), is_dismiss: z.coerce.boolean().optional(), }); diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index 61ebc27c..4b70af1a 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string(), group_name: z.coerce.string(), }); diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index 75ce019c..06b16a27 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - enable: z.union([z.coerce.boolean(), z.coerce.string()]).optional(), + group_id: z.coerce.string(), + enable: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index e6a345d7..87f38743 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), + message_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index b2a5f940..a737b8ab 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -5,7 +5,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), + message_id: z.coerce.string(), group_id: z.coerce.string().optional(), user_id: z.coerce.string().optional(), }); diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index da324844..83095c89 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -9,7 +9,7 @@ import { NetworkAdapterConfig } from '@/onebot/config/config'; export type ReturnDataType = OB11Message const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), + message_id: z.coerce.string(), }); type Payload = z.infer; @@ -29,7 +29,7 @@ class GetMsg extends OneBotAction { } const peer = { guildId: '', peerUid: msgIdWithPeer?.Peer.peerUid, chatType: msgIdWithPeer.Peer.chatType }; const orimsg = this.obContext.recallMsgCache.get(msgIdWithPeer.MsgId); - let msg: RawMessage|undefined; + let msg: RawMessage | undefined; if (orimsg) { msg = orimsg; } else { diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index 65506445..7bb6f9eb 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -5,9 +5,9 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), - group_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), - message_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), + user_id: z.coerce.string().optional(), + group_id: z.coerce.string().optional(), + message_id: z.coerce.string().optional(), }); type PlayloadType = z.infer; diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index 7f4e173a..9d2c5bb0 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -4,8 +4,8 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), - emoji_id: z.union([z.coerce.number(), z.coerce.string()]), + message_id: z.coerce.string(), + emoji_id: z.coerce.string(), set: z.coerce.boolean().optional(), }); diff --git a/src/onebot/action/packet/SendPoke.ts b/src/onebot/action/packet/SendPoke.ts index c362cc8f..02e06c90 100644 --- a/src/onebot/action/packet/SendPoke.ts +++ b/src/onebot/action/packet/SendPoke.ts @@ -3,8 +3,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), - user_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.coerce.string().optional(), + user_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index 625eaa16..3eccae07 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -3,7 +3,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]) + user_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 215d2440..4804184b 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - times: z.union([z.coerce.number(), z.coerce.string()]).default(1), - user_id: z.union([z.coerce.number(), z.coerce.string()]) + times: z.coerce.number().default(1), + user_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index 070901c9..ef1fa7fb 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - flag: z.union([z.coerce.string(), z.coerce.number()]), - approve: z.union([z.coerce.string(), z.coerce.boolean()]).default(true), - remark: z.union([z.coerce.string(), z.null()]).nullable().optional() + flag: z.coerce.string(), + approve: z.coerce.boolean().default(true), + remark: z.coerce.string().nullable().optional() }); type Payload = z.infer; From a0415c5f4ed79673f88818c9bebdbe91953f4196 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Tue, 15 Apr 2025 04:35:48 +0000 Subject: [PATCH 067/149] release: v4.7.22 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index e565a67f..a46b6f88 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.21", + "version": "4.7.22", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index cdc91b35..4d284431 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.21", + "version": "4.7.22", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 3e674b92..d807d809 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.21'; +export const napCatVersion = '4.7.22'; From 9d40eacc15bb9e27b41f270929ffceb1889782b5 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: Tue, 15 Apr 2025 18:38:24 +0800 Subject: [PATCH 068/149] =?UTF-8?q?fix:=2034231=20linux=20arm64=20docker?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/native/packet/MoeHoo.linux.arm64.node | Bin 1302216 -> 1302128 bytes src/native/packet/MoeHoo.linux.x64.node | Bin 134216 -> 130040 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/native/packet/MoeHoo.linux.arm64.node b/src/native/packet/MoeHoo.linux.arm64.node index d4ebb90f43411120e9aebb69889e72a2034e626e..4f2484256ad0d48ce78134d7172621fd26053ac8 100644 GIT binary patch delta 220364 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 G#s2|PqOfiN delta 22431 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 From cc30b51d58233db02b48862ecca2c1aa24ce1535 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Tue, 15 Apr 2025 10:38:47 +0000 Subject: [PATCH 069/149] release: v4.7.23 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index a46b6f88..3cb2f197 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.22", + "version": "4.7.23", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 4d284431..ecee6e39 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.22", + "version": "4.7.23", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index d807d809..62f0f436 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.22'; +export const napCatVersion = '4.7.23'; From 17ef3231df08102cacd10f9319fd149de553fa62 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: Thu, 17 Apr 2025 09:38:38 +0800 Subject: [PATCH 070/149] =?UTF-8?q?fix:=20zod=20boolean=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/helper/config.ts | 15 +-- .../extends/ClickInlineKeyboardButton.ts | 11 +- src/onebot/action/extends/CreateCollection.ts | 6 +- src/onebot/action/extends/FetchCustomFace.ts | 4 +- src/onebot/action/extends/FetchEmojiLike.ts | 10 +- src/onebot/action/extends/GetAiCharacters.ts | 6 +- .../action/extends/GetCollectionList.ts | 6 +- src/onebot/action/extends/GetGroupInfoEx.ts | 3 +- src/onebot/action/extends/GetMiniAppArk.ts | 46 ++++---- src/onebot/action/extends/GetProfileLike.ts | 8 +- src/onebot/action/extends/GetUserStatus.ts | 4 +- src/onebot/action/extends/MoveGroupFile.ts | 10 +- src/onebot/action/extends/OCRImage.ts | 4 +- src/onebot/action/extends/RenameGroupFile.ts | 10 +- src/onebot/action/extends/SendPacket.ts | 7 +- .../action/extends/SetDiyOnlineStatus.ts | 8 +- src/onebot/action/extends/SetGroupRemark.ts | 6 +- src/onebot/action/extends/SetGroupSign.ts | 4 +- src/onebot/action/extends/SetInputStatus.ts | 6 +- src/onebot/action/extends/SetLongNick.ts | 4 +- src/onebot/action/extends/SetOnlineStatus.ts | 8 +- src/onebot/action/extends/SetQQAvatar.ts | 4 +- src/onebot/action/extends/SetSpecialTitle.ts | 8 +- src/onebot/action/extends/ShareContact.ts | 10 +- src/onebot/action/extends/TransGroupFile.ts | 6 +- .../action/extends/TranslateEnWordToZn.ts | 4 +- src/onebot/action/file/GetFile.ts | 6 +- src/onebot/action/file/GetGroupFileUrl.ts | 6 +- src/onebot/action/file/GetPrivateFileUrl.ts | 4 +- .../action/go-cqhttp/CreateGroupFileFolder.ts | 6 +- .../action/go-cqhttp/DeleteGroupFile.ts | 6 +- .../action/go-cqhttp/DeleteGroupFileFolder.ts | 8 +- src/onebot/action/go-cqhttp/DownloadFile.ts | 10 +- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 6 +- .../action/go-cqhttp/GetFriendMsgHistory.ts | 9 +- .../action/go-cqhttp/GetGroupAtAllRemain.ts | 4 +- .../go-cqhttp/GetGroupFileSystemInfo.ts | 4 +- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 10 +- .../action/go-cqhttp/GetGroupHonorInfo.ts | 4 +- .../action/go-cqhttp/GetGroupMsgHistory.ts | 9 +- .../action/go-cqhttp/GetGroupRootFiles.ts | 6 +- .../action/go-cqhttp/GetStrangerInfo.ts | 5 +- .../go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 4 +- .../action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 9 +- .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 4 +- .../action/go-cqhttp/SendGroupNotice.ts | 18 +-- .../action/go-cqhttp/SetGroupPortrait.ts | 5 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 8 +- .../action/go-cqhttp/UploadGroupFile.ts | 12 +- .../action/go-cqhttp/UploadPrivateFile.ts | 8 +- src/onebot/action/group/DelEssenceMsg.ts | 4 +- src/onebot/action/group/DelGroupNotice.ts | 6 +- src/onebot/action/group/GetAiRecord.ts | 8 +- src/onebot/action/group/GetGroupEssence.ts | 4 +- src/onebot/action/group/GetGroupInfo.ts | 4 +- src/onebot/action/group/GetGroupList.ts | 3 +- src/onebot/action/group/GetGroupMemberInfo.ts | 7 +- src/onebot/action/group/GetGroupMemberList.ts | 5 +- src/onebot/action/group/GetGroupNotice.ts | 3 +- src/onebot/action/group/GetGroupShutList.ts | 4 +- src/onebot/action/group/GroupPoke.ts | 6 +- src/onebot/action/group/SendGroupAiRecord.ts | 8 +- src/onebot/action/group/SetEssenceMsg.ts | 4 +- src/onebot/action/group/SetGroupAddRequest.ts | 7 +- src/onebot/action/group/SetGroupAdmin.ts | 7 +- src/onebot/action/group/SetGroupBan.ts | 8 +- src/onebot/action/group/SetGroupCard.ts | 8 +- src/onebot/action/group/SetGroupKick.ts | 7 +- src/onebot/action/group/SetGroupLeave.ts | 5 +- src/onebot/action/group/SetGroupName.ts | 6 +- src/onebot/action/group/SetGroupWholeBan.ts | 5 +- src/onebot/action/msg/DeleteMsg.ts | 3 +- src/onebot/action/msg/ForwardSingleMsg.ts | 8 +- src/onebot/action/msg/GetMsg.ts | 4 +- src/onebot/action/msg/MarkMsgAsRead.ts | 8 +- src/onebot/action/msg/SetMsgEmojiLike.ts | 7 +- src/onebot/action/packet/SendPoke.ts | 5 +- src/onebot/action/system/GetCredentials.ts | 3 +- src/onebot/action/type.ts | 15 +++ src/onebot/action/user/FriendPoke.ts | 3 +- src/onebot/action/user/GetCookies.ts | 3 +- src/onebot/action/user/GetFriendList.ts | 3 +- src/onebot/action/user/GetRecentContact.ts | 3 +- src/onebot/action/user/SendLike.ts | 5 +- src/onebot/action/user/SetFriendAddRequest.ts | 7 +- src/onebot/config/config.ts | 107 +++++++++--------- src/webui/src/helper/config.ts | 11 +- src/webui/src/types/theme.ts | 5 +- 88 files changed, 377 insertions(+), 331 deletions(-) create mode 100644 src/onebot/action/type.ts diff --git a/src/core/helper/config.ts b/src/core/helper/config.ts index 94cfbeb5..1b11467a 100644 --- a/src/core/helper/config.ts +++ b/src/core/helper/config.ts @@ -1,15 +1,16 @@ import { ConfigBase } from '@/common/config-base'; import { NapCatCore } from '@/core'; +import { actionType } from '@/onebot/action/type'; import { z } from 'zod'; export const NapcatConfigSchema = z.object({ - fileLog: z.coerce.boolean().default(false), - consoleLog: z.coerce.boolean().default(true), - fileLogLevel: z.coerce.string().default('debug'), - consoleLogLevel: z.coerce.string().default('info'), - packetBackend: z.coerce.string().default('auto'), - packetServer: z.coerce.string().default(''), - o3HookMode: z.coerce.number().default(0), + fileLog: actionType.boolean().default(false), + consoleLog: actionType.boolean().default(true), + fileLogLevel: actionType.string().default('debug'), + consoleLogLevel: actionType.string().default('info'), + packetBackend: actionType.string().default('auto'), + packetServer: actionType.string().default(''), + o3HookMode: actionType.number().default(0), }); export type NapcatConfig = z.infer; diff --git a/src/onebot/action/extends/ClickInlineKeyboardButton.ts b/src/onebot/action/extends/ClickInlineKeyboardButton.ts index c06947cf..aaca0481 100644 --- a/src/onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/src/onebot/action/extends/ClickInlineKeyboardButton.ts @@ -1,13 +1,14 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '../OneBotAction'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - bot_appid: z.coerce.string(), - button_id: z.coerce.string().default(''), - callback_data: z.coerce.string().default(''), - msg_seq: z.coerce.string().default('10086'), + group_id: actionType.string(), + bot_appid: actionType.string(), + button_id: actionType.string().default(''), + callback_data: actionType.string().default(''), + msg_seq: actionType.string().default('10086'), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/CreateCollection.ts b/src/onebot/action/extends/CreateCollection.ts index e1c5903b..8451664e 100644 --- a/src/onebot/action/extends/CreateCollection.ts +++ b/src/onebot/action/extends/CreateCollection.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - rawData: z.coerce.string(), - brief: z.coerce.string(), + rawData: actionType.string(), + brief: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchCustomFace.ts b/src/onebot/action/extends/FetchCustomFace.ts index cd7d7645..8e068060 100644 --- a/src/onebot/action/extends/FetchCustomFace.ts +++ b/src/onebot/action/extends/FetchCustomFace.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; - +import { actionType } from '../type'; const SchemaData = z.object({ - count: z.coerce.number().default(48), + count: actionType.number().default(48), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchEmojiLike.ts b/src/onebot/action/extends/FetchEmojiLike.ts index 11505d9a..263311ad 100644 --- a/src/onebot/action/extends/FetchEmojiLike.ts +++ b/src/onebot/action/extends/FetchEmojiLike.ts @@ -3,12 +3,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { type NTQQMsgApi } from '@/core/apis'; - +import { actionType } from '../type'; const SchemaData = z.object({ - message_id: z.coerce.string(), - emojiId: z.coerce.string(), - emojiType: z.coerce.string(), - count: z.coerce.number().default(20), + message_id: actionType.string(), + emojiId: actionType.string(), + emojiType: actionType.string(), + count: actionType.number().default(20), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetAiCharacters.ts b/src/onebot/action/extends/GetAiCharacters.ts index e2f2045a..5706cfec 100644 --- a/src/onebot/action/extends/GetAiCharacters.ts +++ b/src/onebot/action/extends/GetAiCharacters.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - chat_type: z.coerce.number().default(1), + group_id: actionType.string(), + chat_type: actionType.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetCollectionList.ts b/src/onebot/action/extends/GetCollectionList.ts index 4399c349..d1593a02 100644 --- a/src/onebot/action/extends/GetCollectionList.ts +++ b/src/onebot/action/extends/GetCollectionList.ts @@ -2,10 +2,10 @@ import { type NTQQCollectionApi } from '@/core/apis/collection'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - category: z.coerce.number(), - count: z.coerce.number().default(1), + category: actionType.number(), + count: actionType.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetGroupInfoEx.ts b/src/onebot/action/extends/GetGroupInfoEx.ts index 4dcd05ee..ec3f685d 100644 --- a/src/onebot/action/extends/GetGroupInfoEx.ts +++ b/src/onebot/action/extends/GetGroupInfoEx.ts @@ -1,8 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetMiniAppArk.ts b/src/onebot/action/extends/GetMiniAppArk.ts index 699d6661..50e1629d 100644 --- a/src/onebot/action/extends/GetMiniAppArk.ts +++ b/src/onebot/action/extends/GetMiniAppArk.ts @@ -3,34 +3,34 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { MiniAppInfo, MiniAppInfoHelper } from '@/core/packet/utils/helper/miniAppHelper'; import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from '@/core/packet/entities/miniApp'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.union([ z.object({ type: z.union([z.literal('bili'), z.literal('weibo')]), - title: z.coerce.string(), - desc: z.coerce.string(), - picUrl: z.coerce.string(), - jumpUrl: z.coerce.string(), - webUrl: z.coerce.string().optional(), - rawArkData: z.coerce.string().optional() + title: actionType.string(), + desc: actionType.string(), + picUrl: actionType.string(), + jumpUrl: actionType.string(), + webUrl: actionType.string().optional(), + rawArkData: actionType.string().optional() }), z.object({ - title: z.coerce.string(), - desc: z.coerce.string(), - picUrl: z.coerce.string(), - jumpUrl: z.coerce.string(), - iconUrl: z.coerce.string(), - webUrl: z.coerce.string().optional(), - appId: z.coerce.string(), - scene: z.union([z.coerce.number(), z.coerce.string()]), - templateType: z.union([z.coerce.number(), z.coerce.string()]), - businessType: z.union([z.coerce.number(), z.coerce.string()]), - verType: z.union([z.coerce.number(), z.coerce.string()]), - shareType: z.union([z.coerce.number(), z.coerce.string()]), - versionId: z.coerce.string(), - sdkId: z.coerce.string(), - withShareTicket: z.union([z.coerce.number(), z.coerce.string()]), - rawArkData: z.coerce.string().optional() + title: actionType.string(), + desc: actionType.string(), + picUrl: actionType.string(), + jumpUrl: actionType.string(), + iconUrl: actionType.string(), + webUrl: actionType.string().optional(), + appId: actionType.string(), + scene: z.union([actionType.number(), actionType.string()]), + templateType: z.union([actionType.number(), actionType.string()]), + businessType: z.union([actionType.number(), actionType.string()]), + verType: z.union([actionType.number(), actionType.string()]), + shareType: z.union([actionType.number(), actionType.string()]), + versionId: actionType.string(), + sdkId: actionType.string(), + withShareTicket: z.union([actionType.number(), actionType.string()]), + rawArkData: actionType.string().optional() }) ]); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index 7e727a7a..3e06b75b 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -2,11 +2,11 @@ import { NTVoteInfo } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - user_id: z.coerce.string().optional(), - start: z.coerce.number().default(0), - count: z.coerce.number().default(10), + user_id: actionType.string().optional(), + start: actionType.number().default(0), + count: actionType.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetUserStatus.ts b/src/onebot/action/extends/GetUserStatus.ts index 7fe274e8..3256b6fe 100644 --- a/src/onebot/action/extends/GetUserStatus.ts +++ b/src/onebot/action/extends/GetUserStatus.ts @@ -1,9 +1,9 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - user_id: z.coerce.number(), + user_id: actionType.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index 05c92220..cdad0987 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -2,12 +2,12 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - file_id: z.coerce.string(), - current_parent_directory: z.coerce.string(), - target_parent_directory: z.coerce.string(), + group_id: actionType.string(), + file_id: actionType.string(), + current_parent_directory: actionType.string(), + target_parent_directory: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/OCRImage.ts b/src/onebot/action/extends/OCRImage.ts index d3dd45a8..6e4baf61 100644 --- a/src/onebot/action/extends/OCRImage.ts +++ b/src/onebot/action/extends/OCRImage.ts @@ -4,9 +4,9 @@ import { checkFileExist, uriToLocalFile } from '@/common/file'; import fs from 'fs'; import { z } from 'zod'; import { GeneralCallResultStatus } from '@/core'; - +import { actionType } from '../type'; const SchemaData = z.object({ - image: z.coerce.string(), + image: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index 06bb1f48..fe0fd2d7 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -2,12 +2,12 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - file_id: z.coerce.string(), - current_parent_directory: z.coerce.string(), - new_name: z.coerce.string(), + group_id: actionType.string(), + file_id: actionType.string(), + current_parent_directory: actionType.string(), + new_name: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SendPacket.ts b/src/onebot/action/extends/SendPacket.ts index ac23b9c4..b472109a 100644 --- a/src/onebot/action/extends/SendPacket.ts +++ b/src/onebot/action/extends/SendPacket.ts @@ -2,11 +2,12 @@ import { PacketHexStr } from '@/core/packet/transformer/base'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - cmd: z.coerce.string(), - data: z.coerce.string(), - rsp: z.coerce.boolean().default(true), + cmd: actionType.string(), + data: actionType.string(), + rsp: actionType.boolean().default(true), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index df36e0be..7c1d609a 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - face_id: z.coerce.string(),// 参考 face_config.json 的 QSid - face_type: z.coerce.string().default('1'), - wording: z.coerce.string().default(' '), + face_id: actionType.string(),// 参考 face_config.json 的 QSid + face_type: actionType.string().default('1'), + wording: actionType.string().default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupRemark.ts b/src/onebot/action/extends/SetGroupRemark.ts index a6e5edaf..c30fb31c 100644 --- a/src/onebot/action/extends/SetGroupRemark.ts +++ b/src/onebot/action/extends/SetGroupRemark.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - remark: z.coerce.string(), + group_id: actionType.string(), + remark: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index 3d22da22..bb66c12f 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -1,9 +1,9 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index 76324901..2dd00a44 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -2,10 +2,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { ChatType } from '@/core'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - user_id: z.coerce.string(), - event_type: z.coerce.number(), + user_id: actionType.string(), + event_type: actionType.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetLongNick.ts b/src/onebot/action/extends/SetLongNick.ts index be68fea2..d84344e3 100644 --- a/src/onebot/action/extends/SetLongNick.ts +++ b/src/onebot/action/extends/SetLongNick.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - longNick: z.coerce.string(), + longNick: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index 10101b9a..d9d76019 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - status: z.coerce.number(), - ext_status: z.coerce.number(), - battery_status: z.coerce.number(), + status: actionType.number(), + ext_status: actionType.number(), + battery_status: actionType.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetQQAvatar.ts b/src/onebot/action/extends/SetQQAvatar.ts index eee209c8..9a84a5a0 100644 --- a/src/onebot/action/extends/SetQQAvatar.ts +++ b/src/onebot/action/extends/SetQQAvatar.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import fs from 'node:fs/promises'; import { checkFileExist, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - file: z.coerce.string(), + file: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index 2665a373..dcb0dff4 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -1,11 +1,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), - special_title: z.coerce.string().default(''), + group_id: actionType.string(), + user_id: actionType.string(), + special_title: actionType.string().default(''), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index d1419683..732ac990 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -2,11 +2,11 @@ import { GeneralCallResult } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - user_id: z.coerce.string().optional(), - group_id: z.coerce.string().optional(), - phoneNumber: z.coerce.string().default(''), + user_id: actionType.string().optional(), + group_id: actionType.string().optional(), + phoneNumber: actionType.string().default(''), }); type Payload = z.infer; @@ -29,7 +29,7 @@ export class SharePeer extends OneBotAction; diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index 2c1da8c9..c802d160 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - file_id: z.coerce.string(), + group_id: actionType.string(), + file_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index bc4977b2..77ce0647 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - words: z.array(z.coerce.string()), + words: z.array(actionType.string()), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetFile.ts b/src/onebot/action/file/GetFile.ts index 8d373676..4116f4c4 100644 --- a/src/onebot/action/file/GetFile.ts +++ b/src/onebot/action/file/GetFile.ts @@ -4,7 +4,7 @@ import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { ActionName } from '@/onebot/action/router'; import { OB11MessageImage, OB11MessageVideo } from '@/onebot/types'; import { z } from 'zod'; - +import { actionType } from '../type'; export interface GetFileResponse { file?: string; // path url?: string; @@ -14,8 +14,8 @@ export interface GetFileResponse { } const GetFileBase_PayloadSchema = z.object({ - file: z.coerce.string().optional(), - file_id: z.coerce.string().optional(), + file: actionType.string().optional(), + file_id: actionType.string().optional(), }); diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index ea475659..e454ea9f 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - file_id: z.coerce.string(), + group_id: actionType.string(), + file_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts index f2ea65e3..2dbb615d 100644 --- a/src/onebot/action/file/GetPrivateFileUrl.ts +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -2,9 +2,9 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - file_id: z.coerce.string(), + file_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index f1f4c8ff..2b1e3a18 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - folder_name: z.coerce.string(), + group_id: actionType.string(), + folder_name: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index 54b5ff6f..5a4895fe 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -4,10 +4,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - file_id: z.coerce.string(), + group_id: actionType.string(), + file_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 44c7767e..170bb703 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - folder_id: z.coerce.string().optional(), - folder: z.coerce.string().optional(), + group_id: actionType.string(), + folder_id: actionType.string().optional(), + folder: actionType.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DownloadFile.ts b/src/onebot/action/go-cqhttp/DownloadFile.ts index a5fb7222..3b5b7965 100644 --- a/src/onebot/action/go-cqhttp/DownloadFile.ts +++ b/src/onebot/action/go-cqhttp/DownloadFile.ts @@ -5,16 +5,16 @@ import { join as joinPath } from 'node:path'; import { calculateFileMD5, uriToLocalFile } from '@/common/file'; import { randomUUID } from 'crypto'; import { z } from 'zod'; - +import { actionType } from '../type'; interface FileResponse { file: string; } const SchemaData = z.object({ - url: z.coerce.string().optional(), - base64: z.coerce.string().optional(), - name: z.coerce.string().optional(), - headers: z.union([z.coerce.string(), z.array(z.coerce.string())]).optional(), + url: actionType.string().optional(), + base64: actionType.string().optional(), + name: actionType.string().optional(), + headers: z.union([actionType.string(), z.array(actionType.string())]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index e85546fe..62cbd438 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -5,10 +5,10 @@ import { MessageUnique } from '@/common/message-unique'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; import { z } from 'zod'; import { isNumeric } from '@/common/helper'; - +import { actionType } from '../type'; const SchemaData = z.object({ - message_id: z.coerce.string().optional(), - id: z.coerce.string().optional(), + message_id: actionType.string().optional(), + id: actionType.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index 08500dee..be7a52d0 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -5,15 +5,16 @@ import { ChatType } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; +import { actionType } from '../type'; interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - user_id: z.coerce.string(), - message_seq: z.coerce.string().optional(), - count: z.coerce.number().default(20), - reverseOrder: z.coerce.boolean().default(false) + user_id: actionType.string(), + message_seq: actionType.string().optional(), + count: actionType.number().default(20), + reverseOrder: actionType.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index c5ff5d3c..67d2eb8d 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string() + group_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 7f9cc99f..9d161641 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string() + group_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index f0431963..fb993dba 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -3,12 +3,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - folder_id: z.coerce.string().optional(), - folder: z.coerce.string().optional(), - file_count: z.coerce.number().default(50), + group_id: actionType.string(), + folder_id: actionType.string().optional(), + folder: actionType.string().optional(), + file_count: actionType.number().default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index 9f30542a..a6c666a3 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -2,9 +2,9 @@ import { WebHonorType } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: actionType.string(), type: z.nativeEnum(WebHonorType).optional() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index f9328d7f..0952bb86 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -5,16 +5,17 @@ import { ChatType, Peer } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; +import { actionType } from '../type'; interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - group_id: z.coerce.string(), - message_seq: z.coerce.string().optional(), - count: z.coerce.number().default(20), - reverseOrder: z.coerce.boolean().default(false) + group_id: actionType.string(), + message_seq: actionType.string().optional(), + count: actionType.number().default(20), + reverseOrder: actionType.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index 9604e804..d3a8efbc 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -4,10 +4,10 @@ import { ActionName } from '@/onebot/action/router'; import { OB11GroupFile, OB11GroupFileFolder } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - file_count: z.coerce.number().default(50), + group_id: actionType.string(), + file_count: actionType.number().default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index 480daa8d..6052c1b7 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -4,10 +4,11 @@ import { OB11Construct } from '@/onebot/helper/data'; import { ActionName } from '@/onebot/action/router'; import { calcQQLevel } from '@/common/helper'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - user_id: z.coerce.string(), - no_cache: z.coerce.boolean().default(false), + user_id: actionType.string(), + no_cache: actionType.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index 0f4d4424..18013147 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - url: z.coerce.string(), + url: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index f828306a..27831852 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -1,12 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - friend_id: z.coerce.string().optional(), - user_id: z.coerce.string().optional(), - temp_block: z.coerce.boolean().optional(), - temp_both_del: z.coerce.boolean().optional(), + friend_id: actionType.string().optional(), + user_id: actionType.string().optional(), + temp_block: actionType.boolean().optional(), + temp_both_del: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index ea791d3e..962cf137 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - model: z.coerce.string(), + model: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SendGroupNotice.ts b/src/onebot/action/go-cqhttp/SendGroupNotice.ts index e51c2355..b3b6a795 100644 --- a/src/onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/src/onebot/action/go-cqhttp/SendGroupNotice.ts @@ -3,16 +3,16 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { unlink } from 'node:fs/promises'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - content: z.coerce.string(), - image: z.coerce.string().optional(), - pinned: z.coerce.number().default(0), - type: z.coerce.number().default(1), - confirm_required: z.coerce.number().default(1), - is_show_edit_card: z.coerce.number().default(0), - tip_window_type: z.coerce.number().default(0), + group_id: actionType.string(), + content: actionType.string(), + image: actionType.string().optional(), + pinned: actionType.number().default(0), + type: actionType.number().default(1), + confirm_required: actionType.number().default(1), + is_show_edit_card: actionType.number().default(0), + tip_window_type: actionType.number().default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index 5c9e7091..b009f267 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -4,9 +4,10 @@ import { checkFileExistV2, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; +import { actionType } from '../type'; const SchemaData = z.object({ - file: z.coerce.string(), - group_id: z.coerce.string() + file: actionType.string(), + group_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index e7832fbc..f61872e9 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -2,11 +2,11 @@ import { NTQQUserApi } from '@/core/apis'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - nickname: z.coerce.string(), - personal_note: z.coerce.string().optional(), - sex: z.coerce.string().optional(), // 传Sex值?建议传0 + nickname: actionType.string(), + personal_note: actionType.string().optional(), + sex: actionType.string().optional(), // 传Sex值?建议传0 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index 32f63065..3381f198 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -5,13 +5,13 @@ import fs from 'fs'; import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - file: z.coerce.string(), - name: z.coerce.string(), - folder: z.coerce.string().optional(), - folder_id: z.coerce.string().optional(),//临时扩展 + group_id: actionType.string(), + file: actionType.string(), + name: actionType.string(), + folder: actionType.string().optional(), + folder_id: actionType.string().optional(),//临时扩展 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index 83379916..6d53fda6 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -6,11 +6,11 @@ import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - user_id: z.coerce.string(), - file: z.coerce.string(), - name: z.coerce.string(), + user_id: actionType.string(), + file: actionType.string(), + name: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index 5f6490cc..1d108bec 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -2,9 +2,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - message_id: z.coerce.string(), + message_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index 11d23234..7ec4de9c 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - notice_id: z.coerce.string() + group_id: actionType.string(), + notice_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index 8837551f..58d40b1d 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - character: z.coerce.string(), - group_id: z.coerce.string(), - text: z.coerce.string(), + character: actionType.string(), + group_id: actionType.string(), + text: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 9b46eb40..0176994e 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -5,9 +5,9 @@ import { MessageUnique } from '@/common/message-unique'; import crypto from 'crypto'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index d9695061..9a24c3c0 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -3,9 +3,9 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupList.ts b/src/onebot/action/group/GetGroupList.ts index 0b219646..98f7d407 100644 --- a/src/onebot/action/group/GetGroupList.ts +++ b/src/onebot/action/group/GetGroupList.ts @@ -3,9 +3,10 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - no_cache: z.coerce.boolean().default(false), + no_cache: actionType.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index 79f9c4e7..0aa72dde 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -3,11 +3,12 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), - no_cache: z.coerce.boolean().default(false), + group_id: actionType.string(), + user_id: actionType.string(), + no_cache: actionType.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 6e0aac63..746efbaa 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -4,10 +4,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; import { GroupMember } from '@/core'; +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - no_cache: z.coerce.boolean().default(false) + group_id: actionType.string(), + no_cache: actionType.boolean().default(false) }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index 50dd50b5..89f30a32 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -2,6 +2,7 @@ import { WebApiGroupNoticeFeed } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; interface GroupNotice { sender_id: number; publish_time: number; @@ -17,7 +18,7 @@ interface GroupNotice { } const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index ba24fea1..3133b412 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -2,9 +2,9 @@ import { ShutUpGroupMember } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index a0efd74f..09d958e5 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -1,10 +1,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), + group_id: actionType.string(), + user_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index d845e793..bb1c85fd 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - character: z.coerce.string(), - group_id: z.coerce.string(), - text: z.coerce.string(), + character: actionType.string(), + group_id: actionType.string(), + text: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetEssenceMsg.ts b/src/onebot/action/group/SetEssenceMsg.ts index 80b7df56..de3c7f43 100644 --- a/src/onebot/action/group/SetEssenceMsg.ts +++ b/src/onebot/action/group/SetEssenceMsg.ts @@ -2,9 +2,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - message_id: z.coerce.string(), + message_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index a2fcb662..f0ced956 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -2,11 +2,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupRequestOperateTypes } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - flag: z.coerce.string(), - approve: z.coerce.boolean().default(true), - reason: z.coerce.string().nullable().default(' '), + flag: actionType.string(), + approve: actionType.boolean().default(true), + reason: actionType.string().nullable().default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index d9e91397..4067b4ff 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -2,11 +2,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupMemberRole } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), - enable: z.coerce.boolean().default(false), + group_id: actionType.string(), + user_id: actionType.string(), + enable: actionType.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index cb146e9d..e4fe3c03 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), - duration: z.coerce.number().default(0), + group_id: actionType.string(), + user_id: actionType.string(), + duration: actionType.number().default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index a3a61ee5..870af15f 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), - card: z.coerce.string().optional(), + group_id: actionType.string(), + user_id: actionType.string(), + card: actionType.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index 9aa31341..a394b9c8 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -1,11 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), - reject_add_request: z.coerce.boolean().optional(), + group_id: actionType.string(), + user_id: actionType.string(), + reject_add_request: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index a830ad78..a21c890e 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -1,10 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - is_dismiss: z.coerce.boolean().optional(), + group_id: actionType.string(), + is_dismiss: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index 4b70af1a..b1949b45 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -2,10 +2,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - group_name: z.coerce.string(), + group_id: actionType.string(), + group_name: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index 06b16a27..e35b85b8 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -1,10 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string(), - enable: z.coerce.boolean().optional(), + group_id: actionType.string(), + enable: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index 87f38743..3d88c5a8 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -2,9 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - message_id: z.coerce.string(), + message_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index a737b8ab..3497a40c 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -3,11 +3,11 @@ import { ChatType, Peer } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - message_id: z.coerce.string(), - group_id: z.coerce.string().optional(), - user_id: z.coerce.string().optional(), + message_id: actionType.string(), + group_id: actionType.string().optional(), + user_id: actionType.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index 83095c89..347b1502 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -5,11 +5,11 @@ import { MessageUnique } from '@/common/message-unique'; import { RawMessage } from '@/core'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; - +import { actionType } from '../type'; export type ReturnDataType = OB11Message const SchemaData = z.object({ - message_id: z.coerce.string(), + message_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index 7bb6f9eb..fcb8e271 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -3,11 +3,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; - +import { actionType } from '../type'; const SchemaData = z.object({ - user_id: z.coerce.string().optional(), - group_id: z.coerce.string().optional(), - message_id: z.coerce.string().optional(), + user_id: actionType.string().optional(), + group_id: actionType.string().optional(), + message_id: actionType.string().optional(), }); type PlayloadType = z.infer; diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index 9d2c5bb0..b71983ef 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -2,11 +2,12 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - message_id: z.coerce.string(), - emoji_id: z.coerce.string(), - set: z.coerce.boolean().optional(), + message_id: actionType.string(), + emoji_id: actionType.string(), + set: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/packet/SendPoke.ts b/src/onebot/action/packet/SendPoke.ts index 02e06c90..dcd9da64 100644 --- a/src/onebot/action/packet/SendPoke.ts +++ b/src/onebot/action/packet/SendPoke.ts @@ -1,10 +1,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - group_id: z.coerce.string().optional(), - user_id: z.coerce.string(), + group_id: actionType.string().optional(), + user_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/system/GetCredentials.ts b/src/onebot/action/system/GetCredentials.ts index 0d6a72fb..07228128 100644 --- a/src/onebot/action/system/GetCredentials.ts +++ b/src/onebot/action/system/GetCredentials.ts @@ -1,6 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; interface Response { cookies: string, @@ -8,7 +9,7 @@ interface Response { } const SchemaData = z.object({ - domain: z.coerce.string() + domain: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/type.ts b/src/onebot/action/type.ts new file mode 100644 index 00000000..f480fda0 --- /dev/null +++ b/src/onebot/action/type.ts @@ -0,0 +1,15 @@ +import { z } from "zod"; + +const boolean = () => z.preprocess( + val => typeof val === 'string' && val.toLowerCase() === 'false' ? false : Boolean(val), + z.boolean() +); +const number = () => z.preprocess( + val => typeof val !== 'number' ? Number(val) : val, + z.number() +); +const string = () => z.preprocess( + val => typeof val !== 'string' ? String(val) : val, + z.string() +); +export const actionType = { boolean, number, string }; \ No newline at end of file diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index 3eccae07..68493c94 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -1,9 +1,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - user_id: z.coerce.string() + user_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetCookies.ts b/src/onebot/action/user/GetCookies.ts index 82df5bcc..60c34424 100644 --- a/src/onebot/action/user/GetCookies.ts +++ b/src/onebot/action/user/GetCookies.ts @@ -1,13 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; interface Response { cookies: string, bkn: string } const SchemaData = z.object({ - domain: z.coerce.string() + domain: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index e804bf1c..74cc6815 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -3,9 +3,10 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - no_cache: z.coerce.boolean().optional(), + no_cache: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetRecentContact.ts b/src/onebot/action/user/GetRecentContact.ts index b79d7aec..8a551b54 100644 --- a/src/onebot/action/user/GetRecentContact.ts +++ b/src/onebot/action/user/GetRecentContact.ts @@ -3,9 +3,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { NetworkAdapterConfig } from '@/onebot/config/config'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - count: z.coerce.number().default(10), + count: actionType.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 4804184b..5ac5078e 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -1,10 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - times: z.coerce.number().default(1), - user_id: z.coerce.string() + times: actionType.number().default(1), + user_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index ef1fa7fb..3fb71e18 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -1,11 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; +import { actionType } from '../type'; const SchemaData = z.object({ - flag: z.coerce.string(), - approve: z.coerce.boolean().default(true), - remark: z.coerce.string().nullable().optional() + flag: actionType.string(), + approve: actionType.boolean().default(true), + remark: actionType.string().nullable().optional() }); type Payload = z.infer; diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index 9a9b8a00..7ee9d3b7 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,71 +1,72 @@ import { z } from 'zod'; +import { actionType } from '../action/type'; const HttpServerConfigSchema = z.object({ - name: z.coerce.string().default('http-server'), - enable: z.coerce.boolean().default(false), - port: z.coerce.number().default(3000), - host: z.coerce.string().default('0.0.0.0'), - enableCors: z.coerce.boolean().default(true), - enableWebsocket: z.coerce.boolean().default(true), - messagePostFormat: z.coerce.string().default('array'), - token: z.coerce.string().default(''), - debug: z.coerce.boolean().default(false) + name: actionType.string().default('http-server'), + enable: actionType.boolean().default(false), + port: actionType.number().default(3000), + host: actionType.string().default('0.0.0.0'), + enableCors: actionType.boolean().default(true), + enableWebsocket: actionType.boolean().default(true), + messagePostFormat: actionType.string().default('array'), + token: actionType.string().default(''), + debug: actionType.boolean().default(false) }); const HttpSseServerConfigSchema = z.object({ - name: z.coerce.string().default('http-sse-server'), - enable: z.coerce.boolean().default(false), - port: z.coerce.number().default(3000), - host: z.coerce.string().default('0.0.0.0'), - enableCors: z.coerce.boolean().default(true), - enableWebsocket: z.coerce.boolean().default(true), - messagePostFormat: z.coerce.string().default('array'), - token: z.coerce.string().default(''), - debug: z.coerce.boolean().default(false), - reportSelfMessage: z.coerce.boolean().default(false) + name: actionType.string().default('http-sse-server'), + enable: actionType.boolean().default(false), + port: actionType.number().default(3000), + host: actionType.string().default('0.0.0.0'), + enableCors: actionType.boolean().default(true), + enableWebsocket: actionType.boolean().default(true), + messagePostFormat: actionType.string().default('array'), + token: actionType.string().default(''), + debug: actionType.boolean().default(false), + reportSelfMessage: actionType.boolean().default(false) }); const HttpClientConfigSchema = z.object({ - name: z.coerce.string().default('http-client'), - enable: z.coerce.boolean().default(false), - url: z.coerce.string().default('http://localhost:8080'), - messagePostFormat: z.coerce.string().default('array'), - reportSelfMessage: z.coerce.boolean().default(false), - token: z.coerce.string().default(''), - debug: z.coerce.boolean().default(false) + name: actionType.string().default('http-client'), + enable: actionType.boolean().default(false), + url: actionType.string().default('http://localhost:8080'), + messagePostFormat: actionType.string().default('array'), + reportSelfMessage: actionType.boolean().default(false), + token: actionType.string().default(''), + debug: actionType.boolean().default(false) }); const WebsocketServerConfigSchema = z.object({ - name: z.coerce.string().default('websocket-server'), - enable: z.coerce.boolean().default(false), - host: z.coerce.string().default('0.0.0.0'), - port: z.coerce.number().default(3001), - messagePostFormat: z.coerce.string().default('array'), - reportSelfMessage: z.coerce.boolean().default(false), - token: z.coerce.string().default(''), - enableForcePushEvent: z.coerce.boolean().default(true), - debug: z.coerce.boolean().default(false), - heartInterval: z.coerce.number().default(30000) + name: actionType.string().default('websocket-server'), + enable: actionType.boolean().default(false), + host: actionType.string().default('0.0.0.0'), + port: actionType.number().default(3001), + messagePostFormat: actionType.string().default('array'), + reportSelfMessage: actionType.boolean().default(false), + token: actionType.string().default(''), + enableForcePushEvent: actionType.boolean().default(true), + debug: actionType.boolean().default(false), + heartInterval: actionType.number().default(30000) }); const WebsocketClientConfigSchema = z.object({ - name: z.coerce.string().default('websocket-client'), - enable: z.coerce.boolean().default(false), - url: z.coerce.string().default('ws://localhost:8082'), - messagePostFormat: z.coerce.string().default('array'), - reportSelfMessage: z.coerce.boolean().default(false), - reconnectInterval: z.coerce.number().default(5000), - token: z.coerce.string().default(''), - debug: z.coerce.boolean().default(false), - heartInterval: z.coerce.number().default(30000) + name: actionType.string().default('websocket-client'), + enable: actionType.boolean().default(false), + url: actionType.string().default('ws://localhost:8082'), + messagePostFormat: actionType.string().default('array'), + reportSelfMessage: actionType.boolean().default(false), + reconnectInterval: actionType.number().default(5000), + token: actionType.string().default(''), + debug: actionType.boolean().default(false), + heartInterval: actionType.number().default(30000) }); const PluginConfigSchema = z.object({ - name: z.coerce.string().default('plugin'), - enable: z.coerce.boolean().default(false), - messagePostFormat: z.coerce.string().default('array'), - reportSelfMessage: z.coerce.boolean().default(false), - debug: z.coerce.boolean().default(false), + name: actionType.string().default('plugin'), + enable: actionType.boolean().default(false), + messagePostFormat: actionType.string().default('array'), + reportSelfMessage: actionType.boolean().default(false), + debug: actionType.boolean().default(false), }); const NetworkConfigSchema = z.object({ @@ -79,9 +80,9 @@ const NetworkConfigSchema = z.object({ export const OneBotConfigSchema = z.object({ network: NetworkConfigSchema, - musicSignUrl: z.coerce.string().default(''), - enableLocalFile2Url: z.coerce.boolean().default(false), - parseMultMsg: z.coerce.boolean().default(false) + musicSignUrl: actionType.string().default(''), + enableLocalFile2Url: actionType.boolean().default(false), + parseMultMsg: actionType.boolean().default(false) }); export type OneBotConfig = z.infer; diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index 06562859..ffaf6df1 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -4,13 +4,14 @@ import { resolve } from 'node:path'; import { deepMerge } from '../utils/object'; import { themeType } from '../types/theme'; import { z } from 'zod'; +import { actionType } from '@/onebot/action/type'; // 定义配置的类型 const WebUiConfigSchema = z.object({ - host: z.coerce.string().default('0.0.0.0'), - port: z.coerce.number().default(6099), - token: z.coerce.string().default('napcat'), - loginRate: z.coerce.number().default(10), - autoLoginAccount: z.coerce.string().default(''), + host: actionType.string().default('0.0.0.0'), + port: actionType.number().default(6099), + token: actionType.string().default('napcat'), + loginRate: actionType.number().default(10), + autoLoginAccount: actionType.string().default(''), theme: themeType, }); diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index dcbe3a47..d62d0821 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -1,9 +1,10 @@ +import { actionType } from '@/onebot/action/type'; import { z } from 'zod'; export const themeType = z.object( { - dark: z.record(z.coerce.string(), z.coerce.string()), - light: z.record(z.coerce.string(), z.coerce.string()), + dark: z.record(actionType.string(), actionType.string()), + light: z.record(actionType.string(), actionType.string()), } ).default({ dark: { From a888714629346c7addf97997e85b07c90556355c 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: Thu, 17 Apr 2025 09:47:39 +0800 Subject: [PATCH 071/149] fix: napcat log --- launcher/NapCatWinBootMain.exe | Bin 35328 -> 35328 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/launcher/NapCatWinBootMain.exe b/launcher/NapCatWinBootMain.exe index 60c4920a9e59e0f41872953e221b2e0e85c83656..66f69e091b54acb7eda6c2cbe25fc31e45606b19 100644 GIT binary patch delta 11019 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 delta 11280 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∋1{5y(6f8MoC0J4d@b+<=mL0C z7nqx%ZV2rD8#+$z9lpLH=Qw{Jcm>3QGW?PA#E5se5IWRlxD6zY9(bDboj?y9%b4B^ zNI`7$JAet}@%+PZ`~pKtLCnB#E$7z*k8u7d@Iw#_bQ|bjEI-#UU7c! ysP%Dt6;#{iyLpg%NXx!g_OHhNl-TQm?lLKA{)CYnNv`uJyP53uLR5TU< From 3f6249f39cfbbce1b214dd8c32d4d9756890268e 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: Thu, 17 Apr 2025 09:48:59 +0800 Subject: [PATCH 072/149] fix --- src/onebot/action/type.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebot/action/type.ts b/src/onebot/action/type.ts index f480fda0..76b11d5c 100644 --- a/src/onebot/action/type.ts +++ b/src/onebot/action/type.ts @@ -1,7 +1,7 @@ import { z } from "zod"; const boolean = () => z.preprocess( - val => typeof val === 'string' && val.toLowerCase() === 'false' ? false : Boolean(val), + val => typeof val === 'string' && (val.toLowerCase() === 'false' || val === '0') ? false : Boolean(val), z.boolean() ); const number = () => z.preprocess( From 54e6d5c3f2b0793ca0ced35e85b83177732e8171 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: Thu, 17 Apr 2025 09:52:03 +0800 Subject: [PATCH 073/149] fix --- src/{onebot/action/type.ts => common/coerce.ts} | 1 - src/core/helper/config.ts | 2 +- src/onebot/action/extends/ClickInlineKeyboardButton.ts | 2 +- src/onebot/action/extends/CreateCollection.ts | 2 +- src/onebot/action/extends/FetchCustomFace.ts | 2 +- src/onebot/action/extends/FetchEmojiLike.ts | 2 +- src/onebot/action/extends/GetAiCharacters.ts | 2 +- src/onebot/action/extends/GetCollectionList.ts | 2 +- src/onebot/action/extends/GetGroupInfoEx.ts | 2 +- src/onebot/action/extends/GetMiniAppArk.ts | 2 +- src/onebot/action/extends/GetProfileLike.ts | 2 +- src/onebot/action/extends/GetUserStatus.ts | 2 +- src/onebot/action/extends/MoveGroupFile.ts | 2 +- src/onebot/action/extends/OCRImage.ts | 2 +- src/onebot/action/extends/RenameGroupFile.ts | 2 +- src/onebot/action/extends/SendPacket.ts | 2 +- src/onebot/action/extends/SetDiyOnlineStatus.ts | 2 +- src/onebot/action/extends/SetGroupRemark.ts | 2 +- src/onebot/action/extends/SetGroupSign.ts | 2 +- src/onebot/action/extends/SetInputStatus.ts | 2 +- src/onebot/action/extends/SetLongNick.ts | 2 +- src/onebot/action/extends/SetOnlineStatus.ts | 2 +- src/onebot/action/extends/SetQQAvatar.ts | 2 +- src/onebot/action/extends/SetSpecialTitle.ts | 2 +- src/onebot/action/extends/ShareContact.ts | 2 +- src/onebot/action/extends/TransGroupFile.ts | 2 +- src/onebot/action/extends/TranslateEnWordToZn.ts | 2 +- src/onebot/action/file/GetFile.ts | 2 +- src/onebot/action/file/GetGroupFileUrl.ts | 2 +- src/onebot/action/file/GetPrivateFileUrl.ts | 2 +- src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts | 2 +- src/onebot/action/go-cqhttp/DeleteGroupFile.ts | 2 +- src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts | 2 +- src/onebot/action/go-cqhttp/DownloadFile.ts | 2 +- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 2 +- src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupRootFiles.ts | 2 +- src/onebot/action/go-cqhttp/GetStrangerInfo.ts | 2 +- src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 2 +- src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 2 +- src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts | 2 +- src/onebot/action/go-cqhttp/SendGroupNotice.ts | 2 +- src/onebot/action/go-cqhttp/SetGroupPortrait.ts | 2 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 2 +- src/onebot/action/go-cqhttp/UploadGroupFile.ts | 2 +- src/onebot/action/go-cqhttp/UploadPrivateFile.ts | 2 +- src/onebot/action/group/DelEssenceMsg.ts | 2 +- src/onebot/action/group/DelGroupNotice.ts | 2 +- src/onebot/action/group/GetAiRecord.ts | 2 +- src/onebot/action/group/GetGroupEssence.ts | 2 +- src/onebot/action/group/GetGroupInfo.ts | 2 +- src/onebot/action/group/GetGroupList.ts | 2 +- src/onebot/action/group/GetGroupMemberInfo.ts | 2 +- src/onebot/action/group/GetGroupMemberList.ts | 2 +- src/onebot/action/group/GetGroupNotice.ts | 2 +- src/onebot/action/group/GetGroupShutList.ts | 2 +- src/onebot/action/group/GroupPoke.ts | 2 +- src/onebot/action/group/SendGroupAiRecord.ts | 2 +- src/onebot/action/group/SetEssenceMsg.ts | 2 +- src/onebot/action/group/SetGroupAddRequest.ts | 2 +- src/onebot/action/group/SetGroupAdmin.ts | 2 +- src/onebot/action/group/SetGroupBan.ts | 2 +- src/onebot/action/group/SetGroupCard.ts | 2 +- src/onebot/action/group/SetGroupKick.ts | 2 +- src/onebot/action/group/SetGroupLeave.ts | 2 +- src/onebot/action/group/SetGroupName.ts | 2 +- src/onebot/action/group/SetGroupWholeBan.ts | 2 +- src/onebot/action/msg/DeleteMsg.ts | 2 +- src/onebot/action/msg/ForwardSingleMsg.ts | 2 +- src/onebot/action/msg/GetMsg.ts | 2 +- src/onebot/action/msg/MarkMsgAsRead.ts | 2 +- src/onebot/action/msg/SetMsgEmojiLike.ts | 2 +- src/onebot/action/packet/SendPoke.ts | 2 +- src/onebot/action/system/GetCredentials.ts | 2 +- src/onebot/action/user/FriendPoke.ts | 2 +- src/onebot/action/user/GetCookies.ts | 2 +- src/onebot/action/user/GetFriendList.ts | 2 +- src/onebot/action/user/GetRecentContact.ts | 2 +- src/onebot/action/user/SendLike.ts | 2 +- src/onebot/action/user/SetFriendAddRequest.ts | 2 +- src/onebot/config/config.ts | 2 +- src/webui/src/helper/config.ts | 2 +- src/webui/src/types/theme.ts | 2 +- 88 files changed, 87 insertions(+), 88 deletions(-) rename src/{onebot/action/type.ts => common/coerce.ts} (99%) diff --git a/src/onebot/action/type.ts b/src/common/coerce.ts similarity index 99% rename from src/onebot/action/type.ts rename to src/common/coerce.ts index 76b11d5c..46eb174d 100644 --- a/src/onebot/action/type.ts +++ b/src/common/coerce.ts @@ -1,5 +1,4 @@ import { z } from "zod"; - const boolean = () => z.preprocess( val => typeof val === 'string' && (val.toLowerCase() === 'false' || val === '0') ? false : Boolean(val), z.boolean() diff --git a/src/core/helper/config.ts b/src/core/helper/config.ts index 1b11467a..ca3d2268 100644 --- a/src/core/helper/config.ts +++ b/src/core/helper/config.ts @@ -1,6 +1,6 @@ import { ConfigBase } from '@/common/config-base'; import { NapCatCore } from '@/core'; -import { actionType } from '@/onebot/action/type'; +import { actionType } from '@/common/coerce'; import { z } from 'zod'; export const NapcatConfigSchema = z.object({ diff --git a/src/onebot/action/extends/ClickInlineKeyboardButton.ts b/src/onebot/action/extends/ClickInlineKeyboardButton.ts index aaca0481..fba1830c 100644 --- a/src/onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/src/onebot/action/extends/ClickInlineKeyboardButton.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '../OneBotAction'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/extends/CreateCollection.ts b/src/onebot/action/extends/CreateCollection.ts index 8451664e..0faf8b4e 100644 --- a/src/onebot/action/extends/CreateCollection.ts +++ b/src/onebot/action/extends/CreateCollection.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ rawData: actionType.string(), brief: actionType.string(), diff --git a/src/onebot/action/extends/FetchCustomFace.ts b/src/onebot/action/extends/FetchCustomFace.ts index 8e068060..ee6a535c 100644 --- a/src/onebot/action/extends/FetchCustomFace.ts +++ b/src/onebot/action/extends/FetchCustomFace.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ count: actionType.number().default(48), }); diff --git a/src/onebot/action/extends/FetchEmojiLike.ts b/src/onebot/action/extends/FetchEmojiLike.ts index 263311ad..c55ce0c4 100644 --- a/src/onebot/action/extends/FetchEmojiLike.ts +++ b/src/onebot/action/extends/FetchEmojiLike.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { type NTQQMsgApi } from '@/core/apis'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ message_id: actionType.string(), emojiId: actionType.string(), diff --git a/src/onebot/action/extends/GetAiCharacters.ts b/src/onebot/action/extends/GetAiCharacters.ts index 5706cfec..7e2210bd 100644 --- a/src/onebot/action/extends/GetAiCharacters.ts +++ b/src/onebot/action/extends/GetAiCharacters.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), chat_type: actionType.number().default(1), diff --git a/src/onebot/action/extends/GetCollectionList.ts b/src/onebot/action/extends/GetCollectionList.ts index d1593a02..1cb62961 100644 --- a/src/onebot/action/extends/GetCollectionList.ts +++ b/src/onebot/action/extends/GetCollectionList.ts @@ -2,7 +2,7 @@ import { type NTQQCollectionApi } from '@/core/apis/collection'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ category: actionType.number(), count: actionType.number().default(1), diff --git a/src/onebot/action/extends/GetGroupInfoEx.ts b/src/onebot/action/extends/GetGroupInfoEx.ts index ec3f685d..9ed398bc 100644 --- a/src/onebot/action/extends/GetGroupInfoEx.ts +++ b/src/onebot/action/extends/GetGroupInfoEx.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), }); diff --git a/src/onebot/action/extends/GetMiniAppArk.ts b/src/onebot/action/extends/GetMiniAppArk.ts index 50e1629d..2bd60b0a 100644 --- a/src/onebot/action/extends/GetMiniAppArk.ts +++ b/src/onebot/action/extends/GetMiniAppArk.ts @@ -3,7 +3,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { MiniAppInfo, MiniAppInfoHelper } from '@/core/packet/utils/helper/miniAppHelper'; import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from '@/core/packet/entities/miniApp'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.union([ z.object({ type: z.union([z.literal('bili'), z.literal('weibo')]), diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index 3e06b75b..cefd9e55 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -2,7 +2,7 @@ import { NTVoteInfo } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ user_id: actionType.string().optional(), start: actionType.number().default(0), diff --git a/src/onebot/action/extends/GetUserStatus.ts b/src/onebot/action/extends/GetUserStatus.ts index 3256b6fe..38ac0007 100644 --- a/src/onebot/action/extends/GetUserStatus.ts +++ b/src/onebot/action/extends/GetUserStatus.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ user_id: actionType.number(), }); diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index cdad0987..7e2e6eb4 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), file_id: actionType.string(), diff --git a/src/onebot/action/extends/OCRImage.ts b/src/onebot/action/extends/OCRImage.ts index 6e4baf61..c08a12b5 100644 --- a/src/onebot/action/extends/OCRImage.ts +++ b/src/onebot/action/extends/OCRImage.ts @@ -4,7 +4,7 @@ import { checkFileExist, uriToLocalFile } from '@/common/file'; import fs from 'fs'; import { z } from 'zod'; import { GeneralCallResultStatus } from '@/core'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ image: actionType.string(), }); diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index fe0fd2d7..ff40a66b 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), file_id: actionType.string(), diff --git a/src/onebot/action/extends/SendPacket.ts b/src/onebot/action/extends/SendPacket.ts index b472109a..27c133ad 100644 --- a/src/onebot/action/extends/SendPacket.ts +++ b/src/onebot/action/extends/SendPacket.ts @@ -2,7 +2,7 @@ import { PacketHexStr } from '@/core/packet/transformer/base'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ cmd: actionType.string(), diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index 7c1d609a..43bffa63 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ face_id: actionType.string(),// 参考 face_config.json 的 QSid face_type: actionType.string().default('1'), diff --git a/src/onebot/action/extends/SetGroupRemark.ts b/src/onebot/action/extends/SetGroupRemark.ts index c30fb31c..d5b7b6a0 100644 --- a/src/onebot/action/extends/SetGroupRemark.ts +++ b/src/onebot/action/extends/SetGroupRemark.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), remark: actionType.string(), diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index bb66c12f..56fdf534 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -1,7 +1,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), }); diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index 2dd00a44..98f28a94 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { ChatType } from '@/core'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ user_id: actionType.string(), event_type: actionType.number(), diff --git a/src/onebot/action/extends/SetLongNick.ts b/src/onebot/action/extends/SetLongNick.ts index d84344e3..4b05825b 100644 --- a/src/onebot/action/extends/SetLongNick.ts +++ b/src/onebot/action/extends/SetLongNick.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ longNick: actionType.string(), }); diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index d9d76019..e863b4ae 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ status: actionType.number(), ext_status: actionType.number(), diff --git a/src/onebot/action/extends/SetQQAvatar.ts b/src/onebot/action/extends/SetQQAvatar.ts index 9a84a5a0..767a5c3b 100644 --- a/src/onebot/action/extends/SetQQAvatar.ts +++ b/src/onebot/action/extends/SetQQAvatar.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import fs from 'node:fs/promises'; import { checkFileExist, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ file: actionType.string(), }); diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index dcb0dff4..efa4000b 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), user_id: actionType.string(), diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index 732ac990..571bbdb7 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -2,7 +2,7 @@ import { GeneralCallResult } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ user_id: actionType.string().optional(), group_id: actionType.string().optional(), diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index c802d160..bd5045a0 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), file_id: actionType.string(), diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index 77ce0647..ff27a83f 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ words: z.array(actionType.string()), }); diff --git a/src/onebot/action/file/GetFile.ts b/src/onebot/action/file/GetFile.ts index 4116f4c4..55725be9 100644 --- a/src/onebot/action/file/GetFile.ts +++ b/src/onebot/action/file/GetFile.ts @@ -4,7 +4,7 @@ import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { ActionName } from '@/onebot/action/router'; import { OB11MessageImage, OB11MessageVideo } from '@/onebot/types'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; export interface GetFileResponse { file?: string; // path url?: string; diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index e454ea9f..c90103e5 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), file_id: actionType.string(), diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts index 2dbb615d..04b9bf1a 100644 --- a/src/onebot/action/file/GetPrivateFileUrl.ts +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ file_id: actionType.string(), }); diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 2b1e3a18..91e3e522 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), folder_name: actionType.string(), diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index 5a4895fe..addee6b9 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), file_id: actionType.string(), diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 170bb703..be39f476 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), folder_id: actionType.string().optional(), diff --git a/src/onebot/action/go-cqhttp/DownloadFile.ts b/src/onebot/action/go-cqhttp/DownloadFile.ts index 3b5b7965..d6288661 100644 --- a/src/onebot/action/go-cqhttp/DownloadFile.ts +++ b/src/onebot/action/go-cqhttp/DownloadFile.ts @@ -5,7 +5,7 @@ import { join as joinPath } from 'node:path'; import { calculateFileMD5, uriToLocalFile } from '@/common/file'; import { randomUUID } from 'crypto'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; interface FileResponse { file: string; } diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index 62cbd438..d49baefd 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -5,7 +5,7 @@ import { MessageUnique } from '@/common/message-unique'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; import { z } from 'zod'; import { isNumeric } from '@/common/helper'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ message_id: actionType.string().optional(), id: actionType.string().optional(), diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index be7a52d0..2c0d4ecc 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -5,7 +5,7 @@ import { ChatType } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; interface Response { messages: OB11Message[]; diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 67d2eb8d..6149aa51 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 9d161641..69c1edf4 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index fb993dba..93d70073 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), folder_id: actionType.string().optional(), diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index a6c666a3..b22c77b8 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -2,7 +2,7 @@ import { WebHonorType } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), type: z.nativeEnum(WebHonorType).optional() diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index 0952bb86..bde27c1a 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -5,7 +5,7 @@ import { ChatType, Peer } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; interface Response { messages: OB11Message[]; diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index d3a8efbc..613bac17 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { OB11GroupFile, OB11GroupFileFolder } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), file_count: actionType.number().default(50), diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index 6052c1b7..aa628283 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -4,7 +4,7 @@ import { OB11Construct } from '@/onebot/helper/data'; import { ActionName } from '@/onebot/action/router'; import { calcQQLevel } from '@/common/helper'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ user_id: actionType.string(), diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index 18013147..997a1630 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ url: actionType.string(), }); diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index 27831852..079f681f 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ friend_id: actionType.string().optional(), diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index 962cf137..bbcce797 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ model: actionType.string(), }); diff --git a/src/onebot/action/go-cqhttp/SendGroupNotice.ts b/src/onebot/action/go-cqhttp/SendGroupNotice.ts index b3b6a795..e309397c 100644 --- a/src/onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/src/onebot/action/go-cqhttp/SendGroupNotice.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { unlink } from 'node:fs/promises'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), content: actionType.string(), diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index b009f267..af178e9b 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -4,7 +4,7 @@ import { checkFileExistV2, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ file: actionType.string(), group_id: actionType.string() diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index f61872e9..28bffd6a 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -2,7 +2,7 @@ import { NTQQUserApi } from '@/core/apis'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ nickname: actionType.string(), personal_note: actionType.string().optional(), diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index 3381f198..195df4b9 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -5,7 +5,7 @@ import fs from 'fs'; import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), file: actionType.string(), diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index 6d53fda6..7de40188 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -6,7 +6,7 @@ import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ user_id: actionType.string(), file: actionType.string(), diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index 1d108bec..846aced1 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ message_id: actionType.string(), }); diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index 7ec4de9c..b012f87d 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), notice_id: actionType.string() diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index 58d40b1d..7e0d002c 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ character: actionType.string(), group_id: actionType.string(), diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 0176994e..500d7dba 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -5,7 +5,7 @@ import { MessageUnique } from '@/common/message-unique'; import crypto from 'crypto'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), }); diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index 9a24c3c0..f427c224 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -3,7 +3,7 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), }); diff --git a/src/onebot/action/group/GetGroupList.ts b/src/onebot/action/group/GetGroupList.ts index 98f7d407..648d6cdc 100644 --- a/src/onebot/action/group/GetGroupList.ts +++ b/src/onebot/action/group/GetGroupList.ts @@ -3,7 +3,7 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ no_cache: actionType.boolean().default(false), diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index 0aa72dde..b1925fd6 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -3,7 +3,7 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 746efbaa..909392ba 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -4,7 +4,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; import { GroupMember } from '@/core'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index 89f30a32..86ef5b0c 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -2,7 +2,7 @@ import { WebApiGroupNoticeFeed } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; interface GroupNotice { sender_id: number; publish_time: number; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index 3133b412..b65bacad 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -2,7 +2,7 @@ import { ShutUpGroupMember } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), }); diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index 09d958e5..00c6fff8 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), user_id: actionType.string(), diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index bb1c85fd..454f77be 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ character: actionType.string(), group_id: actionType.string(), diff --git a/src/onebot/action/group/SetEssenceMsg.ts b/src/onebot/action/group/SetEssenceMsg.ts index de3c7f43..04026cd0 100644 --- a/src/onebot/action/group/SetEssenceMsg.ts +++ b/src/onebot/action/group/SetEssenceMsg.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ message_id: actionType.string(), }); diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index f0ced956..cabe123e 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupRequestOperateTypes } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ flag: actionType.string(), diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index 4067b4ff..f690ba9f 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupMemberRole } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index e4fe3c03..c65d461c 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), user_id: actionType.string(), diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index 870af15f..f0e0b53b 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), user_id: actionType.string(), diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index a394b9c8..08f6ec50 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index a21c890e..4823c6bb 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index b1949b45..bd644049 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), group_name: actionType.string(), diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index e35b85b8..0e6c120c 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index 3d88c5a8..b1305dcc 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ message_id: actionType.string(), diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index 3497a40c..c7e2c245 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -3,7 +3,7 @@ import { ChatType, Peer } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ message_id: actionType.string(), group_id: actionType.string().optional(), diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index 347b1502..ce287a5e 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -5,7 +5,7 @@ import { MessageUnique } from '@/common/message-unique'; import { RawMessage } from '@/core'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; export type ReturnDataType = OB11Message const SchemaData = z.object({ diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index fcb8e271..52ee09e1 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ user_id: actionType.string().optional(), group_id: actionType.string().optional(), diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index b71983ef..1eb9eed8 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ message_id: actionType.string(), diff --git a/src/onebot/action/packet/SendPoke.ts b/src/onebot/action/packet/SendPoke.ts index dcd9da64..438f802f 100644 --- a/src/onebot/action/packet/SendPoke.ts +++ b/src/onebot/action/packet/SendPoke.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ group_id: actionType.string().optional(), diff --git a/src/onebot/action/system/GetCredentials.ts b/src/onebot/action/system/GetCredentials.ts index 07228128..cb49f0cc 100644 --- a/src/onebot/action/system/GetCredentials.ts +++ b/src/onebot/action/system/GetCredentials.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; interface Response { cookies: string, diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index 68493c94..5b8ba425 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ user_id: actionType.string() diff --git a/src/onebot/action/user/GetCookies.ts b/src/onebot/action/user/GetCookies.ts index 60c34424..da021c33 100644 --- a/src/onebot/action/user/GetCookies.ts +++ b/src/onebot/action/user/GetCookies.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; interface Response { cookies: string, bkn: string diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index 74cc6815..ef85df42 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -3,7 +3,7 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ no_cache: actionType.boolean().optional(), diff --git a/src/onebot/action/user/GetRecentContact.ts b/src/onebot/action/user/GetRecentContact.ts index 8a551b54..4c817eb3 100644 --- a/src/onebot/action/user/GetRecentContact.ts +++ b/src/onebot/action/user/GetRecentContact.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { NetworkAdapterConfig } from '@/onebot/config/config'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ count: actionType.number().default(10), diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 5ac5078e..7630161a 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ times: actionType.number().default(1), diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index 3fb71e18..f35318d4 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ flag: actionType.string(), diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index 7ee9d3b7..266106b6 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { actionType } from '../action/type'; +import { actionType } from '../../common/coerce'; const HttpServerConfigSchema = z.object({ name: actionType.string().default('http-server'), diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index ffaf6df1..af8e9c5c 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -4,7 +4,7 @@ import { resolve } from 'node:path'; import { deepMerge } from '../utils/object'; import { themeType } from '../types/theme'; import { z } from 'zod'; -import { actionType } from '@/onebot/action/type'; +import { actionType } from '@/common/coerce'; // 定义配置的类型 const WebUiConfigSchema = z.object({ host: actionType.string().default('0.0.0.0'), diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index d62d0821..02be0c38 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -1,4 +1,4 @@ -import { actionType } from '@/onebot/action/type'; +import { actionType } from '@/common/coerce'; import { z } from 'zod'; export const themeType = z.object( From 41dccd98a9e150671391c9089e6e1bfbe47393df 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: Thu, 17 Apr 2025 09:54:12 +0800 Subject: [PATCH 074/149] fix --- src/common/coerce.ts | 2 +- src/core/helper/config.ts | 16 +-- .../extends/ClickInlineKeyboardButton.ts | 12 +- src/onebot/action/extends/CreateCollection.ts | 6 +- src/onebot/action/extends/FetchCustomFace.ts | 4 +- src/onebot/action/extends/FetchEmojiLike.ts | 10 +- src/onebot/action/extends/GetAiCharacters.ts | 6 +- .../action/extends/GetCollectionList.ts | 6 +- src/onebot/action/extends/GetGroupInfoEx.ts | 4 +- src/onebot/action/extends/GetMiniAppArk.ts | 46 ++++---- src/onebot/action/extends/GetProfileLike.ts | 8 +- src/onebot/action/extends/GetUserStatus.ts | 4 +- src/onebot/action/extends/MoveGroupFile.ts | 10 +- src/onebot/action/extends/OCRImage.ts | 4 +- src/onebot/action/extends/RenameGroupFile.ts | 10 +- src/onebot/action/extends/SendPacket.ts | 8 +- .../action/extends/SetDiyOnlineStatus.ts | 8 +- src/onebot/action/extends/SetGroupRemark.ts | 6 +- src/onebot/action/extends/SetGroupSign.ts | 4 +- src/onebot/action/extends/SetInputStatus.ts | 6 +- src/onebot/action/extends/SetLongNick.ts | 4 +- src/onebot/action/extends/SetOnlineStatus.ts | 8 +- src/onebot/action/extends/SetQQAvatar.ts | 4 +- src/onebot/action/extends/SetSpecialTitle.ts | 8 +- src/onebot/action/extends/ShareContact.ts | 10 +- src/onebot/action/extends/TransGroupFile.ts | 6 +- .../action/extends/TranslateEnWordToZn.ts | 4 +- src/onebot/action/file/GetFile.ts | 6 +- src/onebot/action/file/GetGroupFileUrl.ts | 6 +- src/onebot/action/file/GetPrivateFileUrl.ts | 4 +- .../action/go-cqhttp/CreateGroupFileFolder.ts | 6 +- .../action/go-cqhttp/DeleteGroupFile.ts | 6 +- .../action/go-cqhttp/DeleteGroupFileFolder.ts | 8 +- src/onebot/action/go-cqhttp/DownloadFile.ts | 10 +- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 6 +- .../action/go-cqhttp/GetFriendMsgHistory.ts | 10 +- .../action/go-cqhttp/GetGroupAtAllRemain.ts | 4 +- .../go-cqhttp/GetGroupFileSystemInfo.ts | 4 +- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 10 +- .../action/go-cqhttp/GetGroupHonorInfo.ts | 4 +- .../action/go-cqhttp/GetGroupMsgHistory.ts | 10 +- .../action/go-cqhttp/GetGroupRootFiles.ts | 6 +- .../action/go-cqhttp/GetStrangerInfo.ts | 6 +- .../go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 4 +- .../action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 10 +- .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 4 +- .../action/go-cqhttp/SendGroupNotice.ts | 18 +-- .../action/go-cqhttp/SetGroupPortrait.ts | 6 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 8 +- .../action/go-cqhttp/UploadGroupFile.ts | 12 +- .../action/go-cqhttp/UploadPrivateFile.ts | 8 +- src/onebot/action/group/DelEssenceMsg.ts | 4 +- src/onebot/action/group/DelGroupNotice.ts | 6 +- src/onebot/action/group/GetAiRecord.ts | 8 +- src/onebot/action/group/GetGroupEssence.ts | 4 +- src/onebot/action/group/GetGroupInfo.ts | 4 +- src/onebot/action/group/GetGroupList.ts | 4 +- src/onebot/action/group/GetGroupMemberInfo.ts | 8 +- src/onebot/action/group/GetGroupMemberList.ts | 6 +- src/onebot/action/group/GetGroupNotice.ts | 4 +- src/onebot/action/group/GetGroupShutList.ts | 4 +- src/onebot/action/group/GroupPoke.ts | 6 +- src/onebot/action/group/SendGroupAiRecord.ts | 8 +- src/onebot/action/group/SetEssenceMsg.ts | 4 +- src/onebot/action/group/SetGroupAddRequest.ts | 8 +- src/onebot/action/group/SetGroupAdmin.ts | 8 +- src/onebot/action/group/SetGroupBan.ts | 8 +- src/onebot/action/group/SetGroupCard.ts | 8 +- src/onebot/action/group/SetGroupKick.ts | 8 +- src/onebot/action/group/SetGroupLeave.ts | 6 +- src/onebot/action/group/SetGroupName.ts | 6 +- src/onebot/action/group/SetGroupWholeBan.ts | 6 +- src/onebot/action/msg/DeleteMsg.ts | 4 +- src/onebot/action/msg/ForwardSingleMsg.ts | 8 +- src/onebot/action/msg/GetMsg.ts | 4 +- src/onebot/action/msg/MarkMsgAsRead.ts | 8 +- src/onebot/action/msg/SetMsgEmojiLike.ts | 8 +- src/onebot/action/packet/SendPoke.ts | 6 +- src/onebot/action/system/GetCredentials.ts | 4 +- src/onebot/action/user/FriendPoke.ts | 4 +- src/onebot/action/user/GetCookies.ts | 4 +- src/onebot/action/user/GetFriendList.ts | 4 +- src/onebot/action/user/GetRecentContact.ts | 4 +- src/onebot/action/user/SendLike.ts | 6 +- src/onebot/action/user/SetFriendAddRequest.ts | 8 +- src/onebot/config/config.ts | 108 +++++++++--------- src/webui/src/helper/config.ts | 12 +- src/webui/src/types/theme.ts | 6 +- 88 files changed, 363 insertions(+), 363 deletions(-) diff --git a/src/common/coerce.ts b/src/common/coerce.ts index 46eb174d..6aabd538 100644 --- a/src/common/coerce.ts +++ b/src/common/coerce.ts @@ -11,4 +11,4 @@ const string = () => z.preprocess( val => typeof val !== 'string' ? String(val) : val, z.string() ); -export const actionType = { boolean, number, string }; \ No newline at end of file +export const coerce = { boolean, number, string }; \ No newline at end of file diff --git a/src/core/helper/config.ts b/src/core/helper/config.ts index ca3d2268..66721252 100644 --- a/src/core/helper/config.ts +++ b/src/core/helper/config.ts @@ -1,16 +1,16 @@ import { ConfigBase } from '@/common/config-base'; import { NapCatCore } from '@/core'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; import { z } from 'zod'; export const NapcatConfigSchema = z.object({ - fileLog: actionType.boolean().default(false), - consoleLog: actionType.boolean().default(true), - fileLogLevel: actionType.string().default('debug'), - consoleLogLevel: actionType.string().default('info'), - packetBackend: actionType.string().default('auto'), - packetServer: actionType.string().default(''), - o3HookMode: actionType.number().default(0), + fileLog: coerce.boolean().default(false), + consoleLog: coerce.boolean().default(true), + fileLogLevel: coerce.string().default('debug'), + consoleLogLevel: coerce.string().default('info'), + packetBackend: coerce.string().default('auto'), + packetServer: coerce.string().default(''), + o3HookMode: coerce.number().default(0), }); export type NapcatConfig = z.infer; diff --git a/src/onebot/action/extends/ClickInlineKeyboardButton.ts b/src/onebot/action/extends/ClickInlineKeyboardButton.ts index fba1830c..e7279c51 100644 --- a/src/onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/src/onebot/action/extends/ClickInlineKeyboardButton.ts @@ -1,14 +1,14 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '../OneBotAction'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - bot_appid: actionType.string(), - button_id: actionType.string().default(''), - callback_data: actionType.string().default(''), - msg_seq: actionType.string().default('10086'), + group_id: coerce.string(), + bot_appid: coerce.string(), + button_id: coerce.string().default(''), + callback_data: coerce.string().default(''), + msg_seq: coerce.string().default('10086'), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/CreateCollection.ts b/src/onebot/action/extends/CreateCollection.ts index 0faf8b4e..dd641d1b 100644 --- a/src/onebot/action/extends/CreateCollection.ts +++ b/src/onebot/action/extends/CreateCollection.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - rawData: actionType.string(), - brief: actionType.string(), + rawData: coerce.string(), + brief: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchCustomFace.ts b/src/onebot/action/extends/FetchCustomFace.ts index ee6a535c..b14d2afa 100644 --- a/src/onebot/action/extends/FetchCustomFace.ts +++ b/src/onebot/action/extends/FetchCustomFace.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - count: actionType.number().default(48), + count: coerce.number().default(48), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchEmojiLike.ts b/src/onebot/action/extends/FetchEmojiLike.ts index c55ce0c4..ee383046 100644 --- a/src/onebot/action/extends/FetchEmojiLike.ts +++ b/src/onebot/action/extends/FetchEmojiLike.ts @@ -3,12 +3,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { type NTQQMsgApi } from '@/core/apis'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - message_id: actionType.string(), - emojiId: actionType.string(), - emojiType: actionType.string(), - count: actionType.number().default(20), + message_id: coerce.string(), + emojiId: coerce.string(), + emojiType: coerce.string(), + count: coerce.number().default(20), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetAiCharacters.ts b/src/onebot/action/extends/GetAiCharacters.ts index 7e2210bd..5eb7fc5b 100644 --- a/src/onebot/action/extends/GetAiCharacters.ts +++ b/src/onebot/action/extends/GetAiCharacters.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - chat_type: actionType.number().default(1), + group_id: coerce.string(), + chat_type: coerce.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetCollectionList.ts b/src/onebot/action/extends/GetCollectionList.ts index 1cb62961..4c170cff 100644 --- a/src/onebot/action/extends/GetCollectionList.ts +++ b/src/onebot/action/extends/GetCollectionList.ts @@ -2,10 +2,10 @@ import { type NTQQCollectionApi } from '@/core/apis/collection'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - category: actionType.number(), - count: actionType.number().default(1), + category: coerce.number(), + count: coerce.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetGroupInfoEx.ts b/src/onebot/action/extends/GetGroupInfoEx.ts index 9ed398bc..f0078a41 100644 --- a/src/onebot/action/extends/GetGroupInfoEx.ts +++ b/src/onebot/action/extends/GetGroupInfoEx.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), + group_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetMiniAppArk.ts b/src/onebot/action/extends/GetMiniAppArk.ts index 2bd60b0a..d9ea1449 100644 --- a/src/onebot/action/extends/GetMiniAppArk.ts +++ b/src/onebot/action/extends/GetMiniAppArk.ts @@ -3,34 +3,34 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { MiniAppInfo, MiniAppInfoHelper } from '@/core/packet/utils/helper/miniAppHelper'; import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from '@/core/packet/entities/miniApp'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.union([ z.object({ type: z.union([z.literal('bili'), z.literal('weibo')]), - title: actionType.string(), - desc: actionType.string(), - picUrl: actionType.string(), - jumpUrl: actionType.string(), - webUrl: actionType.string().optional(), - rawArkData: actionType.string().optional() + title: coerce.string(), + desc: coerce.string(), + picUrl: coerce.string(), + jumpUrl: coerce.string(), + webUrl: coerce.string().optional(), + rawArkData: coerce.string().optional() }), z.object({ - title: actionType.string(), - desc: actionType.string(), - picUrl: actionType.string(), - jumpUrl: actionType.string(), - iconUrl: actionType.string(), - webUrl: actionType.string().optional(), - appId: actionType.string(), - scene: z.union([actionType.number(), actionType.string()]), - templateType: z.union([actionType.number(), actionType.string()]), - businessType: z.union([actionType.number(), actionType.string()]), - verType: z.union([actionType.number(), actionType.string()]), - shareType: z.union([actionType.number(), actionType.string()]), - versionId: actionType.string(), - sdkId: actionType.string(), - withShareTicket: z.union([actionType.number(), actionType.string()]), - rawArkData: actionType.string().optional() + title: coerce.string(), + desc: coerce.string(), + picUrl: coerce.string(), + jumpUrl: coerce.string(), + iconUrl: coerce.string(), + webUrl: coerce.string().optional(), + appId: coerce.string(), + scene: z.union([coerce.number(), coerce.string()]), + templateType: z.union([coerce.number(), coerce.string()]), + businessType: z.union([coerce.number(), coerce.string()]), + verType: z.union([coerce.number(), coerce.string()]), + shareType: z.union([coerce.number(), coerce.string()]), + versionId: coerce.string(), + sdkId: coerce.string(), + withShareTicket: z.union([coerce.number(), coerce.string()]), + rawArkData: coerce.string().optional() }) ]); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index cefd9e55..f4cf7400 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -2,11 +2,11 @@ import { NTVoteInfo } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - user_id: actionType.string().optional(), - start: actionType.number().default(0), - count: actionType.number().default(10), + user_id: coerce.string().optional(), + start: coerce.number().default(0), + count: coerce.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetUserStatus.ts b/src/onebot/action/extends/GetUserStatus.ts index 38ac0007..66aeb609 100644 --- a/src/onebot/action/extends/GetUserStatus.ts +++ b/src/onebot/action/extends/GetUserStatus.ts @@ -1,9 +1,9 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - user_id: actionType.number(), + user_id: coerce.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index 7e2e6eb4..bf5c1c48 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -2,12 +2,12 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - file_id: actionType.string(), - current_parent_directory: actionType.string(), - target_parent_directory: actionType.string(), + group_id: coerce.string(), + file_id: coerce.string(), + current_parent_directory: coerce.string(), + target_parent_directory: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/OCRImage.ts b/src/onebot/action/extends/OCRImage.ts index c08a12b5..c280a3cc 100644 --- a/src/onebot/action/extends/OCRImage.ts +++ b/src/onebot/action/extends/OCRImage.ts @@ -4,9 +4,9 @@ import { checkFileExist, uriToLocalFile } from '@/common/file'; import fs from 'fs'; import { z } from 'zod'; import { GeneralCallResultStatus } from '@/core'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - image: actionType.string(), + image: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index ff40a66b..8c6e7964 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -2,12 +2,12 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - file_id: actionType.string(), - current_parent_directory: actionType.string(), - new_name: actionType.string(), + group_id: coerce.string(), + file_id: coerce.string(), + current_parent_directory: coerce.string(), + new_name: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SendPacket.ts b/src/onebot/action/extends/SendPacket.ts index 27c133ad..feeb4d34 100644 --- a/src/onebot/action/extends/SendPacket.ts +++ b/src/onebot/action/extends/SendPacket.ts @@ -2,12 +2,12 @@ import { PacketHexStr } from '@/core/packet/transformer/base'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - cmd: actionType.string(), - data: actionType.string(), - rsp: actionType.boolean().default(true), + cmd: coerce.string(), + data: coerce.string(), + rsp: coerce.boolean().default(true), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index 43bffa63..d63895c8 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - face_id: actionType.string(),// 参考 face_config.json 的 QSid - face_type: actionType.string().default('1'), - wording: actionType.string().default(' '), + face_id: coerce.string(),// 参考 face_config.json 的 QSid + face_type: coerce.string().default('1'), + wording: coerce.string().default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupRemark.ts b/src/onebot/action/extends/SetGroupRemark.ts index d5b7b6a0..ab6367ea 100644 --- a/src/onebot/action/extends/SetGroupRemark.ts +++ b/src/onebot/action/extends/SetGroupRemark.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - remark: actionType.string(), + group_id: coerce.string(), + remark: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index 56fdf534..82c62fd5 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -1,9 +1,9 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), + group_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index 98f28a94..affc88df 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -2,10 +2,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { ChatType } from '@/core'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - user_id: actionType.string(), - event_type: actionType.number(), + user_id: coerce.string(), + event_type: coerce.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetLongNick.ts b/src/onebot/action/extends/SetLongNick.ts index 4b05825b..090f0fb4 100644 --- a/src/onebot/action/extends/SetLongNick.ts +++ b/src/onebot/action/extends/SetLongNick.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - longNick: actionType.string(), + longNick: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index e863b4ae..414c16ee 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - status: actionType.number(), - ext_status: actionType.number(), - battery_status: actionType.number(), + status: coerce.number(), + ext_status: coerce.number(), + battery_status: coerce.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetQQAvatar.ts b/src/onebot/action/extends/SetQQAvatar.ts index 767a5c3b..17832c4c 100644 --- a/src/onebot/action/extends/SetQQAvatar.ts +++ b/src/onebot/action/extends/SetQQAvatar.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import fs from 'node:fs/promises'; import { checkFileExist, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - file: actionType.string(), + file: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index efa4000b..6dca5fd7 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -1,11 +1,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - special_title: actionType.string().default(''), + group_id: coerce.string(), + user_id: coerce.string(), + special_title: coerce.string().default(''), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index 571bbdb7..3a61fdf0 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -2,11 +2,11 @@ import { GeneralCallResult } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - user_id: actionType.string().optional(), - group_id: actionType.string().optional(), - phoneNumber: actionType.string().default(''), + user_id: coerce.string().optional(), + group_id: coerce.string().optional(), + phoneNumber: coerce.string().default(''), }); type Payload = z.infer; @@ -29,7 +29,7 @@ export class SharePeer extends OneBotAction; diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index bd5045a0..2c801334 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - file_id: actionType.string(), + group_id: coerce.string(), + file_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index ff27a83f..9c2e064e 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - words: z.array(actionType.string()), + words: z.array(coerce.string()), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetFile.ts b/src/onebot/action/file/GetFile.ts index 55725be9..9a6dbe8d 100644 --- a/src/onebot/action/file/GetFile.ts +++ b/src/onebot/action/file/GetFile.ts @@ -4,7 +4,7 @@ import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { ActionName } from '@/onebot/action/router'; import { OB11MessageImage, OB11MessageVideo } from '@/onebot/types'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; export interface GetFileResponse { file?: string; // path url?: string; @@ -14,8 +14,8 @@ export interface GetFileResponse { } const GetFileBase_PayloadSchema = z.object({ - file: actionType.string().optional(), - file_id: actionType.string().optional(), + file: coerce.string().optional(), + file_id: coerce.string().optional(), }); diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index c90103e5..df0e66d4 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - file_id: actionType.string(), + group_id: coerce.string(), + file_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts index 04b9bf1a..c830397f 100644 --- a/src/onebot/action/file/GetPrivateFileUrl.ts +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -2,9 +2,9 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - file_id: actionType.string(), + file_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 91e3e522..0c9d53c6 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - folder_name: actionType.string(), + group_id: coerce.string(), + folder_name: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index addee6b9..5e21d1a8 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -4,10 +4,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - file_id: actionType.string(), + group_id: coerce.string(), + file_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index be39f476..b7f6cf1f 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - folder_id: actionType.string().optional(), - folder: actionType.string().optional(), + group_id: coerce.string(), + folder_id: coerce.string().optional(), + folder: coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DownloadFile.ts b/src/onebot/action/go-cqhttp/DownloadFile.ts index d6288661..4b0e0b74 100644 --- a/src/onebot/action/go-cqhttp/DownloadFile.ts +++ b/src/onebot/action/go-cqhttp/DownloadFile.ts @@ -5,16 +5,16 @@ import { join as joinPath } from 'node:path'; import { calculateFileMD5, uriToLocalFile } from '@/common/file'; import { randomUUID } from 'crypto'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; interface FileResponse { file: string; } const SchemaData = z.object({ - url: actionType.string().optional(), - base64: actionType.string().optional(), - name: actionType.string().optional(), - headers: z.union([actionType.string(), z.array(actionType.string())]).optional(), + url: coerce.string().optional(), + base64: coerce.string().optional(), + name: coerce.string().optional(), + headers: z.union([coerce.string(), z.array(coerce.string())]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index d49baefd..95eb9eae 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -5,10 +5,10 @@ import { MessageUnique } from '@/common/message-unique'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; import { z } from 'zod'; import { isNumeric } from '@/common/helper'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - message_id: actionType.string().optional(), - id: actionType.string().optional(), + message_id: coerce.string().optional(), + id: coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index 2c0d4ecc..84e1437e 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -5,16 +5,16 @@ import { ChatType } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - user_id: actionType.string(), - message_seq: actionType.string().optional(), - count: actionType.number().default(20), - reverseOrder: actionType.boolean().default(false) + user_id: coerce.string(), + message_seq: coerce.string().optional(), + count: coerce.number().default(20), + reverseOrder: coerce.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 6149aa51..8846266b 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string() + group_id: coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 69c1edf4..ac476100 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string() + group_id: coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index 93d70073..f6854074 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -3,12 +3,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - folder_id: actionType.string().optional(), - folder: actionType.string().optional(), - file_count: actionType.number().default(50), + group_id: coerce.string(), + folder_id: coerce.string().optional(), + folder: coerce.string().optional(), + file_count: coerce.number().default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index b22c77b8..0a4c172b 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -2,9 +2,9 @@ import { WebHonorType } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), + group_id: coerce.string(), type: z.nativeEnum(WebHonorType).optional() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index bde27c1a..d0203f84 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -5,17 +5,17 @@ import { ChatType, Peer } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - group_id: actionType.string(), - message_seq: actionType.string().optional(), - count: actionType.number().default(20), - reverseOrder: actionType.boolean().default(false) + group_id: coerce.string(), + message_seq: coerce.string().optional(), + count: coerce.number().default(20), + reverseOrder: coerce.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index 613bac17..3e8b4698 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -4,10 +4,10 @@ import { ActionName } from '@/onebot/action/router'; import { OB11GroupFile, OB11GroupFileFolder } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - file_count: actionType.number().default(50), + group_id: coerce.string(), + file_count: coerce.number().default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index aa628283..b0c0c96e 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -4,11 +4,11 @@ import { OB11Construct } from '@/onebot/helper/data'; import { ActionName } from '@/onebot/action/router'; import { calcQQLevel } from '@/common/helper'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - user_id: actionType.string(), - no_cache: actionType.boolean().default(false), + user_id: coerce.string(), + no_cache: coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index 997a1630..29811f4c 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - url: actionType.string(), + url: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index 079f681f..427734dc 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - friend_id: actionType.string().optional(), - user_id: actionType.string().optional(), - temp_block: actionType.boolean().optional(), - temp_both_del: actionType.boolean().optional(), + friend_id: coerce.string().optional(), + user_id: coerce.string().optional(), + temp_block: coerce.boolean().optional(), + temp_both_del: coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index bbcce797..15c4069e 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - model: actionType.string(), + model: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SendGroupNotice.ts b/src/onebot/action/go-cqhttp/SendGroupNotice.ts index e309397c..be63a1ae 100644 --- a/src/onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/src/onebot/action/go-cqhttp/SendGroupNotice.ts @@ -3,16 +3,16 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { unlink } from 'node:fs/promises'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - content: actionType.string(), - image: actionType.string().optional(), - pinned: actionType.number().default(0), - type: actionType.number().default(1), - confirm_required: actionType.number().default(1), - is_show_edit_card: actionType.number().default(0), - tip_window_type: actionType.number().default(0), + group_id: coerce.string(), + content: coerce.string(), + image: coerce.string().optional(), + pinned: coerce.number().default(0), + type: coerce.number().default(1), + confirm_required: coerce.number().default(1), + is_show_edit_card: coerce.number().default(0), + tip_window_type: coerce.number().default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index af178e9b..3d83921e 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -4,10 +4,10 @@ import { checkFileExistV2, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - file: actionType.string(), - group_id: actionType.string() + file: coerce.string(), + group_id: coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index 28bffd6a..ae458c72 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -2,11 +2,11 @@ import { NTQQUserApi } from '@/core/apis'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - nickname: actionType.string(), - personal_note: actionType.string().optional(), - sex: actionType.string().optional(), // 传Sex值?建议传0 + nickname: coerce.string(), + personal_note: coerce.string().optional(), + sex: coerce.string().optional(), // 传Sex值?建议传0 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index 195df4b9..e253bd09 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -5,13 +5,13 @@ import fs from 'fs'; import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - file: actionType.string(), - name: actionType.string(), - folder: actionType.string().optional(), - folder_id: actionType.string().optional(),//临时扩展 + group_id: coerce.string(), + file: coerce.string(), + name: coerce.string(), + folder: coerce.string().optional(), + folder_id: coerce.string().optional(),//临时扩展 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index 7de40188..6d1d240f 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -6,11 +6,11 @@ import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - user_id: actionType.string(), - file: actionType.string(), - name: actionType.string(), + user_id: coerce.string(), + file: coerce.string(), + name: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index 846aced1..2cc5957f 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -2,9 +2,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - message_id: actionType.string(), + message_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index b012f87d..2737003f 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - notice_id: actionType.string() + group_id: coerce.string(), + notice_id: coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index 7e0d002c..a02a6ddc 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - character: actionType.string(), - group_id: actionType.string(), - text: actionType.string(), + character: coerce.string(), + group_id: coerce.string(), + text: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 500d7dba..4719ea2a 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -5,9 +5,9 @@ import { MessageUnique } from '@/common/message-unique'; import crypto from 'crypto'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), + group_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index f427c224..7325c35f 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -3,9 +3,9 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), + group_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupList.ts b/src/onebot/action/group/GetGroupList.ts index 648d6cdc..4710f6d2 100644 --- a/src/onebot/action/group/GetGroupList.ts +++ b/src/onebot/action/group/GetGroupList.ts @@ -3,10 +3,10 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - no_cache: actionType.boolean().default(false), + no_cache: coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index b1925fd6..dc8cc5c1 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -3,12 +3,12 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - no_cache: actionType.boolean().default(false), + group_id: coerce.string(), + user_id: coerce.string(), + no_cache: coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 909392ba..54fd3fbb 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -4,11 +4,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; import { GroupMember } from '@/core'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - no_cache: actionType.boolean().default(false) + group_id: coerce.string(), + no_cache: coerce.boolean().default(false) }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index 86ef5b0c..d290e65d 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -2,7 +2,7 @@ import { WebApiGroupNoticeFeed } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; interface GroupNotice { sender_id: number; publish_time: number; @@ -18,7 +18,7 @@ interface GroupNotice { } const SchemaData = z.object({ - group_id: actionType.string(), + group_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index b65bacad..de927f93 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -2,9 +2,9 @@ import { ShutUpGroupMember } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), + group_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index 00c6fff8..8a7ad66f 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -1,10 +1,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), + group_id: coerce.string(), + user_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index 454f77be..c0355a03 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - character: actionType.string(), - group_id: actionType.string(), - text: actionType.string(), + character: coerce.string(), + group_id: coerce.string(), + text: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetEssenceMsg.ts b/src/onebot/action/group/SetEssenceMsg.ts index 04026cd0..6200a551 100644 --- a/src/onebot/action/group/SetEssenceMsg.ts +++ b/src/onebot/action/group/SetEssenceMsg.ts @@ -2,9 +2,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - message_id: actionType.string(), + message_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index cabe123e..747ed0a9 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -2,12 +2,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupRequestOperateTypes } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - flag: actionType.string(), - approve: actionType.boolean().default(true), - reason: actionType.string().nullable().default(' '), + flag: coerce.string(), + approve: coerce.boolean().default(true), + reason: coerce.string().nullable().default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index f690ba9f..dbc7e1cc 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -2,12 +2,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupMemberRole } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - enable: actionType.boolean().default(false), + group_id: coerce.string(), + user_id: coerce.string(), + enable: coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index c65d461c..0ac71142 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - duration: actionType.number().default(0), + group_id: coerce.string(), + user_id: coerce.string(), + duration: coerce.number().default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index f0e0b53b..467e2776 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - card: actionType.string().optional(), + group_id: coerce.string(), + user_id: coerce.string(), + card: coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index 08f6ec50..66b9cf33 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - reject_add_request: actionType.boolean().optional(), + group_id: coerce.string(), + user_id: coerce.string(), + reject_add_request: coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index 4823c6bb..1f6ce77d 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - is_dismiss: actionType.boolean().optional(), + group_id: coerce.string(), + is_dismiss: coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index bd644049..54f620f7 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -2,10 +2,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - group_name: actionType.string(), + group_id: coerce.string(), + group_name: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index 0e6c120c..1d3f5d72 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string(), - enable: actionType.boolean().optional(), + group_id: coerce.string(), + enable: coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index b1305dcc..92456e9e 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - message_id: actionType.string(), + message_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index c7e2c245..4c4a0ae9 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -3,11 +3,11 @@ import { ChatType, Peer } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - message_id: actionType.string(), - group_id: actionType.string().optional(), - user_id: actionType.string().optional(), + message_id: coerce.string(), + group_id: coerce.string().optional(), + user_id: coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index ce287a5e..ece7efe8 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -5,11 +5,11 @@ import { MessageUnique } from '@/common/message-unique'; import { RawMessage } from '@/core'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; export type ReturnDataType = OB11Message const SchemaData = z.object({ - message_id: actionType.string(), + message_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index 52ee09e1..cde1d2fe 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -3,11 +3,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - user_id: actionType.string().optional(), - group_id: actionType.string().optional(), - message_id: actionType.string().optional(), + user_id: coerce.string().optional(), + group_id: coerce.string().optional(), + message_id: coerce.string().optional(), }); type PlayloadType = z.infer; diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index 1eb9eed8..42016090 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -2,12 +2,12 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - message_id: actionType.string(), - emoji_id: actionType.string(), - set: actionType.boolean().optional(), + message_id: coerce.string(), + emoji_id: coerce.string(), + set: coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/packet/SendPoke.ts b/src/onebot/action/packet/SendPoke.ts index 438f802f..598654c0 100644 --- a/src/onebot/action/packet/SendPoke.ts +++ b/src/onebot/action/packet/SendPoke.ts @@ -1,11 +1,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - group_id: actionType.string().optional(), - user_id: actionType.string(), + group_id: coerce.string().optional(), + user_id: coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/system/GetCredentials.ts b/src/onebot/action/system/GetCredentials.ts index cb49f0cc..c27a7b4c 100644 --- a/src/onebot/action/system/GetCredentials.ts +++ b/src/onebot/action/system/GetCredentials.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; interface Response { cookies: string, @@ -9,7 +9,7 @@ interface Response { } const SchemaData = z.object({ - domain: actionType.string() + domain: coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index 5b8ba425..78a1b796 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -1,10 +1,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - user_id: actionType.string() + user_id: coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetCookies.ts b/src/onebot/action/user/GetCookies.ts index da021c33..9ff0e3bc 100644 --- a/src/onebot/action/user/GetCookies.ts +++ b/src/onebot/action/user/GetCookies.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; interface Response { cookies: string, bkn: string } const SchemaData = z.object({ - domain: actionType.string() + domain: coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index ef85df42..16cf57b0 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -3,10 +3,10 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - no_cache: actionType.boolean().optional(), + no_cache: coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetRecentContact.ts b/src/onebot/action/user/GetRecentContact.ts index 4c817eb3..8ec364e7 100644 --- a/src/onebot/action/user/GetRecentContact.ts +++ b/src/onebot/action/user/GetRecentContact.ts @@ -3,10 +3,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { NetworkAdapterConfig } from '@/onebot/config/config'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - count: actionType.number().default(10), + count: coerce.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 7630161a..66912a9c 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - times: actionType.number().default(1), - user_id: actionType.string() + times: coerce.number().default(1), + user_id: coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index f35318d4..3a44ae8e 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; const SchemaData = z.object({ - flag: actionType.string(), - approve: actionType.boolean().default(true), - remark: actionType.string().nullable().optional() + flag: coerce.string(), + approve: coerce.boolean().default(true), + remark: coerce.string().nullable().optional() }); type Payload = z.infer; diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index 266106b6..489ce61c 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,72 +1,72 @@ import { z } from 'zod'; -import { actionType } from '../../common/coerce'; +import { coerce } from '../../common/coerce'; const HttpServerConfigSchema = z.object({ - name: actionType.string().default('http-server'), - enable: actionType.boolean().default(false), - port: actionType.number().default(3000), - host: actionType.string().default('0.0.0.0'), - enableCors: actionType.boolean().default(true), - enableWebsocket: actionType.boolean().default(true), - messagePostFormat: actionType.string().default('array'), - token: actionType.string().default(''), - debug: actionType.boolean().default(false) + name: coerce.string().default('http-server'), + enable: coerce.boolean().default(false), + port: coerce.number().default(3000), + host: coerce.string().default('0.0.0.0'), + enableCors: coerce.boolean().default(true), + enableWebsocket: coerce.boolean().default(true), + messagePostFormat: coerce.string().default('array'), + token: coerce.string().default(''), + debug: coerce.boolean().default(false) }); const HttpSseServerConfigSchema = z.object({ - name: actionType.string().default('http-sse-server'), - enable: actionType.boolean().default(false), - port: actionType.number().default(3000), - host: actionType.string().default('0.0.0.0'), - enableCors: actionType.boolean().default(true), - enableWebsocket: actionType.boolean().default(true), - messagePostFormat: actionType.string().default('array'), - token: actionType.string().default(''), - debug: actionType.boolean().default(false), - reportSelfMessage: actionType.boolean().default(false) + name: coerce.string().default('http-sse-server'), + enable: coerce.boolean().default(false), + port: coerce.number().default(3000), + host: coerce.string().default('0.0.0.0'), + enableCors: coerce.boolean().default(true), + enableWebsocket: coerce.boolean().default(true), + messagePostFormat: coerce.string().default('array'), + token: coerce.string().default(''), + debug: coerce.boolean().default(false), + reportSelfMessage: coerce.boolean().default(false) }); const HttpClientConfigSchema = z.object({ - name: actionType.string().default('http-client'), - enable: actionType.boolean().default(false), - url: actionType.string().default('http://localhost:8080'), - messagePostFormat: actionType.string().default('array'), - reportSelfMessage: actionType.boolean().default(false), - token: actionType.string().default(''), - debug: actionType.boolean().default(false) + name: coerce.string().default('http-client'), + enable: coerce.boolean().default(false), + url: coerce.string().default('http://localhost:8080'), + messagePostFormat: coerce.string().default('array'), + reportSelfMessage: coerce.boolean().default(false), + token: coerce.string().default(''), + debug: coerce.boolean().default(false) }); const WebsocketServerConfigSchema = z.object({ - name: actionType.string().default('websocket-server'), - enable: actionType.boolean().default(false), - host: actionType.string().default('0.0.0.0'), - port: actionType.number().default(3001), - messagePostFormat: actionType.string().default('array'), - reportSelfMessage: actionType.boolean().default(false), - token: actionType.string().default(''), - enableForcePushEvent: actionType.boolean().default(true), - debug: actionType.boolean().default(false), - heartInterval: actionType.number().default(30000) + name: coerce.string().default('websocket-server'), + enable: coerce.boolean().default(false), + host: coerce.string().default('0.0.0.0'), + port: coerce.number().default(3001), + messagePostFormat: coerce.string().default('array'), + reportSelfMessage: coerce.boolean().default(false), + token: coerce.string().default(''), + enableForcePushEvent: coerce.boolean().default(true), + debug: coerce.boolean().default(false), + heartInterval: coerce.number().default(30000) }); const WebsocketClientConfigSchema = z.object({ - name: actionType.string().default('websocket-client'), - enable: actionType.boolean().default(false), - url: actionType.string().default('ws://localhost:8082'), - messagePostFormat: actionType.string().default('array'), - reportSelfMessage: actionType.boolean().default(false), - reconnectInterval: actionType.number().default(5000), - token: actionType.string().default(''), - debug: actionType.boolean().default(false), - heartInterval: actionType.number().default(30000) + name: coerce.string().default('websocket-client'), + enable: coerce.boolean().default(false), + url: coerce.string().default('ws://localhost:8082'), + messagePostFormat: coerce.string().default('array'), + reportSelfMessage: coerce.boolean().default(false), + reconnectInterval: coerce.number().default(5000), + token: coerce.string().default(''), + debug: coerce.boolean().default(false), + heartInterval: coerce.number().default(30000) }); const PluginConfigSchema = z.object({ - name: actionType.string().default('plugin'), - enable: actionType.boolean().default(false), - messagePostFormat: actionType.string().default('array'), - reportSelfMessage: actionType.boolean().default(false), - debug: actionType.boolean().default(false), + name: coerce.string().default('plugin'), + enable: coerce.boolean().default(false), + messagePostFormat: coerce.string().default('array'), + reportSelfMessage: coerce.boolean().default(false), + debug: coerce.boolean().default(false), }); const NetworkConfigSchema = z.object({ @@ -80,9 +80,9 @@ const NetworkConfigSchema = z.object({ export const OneBotConfigSchema = z.object({ network: NetworkConfigSchema, - musicSignUrl: actionType.string().default(''), - enableLocalFile2Url: actionType.boolean().default(false), - parseMultMsg: actionType.boolean().default(false) + musicSignUrl: coerce.string().default(''), + enableLocalFile2Url: coerce.boolean().default(false), + parseMultMsg: coerce.boolean().default(false) }); export type OneBotConfig = z.infer; diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index af8e9c5c..dbbdf13a 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -4,14 +4,14 @@ import { resolve } from 'node:path'; import { deepMerge } from '../utils/object'; import { themeType } from '../types/theme'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; // 定义配置的类型 const WebUiConfigSchema = z.object({ - host: actionType.string().default('0.0.0.0'), - port: actionType.number().default(6099), - token: actionType.string().default('napcat'), - loginRate: actionType.number().default(10), - autoLoginAccount: actionType.string().default(''), + host: coerce.string().default('0.0.0.0'), + port: coerce.number().default(6099), + token: coerce.string().default('napcat'), + loginRate: coerce.number().default(10), + autoLoginAccount: coerce.string().default(''), theme: themeType, }); diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index 02be0c38..5f32c107 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -1,10 +1,10 @@ -import { actionType } from '@/common/coerce'; +import { coerce } from '@/common/coerce'; import { z } from 'zod'; export const themeType = z.object( { - dark: z.record(actionType.string(), actionType.string()), - light: z.record(actionType.string(), actionType.string()), + dark: z.record(coerce.string(), coerce.string()), + light: z.record(coerce.string(), coerce.string()), } ).default({ dark: { From bd3e06520f4ad340de85e65690d4e9bd3de5b72c 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: Thu, 17 Apr 2025 09:56:12 +0800 Subject: [PATCH 075/149] fix --- src/common/coerce.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/coerce.ts b/src/common/coerce.ts index 6aabd538..e9c6cd35 100644 --- a/src/common/coerce.ts +++ b/src/common/coerce.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from 'zod'; const boolean = () => z.preprocess( val => typeof val === 'string' && (val.toLowerCase() === 'false' || val === '0') ? false : Boolean(val), z.boolean() From c509a01d7d5fbbf3c20bac2f7d59a2637902320f Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 17 Apr 2025 01:57:25 +0000 Subject: [PATCH 076/149] release: v4.7.24 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 3cb2f197..d8325070 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.23", + "version": "4.7.24", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index ecee6e39..dff66559 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.23", + "version": "4.7.24", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 62f0f436..0480108b 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.23'; +export const napCatVersion = '4.7.24'; From 4190831081da525edaf478004b7942f97a973975 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: Thu, 17 Apr 2025 13:26:24 +0800 Subject: [PATCH 077/149] =?UTF-8?q?fix:=20=E6=89=AC=E4=BA=86ffmpeg.wasm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 - src/common/ffmpeg-worker.ts | 308 ------------------------------------ src/common/ffmpeg.ts | 186 +++++++++++++++++++--- vite.config.ts | 6 +- 4 files changed, 164 insertions(+), 338 deletions(-) delete mode 100644 src/common/ffmpeg-worker.ts diff --git a/package.json b/package.json index dff66559..90a49876 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "@eslint/compat": "^1.2.2", "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.14.0", - "@ffmpeg.wasm/main": "^0.13.1", "@homebridge/node-pty-prebuilt-multiarch": "^0.12.0-beta.5", "@log4js-node/log4js-api": "^1.0.2", "@napneko/nap-proto-core": "^0.0.4", @@ -63,7 +62,6 @@ "zod": "^3.24.2" }, "dependencies": { - "@ffmpeg.wasm/core-mt": "^0.13.2", "express": "^5.0.0", "silk-wasm": "^3.6.1", "ws": "^8.18.0" diff --git a/src/common/ffmpeg-worker.ts b/src/common/ffmpeg-worker.ts deleted file mode 100644 index 095776d1..00000000 --- a/src/common/ffmpeg-worker.ts +++ /dev/null @@ -1,308 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { FFmpeg } from '@ffmpeg.wasm/main'; -import { randomUUID } from 'crypto'; -import { readFileSync, statSync, writeFileSync } from 'fs'; -import type { VideoInfo } from './video'; -import { fileTypeFromFile } from 'file-type'; -import imageSize from 'image-size'; -import { parentPort } from 'worker_threads'; -export function recvTask(cb: (taskData: T) => Promise) { - parentPort?.on('message', async (taskData: T) => { - try { - let ret = await cb(taskData); - parentPort?.postMessage(ret); - } catch (error: unknown) { - parentPort?.postMessage({ error: (error as Error).message }); - } - }); -} -export function sendLog(_log: string) { - //parentPort?.postMessage({ log }); -} -class FFmpegService { - public static async extractThumbnail(videoPath: string, thumbnailPath: string): Promise { - const ffmpegInstance = await FFmpeg.create({ core: '@ffmpeg.wasm/core-mt' }); - const videoFileName = `${randomUUID()}.mp4`; - const outputFileName = `${randomUUID()}.jpg`; - try { - ffmpegInstance.fs.writeFile(videoFileName, readFileSync(videoPath)); - const code = await ffmpegInstance.run('-i', videoFileName, '-ss', '00:00:01.000', '-vframes', '1', outputFileName); - if (code !== 0) { - throw new Error('Error extracting thumbnail: FFmpeg process exited with code ' + code); - } - const thumbnail = ffmpegInstance.fs.readFile(outputFileName); - writeFileSync(thumbnailPath, thumbnail); - } catch (error) { - console.error('Error extracting thumbnail:', error); - throw error; - } finally { - try { - ffmpegInstance.fs.unlink(outputFileName); - } catch (unlinkError) { - console.error('Error unlinking output file:', unlinkError); - } - try { - ffmpegInstance.fs.unlink(videoFileName); - } catch (unlinkError) { - console.error('Error unlinking video file:', unlinkError); - } - } - } - - public static async convertFile(inputFile: string, outputFile: string, format: string): Promise { - const ffmpegInstance = await FFmpeg.create({ core: '@ffmpeg.wasm/core-mt' }); - const inputFileName = `${randomUUID()}.pcm`; - const outputFileName = `${randomUUID()}.${format}`; - try { - ffmpegInstance.fs.writeFile(inputFileName, readFileSync(inputFile)); - const params = format === 'amr' - ? ['-f', 's16le', '-ar', '24000', '-ac', '1', '-i', inputFileName, '-ar', '8000', '-b:a', '12.2k', outputFileName] - : ['-f', 's16le', '-ar', '24000', '-ac', '1', '-i', inputFileName, outputFileName]; - const code = await ffmpegInstance.run(...params); - if (code !== 0) { - throw new Error('Error extracting thumbnail: FFmpeg process exited with code ' + code); - } - const outputData = ffmpegInstance.fs.readFile(outputFileName); - writeFileSync(outputFile, outputData); - } catch (error) { - console.error('Error converting file:', error); - throw error; - } finally { - try { - ffmpegInstance.fs.unlink(outputFileName); - } catch (unlinkError) { - console.error('Error unlinking output file:', unlinkError); - } - try { - ffmpegInstance.fs.unlink(inputFileName); - } catch (unlinkError) { - console.error('Error unlinking input file:', unlinkError); - } - } - } - - public static async convert(filePath: string, pcmPath: string): Promise { - const ffmpegInstance = await FFmpeg.create({ core: '@ffmpeg.wasm/core-mt' }); - const inputFileName = `${randomUUID()}.input`; - const outputFileName = `${randomUUID()}.pcm`; - try { - ffmpegInstance.fs.writeFile(inputFileName, readFileSync(filePath)); - const params = ['-y', '-i', inputFileName, '-ar', '24000', '-ac', '1', '-f', 's16le', outputFileName]; - const code = await ffmpegInstance.run(...params); - if (code !== 0) { - throw new Error('FFmpeg process exited with code ' + code); - } - const outputData = ffmpegInstance.fs.readFile(outputFileName); - writeFileSync(pcmPath, outputData); - return Buffer.from(outputData); - } catch (error: any) { - throw new Error('FFmpeg处理转换出错: ' + error.message); - } finally { - try { - ffmpegInstance.fs.unlink(outputFileName); - } catch (unlinkError) { - console.error('Error unlinking output file:', unlinkError); - } - try { - ffmpegInstance.fs.unlink(inputFileName); - } catch (unlinkError) { - console.error('Error unlinking output file:', unlinkError); - } - } - } - public static async getVideoInfo(videoPath: string, thumbnailPath: string): Promise { - const startTime = Date.now(); - sendLog(`开始获取视频信息: ${videoPath}`); - - // 创建一个超时包装函数 - const withTimeout = (promise: Promise, timeoutMs: number, taskName: string): Promise => { - return Promise.race([ - promise, - new Promise((_, reject) => { - setTimeout(() => reject(new Error(`任务超时: ${taskName} (${timeoutMs}ms)`)), timeoutMs); - }) - ]); - }; - - // 并行执行多个任务 - const [fileInfo, durationInfo] = await Promise.all([ - // 任务1: 获取文件信息和提取缩略图 - (async () => { - sendLog('开始任务1: 获取文件信息和提取缩略图'); - - // 获取文件信息 (并行) - const fileInfoStartTime = Date.now(); - const [fileType, fileSize] = await Promise.all([ - withTimeout(fileTypeFromFile(videoPath), 10000, '获取文件类型') - .then(result => { - sendLog(`获取文件类型完成,耗时: ${Date.now() - fileInfoStartTime}ms`); - return result; - }), - (async () => { - const result = statSync(videoPath).size; - sendLog(`获取文件大小完成,耗时: ${Date.now() - fileInfoStartTime}ms`); - return result; - })() - ]); - - // 直接实现缩略图提取 (不调用extractThumbnail方法) - const thumbStartTime = Date.now(); - sendLog('开始提取缩略图'); - - const ffmpegInstance = await withTimeout( - FFmpeg.create({ core: '@ffmpeg.wasm/core-mt' }), - 15000, - '创建FFmpeg实例(缩略图)' - ); - - const videoFileName = `${randomUUID()}.mp4`; - const outputFileName = `${randomUUID()}.jpg`; - - try { - // 写入视频文件到FFmpeg - const writeFileStartTime = Date.now(); - ffmpegInstance.fs.writeFile(videoFileName, readFileSync(videoPath)); - sendLog(`写入视频文件到FFmpeg完成,耗时: ${Date.now() - writeFileStartTime}ms`); - - // 提取缩略图 - const extractStartTime = Date.now(); - const code = await withTimeout( - ffmpegInstance.run('-i', videoFileName, '-ss', '00:00:01.000', '-vframes', '1', outputFileName), - 30000, - '提取缩略图' - ); - sendLog(`FFmpeg提取缩略图命令执行完成,耗时: ${Date.now() - extractStartTime}ms`); - - if (code !== 0) { - throw new Error('Error extracting thumbnail: FFmpeg process exited with code ' + code); - } - - // 读取并保存缩略图 - const saveStartTime = Date.now(); - const thumbnail = ffmpegInstance.fs.readFile(outputFileName); - writeFileSync(thumbnailPath, thumbnail); - sendLog(`读取并保存缩略图完成,耗时: ${Date.now() - saveStartTime}ms`); - - // 获取缩略图尺寸 - const imageSizeStartTime = Date.now(); - const image = imageSize(thumbnailPath); - sendLog(`获取缩略图尺寸完成,耗时: ${Date.now() - imageSizeStartTime}ms`); - - sendLog(`提取缩略图完成,总耗时: ${Date.now() - thumbStartTime}ms`); - - return { - format: fileType?.ext ?? 'mp4', - size: fileSize, - width: image.width ?? 100, - height: image.height ?? 100 - }; - } finally { - // 清理资源 - try { - ffmpegInstance.fs.unlink(outputFileName); - } catch (error) { - sendLog(`清理输出文件失败: ${(error as Error).message}`); - } - - try { - ffmpegInstance.fs.unlink(videoFileName); - } catch (error) { - sendLog(`清理视频文件失败: ${(error as Error).message}`); - } - } - })(), - - // 任务2: 获取视频时长 - (async () => { - const task2StartTime = Date.now(); - sendLog('开始任务2: 获取视频时长'); - - // 创建FFmpeg实例 - const ffmpegCreateStartTime = Date.now(); - const ffmpegInstance = await withTimeout( - FFmpeg.create({ core: '@ffmpeg.wasm/core-mt' }), - 15000, - '创建FFmpeg实例(时长)' - ); - sendLog(`创建FFmpeg实例完成,耗时: ${Date.now() - ffmpegCreateStartTime}ms`); - - const inputFileName = `${randomUUID()}.mp4`; - - try { - // 写入文件 - const writeStartTime = Date.now(); - ffmpegInstance.fs.writeFile(inputFileName, readFileSync(videoPath)); - sendLog(`写入文件到FFmpeg完成,耗时: ${Date.now() - writeStartTime}ms`); - - ffmpegInstance.setLogging(true); - let duration = 60; // 默认值 - - ffmpegInstance.setLogger((_level, ...msg) => { - const message = msg.join(' '); - const durationMatch = message.match(/Duration: (\d+):(\d+):(\d+\.\d+)/); - if (durationMatch) { - const hours = parseInt(durationMatch[1] ?? '0', 10); - const minutes = parseInt(durationMatch[2] ?? '0', 10); - const seconds = parseFloat(durationMatch[3] ?? '0'); - duration = hours * 3600 + minutes * 60 + seconds; - } - }); - - // 执行FFmpeg - const runStartTime = Date.now(); - await withTimeout( - ffmpegInstance.run('-i', inputFileName), - 20000, - '获取视频时长' - ); - sendLog(`执行FFmpeg命令完成,耗时: ${Date.now() - runStartTime}ms`); - - sendLog(`任务2(获取视频时长)完成,总耗时: ${Date.now() - task2StartTime}ms`); - return { time: duration }; - } finally { - try { - ffmpegInstance.fs.unlink(inputFileName); - } catch (error) { - sendLog(`清理输入文件失败: ${(error as Error).message}`); - } - } - })() - ]); - - // 合并结果并返回 - const totalDuration = Date.now() - startTime; - sendLog(`获取视频信息完成,总耗时: ${totalDuration}ms`); - - return { - width: fileInfo.width, - height: fileInfo.height, - time: durationInfo.time, - format: fileInfo.format, - size: fileInfo.size, - filePath: videoPath - }; - } -} -type FFmpegMethod = 'extractThumbnail' | 'convertFile' | 'convert' | 'getVideoInfo'; - -interface FFmpegTask { - method: FFmpegMethod; - args: any[]; -} -export default async function handleFFmpegTask({ method, args }: FFmpegTask): Promise { - switch (method) { - case 'extractThumbnail': - return await FFmpegService.extractThumbnail(...args as [string, string]); - case 'convertFile': - return await FFmpegService.convertFile(...args as [string, string, string]); - case 'convert': - return await FFmpegService.convert(...args as [string, string]); - case 'getVideoInfo': - return await FFmpegService.getVideoInfo(...args as [string, string]); - default: - throw new Error(`Unknown method: ${method}`); - } -} -recvTask(async ({ method, args }: FFmpegTask) => { - return await handleFFmpegTask({ method, args }); -}); \ No newline at end of file diff --git a/src/common/ffmpeg.ts b/src/common/ffmpeg.ts index 22497d6e..31ae5740 100644 --- a/src/common/ffmpeg.ts +++ b/src/common/ffmpeg.ts @@ -1,36 +1,176 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { VideoInfo } from './video'; -import path from 'path'; -import { fileURLToPath } from 'url'; -import { runTask } from './worker'; - -type EncodeArgs = { - method: 'extractThumbnail' | 'convertFile' | 'convert' | 'getVideoInfo'; - args: any[]; -}; - -type EncodeResult = any; - -function getWorkerPath() { - return path.join(path.dirname(fileURLToPath(import.meta.url)), './ffmpeg-worker.mjs'); -} +import { readFileSync, statSync, existsSync, mkdirSync } from 'fs'; +import { dirname } from 'path'; +import { execFile } from 'child_process'; +import { promisify } from 'util'; +import type { VideoInfo } from './video'; +import { fileTypeFromFile } from 'file-type'; +import imageSize from 'image-size'; +const execFileAsync = promisify(execFile); +const FFMPEG_CMD = process.platform === 'win32' ? 'ffmpeg.exe' : 'ffmpeg'; +const FFPROBE_CMD = process.platform === 'win32' ? 'ffprobe.exe' : 'ffprobe'; export class FFmpegService { + // 确保目标目录存在 + private static ensureDirExists(filePath: string): void { + const dir = dirname(filePath); + if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }); + } + } + public static async extractThumbnail(videoPath: string, thumbnailPath: string): Promise { - await runTask(getWorkerPath(), { method: 'extractThumbnail', args: [videoPath, thumbnailPath] }); + try { + this.ensureDirExists(thumbnailPath); + + const { stderr } = await execFileAsync(FFMPEG_CMD, [ + '-i', videoPath, + '-ss', '00:00:01.000', + '-vframes', '1', + '-y', // 覆盖输出文件 + thumbnailPath + ]); + + if (!existsSync(thumbnailPath)) { + throw new Error(`提取缩略图失败,输出文件不存在: ${stderr}`); + } + } catch (error) { + console.error('Error extracting thumbnail:', error); + throw new Error(`提取缩略图失败: ${(error as Error).message}`); + } } public static async convertFile(inputFile: string, outputFile: string, format: string): Promise { - await runTask(getWorkerPath(), { method: 'convertFile', args: [inputFile, outputFile, format] }); + try { + this.ensureDirExists(outputFile); + + const params = format === 'amr' + ? [ + '-f', 's16le', + '-ar', '24000', + '-ac', '1', + '-i', inputFile, + '-ar', '8000', + '-b:a', '12.2k', + '-y', + outputFile + ] + : [ + '-f', 's16le', + '-ar', '24000', + '-ac', '1', + '-i', inputFile, + '-y', + outputFile + ]; + + await execFileAsync(FFMPEG_CMD, params); + + if (!existsSync(outputFile)) { + throw new Error('转换失败,输出文件不存在'); + } + } catch (error) { + console.error('Error converting file:', error); + throw new Error(`文件转换失败: ${(error as Error).message}`); + } } public static async convert(filePath: string, pcmPath: string): Promise { - const result = await runTask(getWorkerPath(), { method: 'convert', args: [filePath, pcmPath] }); - return result; + try { + this.ensureDirExists(pcmPath); + + await execFileAsync(FFMPEG_CMD, [ + '-y', + '-i', filePath, + '-ar', '24000', + '-ac', '1', + '-f', 's16le', + pcmPath + ]); + + if (!existsSync(pcmPath)) { + throw new Error('转换PCM失败,输出文件不存在'); + } + + return readFileSync(pcmPath); + } catch (error: any) { + throw new Error(`FFmpeg处理转换出错: ${error.message}`); + } } public static async getVideoInfo(videoPath: string, thumbnailPath: string): Promise { - const result = await runTask(getWorkerPath(), { method: 'getVideoInfo', args: [videoPath, thumbnailPath] }); - return result; + try { + // 并行执行获取文件信息和提取缩略图 + const [fileInfo, duration] = await Promise.all([ + this.getFileInfo(videoPath, thumbnailPath), + this.getVideoDuration(videoPath) + ]); + + const result: VideoInfo = { + width: fileInfo.width, + height: fileInfo.height, + time: duration, + format: fileInfo.format, + size: fileInfo.size, + filePath: videoPath + }; + return result; + } catch (error) { + throw error; + } } -} + + private static async getFileInfo(videoPath: string, thumbnailPath: string): Promise<{ + format: string, + size: number, + width: number, + height: number + }> { + + // 获取文件大小和类型 + const [fileType, fileSize] = await Promise.all([ + fileTypeFromFile(videoPath).catch(() => { + return null; + }), + Promise.resolve(statSync(videoPath).size) + ]); + + + try { + await this.extractThumbnail(videoPath, thumbnailPath); + // 获取图片尺寸 + const dimensions = imageSize(thumbnailPath); + + return { + format: fileType?.ext ?? 'mp4', + size: fileSize, + width: dimensions.width ?? 100, + height: dimensions.height ?? 100 + }; + } catch (error) { + return { + format: fileType?.ext ?? 'mp4', + size: fileSize, + width: 100, + height: 100 + }; + } + } + + private static async getVideoDuration(videoPath: string): Promise { + try { + // 使用FFprobe获取时长 + const { stdout } = await execFileAsync(FFPROBE_CMD, [ + '-v', 'error', + '-show_entries', 'format=duration', + '-of', 'default=noprint_wrappers=1:nokey=1', + videoPath + ]); + + const duration = parseFloat(stdout.trim()); + + return isNaN(duration) ? 60 : duration; + } catch (error) { + return 60; // 默认时长 + } + } +} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index 9d9429b6..d2565857 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -7,8 +7,7 @@ import { builtinModules } from 'module'; const external = [ 'silk-wasm', 'ws', - 'express', - '@ffmpeg.wasm/core-mt' + 'express' ]; const nodeModules = [...builtinModules, builtinModules.map((m) => `node:${m}`)].flat(); @@ -97,7 +96,6 @@ const UniversalBaseConfig = () => entry: { napcat: 'src/universal/napcat.ts', 'audio-worker': 'src/common/audio-worker.ts', - 'ffmpeg-worker': 'src/common/ffmpeg-worker.ts', 'worker/conoutSocketWorker': 'src/pty/worker/conoutSocketWorker.ts', }, formats: ['es'], @@ -127,7 +125,6 @@ const ShellBaseConfig = () => entry: { napcat: 'src/shell/napcat.ts', 'audio-worker': 'src/common/audio-worker.ts', - 'ffmpeg-worker': 'src/common/ffmpeg-worker.ts', 'worker/conoutSocketWorker': 'src/pty/worker/conoutSocketWorker.ts', }, formats: ['es'], @@ -157,7 +154,6 @@ const FrameworkBaseConfig = () => entry: { napcat: 'src/framework/napcat.ts', 'audio-worker': 'src/common/audio-worker.ts', - 'ffmpeg-worker': 'src/common/ffmpeg-worker.ts', 'worker/conoutSocketWorker': 'src/pty/worker/conoutSocketWorker.ts', }, formats: ['es'], From dad7245a3ad94d4d864f0f03babe508d17d9098b Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 17 Apr 2025 05:28:19 +0000 Subject: [PATCH 078/149] release: v4.7.25 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index d8325070..290ce119 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.24", + "version": "4.7.25", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 90a49876..f5bb232d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.24", + "version": "4.7.25", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 0480108b..9fd98027 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.24'; +export const napCatVersion = '4.7.25'; From fc37288827dedba4f67bf1ae95ac4f2448977590 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: Thu, 17 Apr 2025 13:55:31 +0800 Subject: [PATCH 079/149] fix: ffmpeg --- .github/workflows/build.yml | 6 ++++++ src/common/ffmpeg.ts | 20 +++++++++++++++++--- vite.config.ts | 3 +++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cd85b93b..f7c6a3fa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,6 +38,12 @@ jobs: - name: Build NapCat.Shell run: | npm i && cd napcat.webui && npm i && cd .. || exit 1 + curl -sSL https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2025-04-16-12-54/ffmpeg-n7.1.1-6-g48c0f071d4-win64-lgpl-7.1.zip -o ffmpeg.zip + unzip -q ffmpeg.zip -d ffmpeg && rm ffmpeg.zip + cd ffmpeg + mv ffmpeg.exe ../external/ffmpeg/ffmpeg.exe + mv ffprobe.exe ../external/ffmpeg/ffprobe.exe + cd .. npm run build:shell && npm run depend || exit 1 rm package-lock.json - name: Upload Artifact diff --git a/src/common/ffmpeg.ts b/src/common/ffmpeg.ts index 31ae5740..65b84473 100644 --- a/src/common/ffmpeg.ts +++ b/src/common/ffmpeg.ts @@ -1,14 +1,28 @@ import { readFileSync, statSync, existsSync, mkdirSync } from 'fs'; -import { dirname } from 'path'; +import path, { dirname } from 'path'; import { execFile } from 'child_process'; import { promisify } from 'util'; import type { VideoInfo } from './video'; import { fileTypeFromFile } from 'file-type'; import imageSize from 'image-size'; +import { fileURLToPath } from 'node:url'; +const currentPath = dirname(fileURLToPath(import.meta.url)); const execFileAsync = promisify(execFile); -const FFMPEG_CMD = process.platform === 'win32' ? 'ffmpeg.exe' : 'ffmpeg'; -const FFPROBE_CMD = process.platform === 'win32' ? 'ffprobe.exe' : 'ffprobe'; +const getFFmpegPath = (tool: string): string => { + const exeName = `${tool}.exe`; + const isLocalExeExists = existsSync(path.join(currentPath, 'ffmpeg', exeName)); + if (process.platform === 'win32') { + return isLocalExeExists ? path.join(currentPath, 'ffmpeg', exeName) : exeName; + } + return tool; +}; + +const FFMPEG_CMD = getFFmpegPath('ffmpeg'); +const FFPROBE_CMD = getFFmpegPath('ffprobe'); + +console.log('[Info] ffmpeg:', FFMPEG_CMD); +console.log('[Info] ffprobe:', FFPROBE_CMD); export class FFmpegService { // 确保目标目录存在 private static ensureDirExists(filePath: string): void { diff --git a/vite.config.ts b/vite.config.ts index d2565857..7c8cae11 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -23,6 +23,7 @@ if (process.env.NAPCAT_BUILDSYS == 'linux') { const UniversalBaseConfigPlugin: PluginOption[] = [ cp({ targets: [ + { src: './external/ffmpeg/', dest: 'dist/ffmpeg', flatten: true }, { src: './manifest.json', dest: 'dist' }, { src: './src/core/external/napcat.json', dest: 'dist/config/' }, { src: './src/native/packet', dest: 'dist/moehoo', flatten: false }, @@ -46,6 +47,7 @@ const UniversalBaseConfigPlugin: PluginOption[] = [ const FrameworkBaseConfigPlugin: PluginOption[] = [ cp({ targets: [ + { src: './external/ffmpeg/', dest: 'dist/ffmpeg', flatten: true }, { src: './manifest.json', dest: 'dist' }, { src: './src/core/external/napcat.json', dest: 'dist/config/' }, { src: './src/native/packet', dest: 'dist/moehoo', flatten: false }, @@ -65,6 +67,7 @@ const FrameworkBaseConfigPlugin: PluginOption[] = [ const ShellBaseConfigPlugin: PluginOption[] = [ cp({ targets: [ + { src: './external/ffmpeg/', dest: 'dist/ffmpeg', flatten: true }, { src: './src/native/packet', dest: 'dist/moehoo', flatten: false }, { src: './src/native/pty', dest: 'dist/pty', flatten: false }, { src: './napcat.webui/dist/', dest: 'dist/static/', flatten: false }, From e4b21e94f5c4518393d7ff03a7f90e1089d68423 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: Thu, 17 Apr 2025 14:28:51 +0800 Subject: [PATCH 080/149] feat: ffmpeg download auto --- .github/workflows/build.yml | 6 - src/common/download-ffmpeg.ts | 308 ++++++++++++++++++++++++++++++++++ src/common/ffmpeg.ts | 20 ++- src/framework/napcat.ts | 7 + src/shell/base.ts | 7 + src/shell/napcat.ts | 3 +- vite.config.ts | 3 - 7 files changed, 336 insertions(+), 18 deletions(-) create mode 100644 src/common/download-ffmpeg.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f7c6a3fa..cd85b93b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,12 +38,6 @@ jobs: - name: Build NapCat.Shell run: | npm i && cd napcat.webui && npm i && cd .. || exit 1 - curl -sSL https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2025-04-16-12-54/ffmpeg-n7.1.1-6-g48c0f071d4-win64-lgpl-7.1.zip -o ffmpeg.zip - unzip -q ffmpeg.zip -d ffmpeg && rm ffmpeg.zip - cd ffmpeg - mv ffmpeg.exe ../external/ffmpeg/ffmpeg.exe - mv ffprobe.exe ../external/ffmpeg/ffprobe.exe - cd .. npm run build:shell && npm run depend || exit 1 rm package-lock.json - name: Upload Artifact diff --git a/src/common/download-ffmpeg.ts b/src/common/download-ffmpeg.ts new file mode 100644 index 00000000..dda93886 --- /dev/null +++ b/src/common/download-ffmpeg.ts @@ -0,0 +1,308 @@ +// 更正导入语句 +import * as fs from 'fs'; +import * as path from 'path'; +import * as https from 'https'; +import * as os from 'os'; +import * as compressing from 'compressing'; // 修正导入方式 +import { pipeline } from 'stream/promises'; +import { fileURLToPath } from 'url'; +import { LogWrapper } from './log'; + +const downloadOri = "https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2025-04-16-12-54/ffmpeg-n7.1.1-6-g48c0f071d4-win64-lgpl-7.1.zip" +const urls = [ + "https://github.moeyy.xyz/" + downloadOri, + "https://ghp.ci/" + downloadOri, + "https://gh.api.99988866.xyz/" + downloadOri, + downloadOri +]; + +/** + * 测试URL是否可用 + * @param url 待测试的URL + * @returns 如果URL可访问返回true,否则返回false + */ +async function testUrl(url: string): Promise { + return new Promise((resolve) => { + const req = https.get(url, { timeout: 5000 }, (res) => { + // 检查状态码是否表示成功 + const statusCode = res.statusCode || 0; + if (statusCode >= 200 && statusCode < 300) { + // 终止请求并返回true + req.destroy(); + resolve(true); + } else { + req.destroy(); + resolve(false); + } + }); + + req.on('error', () => { + resolve(false); + }); + + req.on('timeout', () => { + req.destroy(); + resolve(false); + }); + }); +} + +/** + * 查找第一个可用的URL + * @returns 返回第一个可用的URL,如果都不可用则返回null + */ +async function findAvailableUrl(): Promise { + for (const url of urls) { + try { + const available = await testUrl(url); + if (available) { + return url; + } + } catch (error) { + // 忽略错误 + } + } + + return null; +} +/** + * 下载文件 + * @param url 下载URL + * @param destPath 目标保存路径 + * @returns 成功返回true,失败返回false + */ +async function downloadFile(url: string, destPath: string, progressCallback?: (percent: number) => void): Promise { + return new Promise((resolve) => { + const file = fs.createWriteStream(destPath); + + const req = https.get(url, (res) => { + const statusCode = res.statusCode || 0; + + if (statusCode >= 200 && statusCode < 300) { + // 获取文件总大小 + const totalSize = parseInt(res.headers['content-length'] || '0', 10); + let downloadedSize = 0; + let lastReportedPercent = -1; // 上次报告的百分比 + let lastReportTime = 0; // 上次报告的时间戳 + + // 如果有内容长度和进度回调,则添加数据监听 + if (totalSize > 0 && progressCallback) { + // 初始报告 0% + progressCallback(0); + lastReportTime = Date.now(); + + res.on('data', (chunk) => { + downloadedSize += chunk.length; + const currentPercent = Math.floor((downloadedSize / totalSize) * 100); + const now = Date.now(); + + // 只在以下条件触发回调: + // 1. 百分比变化至少为1% + // 2. 距离上次报告至少500毫秒 + // 3. 确保报告100%完成 + if ((currentPercent !== lastReportedPercent && + (currentPercent - lastReportedPercent >= 1 || currentPercent === 100)) && + (now - lastReportTime >= 1000 || currentPercent === 100)) { + + progressCallback(currentPercent); + lastReportedPercent = currentPercent; + lastReportTime = now; + } + }); + } + + pipeline(res, file) + .then(() => { + // 确保最后报告100% + if (progressCallback && lastReportedPercent !== 100) { + progressCallback(100); + } + resolve(true); + }) + .catch(() => resolve(false)); + } else { + file.close(); + fs.unlink(destPath, () => { }); + resolve(false); + } + }); + + req.on('error', () => { + file.close(); + fs.unlink(destPath, () => { }); + resolve(false); + }); + }); +} + +/** + * 解压缩zip文件中的特定内容 + * 只解压bin目录中的文件到目标目录 + * @param zipPath 压缩文件路径 + * @param extractDir 解压目标路径 + */ +async function extractBinDirectory(zipPath: string, extractDir: string): Promise { + try { + // 确保目标目录存在 + if (!fs.existsSync(extractDir)) { + fs.mkdirSync(extractDir, { recursive: true }); + } + + // 解压文件 + const zipStream = new compressing.zip.UncompressStream({ source: zipPath }); + + return new Promise((resolve, reject) => { + // 监听条目事件 + zipStream.on('entry', (header, stream, next) => { + // 获取文件路径 + const filePath = header.name; + + // 匹配内层bin目录中的文件 + // 例如:ffmpeg-n7.1.1-6-g48c0f071d4-win64-lgpl-7.1/bin/ffmpeg.exe + if (filePath.includes('/bin/') && filePath.endsWith('.exe')) { + // 提取文件名 + const fileName = path.basename(filePath); + const targetPath = path.join(extractDir, fileName); + + // 创建写入流 + const writeStream = fs.createWriteStream(targetPath); + + // 将流管道连接到文件 + stream.pipe(writeStream); + + // 监听写入完成事件 + writeStream.on('finish', () => { + next(); + }); + + writeStream.on('error', () => { + next(); + }); + } else { + // 跳过不需要的文件 + stream.resume(); + next(); + } + }); + + zipStream.on('error', (err) => { + reject(err); + }); + + zipStream.on('finish', () => { + resolve(); + }); + }); + } catch (err) { + throw err; + } +} + +/** + * 下载并设置FFmpeg + * @param destDir 目标安装目录,默认为用户临时目录下的ffmpeg文件夹 + * @param tempDir 临时文件目录,默认为系统临时目录 + * @returns 返回ffmpeg可执行文件的路径,如果失败则返回null + */ +export async function downloadFFmpeg( + destDir?: string, + tempDir?: string, + progressCallback?: (percent: number, stage: string) => void +): Promise { + // 仅限Windows + if (os.platform() !== 'win32') { + return null; + } + + const destinationDir = destDir || path.join(os.tmpdir(), 'ffmpeg'); + const tempDirectory = tempDir || os.tmpdir(); + const zipFilePath = path.join(tempDirectory, 'ffmpeg.zip'); // 临时下载到指定临时目录 + const ffmpegExePath = path.join(destinationDir, 'ffmpeg.exe'); + + // 确保目录存在 + if (!fs.existsSync(destinationDir)) { + fs.mkdirSync(destinationDir, { recursive: true }); + } + + // 确保临时目录存在 + if (!fs.existsSync(tempDirectory)) { + fs.mkdirSync(tempDirectory, { recursive: true }); + } + + // 如果ffmpeg已经存在,直接返回路径 + if (fs.existsSync(ffmpegExePath)) { + if (progressCallback) progressCallback(100, '已找到FFmpeg'); + return ffmpegExePath; + } + + // 查找可用URL + if (progressCallback) progressCallback(0, '查找可用下载源'); + const availableUrl = await findAvailableUrl(); + if (!availableUrl) { + return null; + } + + // 下载文件 + if (progressCallback) progressCallback(5, '开始下载FFmpeg'); + const downloaded = await downloadFile( + availableUrl, + zipFilePath, + (percent) => { + // 下载占总进度的70% + if (progressCallback) progressCallback(5 + Math.floor(percent * 0.7), '下载FFmpeg'); + } + ); + + if (!downloaded) { + return null; + } + + try { + // 直接解压bin目录文件到目标目录 + if (progressCallback) progressCallback(75, '解压FFmpeg'); + await extractBinDirectory(zipFilePath, destinationDir); + + // 清理下载文件 + if (progressCallback) progressCallback(95, '清理临时文件'); + try { + fs.unlinkSync(zipFilePath); + } catch (err) { + // 忽略清理临时文件失败的错误 + } + + // 检查ffmpeg.exe是否成功解压 + if (fs.existsSync(ffmpegExePath)) { + if (progressCallback) progressCallback(100, 'FFmpeg安装完成'); + return ffmpegExePath; + } else { + return null; + } + } catch (err) { + return null; + } +} +export async function downloadFFmpegIfNotExists(log:LogWrapper) { + // 仅限Windows + if (os.platform() !== 'win32') { + return { + path: null, + isExist: false + }; + } + const currentPath = path.dirname(fileURLToPath(import.meta.url)); + const ffmpeg_exist = fs.existsSync(path.join(currentPath, 'ffmpeg', 'ffmpeg.exe')); + const ffprobe_exist = fs.existsSync(path.join(currentPath, 'ffmpeg', 'ffprobe.exe')); + if (!ffmpeg_exist || !ffprobe_exist) { + await downloadFFmpeg('./ffmpeg', './cache', (percentage: number, message: string) => { + log.log(`[Ffmpeg] [Download] ${percentage}% - ${message}`); + }); + return { + path: path.join(currentPath, 'ffmpeg'), + isExist: false + } + } + return { + path: path.join(currentPath, 'ffmpeg'), + isExist: true + } +} \ No newline at end of file diff --git a/src/common/ffmpeg.ts b/src/common/ffmpeg.ts index 65b84473..ffb285d5 100644 --- a/src/common/ffmpeg.ts +++ b/src/common/ffmpeg.ts @@ -6,25 +6,31 @@ import type { VideoInfo } from './video'; import { fileTypeFromFile } from 'file-type'; import imageSize from 'image-size'; import { fileURLToPath } from 'node:url'; +import { platform } from 'node:os'; const currentPath = dirname(fileURLToPath(import.meta.url)); const execFileAsync = promisify(execFile); const getFFmpegPath = (tool: string): string => { - const exeName = `${tool}.exe`; - const isLocalExeExists = existsSync(path.join(currentPath, 'ffmpeg', exeName)); - if (process.platform === 'win32') { + const exeName = `${tool}.exe`; + const isLocalExeExists = existsSync(path.join(currentPath, 'ffmpeg', exeName)); return isLocalExeExists ? path.join(currentPath, 'ffmpeg', exeName) : exeName; } return tool; }; - -const FFMPEG_CMD = getFFmpegPath('ffmpeg'); -const FFPROBE_CMD = getFFmpegPath('ffprobe'); - +export let FFMPEG_CMD = getFFmpegPath('ffmpeg'); +export let FFPROBE_CMD = getFFmpegPath('ffprobe'); console.log('[Info] ffmpeg:', FFMPEG_CMD); console.log('[Info] ffprobe:', FFPROBE_CMD); export class FFmpegService { // 确保目标目录存在 + public static setFfmpegPath(ffmpegPath: string): void { + if (platform() === 'win32') { + FFMPEG_CMD = path.join(ffmpegPath, 'ffmpeg.exe'); + FFPROBE_CMD = path.join(ffmpegPath, 'ffprobe.exe'); + console.log('[Info] ffmpeg:', FFMPEG_CMD); + console.log('[Info] ffprobe:', FFPROBE_CMD); + } + } private static ensureDirExists(filePath: string): void { const dir = dirname(filePath); if (!existsSync(dir)) { diff --git a/src/framework/napcat.ts b/src/framework/napcat.ts index d96e1ff3..fb5e2bfc 100644 --- a/src/framework/napcat.ts +++ b/src/framework/napcat.ts @@ -9,6 +9,8 @@ import { NodeIKernelLoginService } from '@/core/services'; import { NodeIQQNTWrapperSession, WrapperNodeApi } from '@/core/wrapper'; import { InitWebUi, WebUiConfig, webUiRuntimePort } from '@/webui'; import { NapCatOneBot11Adapter } from '@/onebot'; +import { downloadFFmpegIfNotExists } from '@/common/download-ffmpeg'; +import { FFmpegService } from '@/common/ffmpeg'; //Framework ES入口文件 export async function getWebUiUrl() { @@ -36,6 +38,11 @@ export async function NCoreInitFramework( const logger = new LogWrapper(pathWrapper.logsPath); const basicInfoWrapper = new QQBasicInfoWrapper({ logger }); const wrapper = loadQQWrapper(basicInfoWrapper.getFullQQVesion()); + downloadFFmpegIfNotExists(logger).then(({ path, isExist }) => { + if (!isExist && path) { + FFmpegService.setFfmpegPath(path); + } + }); //直到登录成功后,执行下一步 const selfInfo = await new Promise((resolveSelfInfo) => { const loginListener = new NodeIKernelLoginListener(); diff --git a/src/shell/base.ts b/src/shell/base.ts index 0ca81a7b..927639b5 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -31,6 +31,8 @@ import { WebUiDataRuntime } from '@/webui/src/helper/Data'; import { napCatVersion } from '@/common/version'; import { NodeIO3MiscListener } from '@/core/listeners/NodeIO3MiscListener'; import { sleep } from '@/common/helper'; +import { downloadFFmpegIfNotExists } from '@/common/download-ffmpeg'; +import { FFmpegService } from '@/common/ffmpeg'; // NapCat Shell App ES 入口文件 async function handleUncaughtExceptions(logger: LogWrapper) { @@ -311,6 +313,11 @@ export async function NCoreInitShell() { const pathWrapper = new NapCatPathWrapper(); const logger = new LogWrapper(pathWrapper.logsPath); handleUncaughtExceptions(logger); + downloadFFmpegIfNotExists(logger).then(({ path, isExist }) => { + if (!isExist && path) { + FFmpegService.setFfmpegPath(path); + } +}); const basicInfoWrapper = new QQBasicInfoWrapper({ logger }); const wrapper = loadQQWrapper(basicInfoWrapper.getFullQQVesion()); diff --git a/src/shell/napcat.ts b/src/shell/napcat.ts index 5a41d404..c3f9bbe8 100644 --- a/src/shell/napcat.ts +++ b/src/shell/napcat.ts @@ -1,7 +1,6 @@ import { NCoreInitShell } from './base'; -import * as net from 'net'; // 引入 net 模块 +import * as net from 'net'; import * as process from 'process'; - if (process.platform === 'win32') { const pid = process.pid; const pipePath = `\\\\.\\pipe\\NapCat_${pid}`; diff --git a/vite.config.ts b/vite.config.ts index 7c8cae11..d2565857 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -23,7 +23,6 @@ if (process.env.NAPCAT_BUILDSYS == 'linux') { const UniversalBaseConfigPlugin: PluginOption[] = [ cp({ targets: [ - { src: './external/ffmpeg/', dest: 'dist/ffmpeg', flatten: true }, { src: './manifest.json', dest: 'dist' }, { src: './src/core/external/napcat.json', dest: 'dist/config/' }, { src: './src/native/packet', dest: 'dist/moehoo', flatten: false }, @@ -47,7 +46,6 @@ const UniversalBaseConfigPlugin: PluginOption[] = [ const FrameworkBaseConfigPlugin: PluginOption[] = [ cp({ targets: [ - { src: './external/ffmpeg/', dest: 'dist/ffmpeg', flatten: true }, { src: './manifest.json', dest: 'dist' }, { src: './src/core/external/napcat.json', dest: 'dist/config/' }, { src: './src/native/packet', dest: 'dist/moehoo', flatten: false }, @@ -67,7 +65,6 @@ const FrameworkBaseConfigPlugin: PluginOption[] = [ const ShellBaseConfigPlugin: PluginOption[] = [ cp({ targets: [ - { src: './external/ffmpeg/', dest: 'dist/ffmpeg', flatten: true }, { src: './src/native/packet', dest: 'dist/moehoo', flatten: false }, { src: './src/native/pty', dest: 'dist/pty', flatten: false }, { src: './napcat.webui/dist/', dest: 'dist/static/', flatten: false }, From 5f637e064a3b66a62161c3dbc0807bfea639e704 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 17 Apr 2025 06:29:11 +0000 Subject: [PATCH 081/149] release: v4.7.26 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 290ce119..6b74d1d9 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.25", + "version": "4.7.26", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index f5bb232d..05b574d7 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.25", + "version": "4.7.26", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 9fd98027..e42fd5da 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.25'; +export const napCatVersion = '4.7.26'; From d53607a118eeae065f26568e7376b8b1c184b9dd 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: Thu, 17 Apr 2025 14:39:30 +0800 Subject: [PATCH 082/149] fix --- src/common/download-ffmpeg.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/download-ffmpeg.ts b/src/common/download-ffmpeg.ts index dda93886..cba7e8be 100644 --- a/src/common/download-ffmpeg.ts +++ b/src/common/download-ffmpeg.ts @@ -281,7 +281,7 @@ export async function downloadFFmpeg( return null; } } -export async function downloadFFmpegIfNotExists(log:LogWrapper) { +export async function downloadFFmpegIfNotExists(log: LogWrapper) { // 仅限Windows if (os.platform() !== 'win32') { return { @@ -293,7 +293,7 @@ export async function downloadFFmpegIfNotExists(log:LogWrapper) { const ffmpeg_exist = fs.existsSync(path.join(currentPath, 'ffmpeg', 'ffmpeg.exe')); const ffprobe_exist = fs.existsSync(path.join(currentPath, 'ffmpeg', 'ffprobe.exe')); if (!ffmpeg_exist || !ffprobe_exist) { - await downloadFFmpeg('./ffmpeg', './cache', (percentage: number, message: string) => { + await downloadFFmpeg(path.join(currentPath, 'ffmpeg'), path.join(currentPath, 'cache'), (percentage: number, message: string) => { log.log(`[Ffmpeg] [Download] ${percentage}% - ${message}`); }); return { From f093f52792171f9aeaa22083d8a69194e27db13e Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 17 Apr 2025 06:39:48 +0000 Subject: [PATCH 083/149] release: v4.7.27 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 6b74d1d9..d9d33474 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.26", + "version": "4.7.27", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 05b574d7..a8da3639 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.26", + "version": "4.7.27", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index e42fd5da..070a165f 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.26'; +export const napCatVersion = '4.7.27'; From 623188d8841a19a588b044982b9c4c89ca1169c4 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: Thu, 17 Apr 2025 17:07:09 +0800 Subject: [PATCH 084/149] feat: 34362 --- src/core/external/appid.json | 4 ++++ src/core/external/offset.json | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/core/external/appid.json b/src/core/external/appid.json index 7cb91704..1f7fe887 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -242,5 +242,9 @@ "3.2.17-34231": { "appid": 537279245, "qua": "V1_LNX_NQ_3.2.17_34231_GW_B" + }, + "9.9.19-34362": { + "appid": 537279260, + "qua": "V1_WIN_NQ_9.9.19_34362_GW_B" } } \ No newline at end of file diff --git a/src/core/external/offset.json b/src/core/external/offset.json index aef27d77..ecaa332f 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -326,5 +326,9 @@ "3.2.17-34231-arm64": { "send": "770CDC0", "recv": "77106F0" + }, + "9.9.19-34362-x64":{ + "send": "3BD80D0", + "recv": "3BDC8D0" } } \ No newline at end of file From d3a34dfdf98100a6833099cebdaabbfa56d35ee6 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: Thu, 17 Apr 2025 17:48:13 +0800 Subject: [PATCH 085/149] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BA=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/napcat.ts | 2 ++ src/shell/base.ts | 12 +++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/framework/napcat.ts b/src/framework/napcat.ts index fb5e2bfc..6b571925 100644 --- a/src/framework/napcat.ts +++ b/src/framework/napcat.ts @@ -42,6 +42,8 @@ export async function NCoreInitFramework( if (!isExist && path) { FFmpegService.setFfmpegPath(path); } + }).catch(e => { + logger.logError('[Ffmpeg] Error:', e); }); //直到登录成功后,执行下一步 const selfInfo = await new Promise((resolveSelfInfo) => { diff --git a/src/shell/base.ts b/src/shell/base.ts index 927639b5..98d3077a 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -222,7 +222,7 @@ async function handleLoginInner(context: { isLogined: boolean }, logger: LogWrap logger.log(`可用于快速登录的 QQ:\n${historyLoginList .map((u, index) => `${index + 1}. ${u.uin} ${u.nickName}`) .join('\n') - }`); + }`); } loginService.getQRCodePicture(); try { @@ -314,10 +314,12 @@ export async function NCoreInitShell() { const logger = new LogWrapper(pathWrapper.logsPath); handleUncaughtExceptions(logger); downloadFFmpegIfNotExists(logger).then(({ path, isExist }) => { - if (!isExist && path) { - FFmpegService.setFfmpegPath(path); - } -}); + if (!isExist && path) { + FFmpegService.setFfmpegPath(path); + } + }).catch(e => { + logger.logError('[Ffmpeg] Error:', e); + }); const basicInfoWrapper = new QQBasicInfoWrapper({ logger }); const wrapper = loadQQWrapper(basicInfoWrapper.getFullQQVesion()); From eca73eae18a372d90f7d1e9728db27343de32a56 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 17 Apr 2025 09:49:05 +0000 Subject: [PATCH 086/149] release: v4.7.28 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index d9d33474..d2f11834 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.27", + "version": "4.7.28", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index a8da3639..bedf8f1e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.27", + "version": "4.7.28", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 070a165f..f48f78c2 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.27'; +export const napCatVersion = '4.7.28'; From d49e69735ab6e50e2cc5f14b98e91c00300b5168 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: Thu, 17 Apr 2025 17:59:06 +0800 Subject: [PATCH 087/149] =?UTF-8?q?fix:=20=E8=87=AA=E5=8A=A8=E5=8C=96?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=E7=9A=84?= =?UTF-8?q?ffmpeg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/download-ffmpeg.ts | 52 ++++++++++++++++++++++++++++++++--- src/common/ffmpeg.ts | 9 +++--- src/framework/napcat.ts | 6 ++-- src/shell/base.ts | 6 ++-- 4 files changed, 58 insertions(+), 15 deletions(-) diff --git a/src/common/download-ffmpeg.ts b/src/common/download-ffmpeg.ts index cba7e8be..1eb6dd27 100644 --- a/src/common/download-ffmpeg.ts +++ b/src/common/download-ffmpeg.ts @@ -281,28 +281,72 @@ export async function downloadFFmpeg( return null; } } + +/** + * 检查系统PATH环境变量中是否存在指定可执行文件 + * @param executable 可执行文件名 + * @returns 如果找到返回完整路径,否则返回null + */ +function findExecutableInPath(executable: string): string | null { + // 仅适用于Windows系统 + if (os.platform() !== 'win32') return null; + + // 获取PATH环境变量 + const pathEnv = process.env['PATH'] || ''; + const pathDirs = pathEnv.split(';'); + + // 检查每个目录 + for (const dir of pathDirs) { + if (!dir) continue; + try { + const filePath = path.join(dir, executable); + if (fs.existsSync(filePath)) { + return filePath; + } + } catch (error) { + continue; + } + } + + return null; +} + export async function downloadFFmpegIfNotExists(log: LogWrapper) { // 仅限Windows if (os.platform() !== 'win32') { return { path: null, - isExist: false + reset: false }; } + const ffmpegInPath = findExecutableInPath('ffmpeg.exe'); + const ffprobeInPath = findExecutableInPath('ffprobe.exe'); + + if (ffmpegInPath && ffprobeInPath) { + const ffmpegDir = path.dirname(ffmpegInPath); + return { + path: ffmpegDir, + reset: true + }; + } + + // 如果环境变量中没有,检查项目目录中是否存在 const currentPath = path.dirname(fileURLToPath(import.meta.url)); const ffmpeg_exist = fs.existsSync(path.join(currentPath, 'ffmpeg', 'ffmpeg.exe')); const ffprobe_exist = fs.existsSync(path.join(currentPath, 'ffmpeg', 'ffprobe.exe')); + if (!ffmpeg_exist || !ffprobe_exist) { await downloadFFmpeg(path.join(currentPath, 'ffmpeg'), path.join(currentPath, 'cache'), (percentage: number, message: string) => { - log.log(`[Ffmpeg] [Download] ${percentage}% - ${message}`); + log.log(`[FFmpeg] [Download] ${percentage}% - ${message}`); }); return { path: path.join(currentPath, 'ffmpeg'), - isExist: false + reset: true } } + return { path: path.join(currentPath, 'ffmpeg'), - isExist: true + reset: true } } \ No newline at end of file diff --git a/src/common/ffmpeg.ts b/src/common/ffmpeg.ts index ffb285d5..40385d23 100644 --- a/src/common/ffmpeg.ts +++ b/src/common/ffmpeg.ts @@ -7,6 +7,7 @@ import { fileTypeFromFile } from 'file-type'; import imageSize from 'image-size'; import { fileURLToPath } from 'node:url'; import { platform } from 'node:os'; +import { LogWrapper } from './log'; const currentPath = dirname(fileURLToPath(import.meta.url)); const execFileAsync = promisify(execFile); const getFFmpegPath = (tool: string): string => { @@ -19,16 +20,14 @@ const getFFmpegPath = (tool: string): string => { }; export let FFMPEG_CMD = getFFmpegPath('ffmpeg'); export let FFPROBE_CMD = getFFmpegPath('ffprobe'); -console.log('[Info] ffmpeg:', FFMPEG_CMD); -console.log('[Info] ffprobe:', FFPROBE_CMD); export class FFmpegService { // 确保目标目录存在 - public static setFfmpegPath(ffmpegPath: string): void { + public static setFfmpegPath(ffmpegPath: string,logger:LogWrapper): void { if (platform() === 'win32') { FFMPEG_CMD = path.join(ffmpegPath, 'ffmpeg.exe'); FFPROBE_CMD = path.join(ffmpegPath, 'ffprobe.exe'); - console.log('[Info] ffmpeg:', FFMPEG_CMD); - console.log('[Info] ffprobe:', FFPROBE_CMD); + logger.log('[Check] ffmpeg:', FFMPEG_CMD); + logger.log('[Check] ffprobe:', FFPROBE_CMD); } } private static ensureDirExists(filePath: string): void { diff --git a/src/framework/napcat.ts b/src/framework/napcat.ts index 6b571925..9f19cecf 100644 --- a/src/framework/napcat.ts +++ b/src/framework/napcat.ts @@ -38,9 +38,9 @@ export async function NCoreInitFramework( const logger = new LogWrapper(pathWrapper.logsPath); const basicInfoWrapper = new QQBasicInfoWrapper({ logger }); const wrapper = loadQQWrapper(basicInfoWrapper.getFullQQVesion()); - downloadFFmpegIfNotExists(logger).then(({ path, isExist }) => { - if (!isExist && path) { - FFmpegService.setFfmpegPath(path); + downloadFFmpegIfNotExists(logger).then(({ path, reset }) => { + if (reset && path) { + FFmpegService.setFfmpegPath(path,logger); } }).catch(e => { logger.logError('[Ffmpeg] Error:', e); diff --git a/src/shell/base.ts b/src/shell/base.ts index 98d3077a..9dbd3c74 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -313,9 +313,9 @@ export async function NCoreInitShell() { const pathWrapper = new NapCatPathWrapper(); const logger = new LogWrapper(pathWrapper.logsPath); handleUncaughtExceptions(logger); - downloadFFmpegIfNotExists(logger).then(({ path, isExist }) => { - if (!isExist && path) { - FFmpegService.setFfmpegPath(path); + downloadFFmpegIfNotExists(logger).then(({ path, reset }) => { + if (reset && path) { + FFmpegService.setFfmpegPath(path,logger); } }).catch(e => { logger.logError('[Ffmpeg] Error:', e); From a6f22167fff87a8ad608e34d5b55097d186c1bd5 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 17 Apr 2025 09:59:29 +0000 Subject: [PATCH 088/149] release: v4.7.29 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index d2f11834..bf092aa2 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.28", + "version": "4.7.29", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index bedf8f1e..12ec905d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.28", + "version": "4.7.29", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index f48f78c2..517497c7 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.28'; +export const napCatVersion = '4.7.29'; From 7c113d6e04a041cee7af85cca5a8946101ab8dd0 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: Thu, 17 Apr 2025 18:07:07 +0800 Subject: [PATCH 089/149] =?UTF-8?q?fix:=20=E4=B8=80=E4=BA=9B=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shell/base.ts | 5 +-- src/shell/napcat.ts | 34 --------------------- src/shell/pipe.ts | 74 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 36 deletions(-) create mode 100644 src/shell/pipe.ts diff --git a/src/shell/base.ts b/src/shell/base.ts index 9dbd3c74..a8e53b34 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -33,7 +33,7 @@ import { NodeIO3MiscListener } from '@/core/listeners/NodeIO3MiscListener'; import { sleep } from '@/common/helper'; import { downloadFFmpegIfNotExists } from '@/common/download-ffmpeg'; import { FFmpegService } from '@/common/ffmpeg'; - +import { connectToNamedPipe } from '@/shell/pipe'; // NapCat Shell App ES 入口文件 async function handleUncaughtExceptions(logger: LogWrapper) { process.on('uncaughtException', (err) => { @@ -313,9 +313,10 @@ export async function NCoreInitShell() { const pathWrapper = new NapCatPathWrapper(); const logger = new LogWrapper(pathWrapper.logsPath); handleUncaughtExceptions(logger); + await connectToNamedPipe(logger).catch(e => logger.logError('命名管道连接失败', e)); downloadFFmpegIfNotExists(logger).then(({ path, reset }) => { if (reset && path) { - FFmpegService.setFfmpegPath(path,logger); + FFmpegService.setFfmpegPath(path, logger); } }).catch(e => { logger.logError('[Ffmpeg] Error:', e); diff --git a/src/shell/napcat.ts b/src/shell/napcat.ts index c3f9bbe8..7b300cb0 100644 --- a/src/shell/napcat.ts +++ b/src/shell/napcat.ts @@ -1,36 +1,2 @@ import { NCoreInitShell } from './base'; -import * as net from 'net'; -import * as process from 'process'; -if (process.platform === 'win32') { - const pid = process.pid; - const pipePath = `\\\\.\\pipe\\NapCat_${pid}`; - try { - const pipeSocket = net.connect(pipePath, () => { - console.log(`已连接到命名管道: ${pipePath}`); - process.stdout.write = ( - chunk: any, - encoding?: BufferEncoding | (() => void), - cb?: () => void - ): boolean => { - if (typeof encoding === 'function') { - cb = encoding; - encoding = undefined; - } - return pipeSocket.write(chunk, encoding as BufferEncoding, cb); - }; - console.log(`stdout 已重定向到命名管道: ${pipePath}`); - }); - - pipeSocket.on('error', (err) => { - console.log(`连接命名管道 ${pipePath} 时出错:`, err); - }); - - pipeSocket.on('end', () => { - console.log('命名管道连接已关闭'); - }); - - } catch (error) { - console.log(`尝试连接命名管道 ${pipePath} 时发生异常:`, error); - } -} NCoreInitShell(); \ No newline at end of file diff --git a/src/shell/pipe.ts b/src/shell/pipe.ts new file mode 100644 index 00000000..bde201cd --- /dev/null +++ b/src/shell/pipe.ts @@ -0,0 +1,74 @@ +import { LogWrapper } from '@/common/log'; +import * as net from 'net'; +import * as process from 'process'; + +/** + * 连接到命名管道并重定向stdout + * @param logger 日志记录器 + * @param timeoutMs 连接超时时间(毫秒),默认5000ms + * @returns Promise,连接成功时resolve,失败时reject + */ +export function connectToNamedPipe(logger: LogWrapper, timeoutMs: number = 5000): Promise<{ disconnect: () => void }> { + return new Promise((resolve, reject) => { + if (process.platform !== 'win32') { + logger.log('只有Windows平台支持命名管道'); + // 非Windows平台不reject,而是返回一个空的disconnect函数 + return resolve({ disconnect: () => { } }); + } + + const pid = process.pid; + const pipePath = `\\\\.\\pipe\\NapCat_${pid}`; + + // 设置连接超时 + const timeoutId = setTimeout(() => { + reject(new Error(`连接命名管道超时: ${pipePath}`)); + }, timeoutMs); + + try { + let originalStdoutWrite = process.stdout.write.bind(process.stdout); + const pipeSocket = net.connect(pipePath, () => { + // 清除超时 + clearTimeout(timeoutId); + + logger.log(`[StdOut] 已重定向到命名管道: ${pipePath}`); + process.stdout.write = ( + chunk: any, + encoding?: BufferEncoding | (() => void), + cb?: () => void + ): boolean => { + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + return pipeSocket.write(chunk, encoding as BufferEncoding, cb); + }; + // 提供断开连接的方法 + const disconnect = () => { + process.stdout.write = originalStdoutWrite; + pipeSocket.end(); + logger.log(`已手动断开命名管道连接: ${pipePath}`); + }; + + // 返回成功和断开连接的方法 + resolve({ disconnect }); + }); + + pipeSocket.on('error', (err) => { + clearTimeout(timeoutId); + process.stdout.write = originalStdoutWrite; + logger.log(`连接命名管道 ${pipePath} 时出错:`, err); + reject(err); + }); + + pipeSocket.on('end', () => { + process.stdout.write = originalStdoutWrite; + logger.log('命名管道连接已关闭'); + }); + + } catch (error) { + clearTimeout(timeoutId); + logger.log(`尝试连接命名管道 ${pipePath} 时发生异常:`, error); + reject(error); + } + }); +} \ No newline at end of file From 9df7c341a937b269300d60a7f0756d2cb0fec005 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 17 Apr 2025 10:07:28 +0000 Subject: [PATCH 090/149] release: v4.7.30 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index bf092aa2..c928212c 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.29", + "version": "4.7.30", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 12ec905d..e5a71834 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.29", + "version": "4.7.30", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 517497c7..cf5491d6 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.29'; +export const napCatVersion = '4.7.30'; From fb20b2e16c8ff704efd8e837506a20e22e3611b5 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: Thu, 17 Apr 2025 22:17:35 +0800 Subject: [PATCH 091/149] fix: coerce --- src/common/coerce.ts | 18 +++++++++++--- src/onebot/action/OneBotAction.ts | 24 +++++++++---------- src/onebot/action/go-cqhttp/SendForwardMsg.ts | 9 ++----- src/onebot/action/group/SendGroupMsg.ts | 7 +++--- src/onebot/action/msg/SendMsg.ts | 4 ++-- src/onebot/action/msg/SendPrivateMsg.ts | 9 ++++--- src/onebot/action/packet/GetPacketStatus.ts | 4 ++-- 7 files changed, 40 insertions(+), 35 deletions(-) diff --git a/src/common/coerce.ts b/src/common/coerce.ts index e9c6cd35..bc1c5b6f 100644 --- a/src/common/coerce.ts +++ b/src/common/coerce.ts @@ -1,14 +1,26 @@ import { z } from 'zod'; + const boolean = () => z.preprocess( - val => typeof val === 'string' && (val.toLowerCase() === 'false' || val === '0') ? false : Boolean(val), + val => val === null || val === undefined + ? val + : typeof val === 'string' && (val.toLowerCase() === 'false' || val === '0') + ? false + : Boolean(val), z.boolean() ); + const number = () => z.preprocess( - val => typeof val !== 'number' ? Number(val) : val, + val => val === null || val === undefined + ? val + : typeof val !== 'number' ? Number(val) : val, z.number() ); + const string = () => z.preprocess( - val => typeof val !== 'string' ? String(val) : val, + val => val === null || val === undefined + ? val + : typeof val !== 'string' ? String(val) : val, z.string() ); + export const coerce = { boolean, number, string }; \ No newline at end of file diff --git a/src/onebot/action/OneBotAction.ts b/src/onebot/action/OneBotAction.ts index 240ea5e8..93142d40 100644 --- a/src/onebot/action/OneBotAction.ts +++ b/src/onebot/action/OneBotAction.ts @@ -32,7 +32,7 @@ export class OB11Response { export abstract class OneBotAction { actionName: typeof ActionName[keyof typeof ActionName] = ActionName.Unknown; core: NapCatCore; - payloadSchema?: z.ZodType = undefined; + payloadSchema?: z.ZodType = undefined; obContext: NapCatOneBot11Adapter; constructor(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -40,15 +40,15 @@ export abstract class OneBotAction { this.core = core; } - protected async check(payload: unknown): Promise { + protected async check(payload: unknown): Promise { if (!this.payloadSchema) { - return { valid: true }; + return { valid: true, parsedPayload: payload as PayloadType }; } try { - // 使用 zod 验证并转换数据 - this.payloadSchema.parse(payload); - return { valid: true }; + // 使用 zod 验证并转换数据,并返回解析后的数据 + const parsedPayload = this.payloadSchema.parse(payload) as PayloadType; + return { valid: true, parsedPayload }; } catch (error) { if (error instanceof z.ZodError) { const errorMessages = error.errors.map(e => @@ -66,13 +66,13 @@ export abstract class OneBotAction { } } - public async handle(payload: PayloadType, adaptername: string, config: NetworkAdapterConfig): Promise> { + public async handle(payload: unknown, adaptername: string, config: NetworkAdapterConfig): Promise> { const result = await this.check(payload); if (!result.valid) { - return OB11Response.error(result.message, 400); + return OB11Response.error(result.message!, 400); } try { - const resData = await this._handle(payload, adaptername, config); + const resData = await this._handle(result.parsedPayload as PayloadType, adaptername, config); return OB11Response.ok(resData); } catch (e: unknown) { this.core.context.logger.logError('发生错误', e); @@ -80,13 +80,13 @@ export abstract class OneBotAction { } } - public async websocketHandle(payload: PayloadType, echo: unknown, adaptername: string, config: NetworkAdapterConfig): Promise> { + public async websocketHandle(payload: unknown, echo: unknown, adaptername: string, config: NetworkAdapterConfig): Promise> { const result = await this.check(payload); if (!result.valid) { - return OB11Response.error(result.message, 1400, echo); + return OB11Response.error(result.message!, 1400, echo); } try { - const resData = await this._handle(payload, adaptername, config); + const resData = await this._handle(result.parsedPayload as PayloadType, adaptername, config); return OB11Response.ok(resData, echo); } catch (e: unknown) { this.core.context.logger.logError('发生错误', e); diff --git a/src/onebot/action/go-cqhttp/SendForwardMsg.ts b/src/onebot/action/go-cqhttp/SendForwardMsg.ts index 304d6fe3..c4579746 100644 --- a/src/onebot/action/go-cqhttp/SendForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/SendForwardMsg.ts @@ -4,18 +4,13 @@ import { ActionName } from '@/onebot/action/router'; // 未验证 export class GoCQHTTPSendForwardMsgBase extends SendMsgBase { - protected override async check(payload: OB11PostSendMsg) { + override async _handle(payload: OB11PostSendMsg) { if (payload.messages) payload.message = normalize(payload.messages); - return super.check(payload); + return super._handle(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); - return super.check(payload); - } } export class GoCQHTTPSendPrivateForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendPrivateForwardMsg; diff --git a/src/onebot/action/group/SendGroupMsg.ts b/src/onebot/action/group/SendGroupMsg.ts index e401abb5..bfc5e368 100644 --- a/src/onebot/action/group/SendGroupMsg.ts +++ b/src/onebot/action/group/SendGroupMsg.ts @@ -1,16 +1,15 @@ import { ContextMode, SendMsgBase } from '@/onebot/action/msg/SendMsg'; -import { ActionName, BaseCheckResult } from '@/onebot/action/router'; +import { ActionName } from '@/onebot/action/router'; import { OB11PostSendMsg } from '@/onebot/types'; // 未检测参数 class SendGroupMsg extends SendMsgBase { override actionName = ActionName.SendGroupMsg; override contextMode: ContextMode = ContextMode.Group; - - protected override async check(payload: OB11PostSendMsg): Promise { + override async _handle(payload: OB11PostSendMsg) { delete payload.user_id; payload.message_type = 'group'; - return super.check(payload); + return super._handle(payload); } } diff --git a/src/onebot/action/msg/SendMsg.ts b/src/onebot/action/msg/SendMsg.ts index 26a93ad2..c004ac59 100644 --- a/src/onebot/action/msg/SendMsg.ts +++ b/src/onebot/action/msg/SendMsg.ts @@ -91,7 +91,7 @@ function getSpecialMsgNum(payload: OB11PostSendMsg, msgType: OB11MessageDataType export class SendMsgBase extends OneBotAction { contextMode = ContextMode.Normal; - protected override async check(payload: OB11PostSendMsg): Promise { + protected override async check(payload: OB11PostSendMsg): Promise { const messages = normalize(payload.message); const nodeElementLength = getSpecialMsgNum(payload, OB11MessageDataType.node); if (nodeElementLength > 0 && nodeElementLength != messages.length) { @@ -100,7 +100,7 @@ export class SendMsgBase extends OneBotAction { message: '转发消息不能和普通消息混在一起发送,转发需要保证message只有type为node的元素', }; } - return { valid: true }; + return { valid: true , parsedPayload: payload }; } async _handle(payload: OB11PostSendMsg): Promise { diff --git a/src/onebot/action/msg/SendPrivateMsg.ts b/src/onebot/action/msg/SendPrivateMsg.ts index cb268f0d..aea7e120 100644 --- a/src/onebot/action/msg/SendPrivateMsg.ts +++ b/src/onebot/action/msg/SendPrivateMsg.ts @@ -1,15 +1,14 @@ import { ContextMode, SendMsgBase } from './SendMsg'; -import { ActionName, BaseCheckResult } from '@/onebot/action/router'; +import { ActionName } from '@/onebot/action/router'; import { OB11PostSendMsg } from '@/onebot/types'; // 未检测参数 class SendPrivateMsg extends SendMsgBase { override actionName = ActionName.SendPrivateMsg; override contextMode: ContextMode = ContextMode.Private; - - protected override async check(payload: OB11PostSendMsg): Promise { - payload.message_type = 'private'; - return super.check(payload); + override async _handle(payload: OB11PostSendMsg) { + if (payload.messages) payload.message = payload.messages; + return super._handle(payload); } } diff --git a/src/onebot/action/packet/GetPacketStatus.ts b/src/onebot/action/packet/GetPacketStatus.ts index 2630163b..ba649ce4 100644 --- a/src/onebot/action/packet/GetPacketStatus.ts +++ b/src/onebot/action/packet/GetPacketStatus.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; -import { ActionName, BaseCheckResult } from '@/onebot/action/router'; +import { ActionName } from '@/onebot/action/router'; export abstract class GetPacketStatusDepends extends OneBotAction { - protected override async check(payload: PT): Promise{ + protected override async check(payload: PT) { if (!this.core.apis.PacketApi.available) { return { valid: false, From b7da31644753165664e575a5e2ea7df66160450e Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 17 Apr 2025 14:17:57 +0000 Subject: [PATCH 092/149] release: v4.7.31 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index c928212c..7f133dbf 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.30", + "version": "4.7.31", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index e5a71834..7ea77cc1 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.30", + "version": "4.7.31", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index cf5491d6..64586862 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.30'; +export const napCatVersion = '4.7.31'; From c453b82e9fb6a2600f502015f8a73c49a67238a6 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: Fri, 18 Apr 2025 12:12:18 +0800 Subject: [PATCH 093/149] feat: #954 --- src/onebot/action/index.ts | 2 ++ src/onebot/action/router.ts | 2 +- src/onebot/action/system/CleanCache.ts | 38 ++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/onebot/action/system/CleanCache.ts diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index b2d8ef9b..cbc14a2f 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -114,6 +114,7 @@ import { TransGroupFile } from './extends/TransGroupFile'; import { RenameGroupFile } from './extends/RenameGroupFile'; import { GetRkeyServer } from './packet/GetRkeyServer'; import { GetRkeyEx } from './packet/GetRkeyEx'; +import { CleanCache } from './system/CleanCache'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -241,6 +242,7 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new ClickInlineKeyboardButton(obContext, core), new GetPrivateFileUrl(obContext, core), new GetUnidirectionalFriendList(obContext, core), + new CleanCache(obContext, core), ]; type HandlerUnion = typeof actionHandlers[number]; diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index d25723eb..711edef6 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -54,7 +54,7 @@ export const ActionName = { GetStatus: 'get_status', GetVersionInfo: 'get_version_info', // Reboot : 'set_restart', - // CleanCache : 'clean_cache', + CleanCache : 'clean_cache', Exit: 'bot_exit', // go-cqhttp SetQQProfile: 'set_qq_profile', diff --git a/src/onebot/action/system/CleanCache.ts b/src/onebot/action/system/CleanCache.ts new file mode 100644 index 00000000..d583c736 --- /dev/null +++ b/src/onebot/action/system/CleanCache.ts @@ -0,0 +1,38 @@ +import { OneBotAction } from '@/onebot/action/OneBotAction'; +import { ActionName } from '@/onebot/action/router'; +import { unlink, readdir } from 'fs/promises'; +import { join } from 'path'; + +export class CleanCache extends OneBotAction { + override actionName = ActionName.CleanCache; + + async _handle() { + try { + // 获取临时文件夹路径 + const tempPath = this.core.NapCatTempPath; + + // 读取文件夹中的所有文件 + const files = await readdir(tempPath); + + // 删除每个文件 + const deletePromises = files.map(async (file) => { + const filePath = join(tempPath, file); + try { + await unlink(filePath); + this.core.context.logger.log(`已删除文件: ${filePath}`); + } catch (err: unknown) { + this.core.context.logger.log(`删除文件 ${filePath} 失败: ${(err as Error).message}`); + + } + }); + + // 等待所有删除操作完成 + await Promise.all(deletePromises); + + this.core.context.logger.log(`临时文件夹清理完成: ${tempPath}`); + } catch (err: unknown) { + this.core.context.logger.log(`清理缓存失败: ${(err as Error).message}`); + throw err; + } + } +} \ No newline at end of file From 6f83d013219a9661446b7cec5541cc30cafa49ff 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: Fri, 18 Apr 2025 18:19:12 +0800 Subject: [PATCH 094/149] feat: 34362 --- src/core/external/appid.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/external/appid.json b/src/core/external/appid.json index 1f7fe887..7eb148ef 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -246,5 +246,9 @@ "9.9.19-34362": { "appid": 537279260, "qua": "V1_WIN_NQ_9.9.19_34362_GW_B" + }, + "3.2.17-34362": { + "appid": 537279296, + "qua": "V1_LNX_NQ_3.2.17_34362_GW_B" } } \ No newline at end of file From a5455e27d104abd5c7065ff85c9658bb584fa484 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: Sat, 19 Apr 2025 09:44:00 +0800 Subject: [PATCH 095/149] feat: 34467 --- src/core/external/appid.json | 8 ++++++++ src/core/external/offset.json | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/core/external/appid.json b/src/core/external/appid.json index 7eb148ef..ab779947 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -250,5 +250,13 @@ "3.2.17-34362": { "appid": 537279296, "qua": "V1_LNX_NQ_3.2.17_34362_GW_B" + }, + "9.9.19-34467": { + "appid": 537282256, + "qua": "V1_WIN_NQ_9.9.19_34467_GW_B" + }, + "3.2.17-34467": { + "appid": 537282292, + "qua": "V1_LNX_NQ_3.2.17_34467_GW_B" } } \ No newline at end of file diff --git a/src/core/external/offset.json b/src/core/external/offset.json index ecaa332f..78818c47 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -330,5 +330,9 @@ "9.9.19-34362-x64":{ "send": "3BD80D0", "recv": "3BDC8D0" + }, + "9.9.19-34467-x64": { + "send": "3BD8690", + "recv": "3BDCE90" } } \ No newline at end of file From ceea50b116cc9eeb8a23556a0cb5bd4d83935e99 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: Sat, 19 Apr 2025 10:53:29 +0800 Subject: [PATCH 096/149] Revert "fix: coerce" This reverts commit fb20b2e16c8ff704efd8e837506a20e22e3611b5. --- src/common/coerce.ts | 18 +++----------- src/onebot/action/OneBotAction.ts | 24 +++++++++---------- src/onebot/action/go-cqhttp/SendForwardMsg.ts | 9 +++++-- src/onebot/action/group/SendGroupMsg.ts | 7 +++--- src/onebot/action/msg/SendMsg.ts | 4 ++-- src/onebot/action/msg/SendPrivateMsg.ts | 9 +++---- src/onebot/action/packet/GetPacketStatus.ts | 4 ++-- 7 files changed, 35 insertions(+), 40 deletions(-) diff --git a/src/common/coerce.ts b/src/common/coerce.ts index bc1c5b6f..e9c6cd35 100644 --- a/src/common/coerce.ts +++ b/src/common/coerce.ts @@ -1,26 +1,14 @@ import { z } from 'zod'; - const boolean = () => z.preprocess( - val => val === null || val === undefined - ? val - : typeof val === 'string' && (val.toLowerCase() === 'false' || val === '0') - ? false - : Boolean(val), + val => typeof val === 'string' && (val.toLowerCase() === 'false' || val === '0') ? false : Boolean(val), z.boolean() ); - const number = () => z.preprocess( - val => val === null || val === undefined - ? val - : typeof val !== 'number' ? Number(val) : val, + val => typeof val !== 'number' ? Number(val) : val, z.number() ); - const string = () => z.preprocess( - val => val === null || val === undefined - ? val - : typeof val !== 'string' ? String(val) : val, + val => typeof val !== 'string' ? String(val) : val, z.string() ); - export const coerce = { boolean, number, string }; \ No newline at end of file diff --git a/src/onebot/action/OneBotAction.ts b/src/onebot/action/OneBotAction.ts index 93142d40..240ea5e8 100644 --- a/src/onebot/action/OneBotAction.ts +++ b/src/onebot/action/OneBotAction.ts @@ -32,7 +32,7 @@ export class OB11Response { export abstract class OneBotAction { actionName: typeof ActionName[keyof typeof ActionName] = ActionName.Unknown; core: NapCatCore; - payloadSchema?: z.ZodType = undefined; + payloadSchema?: z.ZodType = undefined; obContext: NapCatOneBot11Adapter; constructor(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -40,15 +40,15 @@ export abstract class OneBotAction { this.core = core; } - protected async check(payload: unknown): Promise { + protected async check(payload: unknown): Promise { if (!this.payloadSchema) { - return { valid: true, parsedPayload: payload as PayloadType }; + return { valid: true }; } try { - // 使用 zod 验证并转换数据,并返回解析后的数据 - const parsedPayload = this.payloadSchema.parse(payload) as PayloadType; - return { valid: true, parsedPayload }; + // 使用 zod 验证并转换数据 + this.payloadSchema.parse(payload); + return { valid: true }; } catch (error) { if (error instanceof z.ZodError) { const errorMessages = error.errors.map(e => @@ -66,13 +66,13 @@ export abstract class OneBotAction { } } - public async handle(payload: unknown, adaptername: string, config: NetworkAdapterConfig): Promise> { + public async handle(payload: PayloadType, adaptername: string, config: NetworkAdapterConfig): Promise> { const result = await this.check(payload); if (!result.valid) { - return OB11Response.error(result.message!, 400); + return OB11Response.error(result.message, 400); } try { - const resData = await this._handle(result.parsedPayload as PayloadType, adaptername, config); + const resData = await this._handle(payload, adaptername, config); return OB11Response.ok(resData); } catch (e: unknown) { this.core.context.logger.logError('发生错误', e); @@ -80,13 +80,13 @@ export abstract class OneBotAction { } } - public async websocketHandle(payload: unknown, echo: unknown, adaptername: string, config: NetworkAdapterConfig): Promise> { + public async websocketHandle(payload: PayloadType, echo: unknown, adaptername: string, config: NetworkAdapterConfig): Promise> { const result = await this.check(payload); if (!result.valid) { - return OB11Response.error(result.message!, 1400, echo); + return OB11Response.error(result.message, 1400, echo); } try { - const resData = await this._handle(result.parsedPayload as PayloadType, adaptername, config); + const resData = await this._handle(payload, adaptername, config); return OB11Response.ok(resData, echo); } catch (e: unknown) { this.core.context.logger.logError('发生错误', e); diff --git a/src/onebot/action/go-cqhttp/SendForwardMsg.ts b/src/onebot/action/go-cqhttp/SendForwardMsg.ts index c4579746..304d6fe3 100644 --- a/src/onebot/action/go-cqhttp/SendForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/SendForwardMsg.ts @@ -4,13 +4,18 @@ import { ActionName } from '@/onebot/action/router'; // 未验证 export class GoCQHTTPSendForwardMsgBase extends SendMsgBase { - override async _handle(payload: OB11PostSendMsg) { + protected override async check(payload: OB11PostSendMsg) { if (payload.messages) payload.message = normalize(payload.messages); - return super._handle(payload); + 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); + return super.check(payload); + } } export class GoCQHTTPSendPrivateForwardMsg extends GoCQHTTPSendForwardMsgBase { override actionName = ActionName.GoCQHTTP_SendPrivateForwardMsg; diff --git a/src/onebot/action/group/SendGroupMsg.ts b/src/onebot/action/group/SendGroupMsg.ts index bfc5e368..e401abb5 100644 --- a/src/onebot/action/group/SendGroupMsg.ts +++ b/src/onebot/action/group/SendGroupMsg.ts @@ -1,15 +1,16 @@ import { ContextMode, SendMsgBase } from '@/onebot/action/msg/SendMsg'; -import { ActionName } from '@/onebot/action/router'; +import { ActionName, BaseCheckResult } from '@/onebot/action/router'; import { OB11PostSendMsg } from '@/onebot/types'; // 未检测参数 class SendGroupMsg extends SendMsgBase { override actionName = ActionName.SendGroupMsg; override contextMode: ContextMode = ContextMode.Group; - override async _handle(payload: OB11PostSendMsg) { + + protected override async check(payload: OB11PostSendMsg): Promise { delete payload.user_id; payload.message_type = 'group'; - return super._handle(payload); + return super.check(payload); } } diff --git a/src/onebot/action/msg/SendMsg.ts b/src/onebot/action/msg/SendMsg.ts index c004ac59..26a93ad2 100644 --- a/src/onebot/action/msg/SendMsg.ts +++ b/src/onebot/action/msg/SendMsg.ts @@ -91,7 +91,7 @@ function getSpecialMsgNum(payload: OB11PostSendMsg, msgType: OB11MessageDataType export class SendMsgBase extends OneBotAction { contextMode = ContextMode.Normal; - protected override async check(payload: OB11PostSendMsg): Promise { + protected override async check(payload: OB11PostSendMsg): Promise { const messages = normalize(payload.message); const nodeElementLength = getSpecialMsgNum(payload, OB11MessageDataType.node); if (nodeElementLength > 0 && nodeElementLength != messages.length) { @@ -100,7 +100,7 @@ export class SendMsgBase extends OneBotAction { message: '转发消息不能和普通消息混在一起发送,转发需要保证message只有type为node的元素', }; } - return { valid: true , parsedPayload: payload }; + return { valid: true }; } async _handle(payload: OB11PostSendMsg): Promise { diff --git a/src/onebot/action/msg/SendPrivateMsg.ts b/src/onebot/action/msg/SendPrivateMsg.ts index aea7e120..cb268f0d 100644 --- a/src/onebot/action/msg/SendPrivateMsg.ts +++ b/src/onebot/action/msg/SendPrivateMsg.ts @@ -1,14 +1,15 @@ import { ContextMode, SendMsgBase } from './SendMsg'; -import { ActionName } from '@/onebot/action/router'; +import { ActionName, BaseCheckResult } from '@/onebot/action/router'; import { OB11PostSendMsg } from '@/onebot/types'; // 未检测参数 class SendPrivateMsg extends SendMsgBase { override actionName = ActionName.SendPrivateMsg; override contextMode: ContextMode = ContextMode.Private; - override async _handle(payload: OB11PostSendMsg) { - if (payload.messages) payload.message = payload.messages; - return super._handle(payload); + + protected override async check(payload: OB11PostSendMsg): Promise { + payload.message_type = 'private'; + return super.check(payload); } } diff --git a/src/onebot/action/packet/GetPacketStatus.ts b/src/onebot/action/packet/GetPacketStatus.ts index ba649ce4..2630163b 100644 --- a/src/onebot/action/packet/GetPacketStatus.ts +++ b/src/onebot/action/packet/GetPacketStatus.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; -import { ActionName } from '@/onebot/action/router'; +import { ActionName, BaseCheckResult } from '@/onebot/action/router'; export abstract class GetPacketStatusDepends extends OneBotAction { - protected override async check(payload: PT) { + protected override async check(payload: PT): Promise{ if (!this.core.apis.PacketApi.available) { return { valid: false, From 3ed5f543e25d2e3facae6bf2de886c8be1685782 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: Sat, 19 Apr 2025 10:57:25 +0800 Subject: [PATCH 097/149] Revert "fix" This reverts commit bd3e06520f4ad340de85e65690d4e9bd3de5b72c. --- src/common/coerce.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/coerce.ts b/src/common/coerce.ts index e9c6cd35..6aabd538 100644 --- a/src/common/coerce.ts +++ b/src/common/coerce.ts @@ -1,4 +1,4 @@ -import { z } from 'zod'; +import { z } from "zod"; const boolean = () => z.preprocess( val => typeof val === 'string' && (val.toLowerCase() === 'false' || val === '0') ? false : Boolean(val), z.boolean() From 7b365367f72bf67b5dad271dd14999c3ecee27bc 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: Sat, 19 Apr 2025 10:57:28 +0800 Subject: [PATCH 098/149] Revert "fix" This reverts commit 41dccd98a9e150671391c9089e6e1bfbe47393df. --- src/common/coerce.ts | 2 +- src/core/helper/config.ts | 16 +-- .../extends/ClickInlineKeyboardButton.ts | 12 +- src/onebot/action/extends/CreateCollection.ts | 6 +- src/onebot/action/extends/FetchCustomFace.ts | 4 +- src/onebot/action/extends/FetchEmojiLike.ts | 10 +- src/onebot/action/extends/GetAiCharacters.ts | 6 +- .../action/extends/GetCollectionList.ts | 6 +- src/onebot/action/extends/GetGroupInfoEx.ts | 4 +- src/onebot/action/extends/GetMiniAppArk.ts | 46 ++++---- src/onebot/action/extends/GetProfileLike.ts | 8 +- src/onebot/action/extends/GetUserStatus.ts | 4 +- src/onebot/action/extends/MoveGroupFile.ts | 10 +- src/onebot/action/extends/OCRImage.ts | 4 +- src/onebot/action/extends/RenameGroupFile.ts | 10 +- src/onebot/action/extends/SendPacket.ts | 8 +- .../action/extends/SetDiyOnlineStatus.ts | 8 +- src/onebot/action/extends/SetGroupRemark.ts | 6 +- src/onebot/action/extends/SetGroupSign.ts | 4 +- src/onebot/action/extends/SetInputStatus.ts | 6 +- src/onebot/action/extends/SetLongNick.ts | 4 +- src/onebot/action/extends/SetOnlineStatus.ts | 8 +- src/onebot/action/extends/SetQQAvatar.ts | 4 +- src/onebot/action/extends/SetSpecialTitle.ts | 8 +- src/onebot/action/extends/ShareContact.ts | 10 +- src/onebot/action/extends/TransGroupFile.ts | 6 +- .../action/extends/TranslateEnWordToZn.ts | 4 +- src/onebot/action/file/GetFile.ts | 6 +- src/onebot/action/file/GetGroupFileUrl.ts | 6 +- src/onebot/action/file/GetPrivateFileUrl.ts | 4 +- .../action/go-cqhttp/CreateGroupFileFolder.ts | 6 +- .../action/go-cqhttp/DeleteGroupFile.ts | 6 +- .../action/go-cqhttp/DeleteGroupFileFolder.ts | 8 +- src/onebot/action/go-cqhttp/DownloadFile.ts | 10 +- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 6 +- .../action/go-cqhttp/GetFriendMsgHistory.ts | 10 +- .../action/go-cqhttp/GetGroupAtAllRemain.ts | 4 +- .../go-cqhttp/GetGroupFileSystemInfo.ts | 4 +- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 10 +- .../action/go-cqhttp/GetGroupHonorInfo.ts | 4 +- .../action/go-cqhttp/GetGroupMsgHistory.ts | 10 +- .../action/go-cqhttp/GetGroupRootFiles.ts | 6 +- .../action/go-cqhttp/GetStrangerInfo.ts | 6 +- .../go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 4 +- .../action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 10 +- .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 4 +- .../action/go-cqhttp/SendGroupNotice.ts | 18 +-- .../action/go-cqhttp/SetGroupPortrait.ts | 6 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 8 +- .../action/go-cqhttp/UploadGroupFile.ts | 12 +- .../action/go-cqhttp/UploadPrivateFile.ts | 8 +- src/onebot/action/group/DelEssenceMsg.ts | 4 +- src/onebot/action/group/DelGroupNotice.ts | 6 +- src/onebot/action/group/GetAiRecord.ts | 8 +- src/onebot/action/group/GetGroupEssence.ts | 4 +- src/onebot/action/group/GetGroupInfo.ts | 4 +- src/onebot/action/group/GetGroupList.ts | 4 +- src/onebot/action/group/GetGroupMemberInfo.ts | 8 +- src/onebot/action/group/GetGroupMemberList.ts | 6 +- src/onebot/action/group/GetGroupNotice.ts | 4 +- src/onebot/action/group/GetGroupShutList.ts | 4 +- src/onebot/action/group/GroupPoke.ts | 6 +- src/onebot/action/group/SendGroupAiRecord.ts | 8 +- src/onebot/action/group/SetEssenceMsg.ts | 4 +- src/onebot/action/group/SetGroupAddRequest.ts | 8 +- src/onebot/action/group/SetGroupAdmin.ts | 8 +- src/onebot/action/group/SetGroupBan.ts | 8 +- src/onebot/action/group/SetGroupCard.ts | 8 +- src/onebot/action/group/SetGroupKick.ts | 8 +- src/onebot/action/group/SetGroupLeave.ts | 6 +- src/onebot/action/group/SetGroupName.ts | 6 +- src/onebot/action/group/SetGroupWholeBan.ts | 6 +- src/onebot/action/msg/DeleteMsg.ts | 4 +- src/onebot/action/msg/ForwardSingleMsg.ts | 8 +- src/onebot/action/msg/GetMsg.ts | 4 +- src/onebot/action/msg/MarkMsgAsRead.ts | 8 +- src/onebot/action/msg/SetMsgEmojiLike.ts | 8 +- src/onebot/action/packet/SendPoke.ts | 6 +- src/onebot/action/system/GetCredentials.ts | 4 +- src/onebot/action/user/FriendPoke.ts | 4 +- src/onebot/action/user/GetCookies.ts | 4 +- src/onebot/action/user/GetFriendList.ts | 4 +- src/onebot/action/user/GetRecentContact.ts | 4 +- src/onebot/action/user/SendLike.ts | 6 +- src/onebot/action/user/SetFriendAddRequest.ts | 8 +- src/onebot/config/config.ts | 108 +++++++++--------- src/webui/src/helper/config.ts | 12 +- src/webui/src/types/theme.ts | 6 +- 88 files changed, 363 insertions(+), 363 deletions(-) diff --git a/src/common/coerce.ts b/src/common/coerce.ts index 6aabd538..46eb174d 100644 --- a/src/common/coerce.ts +++ b/src/common/coerce.ts @@ -11,4 +11,4 @@ const string = () => z.preprocess( val => typeof val !== 'string' ? String(val) : val, z.string() ); -export const coerce = { boolean, number, string }; \ No newline at end of file +export const actionType = { boolean, number, string }; \ No newline at end of file diff --git a/src/core/helper/config.ts b/src/core/helper/config.ts index 66721252..ca3d2268 100644 --- a/src/core/helper/config.ts +++ b/src/core/helper/config.ts @@ -1,16 +1,16 @@ import { ConfigBase } from '@/common/config-base'; import { NapCatCore } from '@/core'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; import { z } from 'zod'; export const NapcatConfigSchema = z.object({ - fileLog: coerce.boolean().default(false), - consoleLog: coerce.boolean().default(true), - fileLogLevel: coerce.string().default('debug'), - consoleLogLevel: coerce.string().default('info'), - packetBackend: coerce.string().default('auto'), - packetServer: coerce.string().default(''), - o3HookMode: coerce.number().default(0), + fileLog: actionType.boolean().default(false), + consoleLog: actionType.boolean().default(true), + fileLogLevel: actionType.string().default('debug'), + consoleLogLevel: actionType.string().default('info'), + packetBackend: actionType.string().default('auto'), + packetServer: actionType.string().default(''), + o3HookMode: actionType.number().default(0), }); export type NapcatConfig = z.infer; diff --git a/src/onebot/action/extends/ClickInlineKeyboardButton.ts b/src/onebot/action/extends/ClickInlineKeyboardButton.ts index e7279c51..fba1830c 100644 --- a/src/onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/src/onebot/action/extends/ClickInlineKeyboardButton.ts @@ -1,14 +1,14 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '../OneBotAction'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - bot_appid: coerce.string(), - button_id: coerce.string().default(''), - callback_data: coerce.string().default(''), - msg_seq: coerce.string().default('10086'), + group_id: actionType.string(), + bot_appid: actionType.string(), + button_id: actionType.string().default(''), + callback_data: actionType.string().default(''), + msg_seq: actionType.string().default('10086'), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/CreateCollection.ts b/src/onebot/action/extends/CreateCollection.ts index dd641d1b..0faf8b4e 100644 --- a/src/onebot/action/extends/CreateCollection.ts +++ b/src/onebot/action/extends/CreateCollection.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - rawData: coerce.string(), - brief: coerce.string(), + rawData: actionType.string(), + brief: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchCustomFace.ts b/src/onebot/action/extends/FetchCustomFace.ts index b14d2afa..ee6a535c 100644 --- a/src/onebot/action/extends/FetchCustomFace.ts +++ b/src/onebot/action/extends/FetchCustomFace.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - count: coerce.number().default(48), + count: actionType.number().default(48), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchEmojiLike.ts b/src/onebot/action/extends/FetchEmojiLike.ts index ee383046..c55ce0c4 100644 --- a/src/onebot/action/extends/FetchEmojiLike.ts +++ b/src/onebot/action/extends/FetchEmojiLike.ts @@ -3,12 +3,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { type NTQQMsgApi } from '@/core/apis'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - message_id: coerce.string(), - emojiId: coerce.string(), - emojiType: coerce.string(), - count: coerce.number().default(20), + message_id: actionType.string(), + emojiId: actionType.string(), + emojiType: actionType.string(), + count: actionType.number().default(20), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetAiCharacters.ts b/src/onebot/action/extends/GetAiCharacters.ts index 5eb7fc5b..7e2210bd 100644 --- a/src/onebot/action/extends/GetAiCharacters.ts +++ b/src/onebot/action/extends/GetAiCharacters.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - chat_type: coerce.number().default(1), + group_id: actionType.string(), + chat_type: actionType.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetCollectionList.ts b/src/onebot/action/extends/GetCollectionList.ts index 4c170cff..1cb62961 100644 --- a/src/onebot/action/extends/GetCollectionList.ts +++ b/src/onebot/action/extends/GetCollectionList.ts @@ -2,10 +2,10 @@ import { type NTQQCollectionApi } from '@/core/apis/collection'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - category: coerce.number(), - count: coerce.number().default(1), + category: actionType.number(), + count: actionType.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetGroupInfoEx.ts b/src/onebot/action/extends/GetGroupInfoEx.ts index f0078a41..9ed398bc 100644 --- a/src/onebot/action/extends/GetGroupInfoEx.ts +++ b/src/onebot/action/extends/GetGroupInfoEx.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetMiniAppArk.ts b/src/onebot/action/extends/GetMiniAppArk.ts index d9ea1449..2bd60b0a 100644 --- a/src/onebot/action/extends/GetMiniAppArk.ts +++ b/src/onebot/action/extends/GetMiniAppArk.ts @@ -3,34 +3,34 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { MiniAppInfo, MiniAppInfoHelper } from '@/core/packet/utils/helper/miniAppHelper'; import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from '@/core/packet/entities/miniApp'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.union([ z.object({ type: z.union([z.literal('bili'), z.literal('weibo')]), - title: coerce.string(), - desc: coerce.string(), - picUrl: coerce.string(), - jumpUrl: coerce.string(), - webUrl: coerce.string().optional(), - rawArkData: coerce.string().optional() + title: actionType.string(), + desc: actionType.string(), + picUrl: actionType.string(), + jumpUrl: actionType.string(), + webUrl: actionType.string().optional(), + rawArkData: actionType.string().optional() }), z.object({ - title: coerce.string(), - desc: coerce.string(), - picUrl: coerce.string(), - jumpUrl: coerce.string(), - iconUrl: coerce.string(), - webUrl: coerce.string().optional(), - appId: coerce.string(), - scene: z.union([coerce.number(), coerce.string()]), - templateType: z.union([coerce.number(), coerce.string()]), - businessType: z.union([coerce.number(), coerce.string()]), - verType: z.union([coerce.number(), coerce.string()]), - shareType: z.union([coerce.number(), coerce.string()]), - versionId: coerce.string(), - sdkId: coerce.string(), - withShareTicket: z.union([coerce.number(), coerce.string()]), - rawArkData: coerce.string().optional() + title: actionType.string(), + desc: actionType.string(), + picUrl: actionType.string(), + jumpUrl: actionType.string(), + iconUrl: actionType.string(), + webUrl: actionType.string().optional(), + appId: actionType.string(), + scene: z.union([actionType.number(), actionType.string()]), + templateType: z.union([actionType.number(), actionType.string()]), + businessType: z.union([actionType.number(), actionType.string()]), + verType: z.union([actionType.number(), actionType.string()]), + shareType: z.union([actionType.number(), actionType.string()]), + versionId: actionType.string(), + sdkId: actionType.string(), + withShareTicket: z.union([actionType.number(), actionType.string()]), + rawArkData: actionType.string().optional() }) ]); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index f4cf7400..cefd9e55 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -2,11 +2,11 @@ import { NTVoteInfo } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - user_id: coerce.string().optional(), - start: coerce.number().default(0), - count: coerce.number().default(10), + user_id: actionType.string().optional(), + start: actionType.number().default(0), + count: actionType.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetUserStatus.ts b/src/onebot/action/extends/GetUserStatus.ts index 66aeb609..38ac0007 100644 --- a/src/onebot/action/extends/GetUserStatus.ts +++ b/src/onebot/action/extends/GetUserStatus.ts @@ -1,9 +1,9 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - user_id: coerce.number(), + user_id: actionType.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index bf5c1c48..7e2e6eb4 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -2,12 +2,12 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - file_id: coerce.string(), - current_parent_directory: coerce.string(), - target_parent_directory: coerce.string(), + group_id: actionType.string(), + file_id: actionType.string(), + current_parent_directory: actionType.string(), + target_parent_directory: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/OCRImage.ts b/src/onebot/action/extends/OCRImage.ts index c280a3cc..c08a12b5 100644 --- a/src/onebot/action/extends/OCRImage.ts +++ b/src/onebot/action/extends/OCRImage.ts @@ -4,9 +4,9 @@ import { checkFileExist, uriToLocalFile } from '@/common/file'; import fs from 'fs'; import { z } from 'zod'; import { GeneralCallResultStatus } from '@/core'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - image: coerce.string(), + image: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index 8c6e7964..ff40a66b 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -2,12 +2,12 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - file_id: coerce.string(), - current_parent_directory: coerce.string(), - new_name: coerce.string(), + group_id: actionType.string(), + file_id: actionType.string(), + current_parent_directory: actionType.string(), + new_name: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SendPacket.ts b/src/onebot/action/extends/SendPacket.ts index feeb4d34..27c133ad 100644 --- a/src/onebot/action/extends/SendPacket.ts +++ b/src/onebot/action/extends/SendPacket.ts @@ -2,12 +2,12 @@ import { PacketHexStr } from '@/core/packet/transformer/base'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - cmd: coerce.string(), - data: coerce.string(), - rsp: coerce.boolean().default(true), + cmd: actionType.string(), + data: actionType.string(), + rsp: actionType.boolean().default(true), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index d63895c8..43bffa63 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - face_id: coerce.string(),// 参考 face_config.json 的 QSid - face_type: coerce.string().default('1'), - wording: coerce.string().default(' '), + face_id: actionType.string(),// 参考 face_config.json 的 QSid + face_type: actionType.string().default('1'), + wording: actionType.string().default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupRemark.ts b/src/onebot/action/extends/SetGroupRemark.ts index ab6367ea..d5b7b6a0 100644 --- a/src/onebot/action/extends/SetGroupRemark.ts +++ b/src/onebot/action/extends/SetGroupRemark.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - remark: coerce.string(), + group_id: actionType.string(), + remark: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index 82c62fd5..56fdf534 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -1,9 +1,9 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index affc88df..98f28a94 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -2,10 +2,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { ChatType } from '@/core'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - user_id: coerce.string(), - event_type: coerce.number(), + user_id: actionType.string(), + event_type: actionType.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetLongNick.ts b/src/onebot/action/extends/SetLongNick.ts index 090f0fb4..4b05825b 100644 --- a/src/onebot/action/extends/SetLongNick.ts +++ b/src/onebot/action/extends/SetLongNick.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - longNick: coerce.string(), + longNick: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index 414c16ee..e863b4ae 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - status: coerce.number(), - ext_status: coerce.number(), - battery_status: coerce.number(), + status: actionType.number(), + ext_status: actionType.number(), + battery_status: actionType.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetQQAvatar.ts b/src/onebot/action/extends/SetQQAvatar.ts index 17832c4c..767a5c3b 100644 --- a/src/onebot/action/extends/SetQQAvatar.ts +++ b/src/onebot/action/extends/SetQQAvatar.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import fs from 'node:fs/promises'; import { checkFileExist, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - file: coerce.string(), + file: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index 6dca5fd7..efa4000b 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -1,11 +1,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - user_id: coerce.string(), - special_title: coerce.string().default(''), + group_id: actionType.string(), + user_id: actionType.string(), + special_title: actionType.string().default(''), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index 3a61fdf0..571bbdb7 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -2,11 +2,11 @@ import { GeneralCallResult } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - user_id: coerce.string().optional(), - group_id: coerce.string().optional(), - phoneNumber: coerce.string().default(''), + user_id: actionType.string().optional(), + group_id: actionType.string().optional(), + phoneNumber: actionType.string().default(''), }); type Payload = z.infer; @@ -29,7 +29,7 @@ export class SharePeer extends OneBotAction; diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index 2c801334..bd5045a0 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - file_id: coerce.string(), + group_id: actionType.string(), + file_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index 9c2e064e..ff27a83f 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - words: z.array(coerce.string()), + words: z.array(actionType.string()), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetFile.ts b/src/onebot/action/file/GetFile.ts index 9a6dbe8d..55725be9 100644 --- a/src/onebot/action/file/GetFile.ts +++ b/src/onebot/action/file/GetFile.ts @@ -4,7 +4,7 @@ import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { ActionName } from '@/onebot/action/router'; import { OB11MessageImage, OB11MessageVideo } from '@/onebot/types'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; export interface GetFileResponse { file?: string; // path url?: string; @@ -14,8 +14,8 @@ export interface GetFileResponse { } const GetFileBase_PayloadSchema = z.object({ - file: coerce.string().optional(), - file_id: coerce.string().optional(), + file: actionType.string().optional(), + file_id: actionType.string().optional(), }); diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index df0e66d4..c90103e5 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - file_id: coerce.string(), + group_id: actionType.string(), + file_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts index c830397f..04b9bf1a 100644 --- a/src/onebot/action/file/GetPrivateFileUrl.ts +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -2,9 +2,9 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - file_id: coerce.string(), + file_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 0c9d53c6..91e3e522 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - folder_name: coerce.string(), + group_id: actionType.string(), + folder_name: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index 5e21d1a8..addee6b9 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -4,10 +4,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - file_id: coerce.string(), + group_id: actionType.string(), + file_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index b7f6cf1f..be39f476 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - folder_id: coerce.string().optional(), - folder: coerce.string().optional(), + group_id: actionType.string(), + folder_id: actionType.string().optional(), + folder: actionType.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DownloadFile.ts b/src/onebot/action/go-cqhttp/DownloadFile.ts index 4b0e0b74..d6288661 100644 --- a/src/onebot/action/go-cqhttp/DownloadFile.ts +++ b/src/onebot/action/go-cqhttp/DownloadFile.ts @@ -5,16 +5,16 @@ import { join as joinPath } from 'node:path'; import { calculateFileMD5, uriToLocalFile } from '@/common/file'; import { randomUUID } from 'crypto'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; interface FileResponse { file: string; } const SchemaData = z.object({ - url: coerce.string().optional(), - base64: coerce.string().optional(), - name: coerce.string().optional(), - headers: z.union([coerce.string(), z.array(coerce.string())]).optional(), + url: actionType.string().optional(), + base64: actionType.string().optional(), + name: actionType.string().optional(), + headers: z.union([actionType.string(), z.array(actionType.string())]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index 95eb9eae..d49baefd 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -5,10 +5,10 @@ import { MessageUnique } from '@/common/message-unique'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; import { z } from 'zod'; import { isNumeric } from '@/common/helper'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - message_id: coerce.string().optional(), - id: coerce.string().optional(), + message_id: actionType.string().optional(), + id: actionType.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index 84e1437e..2c0d4ecc 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -5,16 +5,16 @@ import { ChatType } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - user_id: coerce.string(), - message_seq: coerce.string().optional(), - count: coerce.number().default(20), - reverseOrder: coerce.boolean().default(false) + user_id: actionType.string(), + message_seq: actionType.string().optional(), + count: actionType.number().default(20), + reverseOrder: actionType.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 8846266b..6149aa51 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string() + group_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index ac476100..69c1edf4 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string() + group_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index f6854074..93d70073 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -3,12 +3,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - folder_id: coerce.string().optional(), - folder: coerce.string().optional(), - file_count: coerce.number().default(50), + group_id: actionType.string(), + folder_id: actionType.string().optional(), + folder: actionType.string().optional(), + file_count: actionType.number().default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index 0a4c172b..b22c77b8 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -2,9 +2,9 @@ import { WebHonorType } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), + group_id: actionType.string(), type: z.nativeEnum(WebHonorType).optional() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index d0203f84..bde27c1a 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -5,17 +5,17 @@ import { ChatType, Peer } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - group_id: coerce.string(), - message_seq: coerce.string().optional(), - count: coerce.number().default(20), - reverseOrder: coerce.boolean().default(false) + group_id: actionType.string(), + message_seq: actionType.string().optional(), + count: actionType.number().default(20), + reverseOrder: actionType.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index 3e8b4698..613bac17 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -4,10 +4,10 @@ import { ActionName } from '@/onebot/action/router'; import { OB11GroupFile, OB11GroupFileFolder } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - file_count: coerce.number().default(50), + group_id: actionType.string(), + file_count: actionType.number().default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index b0c0c96e..aa628283 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -4,11 +4,11 @@ import { OB11Construct } from '@/onebot/helper/data'; import { ActionName } from '@/onebot/action/router'; import { calcQQLevel } from '@/common/helper'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - user_id: coerce.string(), - no_cache: coerce.boolean().default(false), + user_id: actionType.string(), + no_cache: actionType.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index 29811f4c..997a1630 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - url: coerce.string(), + url: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index 427734dc..079f681f 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - friend_id: coerce.string().optional(), - user_id: coerce.string().optional(), - temp_block: coerce.boolean().optional(), - temp_both_del: coerce.boolean().optional(), + friend_id: actionType.string().optional(), + user_id: actionType.string().optional(), + temp_block: actionType.boolean().optional(), + temp_both_del: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index 15c4069e..bbcce797 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - model: coerce.string(), + model: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SendGroupNotice.ts b/src/onebot/action/go-cqhttp/SendGroupNotice.ts index be63a1ae..e309397c 100644 --- a/src/onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/src/onebot/action/go-cqhttp/SendGroupNotice.ts @@ -3,16 +3,16 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { unlink } from 'node:fs/promises'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - content: coerce.string(), - image: coerce.string().optional(), - pinned: coerce.number().default(0), - type: coerce.number().default(1), - confirm_required: coerce.number().default(1), - is_show_edit_card: coerce.number().default(0), - tip_window_type: coerce.number().default(0), + group_id: actionType.string(), + content: actionType.string(), + image: actionType.string().optional(), + pinned: actionType.number().default(0), + type: actionType.number().default(1), + confirm_required: actionType.number().default(1), + is_show_edit_card: actionType.number().default(0), + tip_window_type: actionType.number().default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index 3d83921e..af178e9b 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -4,10 +4,10 @@ import { checkFileExistV2, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - file: coerce.string(), - group_id: coerce.string() + file: actionType.string(), + group_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index ae458c72..28bffd6a 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -2,11 +2,11 @@ import { NTQQUserApi } from '@/core/apis'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - nickname: coerce.string(), - personal_note: coerce.string().optional(), - sex: coerce.string().optional(), // 传Sex值?建议传0 + nickname: actionType.string(), + personal_note: actionType.string().optional(), + sex: actionType.string().optional(), // 传Sex值?建议传0 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index e253bd09..195df4b9 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -5,13 +5,13 @@ import fs from 'fs'; import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - file: coerce.string(), - name: coerce.string(), - folder: coerce.string().optional(), - folder_id: coerce.string().optional(),//临时扩展 + group_id: actionType.string(), + file: actionType.string(), + name: actionType.string(), + folder: actionType.string().optional(), + folder_id: actionType.string().optional(),//临时扩展 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index 6d1d240f..7de40188 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -6,11 +6,11 @@ import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - user_id: coerce.string(), - file: coerce.string(), - name: coerce.string(), + user_id: actionType.string(), + file: actionType.string(), + name: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index 2cc5957f..846aced1 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -2,9 +2,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - message_id: coerce.string(), + message_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index 2737003f..b012f87d 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - notice_id: coerce.string() + group_id: actionType.string(), + notice_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index a02a6ddc..7e0d002c 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - character: coerce.string(), - group_id: coerce.string(), - text: coerce.string(), + character: actionType.string(), + group_id: actionType.string(), + text: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 4719ea2a..500d7dba 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -5,9 +5,9 @@ import { MessageUnique } from '@/common/message-unique'; import crypto from 'crypto'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index 7325c35f..f427c224 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -3,9 +3,9 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupList.ts b/src/onebot/action/group/GetGroupList.ts index 4710f6d2..648d6cdc 100644 --- a/src/onebot/action/group/GetGroupList.ts +++ b/src/onebot/action/group/GetGroupList.ts @@ -3,10 +3,10 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - no_cache: coerce.boolean().default(false), + no_cache: actionType.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index dc8cc5c1..b1925fd6 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -3,12 +3,12 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - user_id: coerce.string(), - no_cache: coerce.boolean().default(false), + group_id: actionType.string(), + user_id: actionType.string(), + no_cache: actionType.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 54fd3fbb..909392ba 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -4,11 +4,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; import { GroupMember } from '@/core'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - no_cache: coerce.boolean().default(false) + group_id: actionType.string(), + no_cache: actionType.boolean().default(false) }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index d290e65d..86ef5b0c 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -2,7 +2,7 @@ import { WebApiGroupNoticeFeed } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; interface GroupNotice { sender_id: number; publish_time: number; @@ -18,7 +18,7 @@ interface GroupNotice { } const SchemaData = z.object({ - group_id: coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index de927f93..b65bacad 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -2,9 +2,9 @@ import { ShutUpGroupMember } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), + group_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index 8a7ad66f..00c6fff8 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -1,10 +1,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - user_id: coerce.string(), + group_id: actionType.string(), + user_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index c0355a03..454f77be 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - character: coerce.string(), - group_id: coerce.string(), - text: coerce.string(), + character: actionType.string(), + group_id: actionType.string(), + text: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetEssenceMsg.ts b/src/onebot/action/group/SetEssenceMsg.ts index 6200a551..04026cd0 100644 --- a/src/onebot/action/group/SetEssenceMsg.ts +++ b/src/onebot/action/group/SetEssenceMsg.ts @@ -2,9 +2,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - message_id: coerce.string(), + message_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index 747ed0a9..cabe123e 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -2,12 +2,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupRequestOperateTypes } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - flag: coerce.string(), - approve: coerce.boolean().default(true), - reason: coerce.string().nullable().default(' '), + flag: actionType.string(), + approve: actionType.boolean().default(true), + reason: actionType.string().nullable().default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index dbc7e1cc..f690ba9f 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -2,12 +2,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupMemberRole } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - user_id: coerce.string(), - enable: coerce.boolean().default(false), + group_id: actionType.string(), + user_id: actionType.string(), + enable: actionType.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index 0ac71142..c65d461c 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - user_id: coerce.string(), - duration: coerce.number().default(0), + group_id: actionType.string(), + user_id: actionType.string(), + duration: actionType.number().default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index 467e2776..f0e0b53b 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - user_id: coerce.string(), - card: coerce.string().optional(), + group_id: actionType.string(), + user_id: actionType.string(), + card: actionType.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index 66b9cf33..08f6ec50 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - user_id: coerce.string(), - reject_add_request: coerce.boolean().optional(), + group_id: actionType.string(), + user_id: actionType.string(), + reject_add_request: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index 1f6ce77d..4823c6bb 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - is_dismiss: coerce.boolean().optional(), + group_id: actionType.string(), + is_dismiss: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index 54f620f7..bd644049 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -2,10 +2,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - group_name: coerce.string(), + group_id: actionType.string(), + group_name: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index 1d3f5d72..0e6c120c 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string(), - enable: coerce.boolean().optional(), + group_id: actionType.string(), + enable: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index 92456e9e..b1305dcc 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - message_id: coerce.string(), + message_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index 4c4a0ae9..c7e2c245 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -3,11 +3,11 @@ import { ChatType, Peer } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - message_id: coerce.string(), - group_id: coerce.string().optional(), - user_id: coerce.string().optional(), + message_id: actionType.string(), + group_id: actionType.string().optional(), + user_id: actionType.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index ece7efe8..ce287a5e 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -5,11 +5,11 @@ import { MessageUnique } from '@/common/message-unique'; import { RawMessage } from '@/core'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; export type ReturnDataType = OB11Message const SchemaData = z.object({ - message_id: coerce.string(), + message_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index cde1d2fe..52ee09e1 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -3,11 +3,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - user_id: coerce.string().optional(), - group_id: coerce.string().optional(), - message_id: coerce.string().optional(), + user_id: actionType.string().optional(), + group_id: actionType.string().optional(), + message_id: actionType.string().optional(), }); type PlayloadType = z.infer; diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index 42016090..1eb9eed8 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -2,12 +2,12 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - message_id: coerce.string(), - emoji_id: coerce.string(), - set: coerce.boolean().optional(), + message_id: actionType.string(), + emoji_id: actionType.string(), + set: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/packet/SendPoke.ts b/src/onebot/action/packet/SendPoke.ts index 598654c0..438f802f 100644 --- a/src/onebot/action/packet/SendPoke.ts +++ b/src/onebot/action/packet/SendPoke.ts @@ -1,11 +1,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - group_id: coerce.string().optional(), - user_id: coerce.string(), + group_id: actionType.string().optional(), + user_id: actionType.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/system/GetCredentials.ts b/src/onebot/action/system/GetCredentials.ts index c27a7b4c..cb49f0cc 100644 --- a/src/onebot/action/system/GetCredentials.ts +++ b/src/onebot/action/system/GetCredentials.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; interface Response { cookies: string, @@ -9,7 +9,7 @@ interface Response { } const SchemaData = z.object({ - domain: coerce.string() + domain: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index 78a1b796..5b8ba425 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -1,10 +1,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - user_id: coerce.string() + user_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetCookies.ts b/src/onebot/action/user/GetCookies.ts index 9ff0e3bc..da021c33 100644 --- a/src/onebot/action/user/GetCookies.ts +++ b/src/onebot/action/user/GetCookies.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; interface Response { cookies: string, bkn: string } const SchemaData = z.object({ - domain: coerce.string() + domain: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index 16cf57b0..ef85df42 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -3,10 +3,10 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - no_cache: coerce.boolean().optional(), + no_cache: actionType.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetRecentContact.ts b/src/onebot/action/user/GetRecentContact.ts index 8ec364e7..4c817eb3 100644 --- a/src/onebot/action/user/GetRecentContact.ts +++ b/src/onebot/action/user/GetRecentContact.ts @@ -3,10 +3,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { NetworkAdapterConfig } from '@/onebot/config/config'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - count: coerce.number().default(10), + count: actionType.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 66912a9c..7630161a 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - times: coerce.number().default(1), - user_id: coerce.string() + times: actionType.number().default(1), + user_id: actionType.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index 3a44ae8e..f35318d4 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; const SchemaData = z.object({ - flag: coerce.string(), - approve: coerce.boolean().default(true), - remark: coerce.string().nullable().optional() + flag: actionType.string(), + approve: actionType.boolean().default(true), + remark: actionType.string().nullable().optional() }); type Payload = z.infer; diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index 489ce61c..266106b6 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,72 +1,72 @@ import { z } from 'zod'; -import { coerce } from '../../common/coerce'; +import { actionType } from '../../common/coerce'; const HttpServerConfigSchema = z.object({ - name: coerce.string().default('http-server'), - enable: coerce.boolean().default(false), - port: coerce.number().default(3000), - host: coerce.string().default('0.0.0.0'), - enableCors: coerce.boolean().default(true), - enableWebsocket: coerce.boolean().default(true), - messagePostFormat: coerce.string().default('array'), - token: coerce.string().default(''), - debug: coerce.boolean().default(false) + name: actionType.string().default('http-server'), + enable: actionType.boolean().default(false), + port: actionType.number().default(3000), + host: actionType.string().default('0.0.0.0'), + enableCors: actionType.boolean().default(true), + enableWebsocket: actionType.boolean().default(true), + messagePostFormat: actionType.string().default('array'), + token: actionType.string().default(''), + debug: actionType.boolean().default(false) }); const HttpSseServerConfigSchema = z.object({ - name: coerce.string().default('http-sse-server'), - enable: coerce.boolean().default(false), - port: coerce.number().default(3000), - host: coerce.string().default('0.0.0.0'), - enableCors: coerce.boolean().default(true), - enableWebsocket: coerce.boolean().default(true), - messagePostFormat: coerce.string().default('array'), - token: coerce.string().default(''), - debug: coerce.boolean().default(false), - reportSelfMessage: coerce.boolean().default(false) + name: actionType.string().default('http-sse-server'), + enable: actionType.boolean().default(false), + port: actionType.number().default(3000), + host: actionType.string().default('0.0.0.0'), + enableCors: actionType.boolean().default(true), + enableWebsocket: actionType.boolean().default(true), + messagePostFormat: actionType.string().default('array'), + token: actionType.string().default(''), + debug: actionType.boolean().default(false), + reportSelfMessage: actionType.boolean().default(false) }); const HttpClientConfigSchema = z.object({ - name: coerce.string().default('http-client'), - enable: coerce.boolean().default(false), - url: coerce.string().default('http://localhost:8080'), - messagePostFormat: coerce.string().default('array'), - reportSelfMessage: coerce.boolean().default(false), - token: coerce.string().default(''), - debug: coerce.boolean().default(false) + name: actionType.string().default('http-client'), + enable: actionType.boolean().default(false), + url: actionType.string().default('http://localhost:8080'), + messagePostFormat: actionType.string().default('array'), + reportSelfMessage: actionType.boolean().default(false), + token: actionType.string().default(''), + debug: actionType.boolean().default(false) }); const WebsocketServerConfigSchema = z.object({ - name: coerce.string().default('websocket-server'), - enable: coerce.boolean().default(false), - host: coerce.string().default('0.0.0.0'), - port: coerce.number().default(3001), - messagePostFormat: coerce.string().default('array'), - reportSelfMessage: coerce.boolean().default(false), - token: coerce.string().default(''), - enableForcePushEvent: coerce.boolean().default(true), - debug: coerce.boolean().default(false), - heartInterval: coerce.number().default(30000) + name: actionType.string().default('websocket-server'), + enable: actionType.boolean().default(false), + host: actionType.string().default('0.0.0.0'), + port: actionType.number().default(3001), + messagePostFormat: actionType.string().default('array'), + reportSelfMessage: actionType.boolean().default(false), + token: actionType.string().default(''), + enableForcePushEvent: actionType.boolean().default(true), + debug: actionType.boolean().default(false), + heartInterval: actionType.number().default(30000) }); const WebsocketClientConfigSchema = z.object({ - name: coerce.string().default('websocket-client'), - enable: coerce.boolean().default(false), - url: coerce.string().default('ws://localhost:8082'), - messagePostFormat: coerce.string().default('array'), - reportSelfMessage: coerce.boolean().default(false), - reconnectInterval: coerce.number().default(5000), - token: coerce.string().default(''), - debug: coerce.boolean().default(false), - heartInterval: coerce.number().default(30000) + name: actionType.string().default('websocket-client'), + enable: actionType.boolean().default(false), + url: actionType.string().default('ws://localhost:8082'), + messagePostFormat: actionType.string().default('array'), + reportSelfMessage: actionType.boolean().default(false), + reconnectInterval: actionType.number().default(5000), + token: actionType.string().default(''), + debug: actionType.boolean().default(false), + heartInterval: actionType.number().default(30000) }); const PluginConfigSchema = z.object({ - name: coerce.string().default('plugin'), - enable: coerce.boolean().default(false), - messagePostFormat: coerce.string().default('array'), - reportSelfMessage: coerce.boolean().default(false), - debug: coerce.boolean().default(false), + name: actionType.string().default('plugin'), + enable: actionType.boolean().default(false), + messagePostFormat: actionType.string().default('array'), + reportSelfMessage: actionType.boolean().default(false), + debug: actionType.boolean().default(false), }); const NetworkConfigSchema = z.object({ @@ -80,9 +80,9 @@ const NetworkConfigSchema = z.object({ export const OneBotConfigSchema = z.object({ network: NetworkConfigSchema, - musicSignUrl: coerce.string().default(''), - enableLocalFile2Url: coerce.boolean().default(false), - parseMultMsg: coerce.boolean().default(false) + musicSignUrl: actionType.string().default(''), + enableLocalFile2Url: actionType.boolean().default(false), + parseMultMsg: actionType.boolean().default(false) }); export type OneBotConfig = z.infer; diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index dbbdf13a..af8e9c5c 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -4,14 +4,14 @@ import { resolve } from 'node:path'; import { deepMerge } from '../utils/object'; import { themeType } from '../types/theme'; import { z } from 'zod'; -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; // 定义配置的类型 const WebUiConfigSchema = z.object({ - host: coerce.string().default('0.0.0.0'), - port: coerce.number().default(6099), - token: coerce.string().default('napcat'), - loginRate: coerce.number().default(10), - autoLoginAccount: coerce.string().default(''), + host: actionType.string().default('0.0.0.0'), + port: actionType.number().default(6099), + token: actionType.string().default('napcat'), + loginRate: actionType.number().default(10), + autoLoginAccount: actionType.string().default(''), theme: themeType, }); diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index 5f32c107..02be0c38 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -1,10 +1,10 @@ -import { coerce } from '@/common/coerce'; +import { actionType } from '@/common/coerce'; import { z } from 'zod'; export const themeType = z.object( { - dark: z.record(coerce.string(), coerce.string()), - light: z.record(coerce.string(), coerce.string()), + dark: z.record(actionType.string(), actionType.string()), + light: z.record(actionType.string(), actionType.string()), } ).default({ dark: { From 30a75bc58192233375db3a8f7fb55a4f4ba63b81 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: Sat, 19 Apr 2025 10:57:32 +0800 Subject: [PATCH 099/149] Revert "fix" This reverts commit 54e6d5c3f2b0793ca0ced35e85b83177732e8171. --- src/core/helper/config.ts | 2 +- src/onebot/action/extends/ClickInlineKeyboardButton.ts | 2 +- src/onebot/action/extends/CreateCollection.ts | 2 +- src/onebot/action/extends/FetchCustomFace.ts | 2 +- src/onebot/action/extends/FetchEmojiLike.ts | 2 +- src/onebot/action/extends/GetAiCharacters.ts | 2 +- src/onebot/action/extends/GetCollectionList.ts | 2 +- src/onebot/action/extends/GetGroupInfoEx.ts | 2 +- src/onebot/action/extends/GetMiniAppArk.ts | 2 +- src/onebot/action/extends/GetProfileLike.ts | 2 +- src/onebot/action/extends/GetUserStatus.ts | 2 +- src/onebot/action/extends/MoveGroupFile.ts | 2 +- src/onebot/action/extends/OCRImage.ts | 2 +- src/onebot/action/extends/RenameGroupFile.ts | 2 +- src/onebot/action/extends/SendPacket.ts | 2 +- src/onebot/action/extends/SetDiyOnlineStatus.ts | 2 +- src/onebot/action/extends/SetGroupRemark.ts | 2 +- src/onebot/action/extends/SetGroupSign.ts | 2 +- src/onebot/action/extends/SetInputStatus.ts | 2 +- src/onebot/action/extends/SetLongNick.ts | 2 +- src/onebot/action/extends/SetOnlineStatus.ts | 2 +- src/onebot/action/extends/SetQQAvatar.ts | 2 +- src/onebot/action/extends/SetSpecialTitle.ts | 2 +- src/onebot/action/extends/ShareContact.ts | 2 +- src/onebot/action/extends/TransGroupFile.ts | 2 +- src/onebot/action/extends/TranslateEnWordToZn.ts | 2 +- src/onebot/action/file/GetFile.ts | 2 +- src/onebot/action/file/GetGroupFileUrl.ts | 2 +- src/onebot/action/file/GetPrivateFileUrl.ts | 2 +- src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts | 2 +- src/onebot/action/go-cqhttp/DeleteGroupFile.ts | 2 +- src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts | 2 +- src/onebot/action/go-cqhttp/DownloadFile.ts | 2 +- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 2 +- src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupRootFiles.ts | 2 +- src/onebot/action/go-cqhttp/GetStrangerInfo.ts | 2 +- src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 2 +- src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 2 +- src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts | 2 +- src/onebot/action/go-cqhttp/SendGroupNotice.ts | 2 +- src/onebot/action/go-cqhttp/SetGroupPortrait.ts | 2 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 2 +- src/onebot/action/go-cqhttp/UploadGroupFile.ts | 2 +- src/onebot/action/go-cqhttp/UploadPrivateFile.ts | 2 +- src/onebot/action/group/DelEssenceMsg.ts | 2 +- src/onebot/action/group/DelGroupNotice.ts | 2 +- src/onebot/action/group/GetAiRecord.ts | 2 +- src/onebot/action/group/GetGroupEssence.ts | 2 +- src/onebot/action/group/GetGroupInfo.ts | 2 +- src/onebot/action/group/GetGroupList.ts | 2 +- src/onebot/action/group/GetGroupMemberInfo.ts | 2 +- src/onebot/action/group/GetGroupMemberList.ts | 2 +- src/onebot/action/group/GetGroupNotice.ts | 2 +- src/onebot/action/group/GetGroupShutList.ts | 2 +- src/onebot/action/group/GroupPoke.ts | 2 +- src/onebot/action/group/SendGroupAiRecord.ts | 2 +- src/onebot/action/group/SetEssenceMsg.ts | 2 +- src/onebot/action/group/SetGroupAddRequest.ts | 2 +- src/onebot/action/group/SetGroupAdmin.ts | 2 +- src/onebot/action/group/SetGroupBan.ts | 2 +- src/onebot/action/group/SetGroupCard.ts | 2 +- src/onebot/action/group/SetGroupKick.ts | 2 +- src/onebot/action/group/SetGroupLeave.ts | 2 +- src/onebot/action/group/SetGroupName.ts | 2 +- src/onebot/action/group/SetGroupWholeBan.ts | 2 +- src/onebot/action/msg/DeleteMsg.ts | 2 +- src/onebot/action/msg/ForwardSingleMsg.ts | 2 +- src/onebot/action/msg/GetMsg.ts | 2 +- src/onebot/action/msg/MarkMsgAsRead.ts | 2 +- src/onebot/action/msg/SetMsgEmojiLike.ts | 2 +- src/onebot/action/packet/SendPoke.ts | 2 +- src/onebot/action/system/GetCredentials.ts | 2 +- src/{common/coerce.ts => onebot/action/type.ts} | 1 + src/onebot/action/user/FriendPoke.ts | 2 +- src/onebot/action/user/GetCookies.ts | 2 +- src/onebot/action/user/GetFriendList.ts | 2 +- src/onebot/action/user/GetRecentContact.ts | 2 +- src/onebot/action/user/SendLike.ts | 2 +- src/onebot/action/user/SetFriendAddRequest.ts | 2 +- src/onebot/config/config.ts | 2 +- src/webui/src/helper/config.ts | 2 +- src/webui/src/types/theme.ts | 2 +- 88 files changed, 88 insertions(+), 87 deletions(-) rename src/{common/coerce.ts => onebot/action/type.ts} (99%) diff --git a/src/core/helper/config.ts b/src/core/helper/config.ts index ca3d2268..1b11467a 100644 --- a/src/core/helper/config.ts +++ b/src/core/helper/config.ts @@ -1,6 +1,6 @@ import { ConfigBase } from '@/common/config-base'; import { NapCatCore } from '@/core'; -import { actionType } from '@/common/coerce'; +import { actionType } from '@/onebot/action/type'; import { z } from 'zod'; export const NapcatConfigSchema = z.object({ diff --git a/src/onebot/action/extends/ClickInlineKeyboardButton.ts b/src/onebot/action/extends/ClickInlineKeyboardButton.ts index fba1830c..aaca0481 100644 --- a/src/onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/src/onebot/action/extends/ClickInlineKeyboardButton.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '../OneBotAction'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/extends/CreateCollection.ts b/src/onebot/action/extends/CreateCollection.ts index 0faf8b4e..8451664e 100644 --- a/src/onebot/action/extends/CreateCollection.ts +++ b/src/onebot/action/extends/CreateCollection.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ rawData: actionType.string(), brief: actionType.string(), diff --git a/src/onebot/action/extends/FetchCustomFace.ts b/src/onebot/action/extends/FetchCustomFace.ts index ee6a535c..8e068060 100644 --- a/src/onebot/action/extends/FetchCustomFace.ts +++ b/src/onebot/action/extends/FetchCustomFace.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ count: actionType.number().default(48), }); diff --git a/src/onebot/action/extends/FetchEmojiLike.ts b/src/onebot/action/extends/FetchEmojiLike.ts index c55ce0c4..263311ad 100644 --- a/src/onebot/action/extends/FetchEmojiLike.ts +++ b/src/onebot/action/extends/FetchEmojiLike.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { type NTQQMsgApi } from '@/core/apis'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ message_id: actionType.string(), emojiId: actionType.string(), diff --git a/src/onebot/action/extends/GetAiCharacters.ts b/src/onebot/action/extends/GetAiCharacters.ts index 7e2210bd..5706cfec 100644 --- a/src/onebot/action/extends/GetAiCharacters.ts +++ b/src/onebot/action/extends/GetAiCharacters.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), chat_type: actionType.number().default(1), diff --git a/src/onebot/action/extends/GetCollectionList.ts b/src/onebot/action/extends/GetCollectionList.ts index 1cb62961..d1593a02 100644 --- a/src/onebot/action/extends/GetCollectionList.ts +++ b/src/onebot/action/extends/GetCollectionList.ts @@ -2,7 +2,7 @@ import { type NTQQCollectionApi } from '@/core/apis/collection'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ category: actionType.number(), count: actionType.number().default(1), diff --git a/src/onebot/action/extends/GetGroupInfoEx.ts b/src/onebot/action/extends/GetGroupInfoEx.ts index 9ed398bc..ec3f685d 100644 --- a/src/onebot/action/extends/GetGroupInfoEx.ts +++ b/src/onebot/action/extends/GetGroupInfoEx.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), }); diff --git a/src/onebot/action/extends/GetMiniAppArk.ts b/src/onebot/action/extends/GetMiniAppArk.ts index 2bd60b0a..50e1629d 100644 --- a/src/onebot/action/extends/GetMiniAppArk.ts +++ b/src/onebot/action/extends/GetMiniAppArk.ts @@ -3,7 +3,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { MiniAppInfo, MiniAppInfoHelper } from '@/core/packet/utils/helper/miniAppHelper'; import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from '@/core/packet/entities/miniApp'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.union([ z.object({ type: z.union([z.literal('bili'), z.literal('weibo')]), diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index cefd9e55..3e06b75b 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -2,7 +2,7 @@ import { NTVoteInfo } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ user_id: actionType.string().optional(), start: actionType.number().default(0), diff --git a/src/onebot/action/extends/GetUserStatus.ts b/src/onebot/action/extends/GetUserStatus.ts index 38ac0007..3256b6fe 100644 --- a/src/onebot/action/extends/GetUserStatus.ts +++ b/src/onebot/action/extends/GetUserStatus.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ user_id: actionType.number(), }); diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index 7e2e6eb4..cdad0987 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), file_id: actionType.string(), diff --git a/src/onebot/action/extends/OCRImage.ts b/src/onebot/action/extends/OCRImage.ts index c08a12b5..6e4baf61 100644 --- a/src/onebot/action/extends/OCRImage.ts +++ b/src/onebot/action/extends/OCRImage.ts @@ -4,7 +4,7 @@ import { checkFileExist, uriToLocalFile } from '@/common/file'; import fs from 'fs'; import { z } from 'zod'; import { GeneralCallResultStatus } from '@/core'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ image: actionType.string(), }); diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index ff40a66b..fe0fd2d7 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), file_id: actionType.string(), diff --git a/src/onebot/action/extends/SendPacket.ts b/src/onebot/action/extends/SendPacket.ts index 27c133ad..b472109a 100644 --- a/src/onebot/action/extends/SendPacket.ts +++ b/src/onebot/action/extends/SendPacket.ts @@ -2,7 +2,7 @@ import { PacketHexStr } from '@/core/packet/transformer/base'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ cmd: actionType.string(), diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index 43bffa63..7c1d609a 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ face_id: actionType.string(),// 参考 face_config.json 的 QSid face_type: actionType.string().default('1'), diff --git a/src/onebot/action/extends/SetGroupRemark.ts b/src/onebot/action/extends/SetGroupRemark.ts index d5b7b6a0..c30fb31c 100644 --- a/src/onebot/action/extends/SetGroupRemark.ts +++ b/src/onebot/action/extends/SetGroupRemark.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), remark: actionType.string(), diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index 56fdf534..bb66c12f 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -1,7 +1,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), }); diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index 98f28a94..2dd00a44 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { ChatType } from '@/core'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ user_id: actionType.string(), event_type: actionType.number(), diff --git a/src/onebot/action/extends/SetLongNick.ts b/src/onebot/action/extends/SetLongNick.ts index 4b05825b..d84344e3 100644 --- a/src/onebot/action/extends/SetLongNick.ts +++ b/src/onebot/action/extends/SetLongNick.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ longNick: actionType.string(), }); diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index e863b4ae..d9d76019 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ status: actionType.number(), ext_status: actionType.number(), diff --git a/src/onebot/action/extends/SetQQAvatar.ts b/src/onebot/action/extends/SetQQAvatar.ts index 767a5c3b..9a84a5a0 100644 --- a/src/onebot/action/extends/SetQQAvatar.ts +++ b/src/onebot/action/extends/SetQQAvatar.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import fs from 'node:fs/promises'; import { checkFileExist, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ file: actionType.string(), }); diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index efa4000b..dcb0dff4 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), user_id: actionType.string(), diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index 571bbdb7..732ac990 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -2,7 +2,7 @@ import { GeneralCallResult } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ user_id: actionType.string().optional(), group_id: actionType.string().optional(), diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index bd5045a0..c802d160 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), file_id: actionType.string(), diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index ff27a83f..77ce0647 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ words: z.array(actionType.string()), }); diff --git a/src/onebot/action/file/GetFile.ts b/src/onebot/action/file/GetFile.ts index 55725be9..4116f4c4 100644 --- a/src/onebot/action/file/GetFile.ts +++ b/src/onebot/action/file/GetFile.ts @@ -4,7 +4,7 @@ import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { ActionName } from '@/onebot/action/router'; import { OB11MessageImage, OB11MessageVideo } from '@/onebot/types'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; export interface GetFileResponse { file?: string; // path url?: string; diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index c90103e5..e454ea9f 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), file_id: actionType.string(), diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts index 04b9bf1a..2dbb615d 100644 --- a/src/onebot/action/file/GetPrivateFileUrl.ts +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ file_id: actionType.string(), }); diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 91e3e522..2b1e3a18 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), folder_name: actionType.string(), diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index addee6b9..5a4895fe 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), file_id: actionType.string(), diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index be39f476..170bb703 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), folder_id: actionType.string().optional(), diff --git a/src/onebot/action/go-cqhttp/DownloadFile.ts b/src/onebot/action/go-cqhttp/DownloadFile.ts index d6288661..3b5b7965 100644 --- a/src/onebot/action/go-cqhttp/DownloadFile.ts +++ b/src/onebot/action/go-cqhttp/DownloadFile.ts @@ -5,7 +5,7 @@ import { join as joinPath } from 'node:path'; import { calculateFileMD5, uriToLocalFile } from '@/common/file'; import { randomUUID } from 'crypto'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; interface FileResponse { file: string; } diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index d49baefd..62cbd438 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -5,7 +5,7 @@ import { MessageUnique } from '@/common/message-unique'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; import { z } from 'zod'; import { isNumeric } from '@/common/helper'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ message_id: actionType.string().optional(), id: actionType.string().optional(), diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index 2c0d4ecc..be7a52d0 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -5,7 +5,7 @@ import { ChatType } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; interface Response { messages: OB11Message[]; diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 6149aa51..67d2eb8d 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 69c1edf4..9d161641 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index 93d70073..fb993dba 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), folder_id: actionType.string().optional(), diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index b22c77b8..a6c666a3 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -2,7 +2,7 @@ import { WebHonorType } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), type: z.nativeEnum(WebHonorType).optional() diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index bde27c1a..0952bb86 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -5,7 +5,7 @@ import { ChatType, Peer } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; interface Response { messages: OB11Message[]; diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index 613bac17..d3a8efbc 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { OB11GroupFile, OB11GroupFileFolder } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), file_count: actionType.number().default(50), diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index aa628283..6052c1b7 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -4,7 +4,7 @@ import { OB11Construct } from '@/onebot/helper/data'; import { ActionName } from '@/onebot/action/router'; import { calcQQLevel } from '@/common/helper'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ user_id: actionType.string(), diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index 997a1630..18013147 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ url: actionType.string(), }); diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index 079f681f..27831852 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ friend_id: actionType.string().optional(), diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index bbcce797..962cf137 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ model: actionType.string(), }); diff --git a/src/onebot/action/go-cqhttp/SendGroupNotice.ts b/src/onebot/action/go-cqhttp/SendGroupNotice.ts index e309397c..b3b6a795 100644 --- a/src/onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/src/onebot/action/go-cqhttp/SendGroupNotice.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { unlink } from 'node:fs/promises'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), content: actionType.string(), diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index af178e9b..b009f267 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -4,7 +4,7 @@ import { checkFileExistV2, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ file: actionType.string(), group_id: actionType.string() diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index 28bffd6a..f61872e9 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -2,7 +2,7 @@ import { NTQQUserApi } from '@/core/apis'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ nickname: actionType.string(), personal_note: actionType.string().optional(), diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index 195df4b9..3381f198 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -5,7 +5,7 @@ import fs from 'fs'; import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), file: actionType.string(), diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index 7de40188..6d53fda6 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -6,7 +6,7 @@ import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ user_id: actionType.string(), file: actionType.string(), diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index 846aced1..1d108bec 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ message_id: actionType.string(), }); diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index b012f87d..7ec4de9c 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), notice_id: actionType.string() diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index 7e0d002c..58d40b1d 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ character: actionType.string(), group_id: actionType.string(), diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 500d7dba..0176994e 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -5,7 +5,7 @@ import { MessageUnique } from '@/common/message-unique'; import crypto from 'crypto'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), }); diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index f427c224..9a24c3c0 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -3,7 +3,7 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), }); diff --git a/src/onebot/action/group/GetGroupList.ts b/src/onebot/action/group/GetGroupList.ts index 648d6cdc..98f7d407 100644 --- a/src/onebot/action/group/GetGroupList.ts +++ b/src/onebot/action/group/GetGroupList.ts @@ -3,7 +3,7 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ no_cache: actionType.boolean().default(false), diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index b1925fd6..0aa72dde 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -3,7 +3,7 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 909392ba..746efbaa 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -4,7 +4,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; import { GroupMember } from '@/core'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index 86ef5b0c..89f30a32 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -2,7 +2,7 @@ import { WebApiGroupNoticeFeed } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; interface GroupNotice { sender_id: number; publish_time: number; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index b65bacad..3133b412 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -2,7 +2,7 @@ import { ShutUpGroupMember } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), }); diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index 00c6fff8..09d958e5 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), user_id: actionType.string(), diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index 454f77be..bb1c85fd 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ character: actionType.string(), group_id: actionType.string(), diff --git a/src/onebot/action/group/SetEssenceMsg.ts b/src/onebot/action/group/SetEssenceMsg.ts index 04026cd0..de3c7f43 100644 --- a/src/onebot/action/group/SetEssenceMsg.ts +++ b/src/onebot/action/group/SetEssenceMsg.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ message_id: actionType.string(), }); diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index cabe123e..f0ced956 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupRequestOperateTypes } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ flag: actionType.string(), diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index f690ba9f..4067b4ff 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupMemberRole } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index c65d461c..e4fe3c03 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), user_id: actionType.string(), diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index f0e0b53b..870af15f 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), user_id: actionType.string(), diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index 08f6ec50..a394b9c8 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index 4823c6bb..a21c890e 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index bd644049..b1949b45 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), group_name: actionType.string(), diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index 0e6c120c..e35b85b8 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string(), diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index b1305dcc..3d88c5a8 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ message_id: actionType.string(), diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index c7e2c245..3497a40c 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -3,7 +3,7 @@ import { ChatType, Peer } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ message_id: actionType.string(), group_id: actionType.string().optional(), diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index ce287a5e..347b1502 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -5,7 +5,7 @@ import { MessageUnique } from '@/common/message-unique'; import { RawMessage } from '@/core'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; export type ReturnDataType = OB11Message const SchemaData = z.object({ diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index 52ee09e1..fcb8e271 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ user_id: actionType.string().optional(), group_id: actionType.string().optional(), diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index 1eb9eed8..b71983ef 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -2,7 +2,7 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ message_id: actionType.string(), diff --git a/src/onebot/action/packet/SendPoke.ts b/src/onebot/action/packet/SendPoke.ts index 438f802f..dcd9da64 100644 --- a/src/onebot/action/packet/SendPoke.ts +++ b/src/onebot/action/packet/SendPoke.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ group_id: actionType.string().optional(), diff --git a/src/onebot/action/system/GetCredentials.ts b/src/onebot/action/system/GetCredentials.ts index cb49f0cc..07228128 100644 --- a/src/onebot/action/system/GetCredentials.ts +++ b/src/onebot/action/system/GetCredentials.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; interface Response { cookies: string, diff --git a/src/common/coerce.ts b/src/onebot/action/type.ts similarity index 99% rename from src/common/coerce.ts rename to src/onebot/action/type.ts index 46eb174d..76b11d5c 100644 --- a/src/common/coerce.ts +++ b/src/onebot/action/type.ts @@ -1,4 +1,5 @@ import { z } from "zod"; + const boolean = () => z.preprocess( val => typeof val === 'string' && (val.toLowerCase() === 'false' || val === '0') ? false : Boolean(val), z.boolean() diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index 5b8ba425..68493c94 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -1,7 +1,7 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ user_id: actionType.string() diff --git a/src/onebot/action/user/GetCookies.ts b/src/onebot/action/user/GetCookies.ts index da021c33..60c34424 100644 --- a/src/onebot/action/user/GetCookies.ts +++ b/src/onebot/action/user/GetCookies.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; interface Response { cookies: string, bkn: string diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index ef85df42..74cc6815 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -3,7 +3,7 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ no_cache: actionType.boolean().optional(), diff --git a/src/onebot/action/user/GetRecentContact.ts b/src/onebot/action/user/GetRecentContact.ts index 4c817eb3..8a551b54 100644 --- a/src/onebot/action/user/GetRecentContact.ts +++ b/src/onebot/action/user/GetRecentContact.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { NetworkAdapterConfig } from '@/onebot/config/config'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ count: actionType.number().default(10), diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 7630161a..5ac5078e 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ times: actionType.number().default(1), diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index f35318d4..3fb71e18 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '../type'; const SchemaData = z.object({ flag: actionType.string(), diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index 266106b6..7ee9d3b7 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { actionType } from '../../common/coerce'; +import { actionType } from '../action/type'; const HttpServerConfigSchema = z.object({ name: actionType.string().default('http-server'), diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index af8e9c5c..ffaf6df1 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -4,7 +4,7 @@ import { resolve } from 'node:path'; import { deepMerge } from '../utils/object'; import { themeType } from '../types/theme'; import { z } from 'zod'; -import { actionType } from '@/common/coerce'; +import { actionType } from '@/onebot/action/type'; // 定义配置的类型 const WebUiConfigSchema = z.object({ host: actionType.string().default('0.0.0.0'), diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index 02be0c38..d62d0821 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -1,4 +1,4 @@ -import { actionType } from '@/common/coerce'; +import { actionType } from '@/onebot/action/type'; import { z } from 'zod'; export const themeType = z.object( From fca7a65ee0187ab64a72f02002ccedcbdaf0dc13 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: Sat, 19 Apr 2025 10:57:36 +0800 Subject: [PATCH 100/149] Revert "fix" This reverts commit 3f6249f39cfbbce1b214dd8c32d4d9756890268e. --- src/onebot/action/type.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebot/action/type.ts b/src/onebot/action/type.ts index 76b11d5c..f480fda0 100644 --- a/src/onebot/action/type.ts +++ b/src/onebot/action/type.ts @@ -1,7 +1,7 @@ import { z } from "zod"; const boolean = () => z.preprocess( - val => typeof val === 'string' && (val.toLowerCase() === 'false' || val === '0') ? false : Boolean(val), + val => typeof val === 'string' && val.toLowerCase() === 'false' ? false : Boolean(val), z.boolean() ); const number = () => z.preprocess( From 80a34c82b96e0d559f5dd70c076d877711a15862 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: Sat, 19 Apr 2025 10:58:39 +0800 Subject: [PATCH 101/149] =?UTF-8?q?Revert=20"fix:=20zod=20boolean=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E8=BD=AC=E6=8D=A2"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 17ef3231df08102cacd10f9319fd149de553fa62. --- src/core/helper/config.ts | 15 ++- .../extends/ClickInlineKeyboardButton.ts | 11 +- src/onebot/action/extends/CreateCollection.ts | 6 +- src/onebot/action/extends/FetchCustomFace.ts | 4 +- src/onebot/action/extends/FetchEmojiLike.ts | 10 +- src/onebot/action/extends/GetAiCharacters.ts | 6 +- .../action/extends/GetCollectionList.ts | 6 +- src/onebot/action/extends/GetGroupInfoEx.ts | 3 +- src/onebot/action/extends/GetMiniAppArk.ts | 46 ++++---- src/onebot/action/extends/GetProfileLike.ts | 8 +- src/onebot/action/extends/GetUserStatus.ts | 4 +- src/onebot/action/extends/MoveGroupFile.ts | 10 +- src/onebot/action/extends/OCRImage.ts | 4 +- src/onebot/action/extends/RenameGroupFile.ts | 10 +- src/onebot/action/extends/SendPacket.ts | 7 +- .../action/extends/SetDiyOnlineStatus.ts | 8 +- src/onebot/action/extends/SetGroupRemark.ts | 6 +- src/onebot/action/extends/SetGroupSign.ts | 4 +- src/onebot/action/extends/SetInputStatus.ts | 6 +- src/onebot/action/extends/SetLongNick.ts | 4 +- src/onebot/action/extends/SetOnlineStatus.ts | 8 +- src/onebot/action/extends/SetQQAvatar.ts | 4 +- src/onebot/action/extends/SetSpecialTitle.ts | 8 +- src/onebot/action/extends/ShareContact.ts | 10 +- src/onebot/action/extends/TransGroupFile.ts | 6 +- .../action/extends/TranslateEnWordToZn.ts | 4 +- src/onebot/action/file/GetFile.ts | 6 +- src/onebot/action/file/GetGroupFileUrl.ts | 6 +- src/onebot/action/file/GetPrivateFileUrl.ts | 4 +- .../action/go-cqhttp/CreateGroupFileFolder.ts | 6 +- .../action/go-cqhttp/DeleteGroupFile.ts | 6 +- .../action/go-cqhttp/DeleteGroupFileFolder.ts | 8 +- src/onebot/action/go-cqhttp/DownloadFile.ts | 10 +- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 6 +- .../action/go-cqhttp/GetFriendMsgHistory.ts | 9 +- .../action/go-cqhttp/GetGroupAtAllRemain.ts | 4 +- .../go-cqhttp/GetGroupFileSystemInfo.ts | 4 +- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 10 +- .../action/go-cqhttp/GetGroupHonorInfo.ts | 4 +- .../action/go-cqhttp/GetGroupMsgHistory.ts | 9 +- .../action/go-cqhttp/GetGroupRootFiles.ts | 6 +- .../action/go-cqhttp/GetStrangerInfo.ts | 5 +- .../go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 4 +- .../action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 9 +- .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 4 +- .../action/go-cqhttp/SendGroupNotice.ts | 18 +-- .../action/go-cqhttp/SetGroupPortrait.ts | 5 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 8 +- .../action/go-cqhttp/UploadGroupFile.ts | 12 +- .../action/go-cqhttp/UploadPrivateFile.ts | 8 +- src/onebot/action/group/DelEssenceMsg.ts | 4 +- src/onebot/action/group/DelGroupNotice.ts | 6 +- src/onebot/action/group/GetAiRecord.ts | 8 +- src/onebot/action/group/GetGroupEssence.ts | 4 +- src/onebot/action/group/GetGroupInfo.ts | 4 +- src/onebot/action/group/GetGroupList.ts | 3 +- src/onebot/action/group/GetGroupMemberInfo.ts | 7 +- src/onebot/action/group/GetGroupMemberList.ts | 5 +- src/onebot/action/group/GetGroupNotice.ts | 3 +- src/onebot/action/group/GetGroupShutList.ts | 4 +- src/onebot/action/group/GroupPoke.ts | 6 +- src/onebot/action/group/SendGroupAiRecord.ts | 8 +- src/onebot/action/group/SetEssenceMsg.ts | 4 +- src/onebot/action/group/SetGroupAddRequest.ts | 7 +- src/onebot/action/group/SetGroupAdmin.ts | 7 +- src/onebot/action/group/SetGroupBan.ts | 8 +- src/onebot/action/group/SetGroupCard.ts | 8 +- src/onebot/action/group/SetGroupKick.ts | 7 +- src/onebot/action/group/SetGroupLeave.ts | 5 +- src/onebot/action/group/SetGroupName.ts | 6 +- src/onebot/action/group/SetGroupWholeBan.ts | 5 +- src/onebot/action/msg/DeleteMsg.ts | 3 +- src/onebot/action/msg/ForwardSingleMsg.ts | 8 +- src/onebot/action/msg/GetMsg.ts | 4 +- src/onebot/action/msg/MarkMsgAsRead.ts | 8 +- src/onebot/action/msg/SetMsgEmojiLike.ts | 7 +- src/onebot/action/packet/SendPoke.ts | 5 +- src/onebot/action/system/GetCredentials.ts | 3 +- src/onebot/action/type.ts | 15 --- src/onebot/action/user/FriendPoke.ts | 3 +- src/onebot/action/user/GetCookies.ts | 3 +- src/onebot/action/user/GetFriendList.ts | 3 +- src/onebot/action/user/GetRecentContact.ts | 3 +- src/onebot/action/user/SendLike.ts | 5 +- src/onebot/action/user/SetFriendAddRequest.ts | 7 +- src/onebot/config/config.ts | 107 +++++++++--------- src/webui/src/helper/config.ts | 11 +- src/webui/src/types/theme.ts | 5 +- 88 files changed, 331 insertions(+), 377 deletions(-) delete mode 100644 src/onebot/action/type.ts diff --git a/src/core/helper/config.ts b/src/core/helper/config.ts index 1b11467a..94cfbeb5 100644 --- a/src/core/helper/config.ts +++ b/src/core/helper/config.ts @@ -1,16 +1,15 @@ import { ConfigBase } from '@/common/config-base'; import { NapCatCore } from '@/core'; -import { actionType } from '@/onebot/action/type'; import { z } from 'zod'; export const NapcatConfigSchema = z.object({ - fileLog: actionType.boolean().default(false), - consoleLog: actionType.boolean().default(true), - fileLogLevel: actionType.string().default('debug'), - consoleLogLevel: actionType.string().default('info'), - packetBackend: actionType.string().default('auto'), - packetServer: actionType.string().default(''), - o3HookMode: actionType.number().default(0), + fileLog: z.coerce.boolean().default(false), + consoleLog: z.coerce.boolean().default(true), + fileLogLevel: z.coerce.string().default('debug'), + consoleLogLevel: z.coerce.string().default('info'), + packetBackend: z.coerce.string().default('auto'), + packetServer: z.coerce.string().default(''), + o3HookMode: z.coerce.number().default(0), }); export type NapcatConfig = z.infer; diff --git a/src/onebot/action/extends/ClickInlineKeyboardButton.ts b/src/onebot/action/extends/ClickInlineKeyboardButton.ts index aaca0481..c06947cf 100644 --- a/src/onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/src/onebot/action/extends/ClickInlineKeyboardButton.ts @@ -1,14 +1,13 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '../OneBotAction'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - group_id: actionType.string(), - bot_appid: actionType.string(), - button_id: actionType.string().default(''), - callback_data: actionType.string().default(''), - msg_seq: actionType.string().default('10086'), + group_id: z.coerce.string(), + bot_appid: z.coerce.string(), + button_id: z.coerce.string().default(''), + callback_data: z.coerce.string().default(''), + msg_seq: z.coerce.string().default('10086'), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/CreateCollection.ts b/src/onebot/action/extends/CreateCollection.ts index 8451664e..e1c5903b 100644 --- a/src/onebot/action/extends/CreateCollection.ts +++ b/src/onebot/action/extends/CreateCollection.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - rawData: actionType.string(), - brief: actionType.string(), + rawData: z.coerce.string(), + brief: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchCustomFace.ts b/src/onebot/action/extends/FetchCustomFace.ts index 8e068060..cd7d7645 100644 --- a/src/onebot/action/extends/FetchCustomFace.ts +++ b/src/onebot/action/extends/FetchCustomFace.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { actionType } from '../type'; + const SchemaData = z.object({ - count: actionType.number().default(48), + count: z.coerce.number().default(48), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchEmojiLike.ts b/src/onebot/action/extends/FetchEmojiLike.ts index 263311ad..11505d9a 100644 --- a/src/onebot/action/extends/FetchEmojiLike.ts +++ b/src/onebot/action/extends/FetchEmojiLike.ts @@ -3,12 +3,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { type NTQQMsgApi } from '@/core/apis'; -import { actionType } from '../type'; + const SchemaData = z.object({ - message_id: actionType.string(), - emojiId: actionType.string(), - emojiType: actionType.string(), - count: actionType.number().default(20), + message_id: z.coerce.string(), + emojiId: z.coerce.string(), + emojiType: z.coerce.string(), + count: z.coerce.number().default(20), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetAiCharacters.ts b/src/onebot/action/extends/GetAiCharacters.ts index 5706cfec..e2f2045a 100644 --- a/src/onebot/action/extends/GetAiCharacters.ts +++ b/src/onebot/action/extends/GetAiCharacters.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - chat_type: actionType.number().default(1), + group_id: z.coerce.string(), + chat_type: z.coerce.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetCollectionList.ts b/src/onebot/action/extends/GetCollectionList.ts index d1593a02..4399c349 100644 --- a/src/onebot/action/extends/GetCollectionList.ts +++ b/src/onebot/action/extends/GetCollectionList.ts @@ -2,10 +2,10 @@ import { type NTQQCollectionApi } from '@/core/apis/collection'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - category: actionType.number(), - count: actionType.number().default(1), + category: z.coerce.number(), + count: z.coerce.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetGroupInfoEx.ts b/src/onebot/action/extends/GetGroupInfoEx.ts index ec3f685d..4dcd05ee 100644 --- a/src/onebot/action/extends/GetGroupInfoEx.ts +++ b/src/onebot/action/extends/GetGroupInfoEx.ts @@ -1,9 +1,8 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - group_id: actionType.string(), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetMiniAppArk.ts b/src/onebot/action/extends/GetMiniAppArk.ts index 50e1629d..699d6661 100644 --- a/src/onebot/action/extends/GetMiniAppArk.ts +++ b/src/onebot/action/extends/GetMiniAppArk.ts @@ -3,34 +3,34 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { MiniAppInfo, MiniAppInfoHelper } from '@/core/packet/utils/helper/miniAppHelper'; import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from '@/core/packet/entities/miniApp'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.union([ z.object({ type: z.union([z.literal('bili'), z.literal('weibo')]), - title: actionType.string(), - desc: actionType.string(), - picUrl: actionType.string(), - jumpUrl: actionType.string(), - webUrl: actionType.string().optional(), - rawArkData: actionType.string().optional() + title: z.coerce.string(), + desc: z.coerce.string(), + picUrl: z.coerce.string(), + jumpUrl: z.coerce.string(), + webUrl: z.coerce.string().optional(), + rawArkData: z.coerce.string().optional() }), z.object({ - title: actionType.string(), - desc: actionType.string(), - picUrl: actionType.string(), - jumpUrl: actionType.string(), - iconUrl: actionType.string(), - webUrl: actionType.string().optional(), - appId: actionType.string(), - scene: z.union([actionType.number(), actionType.string()]), - templateType: z.union([actionType.number(), actionType.string()]), - businessType: z.union([actionType.number(), actionType.string()]), - verType: z.union([actionType.number(), actionType.string()]), - shareType: z.union([actionType.number(), actionType.string()]), - versionId: actionType.string(), - sdkId: actionType.string(), - withShareTicket: z.union([actionType.number(), actionType.string()]), - rawArkData: actionType.string().optional() + title: z.coerce.string(), + desc: z.coerce.string(), + picUrl: z.coerce.string(), + jumpUrl: z.coerce.string(), + iconUrl: z.coerce.string(), + webUrl: z.coerce.string().optional(), + appId: z.coerce.string(), + scene: z.union([z.coerce.number(), z.coerce.string()]), + templateType: z.union([z.coerce.number(), z.coerce.string()]), + businessType: z.union([z.coerce.number(), z.coerce.string()]), + verType: z.union([z.coerce.number(), z.coerce.string()]), + shareType: z.union([z.coerce.number(), z.coerce.string()]), + versionId: z.coerce.string(), + sdkId: z.coerce.string(), + withShareTicket: z.union([z.coerce.number(), z.coerce.string()]), + rawArkData: z.coerce.string().optional() }) ]); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index 3e06b75b..7e727a7a 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -2,11 +2,11 @@ import { NTVoteInfo } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - user_id: actionType.string().optional(), - start: actionType.number().default(0), - count: actionType.number().default(10), + user_id: z.coerce.string().optional(), + start: z.coerce.number().default(0), + count: z.coerce.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetUserStatus.ts b/src/onebot/action/extends/GetUserStatus.ts index 3256b6fe..7fe274e8 100644 --- a/src/onebot/action/extends/GetUserStatus.ts +++ b/src/onebot/action/extends/GetUserStatus.ts @@ -1,9 +1,9 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - user_id: actionType.number(), + user_id: z.coerce.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index cdad0987..05c92220 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -2,12 +2,12 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - file_id: actionType.string(), - current_parent_directory: actionType.string(), - target_parent_directory: actionType.string(), + group_id: z.coerce.string(), + file_id: z.coerce.string(), + current_parent_directory: z.coerce.string(), + target_parent_directory: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/OCRImage.ts b/src/onebot/action/extends/OCRImage.ts index 6e4baf61..d3dd45a8 100644 --- a/src/onebot/action/extends/OCRImage.ts +++ b/src/onebot/action/extends/OCRImage.ts @@ -4,9 +4,9 @@ import { checkFileExist, uriToLocalFile } from '@/common/file'; import fs from 'fs'; import { z } from 'zod'; import { GeneralCallResultStatus } from '@/core'; -import { actionType } from '../type'; + const SchemaData = z.object({ - image: actionType.string(), + image: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index fe0fd2d7..06bb1f48 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -2,12 +2,12 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - file_id: actionType.string(), - current_parent_directory: actionType.string(), - new_name: actionType.string(), + group_id: z.coerce.string(), + file_id: z.coerce.string(), + current_parent_directory: z.coerce.string(), + new_name: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SendPacket.ts b/src/onebot/action/extends/SendPacket.ts index b472109a..ac23b9c4 100644 --- a/src/onebot/action/extends/SendPacket.ts +++ b/src/onebot/action/extends/SendPacket.ts @@ -2,12 +2,11 @@ import { PacketHexStr } from '@/core/packet/transformer/base'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - cmd: actionType.string(), - data: actionType.string(), - rsp: actionType.boolean().default(true), + cmd: z.coerce.string(), + data: z.coerce.string(), + rsp: z.coerce.boolean().default(true), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index 7c1d609a..df36e0be 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - face_id: actionType.string(),// 参考 face_config.json 的 QSid - face_type: actionType.string().default('1'), - wording: actionType.string().default(' '), + face_id: z.coerce.string(),// 参考 face_config.json 的 QSid + face_type: z.coerce.string().default('1'), + wording: z.coerce.string().default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupRemark.ts b/src/onebot/action/extends/SetGroupRemark.ts index c30fb31c..a6e5edaf 100644 --- a/src/onebot/action/extends/SetGroupRemark.ts +++ b/src/onebot/action/extends/SetGroupRemark.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - remark: actionType.string(), + group_id: z.coerce.string(), + remark: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index bb66c12f..3d22da22 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -1,9 +1,9 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index 2dd00a44..76324901 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -2,10 +2,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { ChatType } from '@/core'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - user_id: actionType.string(), - event_type: actionType.number(), + user_id: z.coerce.string(), + event_type: z.coerce.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetLongNick.ts b/src/onebot/action/extends/SetLongNick.ts index d84344e3..be68fea2 100644 --- a/src/onebot/action/extends/SetLongNick.ts +++ b/src/onebot/action/extends/SetLongNick.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - longNick: actionType.string(), + longNick: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index d9d76019..10101b9a 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - status: actionType.number(), - ext_status: actionType.number(), - battery_status: actionType.number(), + status: z.coerce.number(), + ext_status: z.coerce.number(), + battery_status: z.coerce.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetQQAvatar.ts b/src/onebot/action/extends/SetQQAvatar.ts index 9a84a5a0..eee209c8 100644 --- a/src/onebot/action/extends/SetQQAvatar.ts +++ b/src/onebot/action/extends/SetQQAvatar.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import fs from 'node:fs/promises'; import { checkFileExist, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - file: actionType.string(), + file: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index dcb0dff4..2665a373 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -1,11 +1,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - special_title: actionType.string().default(''), + group_id: z.coerce.string(), + user_id: z.coerce.string(), + special_title: z.coerce.string().default(''), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index 732ac990..d1419683 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -2,11 +2,11 @@ import { GeneralCallResult } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - user_id: actionType.string().optional(), - group_id: actionType.string().optional(), - phoneNumber: actionType.string().default(''), + user_id: z.coerce.string().optional(), + group_id: z.coerce.string().optional(), + phoneNumber: z.coerce.string().default(''), }); type Payload = z.infer; @@ -29,7 +29,7 @@ export class SharePeer extends OneBotAction; diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index c802d160..2c1da8c9 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - file_id: actionType.string(), + group_id: z.coerce.string(), + file_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index 77ce0647..bc4977b2 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - words: z.array(actionType.string()), + words: z.array(z.coerce.string()), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetFile.ts b/src/onebot/action/file/GetFile.ts index 4116f4c4..8d373676 100644 --- a/src/onebot/action/file/GetFile.ts +++ b/src/onebot/action/file/GetFile.ts @@ -4,7 +4,7 @@ import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { ActionName } from '@/onebot/action/router'; import { OB11MessageImage, OB11MessageVideo } from '@/onebot/types'; import { z } from 'zod'; -import { actionType } from '../type'; + export interface GetFileResponse { file?: string; // path url?: string; @@ -14,8 +14,8 @@ export interface GetFileResponse { } const GetFileBase_PayloadSchema = z.object({ - file: actionType.string().optional(), - file_id: actionType.string().optional(), + file: z.coerce.string().optional(), + file_id: z.coerce.string().optional(), }); diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index e454ea9f..ea475659 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -2,10 +2,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - file_id: actionType.string(), + group_id: z.coerce.string(), + file_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts index 2dbb615d..f2ea65e3 100644 --- a/src/onebot/action/file/GetPrivateFileUrl.ts +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -2,9 +2,9 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - file_id: actionType.string(), + file_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 2b1e3a18..f1f4c8ff 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - folder_name: actionType.string(), + group_id: z.coerce.string(), + folder_name: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index 5a4895fe..54b5ff6f 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -4,10 +4,10 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - file_id: actionType.string(), + group_id: z.coerce.string(), + file_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 170bb703..44c7767e 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - folder_id: actionType.string().optional(), - folder: actionType.string().optional(), + group_id: z.coerce.string(), + folder_id: z.coerce.string().optional(), + folder: z.coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DownloadFile.ts b/src/onebot/action/go-cqhttp/DownloadFile.ts index 3b5b7965..a5fb7222 100644 --- a/src/onebot/action/go-cqhttp/DownloadFile.ts +++ b/src/onebot/action/go-cqhttp/DownloadFile.ts @@ -5,16 +5,16 @@ import { join as joinPath } from 'node:path'; import { calculateFileMD5, uriToLocalFile } from '@/common/file'; import { randomUUID } from 'crypto'; import { z } from 'zod'; -import { actionType } from '../type'; + interface FileResponse { file: string; } const SchemaData = z.object({ - url: actionType.string().optional(), - base64: actionType.string().optional(), - name: actionType.string().optional(), - headers: z.union([actionType.string(), z.array(actionType.string())]).optional(), + url: z.coerce.string().optional(), + base64: z.coerce.string().optional(), + name: z.coerce.string().optional(), + headers: z.union([z.coerce.string(), z.array(z.coerce.string())]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index 62cbd438..e85546fe 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -5,10 +5,10 @@ import { MessageUnique } from '@/common/message-unique'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; import { z } from 'zod'; import { isNumeric } from '@/common/helper'; -import { actionType } from '../type'; + const SchemaData = z.object({ - message_id: actionType.string().optional(), - id: actionType.string().optional(), + message_id: z.coerce.string().optional(), + id: z.coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index be7a52d0..08500dee 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -5,16 +5,15 @@ import { ChatType } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '../type'; interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - user_id: actionType.string(), - message_seq: actionType.string().optional(), - count: actionType.number().default(20), - reverseOrder: actionType.boolean().default(false) + user_id: z.coerce.string(), + message_seq: z.coerce.string().optional(), + count: z.coerce.number().default(20), + reverseOrder: z.coerce.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 67d2eb8d..c5ff5d3c 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string() + group_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 9d161641..7f9cc99f 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string() + group_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index fb993dba..f0431963 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -3,12 +3,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - folder_id: actionType.string().optional(), - folder: actionType.string().optional(), - file_count: actionType.number().default(50), + group_id: z.coerce.string(), + folder_id: z.coerce.string().optional(), + folder: z.coerce.string().optional(), + file_count: z.coerce.number().default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index a6c666a3..9f30542a 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -2,9 +2,9 @@ import { WebHonorType } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), + group_id: z.coerce.string(), type: z.nativeEnum(WebHonorType).optional() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index 0952bb86..f9328d7f 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -5,17 +5,16 @@ import { ChatType, Peer } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '../type'; interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - group_id: actionType.string(), - message_seq: actionType.string().optional(), - count: actionType.number().default(20), - reverseOrder: actionType.boolean().default(false) + group_id: z.coerce.string(), + message_seq: z.coerce.string().optional(), + count: z.coerce.number().default(20), + reverseOrder: z.coerce.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index d3a8efbc..9604e804 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -4,10 +4,10 @@ import { ActionName } from '@/onebot/action/router'; import { OB11GroupFile, OB11GroupFileFolder } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - file_count: actionType.number().default(50), + group_id: z.coerce.string(), + file_count: z.coerce.number().default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index 6052c1b7..480daa8d 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -4,11 +4,10 @@ import { OB11Construct } from '@/onebot/helper/data'; import { ActionName } from '@/onebot/action/router'; import { calcQQLevel } from '@/common/helper'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - user_id: actionType.string(), - no_cache: actionType.boolean().default(false), + user_id: z.coerce.string(), + no_cache: z.coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index 18013147..0f4d4424 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - url: actionType.string(), + url: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index 27831852..f828306a 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -1,13 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - friend_id: actionType.string().optional(), - user_id: actionType.string().optional(), - temp_block: actionType.boolean().optional(), - temp_both_del: actionType.boolean().optional(), + friend_id: z.coerce.string().optional(), + user_id: z.coerce.string().optional(), + temp_block: z.coerce.boolean().optional(), + temp_both_del: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index 962cf137..ea791d3e 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -1,9 +1,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - model: actionType.string(), + model: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SendGroupNotice.ts b/src/onebot/action/go-cqhttp/SendGroupNotice.ts index b3b6a795..e51c2355 100644 --- a/src/onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/src/onebot/action/go-cqhttp/SendGroupNotice.ts @@ -3,16 +3,16 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { unlink } from 'node:fs/promises'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - content: actionType.string(), - image: actionType.string().optional(), - pinned: actionType.number().default(0), - type: actionType.number().default(1), - confirm_required: actionType.number().default(1), - is_show_edit_card: actionType.number().default(0), - tip_window_type: actionType.number().default(0), + group_id: z.coerce.string(), + content: z.coerce.string(), + image: z.coerce.string().optional(), + pinned: z.coerce.number().default(0), + type: z.coerce.number().default(1), + confirm_required: z.coerce.number().default(1), + is_show_edit_card: z.coerce.number().default(0), + tip_window_type: z.coerce.number().default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index b009f267..5c9e7091 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -4,10 +4,9 @@ import { checkFileExistV2, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; -import { actionType } from '../type'; const SchemaData = z.object({ - file: actionType.string(), - group_id: actionType.string() + file: z.coerce.string(), + group_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index f61872e9..e7832fbc 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -2,11 +2,11 @@ import { NTQQUserApi } from '@/core/apis'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - nickname: actionType.string(), - personal_note: actionType.string().optional(), - sex: actionType.string().optional(), // 传Sex值?建议传0 + nickname: z.coerce.string(), + personal_note: z.coerce.string().optional(), + sex: z.coerce.string().optional(), // 传Sex值?建议传0 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index 3381f198..32f63065 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -5,13 +5,13 @@ import fs from 'fs'; import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - file: actionType.string(), - name: actionType.string(), - folder: actionType.string().optional(), - folder_id: actionType.string().optional(),//临时扩展 + group_id: z.coerce.string(), + file: z.coerce.string(), + name: z.coerce.string(), + folder: z.coerce.string().optional(), + folder_id: z.coerce.string().optional(),//临时扩展 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index 6d53fda6..83379916 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -6,11 +6,11 @@ import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - user_id: actionType.string(), - file: actionType.string(), - name: actionType.string(), + user_id: z.coerce.string(), + file: z.coerce.string(), + name: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index 1d108bec..5f6490cc 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -2,9 +2,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - message_id: actionType.string(), + message_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index 7ec4de9c..11d23234 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -1,10 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - notice_id: actionType.string() + group_id: z.coerce.string(), + notice_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index 58d40b1d..8837551f 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - character: actionType.string(), - group_id: actionType.string(), - text: actionType.string(), + character: z.coerce.string(), + group_id: z.coerce.string(), + text: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 0176994e..9b46eb40 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -5,9 +5,9 @@ import { MessageUnique } from '@/common/message-unique'; import crypto from 'crypto'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index 9a24c3c0..d9695061 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -3,9 +3,9 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupList.ts b/src/onebot/action/group/GetGroupList.ts index 98f7d407..0b219646 100644 --- a/src/onebot/action/group/GetGroupList.ts +++ b/src/onebot/action/group/GetGroupList.ts @@ -3,10 +3,9 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - no_cache: actionType.boolean().default(false), + no_cache: z.coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index 0aa72dde..79f9c4e7 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -3,12 +3,11 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - no_cache: actionType.boolean().default(false), + group_id: z.coerce.string(), + user_id: z.coerce.string(), + no_cache: z.coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 746efbaa..6e0aac63 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -4,11 +4,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; import { GroupMember } from '@/core'; -import { actionType } from '../type'; const SchemaData = z.object({ - group_id: actionType.string(), - no_cache: actionType.boolean().default(false) + group_id: z.coerce.string(), + no_cache: z.coerce.boolean().default(false) }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index 89f30a32..50dd50b5 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -2,7 +2,6 @@ import { WebApiGroupNoticeFeed } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; interface GroupNotice { sender_id: number; publish_time: number; @@ -18,7 +17,7 @@ interface GroupNotice { } const SchemaData = z.object({ - group_id: actionType.string(), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index 3133b412..ba24fea1 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -2,9 +2,9 @@ import { ShutUpGroupMember } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), + group_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index 09d958e5..a0efd74f 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -1,10 +1,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), + group_id: z.coerce.string(), + user_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index bb1c85fd..d845e793 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -2,11 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - character: actionType.string(), - group_id: actionType.string(), - text: actionType.string(), + character: z.coerce.string(), + group_id: z.coerce.string(), + text: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetEssenceMsg.ts b/src/onebot/action/group/SetEssenceMsg.ts index de3c7f43..80b7df56 100644 --- a/src/onebot/action/group/SetEssenceMsg.ts +++ b/src/onebot/action/group/SetEssenceMsg.ts @@ -2,9 +2,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - message_id: actionType.string(), + message_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index f0ced956..a2fcb662 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -2,12 +2,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupRequestOperateTypes } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - flag: actionType.string(), - approve: actionType.boolean().default(true), - reason: actionType.string().nullable().default(' '), + flag: z.coerce.string(), + approve: z.coerce.boolean().default(true), + reason: z.coerce.string().nullable().default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index 4067b4ff..d9e91397 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -2,12 +2,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupMemberRole } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - enable: actionType.boolean().default(false), + group_id: z.coerce.string(), + user_id: z.coerce.string(), + enable: z.coerce.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index e4fe3c03..cb146e9d 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - duration: actionType.number().default(0), + group_id: z.coerce.string(), + user_id: z.coerce.string(), + duration: z.coerce.number().default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index 870af15f..a3a61ee5 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -1,11 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - card: actionType.string().optional(), + group_id: z.coerce.string(), + user_id: z.coerce.string(), + card: z.coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index a394b9c8..9aa31341 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -1,12 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - group_id: actionType.string(), - user_id: actionType.string(), - reject_add_request: actionType.boolean().optional(), + group_id: z.coerce.string(), + user_id: z.coerce.string(), + reject_add_request: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index a21c890e..a830ad78 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -1,11 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - group_id: actionType.string(), - is_dismiss: actionType.boolean().optional(), + group_id: z.coerce.string(), + is_dismiss: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index b1949b45..4b70af1a 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -2,10 +2,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - group_id: actionType.string(), - group_name: actionType.string(), + group_id: z.coerce.string(), + group_name: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index e35b85b8..06b16a27 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -1,11 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - group_id: actionType.string(), - enable: actionType.boolean().optional(), + group_id: z.coerce.string(), + enable: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index 3d88c5a8..87f38743 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -2,10 +2,9 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - message_id: actionType.string(), + message_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index 3497a40c..a737b8ab 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -3,11 +3,11 @@ import { ChatType, Peer } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - message_id: actionType.string(), - group_id: actionType.string().optional(), - user_id: actionType.string().optional(), + message_id: z.coerce.string(), + group_id: z.coerce.string().optional(), + user_id: z.coerce.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index 347b1502..83095c89 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -5,11 +5,11 @@ import { MessageUnique } from '@/common/message-unique'; import { RawMessage } from '@/core'; import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { actionType } from '../type'; + export type ReturnDataType = OB11Message const SchemaData = z.object({ - message_id: actionType.string(), + message_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index fcb8e271..7bb6f9eb 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -3,11 +3,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; + const SchemaData = z.object({ - user_id: actionType.string().optional(), - group_id: actionType.string().optional(), - message_id: actionType.string().optional(), + user_id: z.coerce.string().optional(), + group_id: z.coerce.string().optional(), + message_id: z.coerce.string().optional(), }); type PlayloadType = z.infer; diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index b71983ef..9d2c5bb0 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -2,12 +2,11 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - message_id: actionType.string(), - emoji_id: actionType.string(), - set: actionType.boolean().optional(), + message_id: z.coerce.string(), + emoji_id: z.coerce.string(), + set: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/packet/SendPoke.ts b/src/onebot/action/packet/SendPoke.ts index dcd9da64..02e06c90 100644 --- a/src/onebot/action/packet/SendPoke.ts +++ b/src/onebot/action/packet/SendPoke.ts @@ -1,11 +1,10 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - group_id: actionType.string().optional(), - user_id: actionType.string(), + group_id: z.coerce.string().optional(), + user_id: z.coerce.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/system/GetCredentials.ts b/src/onebot/action/system/GetCredentials.ts index 07228128..0d6a72fb 100644 --- a/src/onebot/action/system/GetCredentials.ts +++ b/src/onebot/action/system/GetCredentials.ts @@ -1,7 +1,6 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; interface Response { cookies: string, @@ -9,7 +8,7 @@ interface Response { } const SchemaData = z.object({ - domain: actionType.string() + domain: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/type.ts b/src/onebot/action/type.ts deleted file mode 100644 index f480fda0..00000000 --- a/src/onebot/action/type.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { z } from "zod"; - -const boolean = () => z.preprocess( - val => typeof val === 'string' && val.toLowerCase() === 'false' ? false : Boolean(val), - z.boolean() -); -const number = () => z.preprocess( - val => typeof val !== 'number' ? Number(val) : val, - z.number() -); -const string = () => z.preprocess( - val => typeof val !== 'string' ? String(val) : val, - z.string() -); -export const actionType = { boolean, number, string }; \ No newline at end of file diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index 68493c94..3eccae07 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -1,10 +1,9 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - user_id: actionType.string() + user_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetCookies.ts b/src/onebot/action/user/GetCookies.ts index 60c34424..82df5bcc 100644 --- a/src/onebot/action/user/GetCookies.ts +++ b/src/onebot/action/user/GetCookies.ts @@ -1,14 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; interface Response { cookies: string, bkn: string } const SchemaData = z.object({ - domain: actionType.string() + domain: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index 74cc6815..e804bf1c 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -3,10 +3,9 @@ import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - no_cache: actionType.boolean().optional(), + no_cache: z.coerce.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetRecentContact.ts b/src/onebot/action/user/GetRecentContact.ts index 8a551b54..b79d7aec 100644 --- a/src/onebot/action/user/GetRecentContact.ts +++ b/src/onebot/action/user/GetRecentContact.ts @@ -3,10 +3,9 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { NetworkAdapterConfig } from '@/onebot/config/config'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - count: actionType.number().default(10), + count: z.coerce.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 5ac5078e..4804184b 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -1,11 +1,10 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - times: actionType.number().default(1), - user_id: actionType.string() + times: z.coerce.number().default(1), + user_id: z.coerce.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index 3fb71e18..ef1fa7fb 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -1,12 +1,11 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; -import { actionType } from '../type'; const SchemaData = z.object({ - flag: actionType.string(), - approve: actionType.boolean().default(true), - remark: actionType.string().nullable().optional() + flag: z.coerce.string(), + approve: z.coerce.boolean().default(true), + remark: z.coerce.string().nullable().optional() }); type Payload = z.infer; diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index 7ee9d3b7..9a9b8a00 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,72 +1,71 @@ import { z } from 'zod'; -import { actionType } from '../action/type'; const HttpServerConfigSchema = z.object({ - name: actionType.string().default('http-server'), - enable: actionType.boolean().default(false), - port: actionType.number().default(3000), - host: actionType.string().default('0.0.0.0'), - enableCors: actionType.boolean().default(true), - enableWebsocket: actionType.boolean().default(true), - messagePostFormat: actionType.string().default('array'), - token: actionType.string().default(''), - debug: actionType.boolean().default(false) + name: z.coerce.string().default('http-server'), + enable: z.coerce.boolean().default(false), + port: z.coerce.number().default(3000), + host: z.coerce.string().default('0.0.0.0'), + enableCors: z.coerce.boolean().default(true), + enableWebsocket: z.coerce.boolean().default(true), + messagePostFormat: z.coerce.string().default('array'), + token: z.coerce.string().default(''), + debug: z.coerce.boolean().default(false) }); const HttpSseServerConfigSchema = z.object({ - name: actionType.string().default('http-sse-server'), - enable: actionType.boolean().default(false), - port: actionType.number().default(3000), - host: actionType.string().default('0.0.0.0'), - enableCors: actionType.boolean().default(true), - enableWebsocket: actionType.boolean().default(true), - messagePostFormat: actionType.string().default('array'), - token: actionType.string().default(''), - debug: actionType.boolean().default(false), - reportSelfMessage: actionType.boolean().default(false) + name: z.coerce.string().default('http-sse-server'), + enable: z.coerce.boolean().default(false), + port: z.coerce.number().default(3000), + host: z.coerce.string().default('0.0.0.0'), + enableCors: z.coerce.boolean().default(true), + enableWebsocket: z.coerce.boolean().default(true), + messagePostFormat: z.coerce.string().default('array'), + token: z.coerce.string().default(''), + debug: z.coerce.boolean().default(false), + reportSelfMessage: z.coerce.boolean().default(false) }); const HttpClientConfigSchema = z.object({ - name: actionType.string().default('http-client'), - enable: actionType.boolean().default(false), - url: actionType.string().default('http://localhost:8080'), - messagePostFormat: actionType.string().default('array'), - reportSelfMessage: actionType.boolean().default(false), - token: actionType.string().default(''), - debug: actionType.boolean().default(false) + name: z.coerce.string().default('http-client'), + enable: z.coerce.boolean().default(false), + url: z.coerce.string().default('http://localhost:8080'), + messagePostFormat: z.coerce.string().default('array'), + reportSelfMessage: z.coerce.boolean().default(false), + token: z.coerce.string().default(''), + debug: z.coerce.boolean().default(false) }); const WebsocketServerConfigSchema = z.object({ - name: actionType.string().default('websocket-server'), - enable: actionType.boolean().default(false), - host: actionType.string().default('0.0.0.0'), - port: actionType.number().default(3001), - messagePostFormat: actionType.string().default('array'), - reportSelfMessage: actionType.boolean().default(false), - token: actionType.string().default(''), - enableForcePushEvent: actionType.boolean().default(true), - debug: actionType.boolean().default(false), - heartInterval: actionType.number().default(30000) + name: z.coerce.string().default('websocket-server'), + enable: z.coerce.boolean().default(false), + host: z.coerce.string().default('0.0.0.0'), + port: z.coerce.number().default(3001), + messagePostFormat: z.coerce.string().default('array'), + reportSelfMessage: z.coerce.boolean().default(false), + token: z.coerce.string().default(''), + enableForcePushEvent: z.coerce.boolean().default(true), + debug: z.coerce.boolean().default(false), + heartInterval: z.coerce.number().default(30000) }); const WebsocketClientConfigSchema = z.object({ - name: actionType.string().default('websocket-client'), - enable: actionType.boolean().default(false), - url: actionType.string().default('ws://localhost:8082'), - messagePostFormat: actionType.string().default('array'), - reportSelfMessage: actionType.boolean().default(false), - reconnectInterval: actionType.number().default(5000), - token: actionType.string().default(''), - debug: actionType.boolean().default(false), - heartInterval: actionType.number().default(30000) + name: z.coerce.string().default('websocket-client'), + enable: z.coerce.boolean().default(false), + url: z.coerce.string().default('ws://localhost:8082'), + messagePostFormat: z.coerce.string().default('array'), + reportSelfMessage: z.coerce.boolean().default(false), + reconnectInterval: z.coerce.number().default(5000), + token: z.coerce.string().default(''), + debug: z.coerce.boolean().default(false), + heartInterval: z.coerce.number().default(30000) }); const PluginConfigSchema = z.object({ - name: actionType.string().default('plugin'), - enable: actionType.boolean().default(false), - messagePostFormat: actionType.string().default('array'), - reportSelfMessage: actionType.boolean().default(false), - debug: actionType.boolean().default(false), + name: z.coerce.string().default('plugin'), + enable: z.coerce.boolean().default(false), + messagePostFormat: z.coerce.string().default('array'), + reportSelfMessage: z.coerce.boolean().default(false), + debug: z.coerce.boolean().default(false), }); const NetworkConfigSchema = z.object({ @@ -80,9 +79,9 @@ const NetworkConfigSchema = z.object({ export const OneBotConfigSchema = z.object({ network: NetworkConfigSchema, - musicSignUrl: actionType.string().default(''), - enableLocalFile2Url: actionType.boolean().default(false), - parseMultMsg: actionType.boolean().default(false) + musicSignUrl: z.coerce.string().default(''), + enableLocalFile2Url: z.coerce.boolean().default(false), + parseMultMsg: z.coerce.boolean().default(false) }); export type OneBotConfig = z.infer; diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index ffaf6df1..06562859 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -4,14 +4,13 @@ import { resolve } from 'node:path'; import { deepMerge } from '../utils/object'; import { themeType } from '../types/theme'; import { z } from 'zod'; -import { actionType } from '@/onebot/action/type'; // 定义配置的类型 const WebUiConfigSchema = z.object({ - host: actionType.string().default('0.0.0.0'), - port: actionType.number().default(6099), - token: actionType.string().default('napcat'), - loginRate: actionType.number().default(10), - autoLoginAccount: actionType.string().default(''), + host: z.coerce.string().default('0.0.0.0'), + port: z.coerce.number().default(6099), + token: z.coerce.string().default('napcat'), + loginRate: z.coerce.number().default(10), + autoLoginAccount: z.coerce.string().default(''), theme: themeType, }); diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index d62d0821..dcbe3a47 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -1,10 +1,9 @@ -import { actionType } from '@/onebot/action/type'; import { z } from 'zod'; export const themeType = z.object( { - dark: z.record(actionType.string(), actionType.string()), - light: z.record(actionType.string(), actionType.string()), + dark: z.record(z.coerce.string(), z.coerce.string()), + light: z.record(z.coerce.string(), z.coerce.string()), } ).default({ dark: { From 2a4589e2682a4473031d57cf69b3ac4adde8a738 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: Sat, 19 Apr 2025 10:58:46 +0800 Subject: [PATCH 102/149] Revert "fix: checker" This reverts commit 941978b5783255a05b91e12d3d22b9c1794e91bd. --- src/onebot/action/extends/MoveGroupFile.ts | 2 +- src/onebot/action/extends/RenameGroupFile.ts | 2 +- src/onebot/action/extends/SetDiyOnlineStatus.ts | 4 ++-- src/onebot/action/extends/SetGroupSign.ts | 2 +- src/onebot/action/extends/SetInputStatus.ts | 2 +- src/onebot/action/extends/SetOnlineStatus.ts | 6 +++--- src/onebot/action/extends/SetSpecialTitle.ts | 4 ++-- src/onebot/action/extends/ShareContact.ts | 6 +++--- src/onebot/action/extends/TransGroupFile.ts | 2 +- src/onebot/action/file/GetGroupFileUrl.ts | 2 +- src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts | 2 +- src/onebot/action/go-cqhttp/DeleteGroupFile.ts | 2 +- src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts | 2 +- src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts | 6 +++--- src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts | 2 +- .../action/go-cqhttp/GetGroupFileSystemInfo.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts | 4 ++-- src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts | 2 +- src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts | 6 +++--- src/onebot/action/go-cqhttp/GetGroupRootFiles.ts | 4 ++-- src/onebot/action/go-cqhttp/GetStrangerInfo.ts | 2 +- src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 4 ++-- src/onebot/action/go-cqhttp/SendGroupNotice.ts | 12 ++++++------ src/onebot/action/go-cqhttp/SetGroupPortrait.ts | 2 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 2 +- src/onebot/action/go-cqhttp/UploadGroupFile.ts | 2 +- src/onebot/action/go-cqhttp/UploadPrivateFile.ts | 2 +- src/onebot/action/group/DelEssenceMsg.ts | 4 ++-- src/onebot/action/group/DelGroupNotice.ts | 2 +- src/onebot/action/group/GetAiRecord.ts | 2 +- src/onebot/action/group/GetGroupEssence.ts | 2 +- src/onebot/action/group/GetGroupInfo.ts | 2 +- src/onebot/action/group/GetGroupMemberInfo.ts | 4 ++-- src/onebot/action/group/GetGroupMemberList.ts | 2 +- src/onebot/action/group/GetGroupNotice.ts | 2 +- src/onebot/action/group/GetGroupShutList.ts | 2 +- src/onebot/action/group/GroupPoke.ts | 4 ++-- src/onebot/action/group/SendGroupAiRecord.ts | 2 +- src/onebot/action/group/SetEssenceMsg.ts | 2 +- src/onebot/action/group/SetGroupAddRequest.ts | 4 ++-- src/onebot/action/group/SetGroupAdmin.ts | 4 ++-- src/onebot/action/group/SetGroupBan.ts | 6 +++--- src/onebot/action/group/SetGroupCard.ts | 4 ++-- src/onebot/action/group/SetGroupKick.ts | 6 +++--- src/onebot/action/group/SetGroupLeave.ts | 2 +- src/onebot/action/group/SetGroupName.ts | 2 +- src/onebot/action/group/SetGroupWholeBan.ts | 4 ++-- src/onebot/action/msg/DeleteMsg.ts | 2 +- src/onebot/action/msg/ForwardSingleMsg.ts | 2 +- src/onebot/action/msg/GetMsg.ts | 4 ++-- src/onebot/action/msg/MarkMsgAsRead.ts | 6 +++--- src/onebot/action/msg/SetMsgEmojiLike.ts | 4 ++-- src/onebot/action/packet/SendPoke.ts | 4 ++-- src/onebot/action/user/FriendPoke.ts | 2 +- src/onebot/action/user/SendLike.ts | 4 ++-- src/onebot/action/user/SetFriendAddRequest.ts | 6 +++--- 56 files changed, 93 insertions(+), 93 deletions(-) diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index 05c92220..7e8e6f89 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), file_id: z.coerce.string(), current_parent_directory: z.coerce.string(), target_parent_directory: z.coerce.string(), diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index 06bb1f48..918bcfd2 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), file_id: z.coerce.string(), current_parent_directory: z.coerce.string(), new_name: z.coerce.string(), diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index df36e0be..c7962d62 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - face_id: z.coerce.string(),// 参考 face_config.json 的 QSid - face_type: z.coerce.string().default('1'), + face_id: z.union([z.coerce.number(), z.coerce.string()]),// 参考 face_config.json 的 QSid + face_type: z.union([z.coerce.number(), z.coerce.string()]).default('1'), wording: z.coerce.string().default(' '), }); diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index 3d22da22..67687b34 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index 76324901..397957e6 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -4,7 +4,7 @@ import { ChatType } from '@/core'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.coerce.string(), + user_id: z.union([z.coerce.number(), z.coerce.string()]), event_type: z.coerce.number(), }); diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index 10101b9a..53051824 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - status: z.coerce.number(), - ext_status: z.coerce.number(), - battery_status: z.coerce.number(), + status: z.union([z.coerce.number(), z.coerce.string()]), + ext_status: z.union([z.coerce.number(), z.coerce.string()]), + battery_status: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index 2665a373..88c81e4f 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -3,8 +3,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), special_title: z.coerce.string().default(''), }); diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index d1419683..6194b445 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -4,8 +4,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.coerce.string().optional(), - group_id: z.coerce.string().optional(), + user_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), + group_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), phoneNumber: z.coerce.string().default(''), }); @@ -29,7 +29,7 @@ export class SharePeer extends OneBotAction; diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index 2c1da8c9..c7b1f7bf 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), file_id: z.coerce.string(), }); diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index ea475659..f191a112 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), file_id: z.coerce.string(), }); diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index f1f4c8ff..900e7b74 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), folder_name: z.coerce.string(), }); diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index 54b5ff6f..80c71247 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -6,7 +6,7 @@ import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), file_id: z.coerce.string(), }); diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 44c7767e..94e5ade5 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -4,7 +4,7 @@ import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), folder_id: z.coerce.string().optional(), folder: z.coerce.string().optional(), }); diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index 08500dee..1a585561 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -10,9 +10,9 @@ interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - user_id: z.coerce.string(), - message_seq: z.coerce.string().optional(), - count: z.coerce.number().default(20), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + message_seq: z.union([z.coerce.number(), z.coerce.string()]).optional(), + count: z.union([z.coerce.number(), z.coerce.string()]).default(20), reverseOrder: z.coerce.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index c5ff5d3c..cad70698 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string() + group_id: z.union([z.coerce.number(), z.coerce.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 7f9cc99f..81e78e27 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string() + group_id: z.union([z.coerce.number(), z.coerce.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index f0431963..e366fef3 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -5,10 +5,10 @@ import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), folder_id: z.coerce.string().optional(), folder: z.coerce.string().optional(), - file_count: z.coerce.number().default(50), + file_count: z.union([z.coerce.number(), z.coerce.string()]).default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index 9f30542a..749b9412 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), type: z.nativeEnum(WebHonorType).optional() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index f9328d7f..fff77c91 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -11,9 +11,9 @@ interface Response { } const SchemaData = z.object({ - group_id: z.coerce.string(), - message_seq: z.coerce.string().optional(), - count: z.coerce.number().default(20), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + message_seq: z.union([z.coerce.number(), z.coerce.string()]).optional(), + count: z.union([z.coerce.number(), z.coerce.string()]).default(20), reverseOrder: z.coerce.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index 9604e804..737d54ec 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -6,8 +6,8 @@ import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - file_count: z.coerce.number().default(50), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + file_count: z.union([z.coerce.number(), z.coerce.string()]).default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index 480daa8d..e0faf91d 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -6,7 +6,7 @@ import { calcQQLevel } from '@/common/helper'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.coerce.string(), + user_id: z.union([z.coerce.number(), z.coerce.string()]), no_cache: z.coerce.boolean().default(false), }); diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index f828306a..3643e5d2 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - friend_id: z.coerce.string().optional(), - user_id: z.coerce.string().optional(), + friend_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), + user_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), temp_block: z.coerce.boolean().optional(), temp_both_del: z.coerce.boolean().optional(), }); diff --git a/src/onebot/action/go-cqhttp/SendGroupNotice.ts b/src/onebot/action/go-cqhttp/SendGroupNotice.ts index e51c2355..b8df9c9c 100644 --- a/src/onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/src/onebot/action/go-cqhttp/SendGroupNotice.ts @@ -5,14 +5,14 @@ import { unlink } from 'node:fs/promises'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), content: z.coerce.string(), image: z.coerce.string().optional(), - pinned: z.coerce.number().default(0), - type: z.coerce.number().default(1), - confirm_required: z.coerce.number().default(1), - is_show_edit_card: z.coerce.number().default(0), - tip_window_type: z.coerce.number().default(0), + pinned: z.union([z.coerce.number(), z.coerce.string()]).default(0), + type: z.union([z.coerce.number(), z.coerce.string()]).default(1), + confirm_required: z.union([z.coerce.number(), z.coerce.string()]).default(1), + is_show_edit_card: z.union([z.coerce.number(), z.coerce.string()]).default(0), + tip_window_type: z.union([z.coerce.number(), z.coerce.string()]).default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index 5c9e7091..c82b11b2 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -6,7 +6,7 @@ import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; const SchemaData = z.object({ file: z.coerce.string(), - group_id: z.coerce.string() + group_id: z.union([z.coerce.number(), z.coerce.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index e7832fbc..40ca8fe3 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -6,7 +6,7 @@ import { z } from 'zod'; const SchemaData = z.object({ nickname: z.coerce.string(), personal_note: z.coerce.string().optional(), - sex: z.coerce.string().optional(), // 传Sex值?建议传0 + sex: z.union([z.coerce.number(), z.coerce.string()]).optional(), // 传Sex值?建议传0 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index 32f63065..e9903f0f 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -7,7 +7,7 @@ import { SendMessageContext } from '@/onebot/api'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), file: z.coerce.string(), name: z.coerce.string(), folder: z.coerce.string().optional(), diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index 83379916..f43a3223 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -8,7 +8,7 @@ import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.coerce.string(), + user_id: z.union([z.coerce.number(), z.coerce.string()]), file: z.coerce.string(), name: z.coerce.string(), }); diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index 5f6490cc..644e5dbf 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.coerce.string(), + message_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; @@ -16,7 +16,7 @@ export default class DelEssenceMsg extends OneBotAction { const msg = MessageUnique.getMsgIdAndPeerByShortId(+payload.message_id); if (!msg) { const data = this.core.apis.GroupApi.essenceLRU.getValue(+payload.message_id); - if (!data) throw new Error('消息不存在'); + 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 }; return await this.core.apis.GroupApi.removeGroupEssenceBySeq(group_id, msg_seq, msg_random); } diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index 11d23234..5668414c 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), notice_id: z.coerce.string() }); diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index 8837551f..86deeca0 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -5,7 +5,7 @@ import { z } from 'zod'; const SchemaData = z.object({ character: z.coerce.string(), - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), text: z.coerce.string(), }); diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 9b46eb40..4f284e6f 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -7,7 +7,7 @@ import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index d9695061..1b8a3e64 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -5,7 +5,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index 79f9c4e7..ac14e3a9 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -5,8 +5,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), no_cache: z.coerce.boolean().default(false), }); diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 6e0aac63..3afca128 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -6,7 +6,7 @@ import { z } from 'zod'; import { GroupMember } from '@/core'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), no_cache: z.coerce.boolean().default(false) }); diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index 50dd50b5..2a1cf2cf 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -17,7 +17,7 @@ interface GroupNotice { } const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index ba24fea1..e48d25ae 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index a0efd74f..084effb1 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -3,8 +3,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index d845e793..88ed5118 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -5,7 +5,7 @@ import { z } from 'zod'; const SchemaData = z.object({ character: z.coerce.string(), - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), text: z.coerce.string(), }); diff --git a/src/onebot/action/group/SetEssenceMsg.ts b/src/onebot/action/group/SetEssenceMsg.ts index 80b7df56..998f3e0b 100644 --- a/src/onebot/action/group/SetEssenceMsg.ts +++ b/src/onebot/action/group/SetEssenceMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.coerce.string(), + message_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index a2fcb662..1bae2c48 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - flag: z.coerce.string(), + flag: z.union([z.coerce.string(), z.coerce.number()]), approve: z.coerce.boolean().default(true), - reason: z.coerce.string().nullable().default(' '), + reason: z.union([z.coerce.string(), z.null()]).default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index d9e91397..97afba3b 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -4,8 +4,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), enable: z.coerce.boolean().default(false), }); diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index cb146e9d..37fe0484 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), - duration: z.coerce.number().default(0), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + duration: z.union([z.coerce.number(), z.coerce.string()]).default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index a3a61ee5..1d4e59ca 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), card: z.coerce.string().optional(), }); diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index 9aa31341..98fa39e8 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - user_id: z.coerce.string(), - reject_add_request: z.coerce.boolean().optional(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + user_id: z.union([z.coerce.number(), z.coerce.string()]), + reject_add_request: z.union([z.coerce.boolean(), z.coerce.string()]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index a830ad78..3cf7cd31 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), is_dismiss: z.coerce.boolean().optional(), }); diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index 4b70af1a..61ebc27c 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), group_name: z.coerce.string(), }); diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index 06b16a27..75ce019c 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - enable: z.coerce.boolean().optional(), + group_id: z.union([z.coerce.number(), z.coerce.string()]), + enable: z.union([z.coerce.boolean(), z.coerce.string()]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index 87f38743..e6a345d7 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.coerce.string(), + message_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index a737b8ab..b2a5f940 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -5,7 +5,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.coerce.string(), + message_id: z.union([z.coerce.number(), z.coerce.string()]), group_id: z.coerce.string().optional(), user_id: z.coerce.string().optional(), }); diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index 83095c89..da324844 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -9,7 +9,7 @@ import { NetworkAdapterConfig } from '@/onebot/config/config'; export type ReturnDataType = OB11Message const SchemaData = z.object({ - message_id: z.coerce.string(), + message_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; @@ -29,7 +29,7 @@ class GetMsg extends OneBotAction { } const peer = { guildId: '', peerUid: msgIdWithPeer?.Peer.peerUid, chatType: msgIdWithPeer.Peer.chatType }; const orimsg = this.obContext.recallMsgCache.get(msgIdWithPeer.MsgId); - let msg: RawMessage | undefined; + let msg: RawMessage|undefined; if (orimsg) { msg = orimsg; } else { diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index 7bb6f9eb..65506445 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -5,9 +5,9 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.coerce.string().optional(), - group_id: z.coerce.string().optional(), - message_id: z.coerce.string().optional(), + user_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), + group_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), + message_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), }); type PlayloadType = z.infer; diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index 9d2c5bb0..7f4e173a 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -4,8 +4,8 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.coerce.string(), - emoji_id: z.coerce.string(), + message_id: z.union([z.coerce.number(), z.coerce.string()]), + emoji_id: z.union([z.coerce.number(), z.coerce.string()]), set: z.coerce.boolean().optional(), }); diff --git a/src/onebot/action/packet/SendPoke.ts b/src/onebot/action/packet/SendPoke.ts index 02e06c90..c362cc8f 100644 --- a/src/onebot/action/packet/SendPoke.ts +++ b/src/onebot/action/packet/SendPoke.ts @@ -3,8 +3,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string().optional(), - user_id: z.coerce.string(), + group_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), + user_id: z.union([z.coerce.number(), z.coerce.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index 3eccae07..625eaa16 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -3,7 +3,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.coerce.string() + user_id: z.union([z.coerce.number(), z.coerce.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 4804184b..215d2440 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - times: z.coerce.number().default(1), - user_id: z.coerce.string() + times: z.union([z.coerce.number(), z.coerce.string()]).default(1), + user_id: z.union([z.coerce.number(), z.coerce.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index ef1fa7fb..070901c9 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - flag: z.coerce.string(), - approve: z.coerce.boolean().default(true), - remark: z.coerce.string().nullable().optional() + flag: z.union([z.coerce.string(), z.coerce.number()]), + approve: z.union([z.coerce.string(), z.coerce.boolean()]).default(true), + remark: z.union([z.coerce.string(), z.null()]).nullable().optional() }); type Payload = z.infer; From d3a27ad701bf0fea37c53518d4b0e295d71c2b2f 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: Sat, 19 Apr 2025 10:58:56 +0800 Subject: [PATCH 103/149] Revert "fix:coerce" This reverts commit dd895d7c177825d9395ebbdc79926fa4133f3e8d. --- src/core/helper/config.ts | 14 +-- .../extends/ClickInlineKeyboardButton.ts | 10 +- src/onebot/action/extends/CreateCollection.ts | 4 +- src/onebot/action/extends/FetchCustomFace.ts | 2 +- src/onebot/action/extends/FetchEmojiLike.ts | 8 +- src/onebot/action/extends/GetAiCharacters.ts | 4 +- .../action/extends/GetCollectionList.ts | 4 +- src/onebot/action/extends/GetGroupInfoEx.ts | 2 +- src/onebot/action/extends/GetMiniAppArk.ts | 44 ++++---- src/onebot/action/extends/GetProfileLike.ts | 6 +- src/onebot/action/extends/GetUserStatus.ts | 2 +- src/onebot/action/extends/MoveGroupFile.ts | 8 +- src/onebot/action/extends/OCRImage.ts | 2 +- src/onebot/action/extends/RenameGroupFile.ts | 8 +- src/onebot/action/extends/SendPacket.ts | 6 +- .../action/extends/SetDiyOnlineStatus.ts | 6 +- src/onebot/action/extends/SetGroupRemark.ts | 4 +- src/onebot/action/extends/SetGroupSign.ts | 2 +- src/onebot/action/extends/SetInputStatus.ts | 4 +- src/onebot/action/extends/SetLongNick.ts | 2 +- src/onebot/action/extends/SetOnlineStatus.ts | 6 +- src/onebot/action/extends/SetQQAvatar.ts | 2 +- src/onebot/action/extends/SetSpecialTitle.ts | 6 +- src/onebot/action/extends/ShareContact.ts | 8 +- src/onebot/action/extends/TransGroupFile.ts | 4 +- .../action/extends/TranslateEnWordToZn.ts | 2 +- src/onebot/action/file/GetFile.ts | 4 +- src/onebot/action/file/GetGroupFileUrl.ts | 4 +- src/onebot/action/file/GetPrivateFileUrl.ts | 2 +- .../action/go-cqhttp/CreateGroupFileFolder.ts | 4 +- .../action/go-cqhttp/DeleteGroupFile.ts | 4 +- .../action/go-cqhttp/DeleteGroupFileFolder.ts | 6 +- src/onebot/action/go-cqhttp/DownloadFile.ts | 8 +- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 4 +- .../action/go-cqhttp/GetFriendMsgHistory.ts | 8 +- .../action/go-cqhttp/GetGroupAtAllRemain.ts | 2 +- .../go-cqhttp/GetGroupFileSystemInfo.ts | 2 +- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 8 +- .../action/go-cqhttp/GetGroupHonorInfo.ts | 2 +- .../action/go-cqhttp/GetGroupMsgHistory.ts | 8 +- .../action/go-cqhttp/GetGroupRootFiles.ts | 4 +- .../action/go-cqhttp/GetStrangerInfo.ts | 4 +- .../go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 2 +- .../action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 8 +- .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 2 +- .../action/go-cqhttp/SendGroupNotice.ts | 16 +-- .../action/go-cqhttp/SetGroupPortrait.ts | 4 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 6 +- .../action/go-cqhttp/UploadGroupFile.ts | 10 +- .../action/go-cqhttp/UploadPrivateFile.ts | 6 +- src/onebot/action/group/DelEssenceMsg.ts | 2 +- src/onebot/action/group/DelGroupNotice.ts | 4 +- src/onebot/action/group/GetAiRecord.ts | 6 +- src/onebot/action/group/GetGroupEssence.ts | 2 +- src/onebot/action/group/GetGroupInfo.ts | 2 +- src/onebot/action/group/GetGroupList.ts | 2 +- src/onebot/action/group/GetGroupMemberInfo.ts | 6 +- src/onebot/action/group/GetGroupMemberList.ts | 4 +- src/onebot/action/group/GetGroupNotice.ts | 2 +- src/onebot/action/group/GetGroupShutList.ts | 2 +- src/onebot/action/group/GroupPoke.ts | 4 +- src/onebot/action/group/SendGroupAiRecord.ts | 6 +- src/onebot/action/group/SetEssenceMsg.ts | 2 +- src/onebot/action/group/SetGroupAddRequest.ts | 6 +- src/onebot/action/group/SetGroupAdmin.ts | 6 +- src/onebot/action/group/SetGroupBan.ts | 6 +- src/onebot/action/group/SetGroupCard.ts | 6 +- src/onebot/action/group/SetGroupKick.ts | 6 +- src/onebot/action/group/SetGroupLeave.ts | 4 +- src/onebot/action/group/SetGroupName.ts | 4 +- src/onebot/action/group/SetGroupWholeBan.ts | 4 +- src/onebot/action/msg/DeleteMsg.ts | 2 +- src/onebot/action/msg/ForwardSingleMsg.ts | 6 +- src/onebot/action/msg/GetMsg.ts | 2 +- src/onebot/action/msg/MarkMsgAsRead.ts | 6 +- src/onebot/action/msg/SetMsgEmojiLike.ts | 6 +- src/onebot/action/packet/SendPoke.ts | 4 +- src/onebot/action/system/GetCredentials.ts | 2 +- src/onebot/action/user/FriendPoke.ts | 2 +- src/onebot/action/user/GetCookies.ts | 2 +- src/onebot/action/user/GetFriendList.ts | 2 +- src/onebot/action/user/GetRecentContact.ts | 2 +- src/onebot/action/user/SendLike.ts | 4 +- src/onebot/action/user/SetFriendAddRequest.ts | 6 +- src/onebot/config/config.ts | 106 +++++++++--------- src/onebot/index.ts | 3 +- src/webui/src/helper/config.ts | 10 +- src/webui/src/types/theme.ts | 4 +- 88 files changed, 276 insertions(+), 277 deletions(-) diff --git a/src/core/helper/config.ts b/src/core/helper/config.ts index 94cfbeb5..6c230056 100644 --- a/src/core/helper/config.ts +++ b/src/core/helper/config.ts @@ -3,13 +3,13 @@ import { NapCatCore } from '@/core'; import { z } from 'zod'; export const NapcatConfigSchema = z.object({ - fileLog: z.coerce.boolean().default(false), - consoleLog: z.coerce.boolean().default(true), - fileLogLevel: z.coerce.string().default('debug'), - consoleLogLevel: z.coerce.string().default('info'), - packetBackend: z.coerce.string().default('auto'), - packetServer: z.coerce.string().default(''), - o3HookMode: z.coerce.number().default(0), + fileLog: z.boolean().default(false), + consoleLog: z.boolean().default(true), + fileLogLevel: z.string().default('debug'), + consoleLogLevel: z.string().default('info'), + packetBackend: z.string().default('auto'), + packetServer: z.string().default(''), + o3HookMode: z.number().default(0), }); export type NapcatConfig = z.infer; diff --git a/src/onebot/action/extends/ClickInlineKeyboardButton.ts b/src/onebot/action/extends/ClickInlineKeyboardButton.ts index c06947cf..4e7983f3 100644 --- a/src/onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/src/onebot/action/extends/ClickInlineKeyboardButton.ts @@ -3,11 +3,11 @@ import { OneBotAction } from '../OneBotAction'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - bot_appid: z.coerce.string(), - button_id: z.coerce.string().default(''), - callback_data: z.coerce.string().default(''), - msg_seq: z.coerce.string().default('10086'), + group_id: z.string(), + bot_appid: z.string(), + button_id: z.string().default(''), + callback_data: z.string().default(''), + msg_seq: z.string().default('10086'), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/CreateCollection.ts b/src/onebot/action/extends/CreateCollection.ts index e1c5903b..ee682241 100644 --- a/src/onebot/action/extends/CreateCollection.ts +++ b/src/onebot/action/extends/CreateCollection.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - rawData: z.coerce.string(), - brief: z.coerce.string(), + rawData: z.string(), + brief: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchCustomFace.ts b/src/onebot/action/extends/FetchCustomFace.ts index cd7d7645..78b1800d 100644 --- a/src/onebot/action/extends/FetchCustomFace.ts +++ b/src/onebot/action/extends/FetchCustomFace.ts @@ -3,7 +3,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; const SchemaData = z.object({ - count: z.coerce.number().default(48), + count: z.number().default(48), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/FetchEmojiLike.ts b/src/onebot/action/extends/FetchEmojiLike.ts index 11505d9a..83749d0e 100644 --- a/src/onebot/action/extends/FetchEmojiLike.ts +++ b/src/onebot/action/extends/FetchEmojiLike.ts @@ -5,10 +5,10 @@ import { MessageUnique } from '@/common/message-unique'; import { type NTQQMsgApi } from '@/core/apis'; const SchemaData = z.object({ - message_id: z.coerce.string(), - emojiId: z.coerce.string(), - emojiType: z.coerce.string(), - count: z.coerce.number().default(20), + message_id: z.string(), + emojiId: z.string(), + emojiType: z.string(), + count: z.number().default(20), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetAiCharacters.ts b/src/onebot/action/extends/GetAiCharacters.ts index e2f2045a..f889e76d 100644 --- a/src/onebot/action/extends/GetAiCharacters.ts +++ b/src/onebot/action/extends/GetAiCharacters.ts @@ -4,8 +4,8 @@ import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - chat_type: z.coerce.number().default(1), + group_id: z.string(), + chat_type: z.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetCollectionList.ts b/src/onebot/action/extends/GetCollectionList.ts index 4399c349..47fb9c4e 100644 --- a/src/onebot/action/extends/GetCollectionList.ts +++ b/src/onebot/action/extends/GetCollectionList.ts @@ -4,8 +4,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - category: z.coerce.number(), - count: z.coerce.number().default(1), + category: z.number(), + count: z.number().default(1), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetGroupInfoEx.ts b/src/onebot/action/extends/GetGroupInfoEx.ts index 4dcd05ee..b38f92f8 100644 --- a/src/onebot/action/extends/GetGroupInfoEx.ts +++ b/src/onebot/action/extends/GetGroupInfoEx.ts @@ -2,7 +2,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), + group_id: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetMiniAppArk.ts b/src/onebot/action/extends/GetMiniAppArk.ts index 699d6661..e4d3c1c5 100644 --- a/src/onebot/action/extends/GetMiniAppArk.ts +++ b/src/onebot/action/extends/GetMiniAppArk.ts @@ -7,30 +7,30 @@ import { z } from 'zod'; const SchemaData = z.union([ z.object({ type: z.union([z.literal('bili'), z.literal('weibo')]), - title: z.coerce.string(), - desc: z.coerce.string(), - picUrl: z.coerce.string(), - jumpUrl: z.coerce.string(), - webUrl: z.coerce.string().optional(), - rawArkData: z.coerce.string().optional() + title: z.string(), + desc: z.string(), + picUrl: z.string(), + jumpUrl: z.string(), + webUrl: z.string().optional(), + rawArkData: z.string().optional() }), z.object({ - title: z.coerce.string(), - desc: z.coerce.string(), - picUrl: z.coerce.string(), - jumpUrl: z.coerce.string(), - iconUrl: z.coerce.string(), - webUrl: z.coerce.string().optional(), - appId: z.coerce.string(), - scene: z.union([z.coerce.number(), z.coerce.string()]), - templateType: z.union([z.coerce.number(), z.coerce.string()]), - businessType: z.union([z.coerce.number(), z.coerce.string()]), - verType: z.union([z.coerce.number(), z.coerce.string()]), - shareType: z.union([z.coerce.number(), z.coerce.string()]), - versionId: z.coerce.string(), - sdkId: z.coerce.string(), - withShareTicket: z.union([z.coerce.number(), z.coerce.string()]), - rawArkData: z.coerce.string().optional() + title: z.string(), + desc: z.string(), + picUrl: z.string(), + jumpUrl: z.string(), + iconUrl: z.string(), + webUrl: z.string().optional(), + appId: z.string(), + scene: z.union([z.number(), z.string()]), + templateType: z.union([z.number(), z.string()]), + businessType: z.union([z.number(), z.string()]), + verType: z.union([z.number(), z.string()]), + shareType: z.union([z.number(), z.string()]), + versionId: z.string(), + sdkId: z.string(), + withShareTicket: z.union([z.number(), z.string()]), + rawArkData: z.string().optional() }) ]); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index 7e727a7a..e9b75812 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.coerce.string().optional(), - start: z.coerce.number().default(0), - count: z.coerce.number().default(10), + user_id: z.string().optional(), + start: z.number().default(0), + count: z.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/GetUserStatus.ts b/src/onebot/action/extends/GetUserStatus.ts index 7fe274e8..c090cc3a 100644 --- a/src/onebot/action/extends/GetUserStatus.ts +++ b/src/onebot/action/extends/GetUserStatus.ts @@ -3,7 +3,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.coerce.number(), + user_id: z.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index 7e8e6f89..31856e09 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -4,10 +4,10 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - file_id: z.coerce.string(), - current_parent_directory: z.coerce.string(), - target_parent_directory: z.coerce.string(), + group_id: z.union([z.number(), z.string()]), + file_id: z.string(), + current_parent_directory: z.string(), + target_parent_directory: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/OCRImage.ts b/src/onebot/action/extends/OCRImage.ts index d3dd45a8..73776de8 100644 --- a/src/onebot/action/extends/OCRImage.ts +++ b/src/onebot/action/extends/OCRImage.ts @@ -6,7 +6,7 @@ import { z } from 'zod'; import { GeneralCallResultStatus } from '@/core'; const SchemaData = z.object({ - image: z.coerce.string(), + image: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index 918bcfd2..69b4e9f6 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -4,10 +4,10 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - file_id: z.coerce.string(), - current_parent_directory: z.coerce.string(), - new_name: z.coerce.string(), + group_id: z.union([z.number(), z.string()]), + file_id: z.string(), + current_parent_directory: z.string(), + new_name: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SendPacket.ts b/src/onebot/action/extends/SendPacket.ts index ac23b9c4..a43b894e 100644 --- a/src/onebot/action/extends/SendPacket.ts +++ b/src/onebot/action/extends/SendPacket.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - cmd: z.coerce.string(), - data: z.coerce.string(), - rsp: z.coerce.boolean().default(true), + cmd: z.string(), + data: z.string(), + rsp: z.boolean().default(true), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index c7962d62..2c1110ac 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - face_id: z.union([z.coerce.number(), z.coerce.string()]),// 参考 face_config.json 的 QSid - face_type: z.union([z.coerce.number(), z.coerce.string()]).default('1'), - wording: z.coerce.string().default(' '), + face_id: z.union([z.number(), z.string()]),// 参考 face_config.json 的 QSid + face_type: z.union([z.number(), z.string()]).default('1'), + wording: z.string().default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupRemark.ts b/src/onebot/action/extends/SetGroupRemark.ts index a6e5edaf..cd26beb3 100644 --- a/src/onebot/action/extends/SetGroupRemark.ts +++ b/src/onebot/action/extends/SetGroupRemark.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.coerce.string(), - remark: z.coerce.string(), + group_id: z.string(), + remark: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index 67687b34..9bc0775a 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index 397957e6..df8cfef5 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -4,8 +4,8 @@ import { ChatType } from '@/core'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]), - event_type: z.coerce.number(), + user_id: z.union([z.number(), z.string()]), + event_type: z.number(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetLongNick.ts b/src/onebot/action/extends/SetLongNick.ts index be68fea2..4403d607 100644 --- a/src/onebot/action/extends/SetLongNick.ts +++ b/src/onebot/action/extends/SetLongNick.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - longNick: z.coerce.string(), + longNick: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index 53051824..999ee261 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - status: z.union([z.coerce.number(), z.coerce.string()]), - ext_status: z.union([z.coerce.number(), z.coerce.string()]), - battery_status: z.union([z.coerce.number(), z.coerce.string()]), + status: z.union([z.number(), z.string()]), + ext_status: z.union([z.number(), z.string()]), + battery_status: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetQQAvatar.ts b/src/onebot/action/extends/SetQQAvatar.ts index eee209c8..5fb8b50f 100644 --- a/src/onebot/action/extends/SetQQAvatar.ts +++ b/src/onebot/action/extends/SetQQAvatar.ts @@ -5,7 +5,7 @@ import { checkFileExist, uriToLocalFile } from '@/common/file'; import { z } from 'zod'; const SchemaData = z.object({ - file: z.coerce.string(), + file: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index 88c81e4f..6193f2e2 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -3,9 +3,9 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), - special_title: z.coerce.string().default(''), + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + special_title: z.string().default(''), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index 6194b445..edf18ecb 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), - group_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), - phoneNumber: z.coerce.string().default(''), + user_id: z.union([z.number(), z.string()]).optional(), + group_id: z.union([z.number(), z.string()]).optional(), + phoneNumber: z.string().default(''), }); type Payload = z.infer; @@ -29,7 +29,7 @@ export class SharePeer extends OneBotAction; diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index c7b1f7bf..746c190d 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -4,8 +4,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - file_id: z.coerce.string(), + group_id: z.union([z.number(), z.string()]), + file_id: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index bc4977b2..7d360652 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - words: z.array(z.coerce.string()), + words: z.array(z.string()), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetFile.ts b/src/onebot/action/file/GetFile.ts index 8d373676..d2d87fa1 100644 --- a/src/onebot/action/file/GetFile.ts +++ b/src/onebot/action/file/GetFile.ts @@ -14,8 +14,8 @@ export interface GetFileResponse { } const GetFileBase_PayloadSchema = z.object({ - file: z.coerce.string().optional(), - file_id: z.coerce.string().optional(), + file: z.string().optional(), + file_id: z.string().optional(), }); diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index f191a112..ebf28021 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -4,8 +4,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - file_id: z.coerce.string(), + group_id: z.union([z.number(), z.string()]), + file_id: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts index f2ea65e3..4504cc20 100644 --- a/src/onebot/action/file/GetPrivateFileUrl.ts +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -4,7 +4,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - file_id: z.coerce.string(), + file_id: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 900e7b74..4a0dea63 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - folder_name: z.coerce.string(), + group_id: z.union([z.number(), z.string()]), + folder_name: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index 80c71247..84343f54 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -6,8 +6,8 @@ import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - file_id: z.coerce.string(), + group_id: z.union([z.number(), z.string()]), + file_id: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 94e5ade5..6e12986b 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -4,9 +4,9 @@ import { z } from 'zod'; import { NTQQGroupApi } from '@/core/apis'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - folder_id: z.coerce.string().optional(), - folder: z.coerce.string().optional(), + group_id: z.union([z.number(), z.string()]), + folder_id: z.string().optional(), + folder: z.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/DownloadFile.ts b/src/onebot/action/go-cqhttp/DownloadFile.ts index a5fb7222..30e9685f 100644 --- a/src/onebot/action/go-cqhttp/DownloadFile.ts +++ b/src/onebot/action/go-cqhttp/DownloadFile.ts @@ -11,10 +11,10 @@ interface FileResponse { } const SchemaData = z.object({ - url: z.coerce.string().optional(), - base64: z.coerce.string().optional(), - name: z.coerce.string().optional(), - headers: z.union([z.coerce.string(), z.array(z.coerce.string())]).optional(), + url: z.string().optional(), + base64: z.string().optional(), + name: z.string().optional(), + headers: z.union([z.string(), z.array(z.string())]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index e85546fe..7cb5ac14 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -7,8 +7,8 @@ import { z } from 'zod'; import { isNumeric } from '@/common/helper'; const SchemaData = z.object({ - message_id: z.coerce.string().optional(), - id: z.coerce.string().optional(), + message_id: z.string().optional(), + id: z.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index 1a585561..de4044d5 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -10,10 +10,10 @@ interface Response { messages: OB11Message[]; } const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]), - message_seq: z.union([z.coerce.number(), z.coerce.string()]).optional(), - count: z.union([z.coerce.number(), z.coerce.string()]).default(20), - reverseOrder: z.coerce.boolean().default(false) + user_id: z.union([z.number(), z.string()]), + message_seq: z.union([z.number(), z.string()]).optional(), + count: z.union([z.number(), z.string()]).default(20), + reverseOrder: z.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index cad70698..28d63901 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]) + group_id: z.union([z.number(), z.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 81e78e27..8d966d35 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]) + group_id: z.union([z.number(), z.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts index e366fef3..5d08bafb 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFilesByFolder.ts @@ -5,10 +5,10 @@ import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - folder_id: z.coerce.string().optional(), - folder: z.coerce.string().optional(), - file_count: z.union([z.coerce.number(), z.coerce.string()]).default(50), + group_id: z.union([z.number(), z.string()]), + folder_id: z.string().optional(), + folder: z.string().optional(), + file_count: z.union([z.number(), z.string()]).default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index 749b9412..1194b67f 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.union([z.number(), z.string()]), type: z.nativeEnum(WebHonorType).optional() }); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index fff77c91..91cc93bd 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -11,10 +11,10 @@ interface Response { } const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - message_seq: z.union([z.coerce.number(), z.coerce.string()]).optional(), - count: z.union([z.coerce.number(), z.coerce.string()]).default(20), - reverseOrder: z.coerce.boolean().default(false) + group_id: z.union([z.number(), z.string()]), + message_seq: z.union([z.number(), z.string()]).optional(), + count: z.union([z.number(), z.string()]).default(20), + reverseOrder: z.boolean().default(false) }); diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index 737d54ec..b990aec8 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -6,8 +6,8 @@ import { OB11Construct } from '@/onebot/helper/data'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - file_count: z.union([z.coerce.number(), z.coerce.string()]).default(50), + group_id: z.union([z.number(), z.string()]), + file_count: z.union([z.number(), z.string()]).default(50), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts index e0faf91d..8ac5aae4 100644 --- a/src/onebot/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot/action/go-cqhttp/GetStrangerInfo.ts @@ -6,8 +6,8 @@ import { calcQQLevel } from '@/common/helper'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]), - no_cache: z.coerce.boolean().default(false), + user_id: z.union([z.number(), z.string()]), + no_cache: z.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index 0f4d4424..dfded410 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - url: z.coerce.string(), + url: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index 3643e5d2..e7ce50c4 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -3,10 +3,10 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - friend_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), - user_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), - temp_block: z.coerce.boolean().optional(), - temp_both_del: z.coerce.boolean().optional(), + friend_id: z.union([z.string(), z.number()]).optional(), + user_id: z.union([z.string(), z.number()]).optional(), + temp_block: z.boolean().optional(), + temp_both_del: z.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index ea791d3e..1e839fe3 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - model: z.coerce.string(), + model: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SendGroupNotice.ts b/src/onebot/action/go-cqhttp/SendGroupNotice.ts index b8df9c9c..4f81313a 100644 --- a/src/onebot/action/go-cqhttp/SendGroupNotice.ts +++ b/src/onebot/action/go-cqhttp/SendGroupNotice.ts @@ -5,14 +5,14 @@ import { unlink } from 'node:fs/promises'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - content: z.coerce.string(), - image: z.coerce.string().optional(), - pinned: z.union([z.coerce.number(), z.coerce.string()]).default(0), - type: z.union([z.coerce.number(), z.coerce.string()]).default(1), - confirm_required: z.union([z.coerce.number(), z.coerce.string()]).default(1), - is_show_edit_card: z.union([z.coerce.number(), z.coerce.string()]).default(0), - tip_window_type: z.union([z.coerce.number(), z.coerce.string()]).default(0), + group_id: z.union([z.number(), z.string()]), + content: z.string(), + image: z.string().optional(), + pinned: z.union([z.number(), z.string()]).default(0), + type: z.union([z.number(), z.string()]).default(1), + confirm_required: z.union([z.number(), z.string()]).default(1), + is_show_edit_card: z.union([z.number(), z.string()]).default(0), + tip_window_type: z.union([z.number(), z.string()]).default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index c82b11b2..765c9897 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -5,8 +5,8 @@ import { z } from 'zod'; import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; const SchemaData = z.object({ - file: z.coerce.string(), - group_id: z.union([z.coerce.number(), z.coerce.string()]) + file: z.string(), + group_id: z.union([z.number(), z.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index 40ca8fe3..c85e4aa4 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - nickname: z.coerce.string(), - personal_note: z.coerce.string().optional(), - sex: z.union([z.coerce.number(), z.coerce.string()]).optional(), // 传Sex值?建议传0 + nickname: z.string(), + personal_note: z.string().optional(), + sex: z.union([z.number(), z.string()]).optional(), // 传Sex值?建议传0 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index e9903f0f..39327cde 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -7,11 +7,11 @@ import { SendMessageContext } from '@/onebot/api'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - file: z.coerce.string(), - name: z.coerce.string(), - folder: z.coerce.string().optional(), - folder_id: z.coerce.string().optional(),//临时扩展 + group_id: z.union([z.number(), z.string()]), + file: z.string(), + name: z.string(), + folder: z.string().optional(), + folder_id: z.string().optional(),//临时扩展 }); type Payload = z.infer; diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index f43a3223..8cee2010 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -8,9 +8,9 @@ import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]), - file: z.coerce.string(), - name: z.coerce.string(), + user_id: z.union([z.number(), z.string()]), + file: z.string(), + name: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index 644e5dbf..b799b651 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), + message_id: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index 5668414c..bd2dae0a 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - notice_id: z.coerce.string() + group_id: z.union([z.number(), z.string()]), + notice_id: z.string() }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index 86deeca0..ba30f9d9 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -4,9 +4,9 @@ import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; const SchemaData = z.object({ - character: z.coerce.string(), - group_id: z.union([z.coerce.number(), z.coerce.string()]), - text: z.coerce.string(), + character: z.string(), + group_id: z.union([z.number(), z.string()]), + text: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 4f284e6f..9ce8c310 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -7,7 +7,7 @@ import { z } from 'zod'; import { NetworkAdapterConfig } from '@/onebot/config/config'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index 1b8a3e64..2bb5ff72 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -5,7 +5,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupList.ts b/src/onebot/action/group/GetGroupList.ts index 0b219646..5ed487b9 100644 --- a/src/onebot/action/group/GetGroupList.ts +++ b/src/onebot/action/group/GetGroupList.ts @@ -5,7 +5,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - no_cache: z.coerce.boolean().default(false), + no_cache: z.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index ac14e3a9..75834049 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -5,9 +5,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), - no_cache: z.coerce.boolean().default(false), + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + no_cache: z.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 3afca128..efd5073c 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -6,8 +6,8 @@ import { z } from 'zod'; import { GroupMember } from '@/core'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - no_cache: z.coerce.boolean().default(false) + group_id: z.union([z.number(), z.string()]), + no_cache: z.boolean().default(false) }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index 2a1cf2cf..317d712c 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -17,7 +17,7 @@ interface GroupNotice { } const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index e48d25ae..3e82f5e3 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -4,7 +4,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index 084effb1..c318211c 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -3,8 +3,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index 88ed5118..1e0c3a03 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -4,9 +4,9 @@ import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { z } from 'zod'; const SchemaData = z.object({ - character: z.coerce.string(), - group_id: z.union([z.coerce.number(), z.coerce.string()]), - text: z.coerce.string(), + character: z.string(), + group_id: z.union([z.number(), z.string()]), + text: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetEssenceMsg.ts b/src/onebot/action/group/SetEssenceMsg.ts index 998f3e0b..a75d27a3 100644 --- a/src/onebot/action/group/SetEssenceMsg.ts +++ b/src/onebot/action/group/SetEssenceMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), + message_id: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index 1bae2c48..8a5834e0 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - flag: z.union([z.coerce.string(), z.coerce.number()]), - approve: z.coerce.boolean().default(true), - reason: z.union([z.coerce.string(), z.null()]).default(' '), + flag: z.union([z.string(), z.number()]), + approve: z.boolean().default(true), + reason: z.union([z.string(), z.null()]).default(' '), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index 97afba3b..6ad18f06 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), - enable: z.coerce.boolean().default(false), + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + enable: z.boolean().default(false), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index 37fe0484..4312e628 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), - duration: z.union([z.coerce.number(), z.coerce.string()]).default(0), + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + duration: z.union([z.number(), z.string()]).default(0), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index 1d4e59ca..bd45f957 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), - card: z.coerce.string().optional(), + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + card: z.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index 98fa39e8..3967ad96 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - user_id: z.union([z.coerce.number(), z.coerce.string()]), - reject_add_request: z.union([z.coerce.boolean(), z.coerce.string()]).optional(), + group_id: z.union([z.number(), z.string()]), + user_id: z.union([z.number(), z.string()]), + reject_add_request: z.union([z.boolean(), z.string()]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index 3cf7cd31..6930af12 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - is_dismiss: z.coerce.boolean().optional(), + group_id: z.union([z.number(), z.string()]), + is_dismiss: z.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index 61ebc27c..d19e9782 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -4,8 +4,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - group_name: z.coerce.string(), + group_id: z.union([z.number(), z.string()]), + group_name: z.string(), }); type Payload = z.infer; diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index 75ce019c..dc1ee1a3 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]), - enable: z.union([z.coerce.boolean(), z.coerce.string()]).optional(), + group_id: z.union([z.number(), z.string()]), + enable: z.union([z.boolean(), z.string()]).optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index e6a345d7..9aa67a30 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -4,7 +4,7 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), + message_id: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index b2a5f940..bc2f5546 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -5,9 +5,9 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), - group_id: z.coerce.string().optional(), - user_id: z.coerce.string().optional(), + message_id: z.union([z.number(), z.string()]), + group_id: z.string().optional(), + user_id: z.string().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index da324844..28cc629a 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -9,7 +9,7 @@ import { NetworkAdapterConfig } from '@/onebot/config/config'; export type ReturnDataType = OB11Message const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), + message_id: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index 65506445..98f5a9cf 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -5,9 +5,9 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), - group_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), - message_id: z.union([z.coerce.string(), z.coerce.number()]).optional(), + user_id: z.union([z.string(), z.number()]).optional(), + group_id: z.union([z.string(), z.number()]).optional(), + message_id: z.union([z.string(), z.number()]).optional(), }); type PlayloadType = z.infer; diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index 7f4e173a..b7ddf580 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -4,9 +4,9 @@ import { MessageUnique } from '@/common/message-unique'; import { z } from 'zod'; const SchemaData = z.object({ - message_id: z.union([z.coerce.number(), z.coerce.string()]), - emoji_id: z.union([z.coerce.number(), z.coerce.string()]), - set: z.coerce.boolean().optional(), + message_id: z.union([z.number(), z.string()]), + emoji_id: z.union([z.number(), z.string()]), + set: z.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/packet/SendPoke.ts b/src/onebot/action/packet/SendPoke.ts index c362cc8f..7334219f 100644 --- a/src/onebot/action/packet/SendPoke.ts +++ b/src/onebot/action/packet/SendPoke.ts @@ -3,8 +3,8 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - group_id: z.union([z.coerce.number(), z.coerce.string()]).optional(), - user_id: z.union([z.coerce.number(), z.coerce.string()]), + group_id: z.union([z.number(), z.string()]).optional(), + user_id: z.union([z.number(), z.string()]), }); type Payload = z.infer; diff --git a/src/onebot/action/system/GetCredentials.ts b/src/onebot/action/system/GetCredentials.ts index 0d6a72fb..a8d50e16 100644 --- a/src/onebot/action/system/GetCredentials.ts +++ b/src/onebot/action/system/GetCredentials.ts @@ -8,7 +8,7 @@ interface Response { } const SchemaData = z.object({ - domain: z.coerce.string() + domain: z.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index 625eaa16..644763eb 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -3,7 +3,7 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { z } from 'zod'; const SchemaData = z.object({ - user_id: z.union([z.coerce.number(), z.coerce.string()]) + user_id: z.union([z.number(), z.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetCookies.ts b/src/onebot/action/user/GetCookies.ts index 82df5bcc..bc3e34e0 100644 --- a/src/onebot/action/user/GetCookies.ts +++ b/src/onebot/action/user/GetCookies.ts @@ -7,7 +7,7 @@ interface Response { } const SchemaData = z.object({ - domain: z.coerce.string() + domain: z.string() }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index e804bf1c..227ca12f 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -5,7 +5,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - no_cache: z.coerce.boolean().optional(), + no_cache: z.boolean().optional(), }); type Payload = z.infer; diff --git a/src/onebot/action/user/GetRecentContact.ts b/src/onebot/action/user/GetRecentContact.ts index b79d7aec..01b3fc0f 100644 --- a/src/onebot/action/user/GetRecentContact.ts +++ b/src/onebot/action/user/GetRecentContact.ts @@ -5,7 +5,7 @@ import { NetworkAdapterConfig } from '@/onebot/config/config'; import { z } from 'zod'; const SchemaData = z.object({ - count: z.coerce.number().default(10), + count: z.number().default(10), }); type Payload = z.infer; diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 215d2440..04b719c0 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -3,8 +3,8 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - times: z.union([z.coerce.number(), z.coerce.string()]).default(1), - user_id: z.union([z.coerce.number(), z.coerce.string()]) + times: z.union([z.number(), z.string()]).default(1), + user_id: z.union([z.number(), z.string()]) }); type Payload = z.infer; diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index 070901c9..72551a9e 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -3,9 +3,9 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - flag: z.union([z.coerce.string(), z.coerce.number()]), - approve: z.union([z.coerce.string(), z.coerce.boolean()]).default(true), - remark: z.union([z.coerce.string(), z.null()]).nullable().optional() + flag: z.union([z.string(), z.number()]), + approve: z.union([z.string(), z.boolean()]).default(true), + remark: z.union([z.string(), z.null()]).nullable().optional() }); type Payload = z.infer; diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index 9a9b8a00..ffc29339 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,71 +1,71 @@ import { z } from 'zod'; const HttpServerConfigSchema = z.object({ - name: z.coerce.string().default('http-server'), - enable: z.coerce.boolean().default(false), - port: z.coerce.number().default(3000), - host: z.coerce.string().default('0.0.0.0'), - enableCors: z.coerce.boolean().default(true), - enableWebsocket: z.coerce.boolean().default(true), - messagePostFormat: z.coerce.string().default('array'), - token: z.coerce.string().default(''), - debug: z.coerce.boolean().default(false) + name: z.string().default('http-server'), + enable: z.boolean().default(false), + port: z.number().default(3000), + host: z.string().default('0.0.0.0'), + enableCors: z.boolean().default(true), + enableWebsocket: z.boolean().default(true), + messagePostFormat: z.string().default('array'), + token: z.string().default(''), + debug: z.boolean().default(false) }); const HttpSseServerConfigSchema = z.object({ - name: z.coerce.string().default('http-sse-server'), - enable: z.coerce.boolean().default(false), - port: z.coerce.number().default(3000), - host: z.coerce.string().default('0.0.0.0'), - enableCors: z.coerce.boolean().default(true), - enableWebsocket: z.coerce.boolean().default(true), - messagePostFormat: z.coerce.string().default('array'), - token: z.coerce.string().default(''), - debug: z.coerce.boolean().default(false), - reportSelfMessage: z.coerce.boolean().default(false) + name: z.string().default('http-sse-server'), + enable: z.boolean().default(false), + port: z.number().default(3000), + host: z.string().default('0.0.0.0'), + enableCors: z.boolean().default(true), + enableWebsocket: z.boolean().default(true), + messagePostFormat: z.string().default('array'), + token: z.string().default(''), + debug: z.boolean().default(false), + reportSelfMessage: z.boolean().default(false) }); const HttpClientConfigSchema = z.object({ - name: z.coerce.string().default('http-client'), - enable: z.coerce.boolean().default(false), - url: z.coerce.string().default('http://localhost:8080'), - messagePostFormat: z.coerce.string().default('array'), - reportSelfMessage: z.coerce.boolean().default(false), - token: z.coerce.string().default(''), - debug: z.coerce.boolean().default(false) + name: z.string().default('http-client'), + enable: z.boolean().default(false), + url: z.string().default('http://localhost:8080'), + messagePostFormat: z.string().default('array'), + reportSelfMessage: z.boolean().default(false), + token: z.string().default(''), + debug: z.boolean().default(false) }); const WebsocketServerConfigSchema = z.object({ - name: z.coerce.string().default('websocket-server'), - enable: z.coerce.boolean().default(false), - host: z.coerce.string().default('0.0.0.0'), - port: z.coerce.number().default(3001), - messagePostFormat: z.coerce.string().default('array'), - reportSelfMessage: z.coerce.boolean().default(false), - token: z.coerce.string().default(''), - enableForcePushEvent: z.coerce.boolean().default(true), - debug: z.coerce.boolean().default(false), - heartInterval: z.coerce.number().default(30000) + name: z.string().default('websocket-server'), + enable: z.boolean().default(false), + host: z.string().default('0.0.0.0'), + port: z.number().default(3001), + messagePostFormat: z.string().default('array'), + reportSelfMessage: z.boolean().default(false), + token: z.string().default(''), + enableForcePushEvent: z.boolean().default(true), + debug: z.boolean().default(false), + heartInterval: z.number().default(30000) }); const WebsocketClientConfigSchema = z.object({ - name: z.coerce.string().default('websocket-client'), - enable: z.coerce.boolean().default(false), - url: z.coerce.string().default('ws://localhost:8082'), - messagePostFormat: z.coerce.string().default('array'), - reportSelfMessage: z.coerce.boolean().default(false), - reconnectInterval: z.coerce.number().default(5000), - token: z.coerce.string().default(''), - debug: z.coerce.boolean().default(false), - heartInterval: z.coerce.number().default(30000) + name: z.string().default('websocket-client'), + enable: z.boolean().default(false), + url: z.string().default('ws://localhost:8082'), + messagePostFormat: z.string().default('array'), + reportSelfMessage: z.boolean().default(false), + reconnectInterval: z.number().default(5000), + token: z.string().default(''), + debug: z.boolean().default(false), + heartInterval: z.number().default(30000) }); const PluginConfigSchema = z.object({ - name: z.coerce.string().default('plugin'), - enable: z.coerce.boolean().default(false), - messagePostFormat: z.coerce.string().default('array'), - reportSelfMessage: z.coerce.boolean().default(false), - debug: z.coerce.boolean().default(false), + name: z.string().default('plugin'), + enable: z.boolean().default(false), + messagePostFormat: z.string().default('array'), + reportSelfMessage: z.boolean().default(false), + debug: z.boolean().default(false), }); const NetworkConfigSchema = z.object({ @@ -79,9 +79,9 @@ const NetworkConfigSchema = z.object({ export const OneBotConfigSchema = z.object({ network: NetworkConfigSchema, - musicSignUrl: z.coerce.string().default(''), - enableLocalFile2Url: z.coerce.boolean().default(false), - parseMultMsg: z.coerce.boolean().default(false) + musicSignUrl: z.string().default(''), + enableLocalFile2Url: z.boolean().default(false), + parseMultMsg: z.boolean().default(false) }); export type OneBotConfig = z.infer; diff --git a/src/onebot/index.ts b/src/onebot/index.ts index b6a05962..4fb0089c 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -50,7 +50,6 @@ import { import { OB11Message } from './types'; import { IOB11NetworkAdapter } from '@/onebot/network/adapter'; import { OB11HttpSSEServerAdapter } from './network/http-server-sse'; -import { ZodType } from 'zod'; //OneBot实现类 export class NapCatOneBot11Adapter { @@ -67,7 +66,7 @@ export class NapCatOneBot11Adapter { constructor(core: NapCatCore, context: InstanceContext, pathWrapper: NapCatPathWrapper) { this.core = core; this.context = context; - this.configLoader = new OB11ConfigLoader(core, pathWrapper.configPath, OneBotConfigSchema as ZodType); + this.configLoader = new OB11ConfigLoader(core, pathWrapper.configPath, OneBotConfigSchema); this.apis = { GroupApi: new OneBotGroupApi(this, core), UserApi: new OneBotUserApi(this, core), diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index 06562859..d6455c68 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -6,11 +6,11 @@ import { themeType } from '../types/theme'; import { z } from 'zod'; // 定义配置的类型 const WebUiConfigSchema = z.object({ - host: z.coerce.string().default('0.0.0.0'), - port: z.coerce.number().default(6099), - token: z.coerce.string().default('napcat'), - loginRate: z.coerce.number().default(10), - autoLoginAccount: z.coerce.string().default(''), + host: z.string().default('0.0.0.0'), + port: z.number().default(6099), + token: z.string().default('napcat'), + loginRate: z.number().default(10), + autoLoginAccount: z.string().default(''), theme: themeType, }); diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index dcbe3a47..2c224023 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -2,8 +2,8 @@ import { z } from 'zod'; export const themeType = z.object( { - dark: z.record(z.coerce.string(), z.coerce.string()), - light: z.record(z.coerce.string(), z.coerce.string()), + dark: z.record(z.string(), z.string()), + light: z.record(z.string(), z.string()), } ).default({ dark: { From 3b16effff0598b4df51b777992b46df5b73c5907 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: Sat, 19 Apr 2025 10:59:04 +0800 Subject: [PATCH 104/149] Revert "fix" This reverts commit 40b06daf1e91b9dd483201d22863cab6934ea91f. --- src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts | 8 ++++++-- src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index de4044d5..a375296e 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -13,7 +13,7 @@ const SchemaData = z.object({ user_id: z.union([z.number(), z.string()]), message_seq: z.union([z.number(), z.string()]).optional(), count: z.union([z.number(), z.string()]).default(20), - reverseOrder: z.boolean().default(false) + reverseOrder: z.union([z.boolean(), z.string()]).optional() }); @@ -26,14 +26,18 @@ export default class GetFriendMsgHistory extends OneBotAction async _handle(payload: Payload, _adapter: string, config: NetworkAdapterConfig): Promise { //处理参数 const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); + + const isReverseOrder = typeof payload.reverseOrder === 'string' ? payload.reverseOrder === 'true' : !!payload.reverseOrder; if (!uid) throw new Error(`记录${payload.user_id}不存在`); const friend = await this.core.apis.FriendApi.isBuddy(uid); const peer = { chatType: friend ? ChatType.KCHATTYPEC2C : ChatType.KCHATTYPETEMPC2CFROMGROUP, peerUid: uid }; const hasMessageSeq = !payload.message_seq ? !!payload.message_seq : !(payload.message_seq?.toString() === '' || payload.message_seq?.toString() === '0'); const startMsgId = hasMessageSeq ? (MessageUnique.getMsgIdAndPeerByShortId(+payload.message_seq!)?.MsgId ?? payload.message_seq!.toString()) : '0'; const msgList = hasMessageSeq ? - (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, payload.reverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; + (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, isReverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; if (msgList.length === 0) throw new Error(`消息${payload.message_seq}不存在`); + //翻转消息 + if (isReverseOrder) msgList.reverse(); //转换序号 await Promise.all(msgList.map(async msg => { msg.id = MessageUnique.createUniqueMsgId({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index 91cc93bd..5eed6ff5 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -14,7 +14,7 @@ const SchemaData = z.object({ group_id: z.union([z.number(), z.string()]), message_seq: z.union([z.number(), z.string()]).optional(), count: z.union([z.number(), z.string()]).default(20), - reverseOrder: z.boolean().default(false) + reverseOrder: z.union([z.boolean(), z.string()]).optional() }); @@ -26,13 +26,17 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction { + //处理参数 + const isReverseOrder = typeof payload.reverseOrder === 'string' ? payload.reverseOrder === 'true' : !!payload.reverseOrder; 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'); //拉取消息 const startMsgId = hasMessageSeq ? (MessageUnique.getMsgIdAndPeerByShortId(+payload.message_seq!)?.MsgId ?? payload.message_seq!.toString()) : '0'; const msgList = hasMessageSeq ? - (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, payload.reverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; + (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, isReverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; if (msgList.length === 0) throw new Error(`消息${payload.message_seq}不存在`); + //翻转消息 + if (isReverseOrder) msgList.reverse(); //转换序号 await Promise.all(msgList.map(async msg => { msg.id = MessageUnique.createUniqueMsgId({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId); From 5c35ea11c3b89b9fc7ed7b7914cce51c05e6129a 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: Sat, 19 Apr 2025 11:01:06 +0800 Subject: [PATCH 105/149] =?UTF-8?q?Revert=20"fix:=20=E4=BF=AE=E6=8E=89?= =?UTF-8?q?=E6=BC=8F=E6=8E=89=E7=9A=84"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7a42f8c26ff429d27876d27dde62794f85b28663. --- src/onebot/action/extends/SetSpecialTitle.ts | 2 +- src/onebot/action/extends/TranslateEnWordToZn.ts | 2 +- src/webui/src/types/theme.ts | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index 6193f2e2..2efe2727 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -5,7 +5,7 @@ import { z } from 'zod'; const SchemaData = z.object({ group_id: z.union([z.number(), z.string()]), user_id: z.union([z.number(), z.string()]), - special_title: z.string().default(''), + special_title: z.string({ default: '' }), }); type Payload = z.infer; diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index 7d360652..46a59408 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { z } from 'zod'; const SchemaData = z.object({ - words: z.array(z.string()), + words: Type.Array(z.string()), }); type Payload = z.infer; diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index 2c224023..f265a0bc 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -2,6 +2,8 @@ import { z } from 'zod'; export const themeType = z.object( { + // dark: Type.Record(Type.String(), Type.String()), + // light: Type.Record(Type.String(), Type.String()), dark: z.record(z.string(), z.string()), light: z.record(z.string(), z.string()), } From 9f318ddaefa54c224a1e267474ced6ba3f7f1794 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: Sat, 19 Apr 2025 11:01:12 +0800 Subject: [PATCH 106/149] =?UTF-8?q?Revert=20"feat:=20=E5=8C=BA=E5=88=86res?= =?UTF-8?q?Id=E5=92=8C=E6=99=AE=E9=80=9A=E6=B6=88=E6=81=AFId"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7ecdd63befc63c64ee3fc32d9fbb156a8c2be098. --- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 68 +++++++++----------- 1 file changed, 29 insertions(+), 39 deletions(-) diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index 7cb5ac14..89e9cb60 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -4,11 +4,10 @@ import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; import { z } from 'zod'; -import { isNumeric } from '@/common/helper'; const SchemaData = z.object({ - message_id: z.string().optional(), - id: z.string().optional(), + message_id: z.union([z.number(), z.string()]).optional(), + id: z.union([z.number(), z.string()]).optional(), }); type Payload = z.infer; @@ -53,21 +52,19 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { + const fakeForwardMsg = (res_id: string) => { return { chatType: ChatType.KCHATTYPEGROUP, elements: [{ elementType: ElementType.MULTIFORWARD, elementId: '', multiForwardMsgElement: { - resId: resId, + resId: res_id, fileName: '', xmlContent: '', } @@ -98,9 +95,8 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { - const ob = (await this.obContext.apis.MsgApi.parseMessageV2(createFakeForwardMsg(resId)))?.arrayMsg; + const protocolFallbackLogic = async (res_id: string) => { + const ob = (await this.obContext.apis.MsgApi.parseMessageV2(fakeForwardMsg(res_id)))?.arrayMsg; if (ob) { return { messages: (ob?.message?.[0] as OB11MessageForward)?.data?.content @@ -108,37 +104,31 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction 0) { - const singleMsg = data.msgList[0]; - if (!singleMsg) { - throw new Error('消息不存在或已过期'); - } - // 6. 解析消息内容 - const resMsg = (await this.obContext.apis.MsgApi.parseMessageV2(singleMsg))?.arrayMsg; - - const forwardContent = (resMsg?.message?.[0] as OB11MessageForward)?.data?.content; - if (forwardContent) { - return { messages: forwardContent }; - } - } + if (!rootMsg) { + return await protocolFallbackLogic(msgId.toString()); } - // 说明消息已过期或者为内层消息 NapCat 一次返回不处理内层消息 - throw new Error('消息已过期或者为内层消息,无法获取转发消息'); + const data = await this.core.apis.MsgApi.getMsgsByMsgId(rootMsg.Peer, [rootMsg.MsgId]); + + if (!data || data.result !== 0) { + return await protocolFallbackLogic(msgId.toString()); + } + + const singleMsg = data.msgList[0]; + if (!singleMsg) { + return await protocolFallbackLogic(msgId.toString()); + } + const resMsg = (await this.obContext.apis.MsgApi.parseMessageV2(singleMsg))?.arrayMsg;//强制array 以便处理 + if (!(resMsg?.message?.[0] as OB11MessageForward)?.data?.content) { + return await protocolFallbackLogic(msgId.toString()); + } + return { + messages: (resMsg?.message?.[0] as OB11MessageForward)?.data?.content + }; + //} + + // return { message: resMsg }; } } From d921dcddf162c6fd3be17b9a6b9930b83a0f041b 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: Sat, 19 Apr 2025 11:01:45 +0800 Subject: [PATCH 107/149] Revert "package->dev" This reverts commit 45d6ebf08416a57aeb9607e7f1a8719b25943199. --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 7ea77cc1..a9511dca 100644 --- a/package.json +++ b/package.json @@ -58,12 +58,12 @@ "vite": "^6.0.1", "vite-plugin-cp": "^6.0.0", "vite-tsconfig-paths": "^5.1.0", - "winston": "^3.17.0", - "zod": "^3.24.2" + "winston": "^3.17.0" }, "dependencies": { "express": "^5.0.0", "silk-wasm": "^3.6.1", - "ws": "^8.18.0" + "ws": "^8.18.0", + "zod": "^3.24.2" } -} \ No newline at end of file +} From cd8698b157f5b0879c6d11190553b758b5122d23 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: Sat, 19 Apr 2025 11:03:03 +0800 Subject: [PATCH 108/149] fix --- package.json | 11 +- src/common/config-base.ts | 37 +- src/common/file.ts | 40 +- src/common/worker.ts | 2 +- src/core/apis/file.ts | 18 +- src/core/helper/config.ts | 25 +- src/core/types/webapi.ts | 2 +- src/onebot/action/OneBotAction.ts | 35 +- .../extends/ClickInlineKeyboardButton.ts | 19 +- src/onebot/action/extends/CreateCollection.ts | 10 +- src/onebot/action/extends/FetchCustomFace.ts | 8 +- src/onebot/action/extends/FetchEmojiLike.ts | 16 +- src/onebot/action/extends/GetAiCharacters.ts | 10 +- .../action/extends/GetCollectionList.ts | 10 +- src/onebot/action/extends/GetGroupInfoEx.ts | 10 +- src/onebot/action/extends/GetMiniAppArk.ts | 56 +- src/onebot/action/extends/GetProfileLike.ts | 12 +- .../extends/GetUnidirectionalFriendList.ts | 2 +- src/onebot/action/extends/GetUserStatus.ts | 10 +- src/onebot/action/extends/MoveGroupFile.ts | 14 +- src/onebot/action/extends/OCRImage.ts | 8 +- src/onebot/action/extends/RenameGroupFile.ts | 14 +- src/onebot/action/extends/SendPacket.ts | 15 +- .../action/extends/SetDiyOnlineStatus.ts | 12 +- src/onebot/action/extends/SetGroupRemark.ts | 10 +- src/onebot/action/extends/SetGroupSign.ts | 8 +- src/onebot/action/extends/SetInputStatus.ts | 10 +- src/onebot/action/extends/SetLongNick.ts | 8 +- src/onebot/action/extends/SetOnlineStatus.ts | 12 +- src/onebot/action/extends/SetQQAvatar.ts | 8 +- src/onebot/action/extends/SetSpecialTitle.ts | 12 +- src/onebot/action/extends/ShareContact.ts | 18 +- src/onebot/action/extends/TransGroupFile.ts | 10 +- .../action/extends/TranslateEnWordToZn.ts | 8 +- src/onebot/action/file/GetFile.ts | 10 +- src/onebot/action/file/GetGroupFileUrl.ts | 10 +- src/onebot/action/file/GetPrivateFileUrl.ts | 8 +- .../action/go-cqhttp/CreateGroupFileFolder.ts | 10 +- .../action/go-cqhttp/DeleteGroupFile.ts | 10 +- .../action/go-cqhttp/DeleteGroupFileFolder.ts | 12 +- src/onebot/action/go-cqhttp/DownloadFile.ts | 14 +- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 11 +- .../action/go-cqhttp/GetFriendMsgHistory.ts | 15 +- .../action/go-cqhttp/GetGroupAtAllRemain.ts | 8 +- .../go-cqhttp/GetGroupFileSystemInfo.ts | 8 +- .../action/go-cqhttp/GetGroupFilesByFolder.ts | 14 +- .../action/go-cqhttp/GetGroupHonorInfo.ts | 14 +- .../action/go-cqhttp/GetGroupMsgHistory.ts | 14 +- .../action/go-cqhttp/GetGroupRootFiles.ts | 10 +- .../action/go-cqhttp/GetStrangerInfo.ts | 10 +- .../go-cqhttp/GoCQHTTPCheckUrlSafely.ts | 8 +- .../action/go-cqhttp/GoCQHTTPDeleteFriend.ts | 14 +- .../action/go-cqhttp/GoCQHTTPGetModelShow.ts | 8 +- .../action/go-cqhttp/SendGroupNotice.ts | 22 +- .../action/go-cqhttp/SetGroupPortrait.ts | 10 +- src/onebot/action/go-cqhttp/SetQQProfile.ts | 12 +- .../action/go-cqhttp/UploadGroupFile.ts | 16 +- .../action/go-cqhttp/UploadPrivateFile.ts | 12 +- src/onebot/action/group/DelEssenceMsg.ts | 8 +- src/onebot/action/group/DelGroupNotice.ts | 10 +- src/onebot/action/group/GetAiRecord.ts | 12 +- src/onebot/action/group/GetGroupEssence.ts | 8 +- src/onebot/action/group/GetGroupInfo.ts | 8 +- src/onebot/action/group/GetGroupList.ts | 8 +- src/onebot/action/group/GetGroupMemberInfo.ts | 12 +- src/onebot/action/group/GetGroupMemberList.ts | 10 +- src/onebot/action/group/GetGroupNotice.ts | 8 +- src/onebot/action/group/GetGroupShutList.ts | 8 +- src/onebot/action/group/GroupPoke.ts | 10 +- src/onebot/action/group/SendGroupAiRecord.ts | 12 +- src/onebot/action/group/SetEssenceMsg.ts | 8 +- src/onebot/action/group/SetGroupAddRequest.ts | 12 +- src/onebot/action/group/SetGroupAdmin.ts | 12 +- src/onebot/action/group/SetGroupBan.ts | 12 +- src/onebot/action/group/SetGroupCard.ts | 12 +- src/onebot/action/group/SetGroupKick.ts | 12 +- src/onebot/action/group/SetGroupLeave.ts | 10 +- src/onebot/action/group/SetGroupName.ts | 10 +- src/onebot/action/group/SetGroupWholeBan.ts | 10 +- src/onebot/action/msg/DeleteMsg.ts | 8 +- src/onebot/action/msg/ForwardSingleMsg.ts | 12 +- src/onebot/action/msg/GetMsg.ts | 8 +- src/onebot/action/msg/MarkMsgAsRead.ts | 12 +- src/onebot/action/msg/SetMsgEmojiLike.ts | 12 +- src/onebot/action/packet/GetRkeyEx.ts | 2 +- src/onebot/action/packet/GetRkeyServer.ts | 2 +- src/onebot/action/packet/SendPoke.ts | 10 +- src/onebot/action/system/GetCredentials.ts | 8 +- src/onebot/action/user/FriendPoke.ts | 8 +- src/onebot/action/user/GetCookies.ts | 8 +- src/onebot/action/user/GetFriendList.ts | 8 +- src/onebot/action/user/GetRecentContact.ts | 8 +- src/onebot/action/user/SendLike.ts | 10 +- src/onebot/action/user/SetFriendAddRequest.ts | 12 +- src/onebot/api/msg.ts | 36 +- src/onebot/config/config.ts | 167 +++--- src/onebot/config/index.ts | 5 +- src/shell/base.ts | 2 +- src/webui/src/helper/config.ts | 24 +- src/webui/src/types/theme.ts | 514 +++++++++--------- 100 files changed, 931 insertions(+), 937 deletions(-) diff --git a/package.json b/package.json index a9511dca..f80b2434 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@napneko/nap-proto-core": "^0.0.4", "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/plugin-typescript": "^12.1.2", + "@sinclair/typebox": "^0.34.9", "@types/cors": "^2.8.17", "@types/express": "^5.0.0", "@types/multer": "^1.4.12", @@ -37,9 +38,9 @@ "@types/ws": "^8.5.12", "@typescript-eslint/eslint-plugin": "^8.3.0", "@typescript-eslint/parser": "^8.3.0", + "ajv": "^8.13.0", "async-mutex": "^0.5.0", "commander": "^13.0.0", - "compressing": "^1.10.1", "cors": "^2.8.5", "esbuild": "0.25.0", "eslint": "^9.14.0", @@ -52,18 +53,18 @@ "image-size": "^1.1.1", "json5": "^2.2.3", "multer": "^1.4.5-lts.1", - "napcat.protobuf": "^1.1.4", "typescript": "^5.3.3", "typescript-eslint": "^8.13.0", "vite": "^6.0.1", "vite-plugin-cp": "^6.0.0", "vite-tsconfig-paths": "^5.1.0", - "winston": "^3.17.0" + "napcat.protobuf": "^1.1.4", + "winston": "^3.17.0", + "compressing": "^1.10.1" }, "dependencies": { "express": "^5.0.0", "silk-wasm": "^3.6.1", - "ws": "^8.18.0", - "zod": "^3.24.2" + "ws": "^8.18.0" } } diff --git a/src/common/config-base.ts b/src/common/config-base.ts index ed5e5540..8f39a4b0 100644 --- a/src/common/config-base.ts +++ b/src/common/config-base.ts @@ -2,20 +2,22 @@ import path from 'node:path'; import fs from 'node:fs'; import type { NapCatCore } from '@/core'; import json5 from 'json5'; -import { z } from 'zod'; +import Ajv, { AnySchema, ValidateFunction } from 'ajv'; export abstract class ConfigBase { name: string; core: NapCatCore; configPath: string; configData: T = {} as T; - schema: z.ZodType; + ajv: Ajv; + validate: ValidateFunction; - protected constructor(name: string, core: NapCatCore, configPath: string, schema: z.ZodType) { + protected constructor(name: string, core: NapCatCore, configPath: string, ConfigSchema: AnySchema) { this.name = name; this.core = core; this.configPath = configPath; - this.schema = schema; + this.ajv = new Ajv({ useDefaults: true, coerceTypes: true }); + this.validate = this.ajv.compile(ConfigSchema); fs.mkdirSync(this.configPath, { recursive: true }); this.read(); } @@ -40,16 +42,11 @@ export abstract class ConfigBase { private loadConfig(configPath: string): T { try { - let configData = json5.parse(fs.readFileSync(configPath, 'utf-8')); - const result = this.schema.safeParse(configData); - - if (result.success) { - this.configData = result.data; - this.core.context.logger.logDebug(`[Core] [Config] 配置文件${configPath}加载`, this.configData); - return this.configData; - } else { - throw new Error(`配置文件验证失败: ${result.error.message}`); - } + let newConfigData = json5.parse(fs.readFileSync(configPath, 'utf-8')); + this.validate(newConfigData); + this.configData = newConfigData; + this.core.context.logger.logDebug(`[Core] [Config] 配置文件${configPath}加载`, this.configData); + return this.configData; } catch (e: unknown) { this.handleError(e, '读取配置文件时发生错误'); return {} as T; @@ -58,14 +55,10 @@ export abstract class ConfigBase { save(newConfigData: T = this.configData): void { const configPath = this.getConfigPath(this.core.selfInfo.uin); + this.validate(newConfigData); + this.configData = newConfigData; try { - const result = this.schema.safeParse(newConfigData); - if (result.success) { - this.configData = result.data; - fs.writeFileSync(configPath, JSON.stringify(this.configData, null, 2)); - } else { - throw new Error(`配置文件验证失败: ${result.error.message}`); - } + fs.writeFileSync(configPath, JSON.stringify(this.configData, null, 2)); } catch (e: unknown) { this.handleError(e, `保存配置文件 ${configPath} 时发生错误:`); } @@ -74,8 +67,6 @@ export abstract class ConfigBase { private handleError(e: unknown, message: string): void { if (e instanceof SyntaxError) { this.core.context.logger.logError('[Core] [Config] 操作配置文件格式错误,请检查配置文件:', e.message); - } else if (e instanceof z.ZodError) { - this.core.context.logger.logError('[Core] [Config] 配置文件验证错误:', e.message); } else { this.core.context.logger.logError(`[Core] [Config] ${message}:`, (e as Error).message); } diff --git a/src/common/file.ts b/src/common/file.ts index d323dac9..c75bcce4 100644 --- a/src/common/file.ts +++ b/src/common/file.ts @@ -182,28 +182,28 @@ export async function uriToLocalFile(dir: string, uri: string, filename: string const filePath = path.join(dir, filename); switch (UriType) { - case FileUriType.Local: { - const fileExt = path.extname(HandledUri); - const localFileName = path.basename(HandledUri, fileExt) + fileExt; - const tempFilePath = path.join(dir, filename + fileExt); - fs.copyFileSync(HandledUri, tempFilePath); - return { success: true, errMsg: '', fileName: localFileName, path: tempFilePath }; - } + case FileUriType.Local: { + const fileExt = path.extname(HandledUri); + const localFileName = path.basename(HandledUri, fileExt) + fileExt; + const tempFilePath = path.join(dir, filename + fileExt); + fs.copyFileSync(HandledUri, tempFilePath); + return { success: true, errMsg: '', fileName: localFileName, path: tempFilePath }; + } - case FileUriType.Remote: { - const buffer = await httpDownload({ url: HandledUri, headers: headers ?? {} }); - fs.writeFileSync(filePath, buffer); - return { success: true, errMsg: '', fileName: filename, path: filePath }; - } + case FileUriType.Remote: { + const buffer = await httpDownload({ url: HandledUri, headers: headers ?? {} }); + fs.writeFileSync(filePath, buffer); + return { success: true, errMsg: '', fileName: filename, path: filePath }; + } - case FileUriType.Base64: { - const base64 = HandledUri.replace(/^base64:\/\//, ''); - const base64Buffer = Buffer.from(base64, 'base64'); - fs.writeFileSync(filePath, base64Buffer); - return { success: true, errMsg: '', fileName: filename, path: filePath }; - } + case FileUriType.Base64: { + const base64 = HandledUri.replace(/^base64:\/\//, ''); + const base64Buffer = Buffer.from(base64, 'base64'); + fs.writeFileSync(filePath, base64Buffer); + return { success: true, errMsg: '', fileName: filename, path: filePath }; + } - default: - return { success: false, errMsg: `识别URL失败, uri= ${uri}`, fileName: '', path: '' }; + default: + return { success: false, errMsg: `识别URL失败, uri= ${uri}`, fileName: '', path: '' }; } } diff --git a/src/common/worker.ts b/src/common/worker.ts index 1e2bc0b7..da5c1321 100644 --- a/src/common/worker.ts +++ b/src/common/worker.ts @@ -9,7 +9,7 @@ export async function runTask(workerScript: string, taskData: T): Promise< console.error('Worker Log--->:', (result as { log: string }).log); } if ((result as any)?.error) { - reject(new Error('Worker error: ' + (result as { error: string }).error)); + reject(new Error("Worker error: " + (result as { error: string }).error)); } resolve(result); }); diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index 2f66490a..616ccb71 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -44,7 +44,7 @@ export class NTQQFileApi { 'https://secret-service.bietiaop.com/rkeys', 'http://ss.xingzhige.com/music_card/rkey', ], - this.context.logger + this.context.logger ); } @@ -308,18 +308,18 @@ export class NTQQFileApi { element.elementType === ElementType.FILE ) { switch (element.elementType) { - case ElementType.PIC: + case ElementType.PIC: element.picElement!.sourcePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.VIDEO: + break; + case ElementType.VIDEO: element.videoElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.PTT: + break; + case ElementType.PTT: element.pttElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.FILE: + break; + case ElementType.FILE: element.fileElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; + break; } elementIndex++; } diff --git a/src/core/helper/config.ts b/src/core/helper/config.ts index 6c230056..0c2540c1 100644 --- a/src/core/helper/config.ts +++ b/src/core/helper/config.ts @@ -1,21 +1,22 @@ import { ConfigBase } from '@/common/config-base'; import { NapCatCore } from '@/core'; -import { z } from 'zod'; +import { Type, Static } from '@sinclair/typebox'; +import { AnySchema } from 'ajv'; -export const NapcatConfigSchema = z.object({ - fileLog: z.boolean().default(false), - consoleLog: z.boolean().default(true), - fileLogLevel: z.string().default('debug'), - consoleLogLevel: z.string().default('info'), - packetBackend: z.string().default('auto'), - packetServer: z.string().default(''), - o3HookMode: z.number().default(0), +export const NapcatConfigSchema = Type.Object({ + fileLog: Type.Boolean({ default: false }), + consoleLog: Type.Boolean({ default: true }), + fileLogLevel: Type.String({ default: 'debug' }), + consoleLogLevel: Type.String({ default: 'info' }), + packetBackend: Type.String({ default: 'auto' }), + packetServer: Type.String({ default: '' }), + o3HookMode: Type.Number({ default: 0 }), }); -export type NapcatConfig = z.infer; +export type NapcatConfig = Static; export class NapCatConfigLoader extends ConfigBase { - constructor(core: NapCatCore, configPath: string, schema: z.ZodType) { + constructor(core: NapCatCore, configPath: string, schema: AnySchema) { super('napcat', core, configPath, schema); } -} \ No newline at end of file +} diff --git a/src/core/types/webapi.ts b/src/core/types/webapi.ts index c9771cba..c689d860 100644 --- a/src/core/types/webapi.ts +++ b/src/core/types/webapi.ts @@ -115,7 +115,7 @@ export interface GroupEssenceMsg { add_digest_uin: string; add_digest_nick: string; add_digest_time: number; - msg_content: { msg_type: number, text?: string, image_url?: string }[]; + msg_content: unknown[]; can_be_removed: true; } diff --git a/src/onebot/action/OneBotAction.ts b/src/onebot/action/OneBotAction.ts index 240ea5e8..818169e2 100644 --- a/src/onebot/action/OneBotAction.ts +++ b/src/onebot/action/OneBotAction.ts @@ -1,8 +1,9 @@ import { ActionName, BaseCheckResult } from './router'; +import Ajv, { ErrorObject, ValidateFunction } from 'ajv'; import { NapCatCore } from '@/core'; import { NapCatOneBot11Adapter, OB11Return } from '@/onebot'; import { NetworkAdapterConfig } from '../config/config'; -import { z } from 'zod'; +import { TSchema } from '@sinclair/typebox'; export class OB11Response { private static createResponse(data: T, status: string, retcode: number, message: string = '', echo: unknown = null): OB11Return { @@ -32,7 +33,8 @@ export class OB11Response { export abstract class OneBotAction { actionName: typeof ActionName[keyof typeof ActionName] = ActionName.Unknown; core: NapCatCore; - payloadSchema?: z.ZodType = undefined; + private validate?: ValidateFunction = undefined; + payloadSchema?: TSchema = undefined; obContext: NapCatOneBot11Adapter; constructor(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -40,30 +42,19 @@ export abstract class OneBotAction { this.core = core; } - protected async check(payload: unknown): Promise { - if (!this.payloadSchema) { - return { valid: true }; + protected async check(payload: PayloadType): Promise { + if (this.payloadSchema) { + this.validate = new Ajv({ allowUnionTypes: true, useDefaults: true, coerceTypes: true }).compile(this.payloadSchema); } - - try { - // 使用 zod 验证并转换数据 - this.payloadSchema.parse(payload); - return { valid: true }; - } catch (error) { - if (error instanceof z.ZodError) { - const errorMessages = error.errors.map(e => - `Key: ${e.path.join('.')}, Message: ${e.message}` - ); - return { - valid: false, - message: errorMessages.join('\n') || '未知错误', - }; - } + if (this.validate && !this.validate(payload)) { + const errors = this.validate.errors as ErrorObject[]; + const errorMessages = errors.map(e => `Key: ${e.instancePath.split('/').slice(1).join('.')}, Message: ${e.message}`); return { valid: false, - message: '验证过程中发生未知错误' + message: errorMessages.join('\n') ?? '未知错误', }; } + return { valid: true }; } public async handle(payload: PayloadType, adaptername: string, config: NetworkAdapterConfig): Promise> { @@ -95,4 +86,4 @@ export abstract class OneBotAction { } abstract _handle(payload: PayloadType, adaptername: string, config: NetworkAdapterConfig): Promise; -} \ No newline at end of file +} diff --git a/src/onebot/action/extends/ClickInlineKeyboardButton.ts b/src/onebot/action/extends/ClickInlineKeyboardButton.ts index 4e7983f3..f27acfb2 100644 --- a/src/onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/src/onebot/action/extends/ClickInlineKeyboardButton.ts @@ -1,15 +1,16 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '../OneBotAction'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.string(), - bot_appid: z.string(), - button_id: z.string().default(''), - callback_data: z.string().default(''), - msg_seq: z.string().default('10086'), +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' }), }); -type Payload = z.infer; + +type Payload = Static; export class ClickInlineKeyboardButton extends OneBotAction { override actionName = ActionName.ClickInlineKeyboardButton; @@ -24,6 +25,6 @@ export class ClickInlineKeyboardButton extends OneBotAction { callback_data: payload.callback_data, dmFlag: 0, chatType: 2 - }); + }) } } diff --git a/src/onebot/action/extends/CreateCollection.ts b/src/onebot/action/extends/CreateCollection.ts index ee682241..3f9c841f 100644 --- a/src/onebot/action/extends/CreateCollection.ts +++ b/src/onebot/action/extends/CreateCollection.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Type, Static } from '@sinclair/typebox'; -const SchemaData = z.object({ - rawData: z.string(), - brief: z.string(), +const SchemaData = Type.Object({ + rawData: Type.String(), + brief: Type.String(), }); -type Payload = z.infer; +type Payload = Static; export class CreateCollection extends OneBotAction { override actionName = ActionName.CreateCollection; diff --git a/src/onebot/action/extends/FetchCustomFace.ts b/src/onebot/action/extends/FetchCustomFace.ts index 78b1800d..f2850097 100644 --- a/src/onebot/action/extends/FetchCustomFace.ts +++ b/src/onebot/action/extends/FetchCustomFace.ts @@ -1,12 +1,12 @@ -import { z } from 'zod'; +import { Type, Static } from '@sinclair/typebox'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -const SchemaData = z.object({ - count: z.number().default(48), +const SchemaData = Type.Object({ + count: Type.Union([Type.Number(), Type.String()], { default: 48 }), }); -type Payload = z.infer; +type Payload = Static; export class FetchCustomFace extends OneBotAction { override actionName = ActionName.FetchCustomFace; diff --git a/src/onebot/action/extends/FetchEmojiLike.ts b/src/onebot/action/extends/FetchEmojiLike.ts index 83749d0e..39bab1a7 100644 --- a/src/onebot/action/extends/FetchEmojiLike.ts +++ b/src/onebot/action/extends/FetchEmojiLike.ts @@ -1,17 +1,17 @@ -import { z } from 'zod'; +import { Type, Static } from '@sinclair/typebox'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { type NTQQMsgApi } from '@/core/apis'; -const SchemaData = z.object({ - message_id: z.string(), - emojiId: z.string(), - emojiType: z.string(), - count: z.number().default(20), +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 }), }); -type Payload = z.infer; +type Payload = Static; export class FetchEmojiLike extends OneBotAction>> { override actionName = ActionName.FetchEmojiLike; @@ -23,7 +23,7 @@ export class FetchEmojiLike extends OneBotAction; +type Payload = Static; interface GetAiCharactersResponse { type: string; diff --git a/src/onebot/action/extends/GetCollectionList.ts b/src/onebot/action/extends/GetCollectionList.ts index 47fb9c4e..2de4305f 100644 --- a/src/onebot/action/extends/GetCollectionList.ts +++ b/src/onebot/action/extends/GetCollectionList.ts @@ -1,14 +1,14 @@ import { type NTQQCollectionApi } from '@/core/apis/collection'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Type, Static } from '@sinclair/typebox'; -const SchemaData = z.object({ - category: z.number(), - count: z.number().default(1), +const SchemaData = Type.Object({ + category: Type.Union([Type.Number(), Type.String()]), + count: Type.Union([Type.Union([Type.Number(), Type.String()])], { default: 1 }), }); -type Payload = z.infer; +type Payload = Static; export class GetCollectionList extends OneBotAction>> { override actionName = ActionName.GetCollectionList; diff --git a/src/onebot/action/extends/GetGroupInfoEx.ts b/src/onebot/action/extends/GetGroupInfoEx.ts index b38f92f8..c566a105 100644 --- a/src/onebot/action/extends/GetGroupInfoEx.ts +++ b/src/onebot/action/extends/GetGroupInfoEx.ts @@ -1,17 +1,17 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; -const SchemaData = z.object({ - group_id: z.string(), +import { Type, Static } from '@sinclair/typebox'; +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), }); -type Payload = z.infer; +type Payload = Static; export class GetGroupInfoEx extends OneBotAction { override actionName = ActionName.GetGroupInfoEx; override payloadSchema = SchemaData; async _handle(payload: Payload) { - return (await this.core.apis.GroupApi.getGroupExtFE0Info([payload.group_id])).result.groupExtInfos.get(payload.group_id); + return (await this.core.apis.GroupApi.getGroupExtFE0Info([payload.group_id.toString()])).result.groupExtInfos.get(payload.group_id.toString()); } } diff --git a/src/onebot/action/extends/GetMiniAppArk.ts b/src/onebot/action/extends/GetMiniAppArk.ts index e4d3c1c5..6ab90445 100644 --- a/src/onebot/action/extends/GetMiniAppArk.ts +++ b/src/onebot/action/extends/GetMiniAppArk.ts @@ -2,38 +2,38 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { MiniAppInfo, MiniAppInfoHelper } from '@/core/packet/utils/helper/miniAppHelper'; import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from '@/core/packet/entities/miniApp'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.union([ - z.object({ - type: z.union([z.literal('bili'), z.literal('weibo')]), - title: z.string(), - desc: z.string(), - picUrl: z.string(), - jumpUrl: z.string(), - webUrl: z.string().optional(), - rawArkData: z.string().optional() +const SchemaData = 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()])) }), - z.object({ - title: z.string(), - desc: z.string(), - picUrl: z.string(), - jumpUrl: z.string(), - iconUrl: z.string(), - webUrl: z.string().optional(), - appId: z.string(), - scene: z.union([z.number(), z.string()]), - templateType: z.union([z.number(), z.string()]), - businessType: z.union([z.number(), z.string()]), - verType: z.union([z.number(), z.string()]), - shareType: z.union([z.number(), z.string()]), - versionId: z.string(), - sdkId: z.string(), - withShareTicket: z.union([z.number(), z.string()]), - rawArkData: z.string().optional() + 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()])) }) ]); -type Payload = z.infer; +type Payload = Static; export class GetMiniAppArk extends GetPacketStatusDepends; +type Payload = Static; export class GetProfileLike extends OneBotAction { uint64_uin: self_id, uint64_top: 0, uint32_req_num: 99, - bytes_cookies: '' + bytes_cookies: "" }; const packed_data = await this.pack_data(JSON.stringify(req_json)); const data = Buffer.from(packed_data).toString('hex'); diff --git a/src/onebot/action/extends/GetUserStatus.ts b/src/onebot/action/extends/GetUserStatus.ts index c090cc3a..3987c81a 100644 --- a/src/onebot/action/extends/GetUserStatus.ts +++ b/src/onebot/action/extends/GetUserStatus.ts @@ -1,18 +1,18 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - user_id: z.number(), +const SchemaData = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()]), }); -type Payload = z.infer; +type Payload = Static; export class GetUserStatus extends GetPacketStatusDepends { override actionName = ActionName.GetUserStatus; override payloadSchema = SchemaData; async _handle(payload: Payload) { - return await this.core.apis.PacketApi.pkt.operation.GetStrangerStatus(payload.user_id); + return await this.core.apis.PacketApi.pkt.operation.GetStrangerStatus(+payload.user_id); } } diff --git a/src/onebot/action/extends/MoveGroupFile.ts b/src/onebot/action/extends/MoveGroupFile.ts index 31856e09..110551bc 100644 --- a/src/onebot/action/extends/MoveGroupFile.ts +++ b/src/onebot/action/extends/MoveGroupFile.ts @@ -1,16 +1,16 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_id: z.string(), - current_parent_directory: z.string(), - target_parent_directory: z.string(), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + file_id: Type.String(), + current_parent_directory: Type.String(), + target_parent_directory: Type.String(), }); -type Payload = z.infer; +type Payload = Static; interface MoveGroupFileResponse { ok: boolean; diff --git a/src/onebot/action/extends/OCRImage.ts b/src/onebot/action/extends/OCRImage.ts index 73776de8..3b45c64e 100644 --- a/src/onebot/action/extends/OCRImage.ts +++ b/src/onebot/action/extends/OCRImage.ts @@ -2,14 +2,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { checkFileExist, uriToLocalFile } from '@/common/file'; import fs from 'fs'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; import { GeneralCallResultStatus } from '@/core'; -const SchemaData = z.object({ - image: z.string(), +const SchemaData = Type.Object({ + image: Type.String(), }); -type Payload = z.infer; +type Payload = Static; class OCRImageBase extends OneBotAction { override payloadSchema = SchemaData; diff --git a/src/onebot/action/extends/RenameGroupFile.ts b/src/onebot/action/extends/RenameGroupFile.ts index 69b4e9f6..a567ea55 100644 --- a/src/onebot/action/extends/RenameGroupFile.ts +++ b/src/onebot/action/extends/RenameGroupFile.ts @@ -1,16 +1,16 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_id: z.string(), - current_parent_directory: z.string(), - new_name: z.string(), +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(), }); -type Payload = z.infer; +type Payload = Static; interface RenameGroupFileResponse { ok: boolean; diff --git a/src/onebot/action/extends/SendPacket.ts b/src/onebot/action/extends/SendPacket.ts index a43b894e..479b10f7 100644 --- a/src/onebot/action/extends/SendPacket.ts +++ b/src/onebot/action/extends/SendPacket.ts @@ -1,21 +1,22 @@ import { PacketHexStr } from '@/core/packet/transformer/base'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - cmd: z.string(), - data: z.string(), - rsp: z.boolean().default(true), +const SchemaData = Type.Object({ + cmd: Type.String(), + data: Type.String(), + rsp: Type.Union([Type.String(), Type.Boolean()], { default: true }), }); -type Payload = z.infer; +type Payload = Static; export class SendPacket extends GetPacketStatusDepends { override payloadSchema = SchemaData; override actionName = ActionName.SendPacket; async _handle(payload: Payload) { - const data = await this.core.apis.PacketApi.pkt.operation.sendPacket({ cmd: payload.cmd, data: payload.data as PacketHexStr }, payload.rsp); + 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: payload.data as PacketHexStr }, rsp); return typeof data === 'object' ? data.toString('hex') : undefined; } } diff --git a/src/onebot/action/extends/SetDiyOnlineStatus.ts b/src/onebot/action/extends/SetDiyOnlineStatus.ts index 2c1110ac..82e903ca 100644 --- a/src/onebot/action/extends/SetDiyOnlineStatus.ts +++ b/src/onebot/action/extends/SetDiyOnlineStatus.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - face_id: z.union([z.number(), z.string()]),// 参考 face_config.json 的 QSid - face_type: z.union([z.number(), z.string()]).default('1'), - wording: z.string().default(' '), +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: ' ' }), }); -type Payload = z.infer; +type Payload = Static; export class SetDiyOnlineStatus extends OneBotAction { override actionName = ActionName.SetDiyOnlineStatus; diff --git a/src/onebot/action/extends/SetGroupRemark.ts b/src/onebot/action/extends/SetGroupRemark.ts index cd26beb3..a8dbf5a9 100644 --- a/src/onebot/action/extends/SetGroupRemark.ts +++ b/src/onebot/action/extends/SetGroupRemark.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.string(), - remark: z.string(), +const SchemaData = Type.Object({ + group_id: Type.String(), + remark: Type.String(), }); -type Payload = z.infer; +type Payload = Static; export default class SetGroupRemark extends OneBotAction { override actionName = ActionName.SetGroupRemark; diff --git a/src/onebot/action/extends/SetGroupSign.ts b/src/onebot/action/extends/SetGroupSign.ts index 9bc0775a..716aca22 100644 --- a/src/onebot/action/extends/SetGroupSign.ts +++ b/src/onebot/action/extends/SetGroupSign.ts @@ -1,12 +1,12 @@ import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), }); -type Payload = z.infer; +type Payload = Static; class SetGroupSignBase extends GetPacketStatusDepends { override payloadSchema = SchemaData; diff --git a/src/onebot/action/extends/SetInputStatus.ts b/src/onebot/action/extends/SetInputStatus.ts index df8cfef5..448c00ff 100644 --- a/src/onebot/action/extends/SetInputStatus.ts +++ b/src/onebot/action/extends/SetInputStatus.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { ChatType } from '@/core'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - user_id: z.union([z.number(), z.string()]), - event_type: z.number(), +const SchemaData = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()]), + event_type: Type.Number(), }); -type Payload = z.infer; +type Payload = Static; export class SetInputStatus extends OneBotAction { override actionName = ActionName.SetInputStatus; diff --git a/src/onebot/action/extends/SetLongNick.ts b/src/onebot/action/extends/SetLongNick.ts index 4403d607..5169bada 100644 --- a/src/onebot/action/extends/SetLongNick.ts +++ b/src/onebot/action/extends/SetLongNick.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - longNick: z.string(), +const SchemaData = Type.Object({ + longNick: Type.String(), }); -type Payload = z.infer; +type Payload = Static; export class SetLongNick extends OneBotAction { override actionName = ActionName.SetLongNick; diff --git a/src/onebot/action/extends/SetOnlineStatus.ts b/src/onebot/action/extends/SetOnlineStatus.ts index 999ee261..6e1782e9 100644 --- a/src/onebot/action/extends/SetOnlineStatus.ts +++ b/src/onebot/action/extends/SetOnlineStatus.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - status: z.union([z.number(), z.string()]), - ext_status: z.union([z.number(), z.string()]), - battery_status: z.union([z.number(), z.string()]), +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()]), }); -type Payload = z.infer; +type Payload = Static; export class SetOnlineStatus extends OneBotAction { override actionName = ActionName.SetOnlineStatus; diff --git a/src/onebot/action/extends/SetQQAvatar.ts b/src/onebot/action/extends/SetQQAvatar.ts index 5fb8b50f..c4e019aa 100644 --- a/src/onebot/action/extends/SetQQAvatar.ts +++ b/src/onebot/action/extends/SetQQAvatar.ts @@ -2,13 +2,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import fs from 'node:fs/promises'; import { checkFileExist, uriToLocalFile } from '@/common/file'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - file: z.string(), +const SchemaData = Type.Object({ + file: Type.String(), }); -type Payload = z.infer; +type Payload = Static; export default class SetAvatar extends OneBotAction { override actionName = ActionName.SetQQAvatar; diff --git a/src/onebot/action/extends/SetSpecialTitle.ts b/src/onebot/action/extends/SetSpecialTitle.ts index 2efe2727..7d68ff36 100644 --- a/src/onebot/action/extends/SetSpecialTitle.ts +++ b/src/onebot/action/extends/SetSpecialTitle.ts @@ -1,14 +1,14 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - special_title: z.string({ default: '' }), +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: '' }), }); -type Payload = z.infer; +type Payload = Static; export class SetSpecialTitle extends GetPacketStatusDepends { override actionName = ActionName.SetSpecialTitle; diff --git a/src/onebot/action/extends/ShareContact.ts b/src/onebot/action/extends/ShareContact.ts index edf18ecb..22c8654b 100644 --- a/src/onebot/action/extends/ShareContact.ts +++ b/src/onebot/action/extends/ShareContact.ts @@ -1,15 +1,15 @@ import { GeneralCallResult } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - user_id: z.union([z.number(), z.string()]).optional(), - group_id: z.union([z.number(), z.string()]).optional(), - phoneNumber: z.string().default(''), +const SchemaData = Type.Object({ + user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), + group_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), + phoneNumber: Type.String({ default: '' }), }); -type Payload = z.infer; +type Payload = Static; export class SharePeer extends OneBotAction; +type PayloadGroupEx = Static; export class ShareGroupEx extends OneBotAction { override actionName = ActionName.ShareGroupEx; diff --git a/src/onebot/action/extends/TransGroupFile.ts b/src/onebot/action/extends/TransGroupFile.ts index 746c190d..35b3275a 100644 --- a/src/onebot/action/extends/TransGroupFile.ts +++ b/src/onebot/action/extends/TransGroupFile.ts @@ -1,14 +1,14 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_id: z.string(), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + file_id: Type.String(), }); -type Payload = z.infer; +type Payload = Static; interface TransGroupFileResponse { ok: boolean; diff --git a/src/onebot/action/extends/TranslateEnWordToZn.ts b/src/onebot/action/extends/TranslateEnWordToZn.ts index 46a59408..2edb8b83 100644 --- a/src/onebot/action/extends/TranslateEnWordToZn.ts +++ b/src/onebot/action/extends/TranslateEnWordToZn.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - words: Type.Array(z.string()), +const SchemaData = Type.Object({ + words: Type.Array(Type.String()), }); -type Payload = z.infer; +type Payload = Static; export class TranslateEnWordToZn extends OneBotAction | null> { override actionName = ActionName.TranslateEnWordToZn; diff --git a/src/onebot/action/file/GetFile.ts b/src/onebot/action/file/GetFile.ts index d2d87fa1..853261cd 100644 --- a/src/onebot/action/file/GetFile.ts +++ b/src/onebot/action/file/GetFile.ts @@ -3,7 +3,7 @@ import fs from 'fs/promises'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { ActionName } from '@/onebot/action/router'; import { OB11MessageImage, OB11MessageVideo } from '@/onebot/types'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; export interface GetFileResponse { file?: string; // path @@ -13,13 +13,13 @@ export interface GetFileResponse { base64?: string; } -const GetFileBase_PayloadSchema = z.object({ - file: z.string().optional(), - file_id: z.string().optional(), +const GetFileBase_PayloadSchema = Type.Object({ + file: Type.Optional(Type.String()), + file_id: Type.Optional(Type.String()) }); -export type GetFilePayload = z.infer; +export type GetFilePayload = Static; export class GetFileBase extends OneBotAction { override payloadSchema = GetFileBase_PayloadSchema; diff --git a/src/onebot/action/file/GetGroupFileUrl.ts b/src/onebot/action/file/GetGroupFileUrl.ts index ebf28021..0ae7d314 100644 --- a/src/onebot/action/file/GetGroupFileUrl.ts +++ b/src/onebot/action/file/GetGroupFileUrl.ts @@ -1,14 +1,14 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_id: z.string(), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + file_id: Type.String(), }); -type Payload = z.infer; +type Payload = Static; interface GetGroupFileUrlResponse { url?: string; diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts index 4504cc20..f592cc08 100644 --- a/src/onebot/action/file/GetPrivateFileUrl.ts +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -1,13 +1,13 @@ import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - file_id: z.string(), +const SchemaData = Type.Object({ + file_id: Type.String(), }); -type Payload = z.infer; +type Payload = Static; interface GetPrivateFileUrlResponse { url?: string; diff --git a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts index 4a0dea63..760929ea 100644 --- a/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/CreateGroupFileFolder.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - folder_name: z.string(), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + folder_name: Type.String(), }); -type Payload = z.infer; +type Payload = Static; interface ResponseType{ result:unknown; groupItem:unknown; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts index 84343f54..7db532a3 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFile.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFile.ts @@ -2,15 +2,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; import { NTQQGroupApi } from '@/core/apis'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_id: z.string(), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + file_id: Type.String(), }); -type Payload = z.infer; +type Payload = Static; export class DeleteGroupFile extends OneBotAction>> { override actionName = ActionName.GOCQHTTP_DeleteGroupFile; diff --git a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts index 6e12986b..818c10a0 100644 --- a/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts +++ b/src/onebot/action/go-cqhttp/DeleteGroupFileFolder.ts @@ -1,15 +1,15 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; import { NTQQGroupApi } from '@/core/apis'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - folder_id: z.string().optional(), - folder: z.string().optional(), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + folder_id: Type.Optional(Type.String()), + folder: Type.Optional(Type.String()), }); -type Payload = z.infer; +type Payload = Static; export class DeleteGroupFileFolder extends OneBotAction>['groupFileCommonResult']> { override actionName = ActionName.GoCQHTTP_DeleteGroupFileFolder; diff --git a/src/onebot/action/go-cqhttp/DownloadFile.ts b/src/onebot/action/go-cqhttp/DownloadFile.ts index 30e9685f..32fabfb5 100644 --- a/src/onebot/action/go-cqhttp/DownloadFile.ts +++ b/src/onebot/action/go-cqhttp/DownloadFile.ts @@ -4,20 +4,20 @@ import fs from 'fs'; import { join as joinPath } from 'node:path'; import { calculateFileMD5, uriToLocalFile } from '@/common/file'; import { randomUUID } from 'crypto'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; interface FileResponse { file: string; } -const SchemaData = z.object({ - url: z.string().optional(), - base64: z.string().optional(), - name: z.string().optional(), - headers: z.union([z.string(), z.array(z.string())]).optional(), +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())])), }); -type Payload = z.infer; +type Payload = Static; export default class GoCQHTTPDownloadFile extends OneBotAction { override actionName = ActionName.GoCQHTTP_DownloadFile; diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index 89e9cb60..5552229b 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -2,14 +2,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OB11Message, OB11MessageData, OB11MessageDataType, OB11MessageForward, OB11MessageNodePlain as OB11MessageNode } from '@/onebot'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; +import { Static, Type } from '@sinclair/typebox'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; -import { z } from 'zod'; -const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]).optional(), - id: z.union([z.number(), z.string()]).optional(), +const SchemaData = Type.Object({ + message_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), + id: Type.Optional(Type.Union([Type.Number(), Type.String()])), }); -type Payload = z.infer; + +type Payload = Static; export class GoCQHTTPGetForwardMsgAction extends OneBotAction; +type Payload = Static; export default class GetFriendMsgHistory extends OneBotAction { override actionName = ActionName.GetFriendMsgHistory; diff --git a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts index 28d63901..5d4939d2 100644 --- a/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts +++ b/src/onebot/action/go-cqhttp/GetGroupAtAllRemain.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]) +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]) }); -type Payload = z.infer; +type Payload = Static; interface ResponseType { can_at_all: boolean; remain_at_all_count_for_group: number; diff --git a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts index 8d966d35..9f740732 100644 --- a/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupFileSystemInfo.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]) +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]) }); -type Payload = z.infer; +type Payload = Static; export class GetGroupFileSystemInfo extends OneBotAction; +type Payload = Static; export class GetGroupFilesByFolder extends OneBotAction[], diff --git a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts index 1194b67f..9ead4af2 100644 --- a/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts +++ b/src/onebot/action/go-cqhttp/GetGroupHonorInfo.ts @@ -1,16 +1,16 @@ -import { WebHonorType } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { WebHonorType } from '@/core/types'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - type: z.nativeEnum(WebHonorType).optional() +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + type: Type.Optional(Type.Enum(WebHonorType)) }); -type Payload = z.infer; +type Payload = Static; -export class GetGroupHonorInfo extends OneBotAction { +export class GetGroupHonorInfo extends OneBotAction> { override actionName = ActionName.GetGroupHonorInfo; override payloadSchema = SchemaData; diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index 5eed6ff5..4c356df2 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -3,22 +3,22 @@ import { OB11Message } from '@/onebot'; import { ActionName } from '@/onebot/action/router'; import { ChatType, Peer } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/onebot/config/config'; interface Response { messages: OB11Message[]; } -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - message_seq: z.union([z.number(), z.string()]).optional(), - count: z.union([z.number(), z.string()]).default(20), - reverseOrder: z.union([z.boolean(), z.string()]).optional() +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + message_seq: Type.Optional(Type.Union([Type.Number(), Type.String()])), + count: Type.Union([Type.Number(), Type.String()], { default: 20 }), + reverseOrder: Type.Optional(Type.Union([Type.Boolean(), Type.String()])) }); -type Payload = z.infer; +type Payload = Static; export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction { diff --git a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts index b990aec8..a4c1c916 100644 --- a/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts +++ b/src/onebot/action/go-cqhttp/GetGroupRootFiles.ts @@ -3,14 +3,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { OB11GroupFile, OB11GroupFileFolder } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file_count: z.union([z.number(), z.string()]).default(50), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + file_count: Type.Union([Type.Number(), Type.String()], { default: 50 }), }); -type Payload = z.infer; +type Payload = Static; export class GetGroupRootFiles extends OneBotAction; +type Payload = Static; export default class GoCQHTTPGetStrangerInfo extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetStrangerInfo; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts index dfded410..29a9b502 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPCheckUrlSafely.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - url: z.string(), +const SchemaData = Type.Object({ + url: Type.String(), }); -type Payload = z.infer; +type Payload = Static; export class GoCQHTTPCheckUrlSafely extends OneBotAction { override actionName = ActionName.GoCQHTTP_CheckUrlSafely; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts index e7ce50c4..adc02cf9 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPDeleteFriend.ts @@ -1,15 +1,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - friend_id: z.union([z.string(), z.number()]).optional(), - user_id: z.union([z.string(), z.number()]).optional(), - temp_block: z.boolean().optional(), - temp_both_del: z.boolean().optional(), +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()), }); -type Payload = z.infer; +type Payload = Static; export class GoCQHTTPDeleteFriend extends OneBotAction { override actionName = ActionName.GoCQHTTP_DeleteFriend; diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index 1e839fe3..453db746 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -1,12 +1,12 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - model: z.string(), +const SchemaData = Type.Object({ + model: Type.String(), }); -type Payload = z.infer; +type Payload = Static; export class GoCQHTTPGetModelShow extends OneBotAction; +type Payload = Static; export class SendGroupNotice extends OneBotAction { override actionName = ActionName.GoCQHTTP_SendGroupNotice; diff --git a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts index 765c9897..bfe0997f 100644 --- a/src/onebot/action/go-cqhttp/SetGroupPortrait.ts +++ b/src/onebot/action/go-cqhttp/SetGroupPortrait.ts @@ -1,15 +1,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { checkFileExistV2, uriToLocalFile } from '@/common/file'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; import fs from 'node:fs/promises'; import { GeneralCallResult } from '@/core'; -const SchemaData = z.object({ - file: z.string(), - group_id: z.union([z.number(), z.string()]) +const SchemaData = Type.Object({ + file: Type.String(), + group_id: Type.Union([Type.Number(), Type.String()]) }); -type Payload = z.infer; +type Payload = Static; export default class SetGroupPortrait extends OneBotAction { override actionName = ActionName.SetGroupPortrait; diff --git a/src/onebot/action/go-cqhttp/SetQQProfile.ts b/src/onebot/action/go-cqhttp/SetQQProfile.ts index c85e4aa4..976d87b5 100644 --- a/src/onebot/action/go-cqhttp/SetQQProfile.ts +++ b/src/onebot/action/go-cqhttp/SetQQProfile.ts @@ -1,15 +1,15 @@ import { NTQQUserApi } from '@/core/apis'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - nickname: z.string(), - personal_note: z.string().optional(), - sex: z.union([z.number(), z.string()]).optional(), // 传Sex值?建议传0 +const SchemaData = Type.Object({ + nickname: Type.String(), + personal_note: Type.Optional(Type.String()), + sex: Type.Optional(Type.Union([Type.Number(), Type.String()])), // 传Sex值?建议传0 }); -type Payload = z.infer; +type Payload = Static; export class SetQQProfile extends OneBotAction> | null> { override actionName = ActionName.SetQQProfile; override payloadSchema = SchemaData; diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index 39327cde..906d7e91 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -4,17 +4,17 @@ import { ChatType, Peer } from '@/core/types'; import fs from 'fs'; import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - file: z.string(), - name: z.string(), - folder: z.string().optional(), - folder_id: z.string().optional(),//临时扩展 +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()),//临时扩展 }); -type Payload = z.infer; +type Payload = Static; export default class GoCQHTTPUploadGroupFile extends OneBotAction { override actionName = ActionName.GoCQHTTP_UploadGroupFile; diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index 8cee2010..f17e3edf 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -5,15 +5,15 @@ import fs from 'fs'; import { uriToLocalFile } from '@/common/file'; import { SendMessageContext } from '@/onebot/api'; import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - user_id: z.union([z.number(), z.string()]), - file: z.string(), - name: z.string(), +const SchemaData = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()]), + file: Type.String(), + name: Type.String(), }); -type Payload = z.infer; +type Payload = Static; export default class GoCQHTTPUploadPrivateFile extends OneBotAction { override actionName = ActionName.GOCQHTTP_UploadPrivateFile; diff --git a/src/onebot/action/group/DelEssenceMsg.ts b/src/onebot/action/group/DelEssenceMsg.ts index b799b651..ccb20a58 100644 --- a/src/onebot/action/group/DelEssenceMsg.ts +++ b/src/onebot/action/group/DelEssenceMsg.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]), +const SchemaData = Type.Object({ + message_id: Type.Union([Type.Number(), Type.String()]), }); -type Payload = z.infer; +type Payload = Static; export default class DelEssenceMsg extends OneBotAction { override actionName = ActionName.DelEssenceMsg; override payloadSchema = SchemaData; diff --git a/src/onebot/action/group/DelGroupNotice.ts b/src/onebot/action/group/DelGroupNotice.ts index bd2dae0a..04f9cbea 100644 --- a/src/onebot/action/group/DelGroupNotice.ts +++ b/src/onebot/action/group/DelGroupNotice.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - notice_id: z.string() +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + notice_id: Type.String() }); -type Payload = z.infer; +type Payload = Static; export class DelGroupNotice extends OneBotAction { override actionName = ActionName.DelGroupNotice; diff --git a/src/onebot/action/group/GetAiRecord.ts b/src/onebot/action/group/GetAiRecord.ts index ba30f9d9..0eeac7ab 100644 --- a/src/onebot/action/group/GetAiRecord.ts +++ b/src/onebot/action/group/GetAiRecord.ts @@ -1,15 +1,15 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - character: z.string(), - group_id: z.union([z.number(), z.string()]), - text: z.string(), +const SchemaData = Type.Object({ + character: Type.String(), + group_id: Type.Union([Type.Number(), Type.String()]), + text: Type.String(), }); -type Payload = z.infer; +type Payload = Static; export class GetAiRecord extends GetPacketStatusDepends { override actionName = ActionName.GetAiRecord; diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 9ce8c310..91deb65c 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -3,14 +3,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import crypto from 'crypto'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), }); -type Payload = z.infer; +type Payload = Static; export class GetGroupEssence extends OneBotAction { override actionName = ActionName.GoCQHTTP_GetEssenceMsg; diff --git a/src/onebot/action/group/GetGroupInfo.ts b/src/onebot/action/group/GetGroupInfo.ts index 2bb5ff72..dd0a40bc 100644 --- a/src/onebot/action/group/GetGroupInfo.ts +++ b/src/onebot/action/group/GetGroupInfo.ts @@ -2,13 +2,13 @@ import { OB11Group } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), }); -type Payload = z.infer; +type Payload = Static; class GetGroupInfo extends OneBotAction { override actionName = ActionName.GetGroupInfo; diff --git a/src/onebot/action/group/GetGroupList.ts b/src/onebot/action/group/GetGroupList.ts index 5ed487b9..251b79aa 100644 --- a/src/onebot/action/group/GetGroupList.ts +++ b/src/onebot/action/group/GetGroupList.ts @@ -2,13 +2,13 @@ import { OB11Group } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - no_cache: z.boolean().default(false), +const SchemaData = Type.Object({ + no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), }); -type Payload = z.infer; +type Payload = Static; class GetGroupList extends OneBotAction { override actionName = ActionName.GetGroupList; diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index 75834049..03938f27 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -2,15 +2,15 @@ import { OB11GroupMember } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - no_cache: z.boolean().default(false), +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()])), }); -type Payload = z.infer; +type Payload = Static; class GetGroupMemberInfo extends OneBotAction { override actionName = ActionName.GetGroupMemberInfo; diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index efd5073c..41e028bf 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -2,15 +2,15 @@ import { OB11GroupMember } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; import { GroupMember } from '@/core'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - no_cache: z.boolean().default(false) +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])) }); -type Payload = z.infer; +type Payload = Static; export class GetGroupMemberList extends OneBotAction { override actionName = ActionName.GetGroupMemberList; diff --git a/src/onebot/action/group/GetGroupNotice.ts b/src/onebot/action/group/GetGroupNotice.ts index 317d712c..fe952557 100644 --- a/src/onebot/action/group/GetGroupNotice.ts +++ b/src/onebot/action/group/GetGroupNotice.ts @@ -1,7 +1,7 @@ import { WebApiGroupNoticeFeed } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; interface GroupNotice { sender_id: number; publish_time: number; @@ -16,11 +16,11 @@ interface GroupNotice { }; } -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), }); -type Payload = z.infer; +type Payload = Static; type ApiGroupNotice = GroupNotice & WebApiGroupNoticeFeed; diff --git a/src/onebot/action/group/GetGroupShutList.ts b/src/onebot/action/group/GetGroupShutList.ts index 3e82f5e3..05ab27de 100644 --- a/src/onebot/action/group/GetGroupShutList.ts +++ b/src/onebot/action/group/GetGroupShutList.ts @@ -1,13 +1,13 @@ import { ShutUpGroupMember } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), }); -type Payload = z.infer; +type Payload = Static; export class GetGroupShutList extends OneBotAction { override actionName = ActionName.GetGroupShutList; diff --git a/src/onebot/action/group/GroupPoke.ts b/src/onebot/action/group/GroupPoke.ts index c318211c..8dcc8815 100644 --- a/src/onebot/action/group/GroupPoke.ts +++ b/src/onebot/action/group/GroupPoke.ts @@ -1,13 +1,13 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + user_id: Type.Union([Type.Number(), Type.String()]), }); -type Payload = z.infer; +type Payload = Static; export class GroupPoke extends GetPacketStatusDepends { override actionName = ActionName.GroupPoke; diff --git a/src/onebot/action/group/SendGroupAiRecord.ts b/src/onebot/action/group/SendGroupAiRecord.ts index 1e0c3a03..7cfd5f85 100644 --- a/src/onebot/action/group/SendGroupAiRecord.ts +++ b/src/onebot/action/group/SendGroupAiRecord.ts @@ -1,15 +1,15 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - character: z.string(), - group_id: z.union([z.number(), z.string()]), - text: z.string(), +const SchemaData = Type.Object({ + character: Type.String(), + group_id: Type.Union([Type.Number(), Type.String()]), + text: Type.String(), }); -type Payload = z.infer; +type Payload = Static; export class SendGroupAiRecord extends GetPacketStatusDepends; +type Payload = Static; export default class SetEssenceMsg extends OneBotAction { override actionName = ActionName.SetEssenceMsg; diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index 8a5834e0..8cd69bcd 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -1,15 +1,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupRequestOperateTypes } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - flag: z.union([z.string(), z.number()]), - approve: z.boolean().default(true), - reason: z.union([z.string(), z.null()]).default(' '), +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()])), }); -type Payload = z.infer; +type Payload = Static; export default class SetGroupAddRequest extends OneBotAction { override actionName = ActionName.SetGroupAddRequest; diff --git a/src/onebot/action/group/SetGroupAdmin.ts b/src/onebot/action/group/SetGroupAdmin.ts index 6ad18f06..ee70edfb 100644 --- a/src/onebot/action/group/SetGroupAdmin.ts +++ b/src/onebot/action/group/SetGroupAdmin.ts @@ -1,15 +1,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { NTGroupMemberRole } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - enable: z.boolean().default(false), +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()])), }); -type Payload = z.infer; +type Payload = Static; export default class SetGroupAdmin extends OneBotAction { override actionName = ActionName.SetGroupAdmin; diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index 4312e628..3f30aa1f 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - duration: z.union([z.number(), z.string()]).default(0), +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 }), }); -type Payload = z.infer; +type Payload = Static; export default class SetGroupBan extends OneBotAction { override actionName = ActionName.SetGroupBan; diff --git a/src/onebot/action/group/SetGroupCard.ts b/src/onebot/action/group/SetGroupCard.ts index bd45f957..2e825c68 100644 --- a/src/onebot/action/group/SetGroupCard.ts +++ b/src/onebot/action/group/SetGroupCard.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - card: z.string().optional(), +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()) }); -type Payload = z.infer; +type Payload = Static; export default class SetGroupCard extends OneBotAction { override actionName = ActionName.SetGroupCard; diff --git a/src/onebot/action/group/SetGroupKick.ts b/src/onebot/action/group/SetGroupKick.ts index 3967ad96..7b57d48c 100644 --- a/src/onebot/action/group/SetGroupKick.ts +++ b/src/onebot/action/group/SetGroupKick.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - user_id: z.union([z.number(), z.string()]), - reject_add_request: z.union([z.boolean(), z.string()]).optional(), +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()])), }); -type Payload = z.infer; +type Payload = Static; export default class SetGroupKick extends OneBotAction { override actionName = ActionName.SetGroupKick; diff --git a/src/onebot/action/group/SetGroupLeave.ts b/src/onebot/action/group/SetGroupLeave.ts index 6930af12..4d9a4083 100644 --- a/src/onebot/action/group/SetGroupLeave.ts +++ b/src/onebot/action/group/SetGroupLeave.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - is_dismiss: z.boolean().optional(), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + is_dismiss: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), }); -type Payload = z.infer; +type Payload = Static; export default class SetGroupLeave extends OneBotAction { override actionName = ActionName.SetGroupLeave; diff --git a/src/onebot/action/group/SetGroupName.ts b/src/onebot/action/group/SetGroupName.ts index d19e9782..cde09908 100644 --- a/src/onebot/action/group/SetGroupName.ts +++ b/src/onebot/action/group/SetGroupName.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - group_name: z.string(), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + group_name: Type.String(), }); -type Payload = z.infer; +type Payload = Static; export default class SetGroupName extends OneBotAction { override actionName = ActionName.SetGroupName; diff --git a/src/onebot/action/group/SetGroupWholeBan.ts b/src/onebot/action/group/SetGroupWholeBan.ts index dc1ee1a3..a4c84c44 100644 --- a/src/onebot/action/group/SetGroupWholeBan.ts +++ b/src/onebot/action/group/SetGroupWholeBan.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - group_id: z.union([z.number(), z.string()]), - enable: z.union([z.boolean(), z.string()]).optional(), +const SchemaData = Type.Object({ + group_id: Type.Union([Type.Number(), Type.String()]), + enable: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), }); -type Payload = z.infer; +type Payload = Static; export default class SetGroupWholeBan extends OneBotAction { override actionName = ActionName.SetGroupWholeBan; diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index 9aa67a30..a4b27aa2 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -1,13 +1,13 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]), +const SchemaData = Type.Object({ + message_id: Type.Union([Type.Number(), Type.String()]), }); -type Payload = z.infer; +type Payload = Static; class DeleteMsg extends OneBotAction { override actionName = ActionName.DeleteMsg; diff --git a/src/onebot/action/msg/ForwardSingleMsg.ts b/src/onebot/action/msg/ForwardSingleMsg.ts index bc2f5546..7156159c 100644 --- a/src/onebot/action/msg/ForwardSingleMsg.ts +++ b/src/onebot/action/msg/ForwardSingleMsg.ts @@ -2,15 +2,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ChatType, Peer } from '@/core/types'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]), - group_id: z.string().optional(), - user_id: z.string().optional(), +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()])), }); -type Payload = z.infer; +type Payload = Static; class ForwardSingleMsg extends OneBotAction { protected async getTargetPeer(payload: Payload): Promise { diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index 28cc629a..08b2e955 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -3,16 +3,16 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { RawMessage } from '@/core'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; import { NetworkAdapterConfig } from '@/onebot/config/config'; export type ReturnDataType = OB11Message -const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]), +const SchemaData = Type.Object({ + message_id: Type.Union([Type.Number(), Type.String()]), }); -type Payload = z.infer; +type Payload = Static; class GetMsg extends OneBotAction { override actionName = ActionName.GetMsg; diff --git a/src/onebot/action/msg/MarkMsgAsRead.ts b/src/onebot/action/msg/MarkMsgAsRead.ts index 98f5a9cf..f36a653a 100644 --- a/src/onebot/action/msg/MarkMsgAsRead.ts +++ b/src/onebot/action/msg/MarkMsgAsRead.ts @@ -2,15 +2,15 @@ import { ChatType, Peer } from '@/core/types'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - user_id: z.union([z.string(), z.number()]).optional(), - group_id: z.union([z.string(), z.number()]).optional(), - message_id: z.union([z.string(), z.number()]).optional(), +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()])), }); -type PlayloadType = z.infer; +type PlayloadType = Static; class MarkMsgAsRead extends OneBotAction { async getPeer(payload: PlayloadType): Promise { diff --git a/src/onebot/action/msg/SetMsgEmojiLike.ts b/src/onebot/action/msg/SetMsgEmojiLike.ts index b7ddf580..02ce4e01 100644 --- a/src/onebot/action/msg/SetMsgEmojiLike.ts +++ b/src/onebot/action/msg/SetMsgEmojiLike.ts @@ -1,15 +1,15 @@ import { ActionName } from '@/onebot/action/router'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { MessageUnique } from '@/common/message-unique'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - message_id: z.union([z.number(), z.string()]), - emoji_id: z.union([z.number(), z.string()]), - set: z.boolean().optional(), +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()])) }); -type Payload = z.infer; +type Payload = Static; export class SetMsgEmojiLike extends OneBotAction { override actionName = ActionName.SetMsgEmojiLike; diff --git a/src/onebot/action/packet/GetRkeyEx.ts b/src/onebot/action/packet/GetRkeyEx.ts index ca95dfbd..d330b8ee 100644 --- a/src/onebot/action/packet/GetRkeyEx.ts +++ b/src/onebot/action/packet/GetRkeyEx.ts @@ -8,7 +8,7 @@ export class GetRkeyEx extends GetPacketStatusDepends { let rkeys = await this.core.apis.PacketApi.pkt.operation.FetchRkey(); return rkeys.map(rkey => { return { - type: rkey.type === 10 ? 'private' : 'group', + type: rkey.type === 10 ? "private" : "group", rkey: rkey.rkey, created_at: rkey.time, ttl: rkey.ttl, diff --git a/src/onebot/action/packet/GetRkeyServer.ts b/src/onebot/action/packet/GetRkeyServer.ts index 17e04c35..ebfa7049 100644 --- a/src/onebot/action/packet/GetRkeyServer.ts +++ b/src/onebot/action/packet/GetRkeyServer.ts @@ -30,7 +30,7 @@ export class GetRkeyServer extends GetPacketStatusDepends; +type Payload = Static; export class SendPoke extends GetPacketStatusDepends { override actionName = ActionName.SendPoke; diff --git a/src/onebot/action/system/GetCredentials.ts b/src/onebot/action/system/GetCredentials.ts index a8d50e16..90ef79ca 100644 --- a/src/onebot/action/system/GetCredentials.ts +++ b/src/onebot/action/system/GetCredentials.ts @@ -1,17 +1,17 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; interface Response { cookies: string, token: number } -const SchemaData = z.object({ - domain: z.string() +const SchemaData = Type.Object({ + domain: Type.String() }); -type Payload = z.infer; +type Payload = Static; export class GetCredentials extends OneBotAction { diff --git a/src/onebot/action/user/FriendPoke.ts b/src/onebot/action/user/FriendPoke.ts index 644763eb..e447a987 100644 --- a/src/onebot/action/user/FriendPoke.ts +++ b/src/onebot/action/user/FriendPoke.ts @@ -1,12 +1,12 @@ import { ActionName } from '@/onebot/action/router'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - user_id: z.union([z.number(), z.string()]) +const SchemaData = Type.Object({ + user_id: Type.Union([Type.Number(), Type.String()]) }); -type Payload = z.infer; +type Payload = Static; export class FriendPoke extends GetPacketStatusDepends { override actionName = ActionName.FriendPoke; diff --git a/src/onebot/action/user/GetCookies.ts b/src/onebot/action/user/GetCookies.ts index bc3e34e0..00773fe3 100644 --- a/src/onebot/action/user/GetCookies.ts +++ b/src/onebot/action/user/GetCookies.ts @@ -1,16 +1,16 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; interface Response { cookies: string, bkn: string } -const SchemaData = z.object({ - domain: z.string() +const SchemaData = Type.Object({ + domain: Type.String() }); -type Payload = z.infer; +type Payload = Static; export class GetCookies extends OneBotAction { override actionName = ActionName.GetCookies; diff --git a/src/onebot/action/user/GetFriendList.ts b/src/onebot/action/user/GetFriendList.ts index 227ca12f..6850f0f6 100644 --- a/src/onebot/action/user/GetFriendList.ts +++ b/src/onebot/action/user/GetFriendList.ts @@ -2,13 +2,13 @@ import { OB11User } from '@/onebot'; import { OB11Construct } from '@/onebot/helper/data'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - no_cache: z.boolean().optional(), +const SchemaData = Type.Object({ + no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), }); -type Payload = z.infer; +type Payload = Static; export default class GetFriendList extends OneBotAction { override actionName = ActionName.GetFriendList; diff --git a/src/onebot/action/user/GetRecentContact.ts b/src/onebot/action/user/GetRecentContact.ts index 01b3fc0f..91f25484 100644 --- a/src/onebot/action/user/GetRecentContact.ts +++ b/src/onebot/action/user/GetRecentContact.ts @@ -2,13 +2,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { NetworkAdapterConfig } from '@/onebot/config/config'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - count: z.number().default(10), +const SchemaData = Type.Object({ + count: Type.Union([Type.Number(), Type.String()], { default: 10 }), }); -type Payload = z.infer; +type Payload = Static; export default class GetRecentContact extends OneBotAction { override actionName = ActionName.GetRecentContact; diff --git a/src/onebot/action/user/SendLike.ts b/src/onebot/action/user/SendLike.ts index 04b719c0..828b46a5 100644 --- a/src/onebot/action/user/SendLike.ts +++ b/src/onebot/action/user/SendLike.ts @@ -1,13 +1,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - times: z.union([z.number(), z.string()]).default(1), - user_id: z.union([z.number(), z.string()]) +const SchemaData = Type.Object({ + times: Type.Union([Type.Number(), Type.String()], { default: 1 }), + user_id: Type.Union([Type.Number(), Type.String()]) }); -type Payload = z.infer; +type Payload = Static; export default class SendLike extends OneBotAction { override actionName = ActionName.SendLike; diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index 72551a9e..bda5964a 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -1,14 +1,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { z } from 'zod'; +import { Static, Type } from '@sinclair/typebox'; -const SchemaData = z.object({ - flag: z.union([z.string(), z.number()]), - approve: z.union([z.string(), z.boolean()]).default(true), - remark: z.union([z.string(), z.null()]).nullable().optional() +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()) }); -type Payload = z.infer; +type Payload = Static; export default class SetFriendAddRequest extends OneBotAction { override actionName = ActionName.SetFriendAddRequest; diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 107a66cc..86e943eb 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -1000,16 +1000,16 @@ export class OneBotMsgApi { const calculateTotalSize = async (elements: SendMessageElement[]): Promise => { const sizePromises = elements.map(async element => { switch (element.elementType) { - case ElementType.PTT: - return (await fsPromise.stat(element.pttElement.filePath)).size; - case ElementType.FILE: - return (await fsPromise.stat(element.fileElement.filePath)).size; - case ElementType.VIDEO: - return (await fsPromise.stat(element.videoElement.filePath)).size; - case ElementType.PIC: - return (await fsPromise.stat(element.picElement.sourcePath)).size; - default: - return 0; + case ElementType.PTT: + return (await fsPromise.stat(element.pttElement.filePath)).size; + case ElementType.FILE: + return (await fsPromise.stat(element.fileElement.filePath)).size; + case ElementType.VIDEO: + return (await fsPromise.stat(element.videoElement.filePath)).size; + case ElementType.PIC: + return (await fsPromise.stat(element.picElement.sourcePath)).size; + default: + return 0; } }); const sizes = await Promise.all(sizePromises); @@ -1099,14 +1099,14 @@ export class OneBotMsgApi { groupChangDecreseType2String(type: number): GroupDecreaseSubType { switch (type) { - case 130: - return 'leave'; - case 131: - return 'kick'; - case 3: - return 'kick_me'; - default: - return 'kick'; + case 130: + return 'leave'; + case 131: + return 'kick'; + case 3: + return 'kick_me'; + default: + return 'kick'; } } diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index ffc29339..cfa9c4a1 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,107 +1,108 @@ -import { z } from 'zod'; +import { Type, Static } from '@sinclair/typebox'; +import Ajv from 'ajv'; -const HttpServerConfigSchema = z.object({ - name: z.string().default('http-server'), - enable: z.boolean().default(false), - port: z.number().default(3000), - host: z.string().default('0.0.0.0'), - enableCors: z.boolean().default(true), - enableWebsocket: z.boolean().default(true), - messagePostFormat: z.string().default('array'), - token: z.string().default(''), - debug: z.boolean().default(false) +const HttpServerConfigSchema = Type.Object({ + name: Type.String({ default: 'http-server' }), + enable: Type.Boolean({ default: false }), + port: Type.Number({ default: 3000 }), + host: Type.String({ default: '0.0.0.0' }), + enableCors: Type.Boolean({ default: true }), + enableWebsocket: Type.Boolean({ default: true }), + messagePostFormat: Type.String({ default: 'array' }), + token: Type.String({ default: '' }), + debug: Type.Boolean({ default: false }) }); -const HttpSseServerConfigSchema = z.object({ - name: z.string().default('http-sse-server'), - enable: z.boolean().default(false), - port: z.number().default(3000), - host: z.string().default('0.0.0.0'), - enableCors: z.boolean().default(true), - enableWebsocket: z.boolean().default(true), - messagePostFormat: z.string().default('array'), - token: z.string().default(''), - debug: z.boolean().default(false), - reportSelfMessage: z.boolean().default(false) +const HttpSseServerConfigSchema = Type.Object({ + name: Type.String({ default: 'http-sse-server' }), + enable: Type.Boolean({ default: false }), + port: Type.Number({ default: 3000 }), + host: Type.String({ default: '0.0.0.0' }), + enableCors: Type.Boolean({ default: true }), + enableWebsocket: Type.Boolean({ default: true }), + messagePostFormat: Type.String({ default: 'array' }), + token: Type.String({ default: '' }), + debug: Type.Boolean({ default: false }), + reportSelfMessage: Type.Boolean({ default: false }) }); -const HttpClientConfigSchema = z.object({ - name: z.string().default('http-client'), - enable: z.boolean().default(false), - url: z.string().default('http://localhost:8080'), - messagePostFormat: z.string().default('array'), - reportSelfMessage: z.boolean().default(false), - token: z.string().default(''), - debug: z.boolean().default(false) +const HttpClientConfigSchema = Type.Object({ + name: Type.String({ default: 'http-client' }), + enable: Type.Boolean({ default: false }), + url: Type.String({ default: 'http://localhost:8080' }), + messagePostFormat: Type.String({ default: 'array' }), + reportSelfMessage: Type.Boolean({ default: false }), + token: Type.String({ default: '' }), + debug: Type.Boolean({ default: false }) }); -const WebsocketServerConfigSchema = z.object({ - name: z.string().default('websocket-server'), - enable: z.boolean().default(false), - host: z.string().default('0.0.0.0'), - port: z.number().default(3001), - messagePostFormat: z.string().default('array'), - reportSelfMessage: z.boolean().default(false), - token: z.string().default(''), - enableForcePushEvent: z.boolean().default(true), - debug: z.boolean().default(false), - heartInterval: z.number().default(30000) +const WebsocketServerConfigSchema = Type.Object({ + name: Type.String({ default: 'websocket-server' }), + enable: Type.Boolean({ default: false }), + host: Type.String({ default: '0.0.0.0' }), + port: Type.Number({ default: 3001 }), + messagePostFormat: Type.String({ default: 'array' }), + reportSelfMessage: Type.Boolean({ default: false }), + token: Type.String({ default: '' }), + enableForcePushEvent: Type.Boolean({ default: true }), + debug: Type.Boolean({ default: false }), + heartInterval: Type.Number({ default: 30000 }) }); -const WebsocketClientConfigSchema = z.object({ - name: z.string().default('websocket-client'), - enable: z.boolean().default(false), - url: z.string().default('ws://localhost:8082'), - messagePostFormat: z.string().default('array'), - reportSelfMessage: z.boolean().default(false), - reconnectInterval: z.number().default(5000), - token: z.string().default(''), - debug: z.boolean().default(false), - heartInterval: z.number().default(30000) +const WebsocketClientConfigSchema = Type.Object({ + name: Type.String({ default: 'websocket-client' }), + enable: Type.Boolean({ default: false }), + url: Type.String({ default: 'ws://localhost:8082' }), + messagePostFormat: Type.String({ default: 'array' }), + reportSelfMessage: Type.Boolean({ default: false }), + reconnectInterval: Type.Number({ default: 5000 }), + token: Type.String({ default: '' }), + debug: Type.Boolean({ default: false }), + heartInterval: Type.Number({ default: 30000 }) }); -const PluginConfigSchema = z.object({ - name: z.string().default('plugin'), - enable: z.boolean().default(false), - messagePostFormat: z.string().default('array'), - reportSelfMessage: z.boolean().default(false), - debug: z.boolean().default(false), +const PluginConfigSchema = Type.Object({ + name: Type.String({ default: 'plugin' }), + enable: Type.Boolean({ default: false }), + messagePostFormat: Type.String({ default: 'array' }), + reportSelfMessage: Type.Boolean({ default: false }), + debug: Type.Boolean({ default: false }), }); -const NetworkConfigSchema = z.object({ - httpServers: z.array(HttpServerConfigSchema).default([]), - httpSseServers: z.array(HttpSseServerConfigSchema).default([]), - httpClients: z.array(HttpClientConfigSchema).default([]), - websocketServers: z.array(WebsocketServerConfigSchema).default([]), - websocketClients: z.array(WebsocketClientConfigSchema).default([]), - plugins: z.array(PluginConfigSchema).default([]) -}).default({}); +const NetworkConfigSchema = Type.Object({ + httpServers: Type.Array(HttpServerConfigSchema, { default: [] }), + httpSseServers: Type.Array(HttpSseServerConfigSchema, { default: [] }), + httpClients: Type.Array(HttpClientConfigSchema, { default: [] }), + websocketServers: Type.Array(WebsocketServerConfigSchema, { default: [] }), + websocketClients: Type.Array(WebsocketClientConfigSchema, { default: [] }), + plugins: Type.Array(PluginConfigSchema, { default: [] }) +}, { default: {} }); -export const OneBotConfigSchema = z.object({ +export const OneBotConfigSchema = Type.Object({ network: NetworkConfigSchema, - musicSignUrl: z.string().default(''), - enableLocalFile2Url: z.boolean().default(false), - parseMultMsg: z.boolean().default(false) + musicSignUrl: Type.String({ default: '' }), + enableLocalFile2Url: Type.Boolean({ default: false }), + parseMultMsg: Type.Boolean({ default: false }) }); -export type OneBotConfig = z.infer; -export type HttpServerConfig = z.infer; -export type HttpSseServerConfig = z.infer; -export type HttpClientConfig = z.infer; -export type WebsocketServerConfig = z.infer; -export type WebsocketClientConfig = z.infer; -export type PluginConfig = z.infer; +export type OneBotConfig = Static; +export type HttpServerConfig = Static; +export type HttpSseServerConfig = Static; +export type HttpClientConfig = Static; +export type WebsocketServerConfig = Static; +export type WebsocketClientConfig = Static; +export type PluginConfig = Static; export type NetworkAdapterConfig = HttpServerConfig | HttpSseServerConfig | HttpClientConfig | WebsocketServerConfig | WebsocketClientConfig | PluginConfig; export type NetworkConfigKey = keyof OneBotConfig['network']; + export function loadConfig(config: Partial): OneBotConfig { - try { - return OneBotConfigSchema.parse(config); - } catch (error) { - if (error instanceof z.ZodError) { - throw new Error(error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ')); - } - throw error; + const ajv = new Ajv({ useDefaults: true, coerceTypes: true }); + const validate = ajv.compile(OneBotConfigSchema); + const valid = validate(config); + if (!valid) { + throw new Error(ajv.errorsText(validate.errors)); } + return config as OneBotConfig; } \ No newline at end of file diff --git a/src/onebot/config/index.ts b/src/onebot/config/index.ts index 7e40d5d0..2c1f8221 100644 --- a/src/onebot/config/index.ts +++ b/src/onebot/config/index.ts @@ -1,11 +1,10 @@ import { ConfigBase } from '@/common/config-base'; import type { NapCatCore } from '@/core'; import { OneBotConfig } from './config'; -import { z } from 'zod'; - +import { AnySchema } from 'ajv'; export class OB11ConfigLoader extends ConfigBase { - constructor(core: NapCatCore, configPath: string, schema: z.ZodType) { + constructor(core: NapCatCore, configPath: string, schema: AnySchema) { super('onebot11', core, configPath, schema); } } diff --git a/src/shell/base.ts b/src/shell/base.ts index a8e53b34..540e19cb 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -143,7 +143,7 @@ async function handleLogin( handleLoginInner(context, logger, loginService, quickLoginUin, historyLoginList).then().catch(e => logger.logError(e)); loginListener.onLoginConnected = () => { }; }); - }; + } loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => { WebUiDataRuntime.setQQLoginQrcodeURL(qrcodeUrl); diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index d6455c68..a21b3639 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -1,27 +1,33 @@ import { webUiPathWrapper } from '@/webui'; +import { Type, Static } from '@sinclair/typebox'; +import Ajv from 'ajv'; import fs, { constants } from 'node:fs/promises'; + import { resolve } from 'node:path'; + import { deepMerge } from '../utils/object'; import { themeType } from '../types/theme'; -import { z } from 'zod'; + +// 限制尝试端口的次数,避免死循环 + // 定义配置的类型 -const WebUiConfigSchema = z.object({ - host: z.string().default('0.0.0.0'), - port: z.number().default(6099), - token: z.string().default('napcat'), - loginRate: z.number().default(10), - autoLoginAccount: z.string().default(''), +const WebUiConfigSchema = Type.Object({ + host: Type.String({ default: '0.0.0.0' }), + port: Type.Number({ default: 6099 }), + token: Type.String({ default: 'napcat' }), + loginRate: Type.Number({ default: 10 }), + autoLoginAccount: Type.String({ default: '' }), theme: themeType, }); -export type WebUiConfigType = z.infer; +export type WebUiConfigType = Static; // 读取当前目录下名为 webui.json 的配置文件,如果不存在则创建初始化配置文件 export class WebUiConfigWrapper { WebUiConfigData: WebUiConfigType | undefined = undefined; private validateAndApplyDefaults(config: Partial): WebUiConfigType { - config = WebUiConfigSchema.parse(config); + new Ajv({ coerceTypes: true, useDefaults: true }).compile(WebUiConfigSchema)(config); return config as WebUiConfigType; } diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts index f265a0bc..593eb96c 100644 --- a/src/webui/src/types/theme.ts +++ b/src/webui/src/types/theme.ts @@ -1,260 +1,260 @@ -import { z } from 'zod'; +import { Type } from '@sinclair/typebox'; -export const themeType = z.object( +export const themeType = Type.Object( { - // dark: Type.Record(Type.String(), Type.String()), - // light: Type.Record(Type.String(), Type.String()), - dark: z.record(z.string(), z.string()), - light: z.record(z.string(), z.string()), + dark: Type.Record(Type.String(), Type.String()), + light: Type.Record(Type.String(), Type.String()), + }, + { + default: { + dark: { + '--heroui-background': '0 0% 0%', + '--heroui-foreground-50': '240 5.88% 10%', + '--heroui-foreground-100': '240 3.7% 15.88%', + '--heroui-foreground-200': '240 5.26% 26.08%', + '--heroui-foreground-300': '240 5.2% 33.92%', + '--heroui-foreground-400': '240 3.83% 46.08%', + '--heroui-foreground-500': '240 5.03% 64.9%', + '--heroui-foreground-600': '240 4.88% 83.92%', + '--heroui-foreground-700': '240 5.88% 90%', + '--heroui-foreground-800': '240 4.76% 95.88%', + '--heroui-foreground-900': '0 0% 98.04%', + '--heroui-foreground': '210 5.56% 92.94%', + '--heroui-focus': '212.01999999999998 100% 46.67%', + '--heroui-overlay': '0 0% 0%', + '--heroui-divider': '0 0% 100%', + '--heroui-divider-opacity': '0.15', + '--heroui-content1': '240 5.88% 10%', + '--heroui-content1-foreground': '0 0% 98.04%', + '--heroui-content2': '240 3.7% 15.88%', + '--heroui-content2-foreground': '240 4.76% 95.88%', + '--heroui-content3': '240 5.26% 26.08%', + '--heroui-content3-foreground': '240 5.88% 90%', + '--heroui-content4': '240 5.2% 33.92%', + '--heroui-content4-foreground': '240 4.88% 83.92%', + '--heroui-default-50': '240 5.88% 10%', + '--heroui-default-100': '240 3.7% 15.88%', + '--heroui-default-200': '240 5.26% 26.08%', + '--heroui-default-300': '240 5.2% 33.92%', + '--heroui-default-400': '240 3.83% 46.08%', + '--heroui-default-500': '240 5.03% 64.9%', + '--heroui-default-600': '240 4.88% 83.92%', + '--heroui-default-700': '240 5.88% 90%', + '--heroui-default-800': '240 4.76% 95.88%', + '--heroui-default-900': '0 0% 98.04%', + '--heroui-default-foreground': '0 0% 100%', + '--heroui-default': '240 5.26% 26.08%', + '--heroui-danger-50': '301.89 82.61% 22.55%', + '--heroui-danger-100': '308.18 76.39% 28.24%', + '--heroui-danger-200': '313.85 70.65% 36.08%', + '--heroui-danger-300': '319.73 65.64% 44.51%', + '--heroui-danger-400': '325.82 69.62% 53.53%', + '--heroui-danger-500': '331.82 75% 65.49%', + '--heroui-danger-600': '337.84 83.46% 73.92%', + '--heroui-danger-700': '343.42 90.48% 83.53%', + '--heroui-danger-800': '350.53 90.48% 91.76%', + '--heroui-danger-900': '324 90.91% 95.69%', + '--heroui-danger-foreground': '0 0% 100%', + '--heroui-danger': '325.82 69.62% 53.53%', + '--heroui-primary-50': '340 84.91% 10.39%', + '--heroui-primary-100': '339.33 86.54% 20.39%', + '--heroui-primary-200': '339.11 85.99% 30.78%', + '--heroui-primary-300': '339 86.54% 40.78%', + '--heroui-primary-400': '339.2 90.36% 51.18%', + '--heroui-primary-500': '339 90% 60.78%', + '--heroui-primary-600': '339.11 90.6% 70.78%', + '--heroui-primary-700': '339.33 90% 80.39%', + '--heroui-primary-800': '340 91.84% 90.39%', + '--heroui-primary-900': '339.13 92% 95.1%', + '--heroui-primary-foreground': '0 0% 100%', + '--heroui-primary': '339.2 90.36% 51.18%', + '--heroui-secondary-50': '270 66.67% 9.41%', + '--heroui-secondary-100': '270 66.67% 18.82%', + '--heroui-secondary-200': '270 66.67% 28.24%', + '--heroui-secondary-300': '270 66.67% 37.65%', + '--heroui-secondary-400': '270 66.67% 47.06%', + '--heroui-secondary-500': '270 59.26% 57.65%', + '--heroui-secondary-600': '270 59.26% 68.24%', + '--heroui-secondary-700': '270 59.26% 78.82%', + '--heroui-secondary-800': '270 59.26% 89.41%', + '--heroui-secondary-900': '270 61.54% 94.9%', + '--heroui-secondary-foreground': '0 0% 100%', + '--heroui-secondary': '270 59.26% 57.65%', + '--heroui-success-50': '145.71 77.78% 8.82%', + '--heroui-success-100': '146.2 79.78% 17.45%', + '--heroui-success-200': '145.79 79.26% 26.47%', + '--heroui-success-300': '146.01 79.89% 35.1%', + '--heroui-success-400': '145.96 79.46% 43.92%', + '--heroui-success-500': '146.01 62.45% 55.1%', + '--heroui-success-600': '145.79 62.57% 66.47%', + '--heroui-success-700': '146.2 61.74% 77.45%', + '--heroui-success-800': '145.71 61.4% 88.82%', + '--heroui-success-900': '146.67 64.29% 94.51%', + '--heroui-success-foreground': '0 0% 0%', + '--heroui-success': '145.96 79.46% 43.92%', + '--heroui-warning-50': '37.14 75% 10.98%', + '--heroui-warning-100': '37.14 75% 21.96%', + '--heroui-warning-200': '36.96 73.96% 33.14%', + '--heroui-warning-300': '37.01 74.22% 44.12%', + '--heroui-warning-400': '37.03 91.27% 55.1%', + '--heroui-warning-500': '37.01 91.26% 64.12%', + '--heroui-warning-600': '36.96 91.24% 73.14%', + '--heroui-warning-700': '37.14 91.3% 81.96%', + '--heroui-warning-800': '37.14 91.3% 90.98%', + '--heroui-warning-900': '54.55 91.67% 95.29%', + '--heroui-warning-foreground': '0 0% 0%', + '--heroui-warning': '37.03 91.27% 55.1%', + '--heroui-code-background': '240 5.56% 7.06%', + '--heroui-strong': '190.14 94.67% 44.12%', + '--heroui-code-mdx': '190.14 94.67% 44.12%', + '--heroui-divider-weight': '1px', + '--heroui-disabled-opacity': '.5', + '--heroui-font-size-tiny': '0.75rem', + '--heroui-font-size-small': '0.875rem', + '--heroui-font-size-medium': '1rem', + '--heroui-font-size-large': '1.125rem', + '--heroui-line-height-tiny': '1rem', + '--heroui-line-height-small': '1.25rem', + '--heroui-line-height-medium': '1.5rem', + '--heroui-line-height-large': '1.75rem', + '--heroui-radius-small': '8px', + '--heroui-radius-medium': '12px', + '--heroui-radius-large': '14px', + '--heroui-border-width-small': '1px', + '--heroui-border-width-medium': '2px', + '--heroui-border-width-large': '3px', + '--heroui-box-shadow-small': + '0px 0px 5px 0px rgba(0, 0, 0, .05), 0px 2px 10px 0px rgba(0, 0, 0, .2), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', + '--heroui-box-shadow-medium': + '0px 0px 15px 0px rgba(0, 0, 0, .06), 0px 2px 30px 0px rgba(0, 0, 0, .22), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', + '--heroui-box-shadow-large': + '0px 0px 30px 0px rgba(0, 0, 0, .07), 0px 30px 60px 0px rgba(0, 0, 0, .26), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', + '--heroui-hover-opacity': '.9', + }, + light: { + '--heroui-background': '0 0% 100%', + '--heroui-foreground-50': '240 5.88% 95%', + '--heroui-foreground-100': '240 3.7% 90%', + '--heroui-foreground-200': '240 5.26% 80%', + '--heroui-foreground-300': '240 5.2% 70%', + '--heroui-foreground-400': '240 3.83% 60%', + '--heroui-foreground-500': '240 5.03% 50%', + '--heroui-foreground-600': '240 4.88% 40%', + '--heroui-foreground-700': '240 5.88% 30%', + '--heroui-foreground-800': '240 4.76% 20%', + '--heroui-foreground-900': '0 0% 10%', + '--heroui-foreground': '210 5.56% 7.06%', + '--heroui-focus': '212.01999999999998 100% 53.33%', + '--heroui-overlay': '0 0% 100%', + '--heroui-divider': '0 0% 0%', + '--heroui-divider-opacity': '0.85', + '--heroui-content1': '240 5.88% 95%', + '--heroui-content1-foreground': '0 0% 10%', + '--heroui-content2': '240 3.7% 90%', + '--heroui-content2-foreground': '240 4.76% 20%', + '--heroui-content3': '240 5.26% 80%', + '--heroui-content3-foreground': '240 5.88% 30%', + '--heroui-content4': '240 5.2% 70%', + '--heroui-content4-foreground': '240 4.88% 40%', + '--heroui-default-50': '240 5.88% 95%', + '--heroui-default-100': '240 3.7% 90%', + '--heroui-default-200': '240 5.26% 80%', + '--heroui-default-300': '240 5.2% 70%', + '--heroui-default-400': '240 3.83% 60%', + '--heroui-default-500': '240 5.03% 50%', + '--heroui-default-600': '240 4.88% 40%', + '--heroui-default-700': '240 5.88% 30%', + '--heroui-default-800': '240 4.76% 20%', + '--heroui-default-900': '0 0% 10%', + '--heroui-default-foreground': '0 0% 0%', + '--heroui-default': '240 5.26% 80%', + '--heroui-danger-50': '324 90.91% 95.69%', + '--heroui-danger-100': '350.53 90.48% 91.76%', + '--heroui-danger-200': '343.42 90.48% 83.53%', + '--heroui-danger-300': '337.84 83.46% 73.92%', + '--heroui-danger-400': '331.82 75% 65.49%', + '--heroui-danger-500': '325.82 69.62% 53.53%', + '--heroui-danger-600': '319.73 65.64% 44.51%', + '--heroui-danger-700': '313.85 70.65% 36.08%', + '--heroui-danger-800': '308.18 76.39% 28.24%', + '--heroui-danger-900': '301.89 82.61% 22.55%', + '--heroui-danger-foreground': '0 0% 100%', + '--heroui-danger': '325.82 69.62% 53.53%', + '--heroui-primary-50': '339.13 92% 95.1%', + '--heroui-primary-100': '340 91.84% 90.39%', + '--heroui-primary-200': '339.33 90% 80.39%', + '--heroui-primary-300': '339.11 90.6% 70.78%', + '--heroui-primary-400': '339 90% 60.78%', + '--heroui-primary-500': '339.2 90.36% 51.18%', + '--heroui-primary-600': '339 86.54% 40.78%', + '--heroui-primary-700': '339.11 85.99% 30.78%', + '--heroui-primary-800': '339.33 86.54% 20.39%', + '--heroui-primary-900': '340 84.91% 10.39%', + '--heroui-primary-foreground': '0 0% 100%', + '--heroui-primary': '339.2 90.36% 51.18%', + '--heroui-secondary-50': '270 61.54% 94.9%', + '--heroui-secondary-100': '270 59.26% 89.41%', + '--heroui-secondary-200': '270 59.26% 78.82%', + '--heroui-secondary-300': '270 59.26% 68.24%', + '--heroui-secondary-400': '270 59.26% 57.65%', + '--heroui-secondary-500': '270 66.67% 47.06%', + '--heroui-secondary-600': '270 66.67% 37.65%', + '--heroui-secondary-700': '270 66.67% 28.24%', + '--heroui-secondary-800': '270 66.67% 18.82%', + '--heroui-secondary-900': '270 66.67% 9.41%', + '--heroui-secondary-foreground': '0 0% 100%', + '--heroui-secondary': '270 66.67% 47.06%', + '--heroui-success-50': '146.67 64.29% 94.51%', + '--heroui-success-100': '145.71 61.4% 88.82%', + '--heroui-success-200': '146.2 61.74% 77.45%', + '--heroui-success-300': '145.79 62.57% 66.47%', + '--heroui-success-400': '146.01 62.45% 55.1%', + '--heroui-success-500': '145.96 79.46% 43.92%', + '--heroui-success-600': '146.01 79.89% 35.1%', + '--heroui-success-700': '145.79 79.26% 26.47%', + '--heroui-success-800': '146.2 79.78% 17.45%', + '--heroui-success-900': '145.71 77.78% 8.82%', + '--heroui-success-foreground': '0 0% 0%', + '--heroui-success': '145.96 79.46% 43.92%', + '--heroui-warning-50': '54.55 91.67% 95.29%', + '--heroui-warning-100': '37.14 91.3% 90.98%', + '--heroui-warning-200': '37.14 91.3% 81.96%', + '--heroui-warning-300': '36.96 91.24% 73.14%', + '--heroui-warning-400': '37.01 91.26% 64.12%', + '--heroui-warning-500': '37.03 91.27% 55.1%', + '--heroui-warning-600': '37.01 74.22% 44.12%', + '--heroui-warning-700': '36.96 73.96% 33.14%', + '--heroui-warning-800': '37.14 75% 21.96%', + '--heroui-warning-900': '37.14 75% 10.98%', + '--heroui-warning-foreground': '0 0% 0%', + '--heroui-warning': '37.03 91.27% 55.1%', + '--heroui-code-background': '221.25 17.39% 18.04%', + '--heroui-strong': '316.95 100% 65.29%', + '--heroui-code-mdx': '316.95 100% 65.29%', + '--heroui-divider-weight': '1px', + '--heroui-disabled-opacity': '.5', + '--heroui-font-size-tiny': '0.75rem', + '--heroui-font-size-small': '0.875rem', + '--heroui-font-size-medium': '1rem', + '--heroui-font-size-large': '1.125rem', + '--heroui-line-height-tiny': '1rem', + '--heroui-line-height-small': '1.25rem', + '--heroui-line-height-medium': '1.5rem', + '--heroui-line-height-large': '1.75rem', + '--heroui-radius-small': '8px', + '--heroui-radius-medium': '12px', + '--heroui-radius-large': '14px', + '--heroui-border-width-small': '1px', + '--heroui-border-width-medium': '2px', + '--heroui-border-width-large': '3px', + '--heroui-box-shadow-small': + '0px 0px 5px 0px rgba(0, 0, 0, .02), 0px 2px 10px 0px rgba(0, 0, 0, .06), 0px 0px 1px 0px rgba(0, 0, 0, .3)', + '--heroui-box-shadow-medium': + '0px 0px 15px 0px rgba(0, 0, 0, .03), 0px 2px 30px 0px rgba(0, 0, 0, .08), 0px 0px 1px 0px rgba(0, 0, 0, .3)', + '--heroui-box-shadow-large': + '0px 0px 30px 0px rgba(0, 0, 0, .04), 0px 30px 60px 0px rgba(0, 0, 0, .12), 0px 0px 1px 0px rgba(0, 0, 0, .3)', + '--heroui-hover-opacity': '.8', + }, + }, } -).default({ - dark: { - '--heroui-background': '0 0% 0%', - '--heroui-foreground-50': '240 5.88% 10%', - '--heroui-foreground-100': '240 3.7% 15.88%', - '--heroui-foreground-200': '240 5.26% 26.08%', - '--heroui-foreground-300': '240 5.2% 33.92%', - '--heroui-foreground-400': '240 3.83% 46.08%', - '--heroui-foreground-500': '240 5.03% 64.9%', - '--heroui-foreground-600': '240 4.88% 83.92%', - '--heroui-foreground-700': '240 5.88% 90%', - '--heroui-foreground-800': '240 4.76% 95.88%', - '--heroui-foreground-900': '0 0% 98.04%', - '--heroui-foreground': '210 5.56% 92.94%', - '--heroui-focus': '212.01999999999998 100% 46.67%', - '--heroui-overlay': '0 0% 0%', - '--heroui-divider': '0 0% 100%', - '--heroui-divider-opacity': '0.15', - '--heroui-content1': '240 5.88% 10%', - '--heroui-content1-foreground': '0 0% 98.04%', - '--heroui-content2': '240 3.7% 15.88%', - '--heroui-content2-foreground': '240 4.76% 95.88%', - '--heroui-content3': '240 5.26% 26.08%', - '--heroui-content3-foreground': '240 5.88% 90%', - '--heroui-content4': '240 5.2% 33.92%', - '--heroui-content4-foreground': '240 4.88% 83.92%', - '--heroui-default-50': '240 5.88% 10%', - '--heroui-default-100': '240 3.7% 15.88%', - '--heroui-default-200': '240 5.26% 26.08%', - '--heroui-default-300': '240 5.2% 33.92%', - '--heroui-default-400': '240 3.83% 46.08%', - '--heroui-default-500': '240 5.03% 64.9%', - '--heroui-default-600': '240 4.88% 83.92%', - '--heroui-default-700': '240 5.88% 90%', - '--heroui-default-800': '240 4.76% 95.88%', - '--heroui-default-900': '0 0% 98.04%', - '--heroui-default-foreground': '0 0% 100%', - '--heroui-default': '240 5.26% 26.08%', - '--heroui-danger-50': '301.89 82.61% 22.55%', - '--heroui-danger-100': '308.18 76.39% 28.24%', - '--heroui-danger-200': '313.85 70.65% 36.08%', - '--heroui-danger-300': '319.73 65.64% 44.51%', - '--heroui-danger-400': '325.82 69.62% 53.53%', - '--heroui-danger-500': '331.82 75% 65.49%', - '--heroui-danger-600': '337.84 83.46% 73.92%', - '--heroui-danger-700': '343.42 90.48% 83.53%', - '--heroui-danger-800': '350.53 90.48% 91.76%', - '--heroui-danger-900': '324 90.91% 95.69%', - '--heroui-danger-foreground': '0 0% 100%', - '--heroui-danger': '325.82 69.62% 53.53%', - '--heroui-primary-50': '340 84.91% 10.39%', - '--heroui-primary-100': '339.33 86.54% 20.39%', - '--heroui-primary-200': '339.11 85.99% 30.78%', - '--heroui-primary-300': '339 86.54% 40.78%', - '--heroui-primary-400': '339.2 90.36% 51.18%', - '--heroui-primary-500': '339 90% 60.78%', - '--heroui-primary-600': '339.11 90.6% 70.78%', - '--heroui-primary-700': '339.33 90% 80.39%', - '--heroui-primary-800': '340 91.84% 90.39%', - '--heroui-primary-900': '339.13 92% 95.1%', - '--heroui-primary-foreground': '0 0% 100%', - '--heroui-primary': '339.2 90.36% 51.18%', - '--heroui-secondary-50': '270 66.67% 9.41%', - '--heroui-secondary-100': '270 66.67% 18.82%', - '--heroui-secondary-200': '270 66.67% 28.24%', - '--heroui-secondary-300': '270 66.67% 37.65%', - '--heroui-secondary-400': '270 66.67% 47.06%', - '--heroui-secondary-500': '270 59.26% 57.65%', - '--heroui-secondary-600': '270 59.26% 68.24%', - '--heroui-secondary-700': '270 59.26% 78.82%', - '--heroui-secondary-800': '270 59.26% 89.41%', - '--heroui-secondary-900': '270 61.54% 94.9%', - '--heroui-secondary-foreground': '0 0% 100%', - '--heroui-secondary': '270 59.26% 57.65%', - '--heroui-success-50': '145.71 77.78% 8.82%', - '--heroui-success-100': '146.2 79.78% 17.45%', - '--heroui-success-200': '145.79 79.26% 26.47%', - '--heroui-success-300': '146.01 79.89% 35.1%', - '--heroui-success-400': '145.96 79.46% 43.92%', - '--heroui-success-500': '146.01 62.45% 55.1%', - '--heroui-success-600': '145.79 62.57% 66.47%', - '--heroui-success-700': '146.2 61.74% 77.45%', - '--heroui-success-800': '145.71 61.4% 88.82%', - '--heroui-success-900': '146.67 64.29% 94.51%', - '--heroui-success-foreground': '0 0% 0%', - '--heroui-success': '145.96 79.46% 43.92%', - '--heroui-warning-50': '37.14 75% 10.98%', - '--heroui-warning-100': '37.14 75% 21.96%', - '--heroui-warning-200': '36.96 73.96% 33.14%', - '--heroui-warning-300': '37.01 74.22% 44.12%', - '--heroui-warning-400': '37.03 91.27% 55.1%', - '--heroui-warning-500': '37.01 91.26% 64.12%', - '--heroui-warning-600': '36.96 91.24% 73.14%', - '--heroui-warning-700': '37.14 91.3% 81.96%', - '--heroui-warning-800': '37.14 91.3% 90.98%', - '--heroui-warning-900': '54.55 91.67% 95.29%', - '--heroui-warning-foreground': '0 0% 0%', - '--heroui-warning': '37.03 91.27% 55.1%', - '--heroui-code-background': '240 5.56% 7.06%', - '--heroui-strong': '190.14 94.67% 44.12%', - '--heroui-code-mdx': '190.14 94.67% 44.12%', - '--heroui-divider-weight': '1px', - '--heroui-disabled-opacity': '.5', - '--heroui-font-size-tiny': '0.75rem', - '--heroui-font-size-small': '0.875rem', - '--heroui-font-size-medium': '1rem', - '--heroui-font-size-large': '1.125rem', - '--heroui-line-height-tiny': '1rem', - '--heroui-line-height-small': '1.25rem', - '--heroui-line-height-medium': '1.5rem', - '--heroui-line-height-large': '1.75rem', - '--heroui-radius-small': '8px', - '--heroui-radius-medium': '12px', - '--heroui-radius-large': '14px', - '--heroui-border-width-small': '1px', - '--heroui-border-width-medium': '2px', - '--heroui-border-width-large': '3px', - '--heroui-box-shadow-small': - '0px 0px 5px 0px rgba(0, 0, 0, .05), 0px 2px 10px 0px rgba(0, 0, 0, .2), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', - '--heroui-box-shadow-medium': - '0px 0px 15px 0px rgba(0, 0, 0, .06), 0px 2px 30px 0px rgba(0, 0, 0, .22), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', - '--heroui-box-shadow-large': - '0px 0px 30px 0px rgba(0, 0, 0, .07), 0px 30px 60px 0px rgba(0, 0, 0, .26), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', - '--heroui-hover-opacity': '.9', - }, - light: { - '--heroui-background': '0 0% 100%', - '--heroui-foreground-50': '240 5.88% 95%', - '--heroui-foreground-100': '240 3.7% 90%', - '--heroui-foreground-200': '240 5.26% 80%', - '--heroui-foreground-300': '240 5.2% 70%', - '--heroui-foreground-400': '240 3.83% 60%', - '--heroui-foreground-500': '240 5.03% 50%', - '--heroui-foreground-600': '240 4.88% 40%', - '--heroui-foreground-700': '240 5.88% 30%', - '--heroui-foreground-800': '240 4.76% 20%', - '--heroui-foreground-900': '0 0% 10%', - '--heroui-foreground': '210 5.56% 7.06%', - '--heroui-focus': '212.01999999999998 100% 53.33%', - '--heroui-overlay': '0 0% 100%', - '--heroui-divider': '0 0% 0%', - '--heroui-divider-opacity': '0.85', - '--heroui-content1': '240 5.88% 95%', - '--heroui-content1-foreground': '0 0% 10%', - '--heroui-content2': '240 3.7% 90%', - '--heroui-content2-foreground': '240 4.76% 20%', - '--heroui-content3': '240 5.26% 80%', - '--heroui-content3-foreground': '240 5.88% 30%', - '--heroui-content4': '240 5.2% 70%', - '--heroui-content4-foreground': '240 4.88% 40%', - '--heroui-default-50': '240 5.88% 95%', - '--heroui-default-100': '240 3.7% 90%', - '--heroui-default-200': '240 5.26% 80%', - '--heroui-default-300': '240 5.2% 70%', - '--heroui-default-400': '240 3.83% 60%', - '--heroui-default-500': '240 5.03% 50%', - '--heroui-default-600': '240 4.88% 40%', - '--heroui-default-700': '240 5.88% 30%', - '--heroui-default-800': '240 4.76% 20%', - '--heroui-default-900': '0 0% 10%', - '--heroui-default-foreground': '0 0% 0%', - '--heroui-default': '240 5.26% 80%', - '--heroui-danger-50': '324 90.91% 95.69%', - '--heroui-danger-100': '350.53 90.48% 91.76%', - '--heroui-danger-200': '343.42 90.48% 83.53%', - '--heroui-danger-300': '337.84 83.46% 73.92%', - '--heroui-danger-400': '331.82 75% 65.49%', - '--heroui-danger-500': '325.82 69.62% 53.53%', - '--heroui-danger-600': '319.73 65.64% 44.51%', - '--heroui-danger-700': '313.85 70.65% 36.08%', - '--heroui-danger-800': '308.18 76.39% 28.24%', - '--heroui-danger-900': '301.89 82.61% 22.55%', - '--heroui-danger-foreground': '0 0% 100%', - '--heroui-danger': '325.82 69.62% 53.53%', - '--heroui-primary-50': '339.13 92% 95.1%', - '--heroui-primary-100': '340 91.84% 90.39%', - '--heroui-primary-200': '339.33 90% 80.39%', - '--heroui-primary-300': '339.11 90.6% 70.78%', - '--heroui-primary-400': '339 90% 60.78%', - '--heroui-primary-500': '339.2 90.36% 51.18%', - '--heroui-primary-600': '339 86.54% 40.78%', - '--heroui-primary-700': '339.11 85.99% 30.78%', - '--heroui-primary-800': '339.33 86.54% 20.39%', - '--heroui-primary-900': '340 84.91% 10.39%', - '--heroui-primary-foreground': '0 0% 100%', - '--heroui-primary': '339.2 90.36% 51.18%', - '--heroui-secondary-50': '270 61.54% 94.9%', - '--heroui-secondary-100': '270 59.26% 89.41%', - '--heroui-secondary-200': '270 59.26% 78.82%', - '--heroui-secondary-300': '270 59.26% 68.24%', - '--heroui-secondary-400': '270 59.26% 57.65%', - '--heroui-secondary-500': '270 66.67% 47.06%', - '--heroui-secondary-600': '270 66.67% 37.65%', - '--heroui-secondary-700': '270 66.67% 28.24%', - '--heroui-secondary-800': '270 66.67% 18.82%', - '--heroui-secondary-900': '270 66.67% 9.41%', - '--heroui-secondary-foreground': '0 0% 100%', - '--heroui-secondary': '270 66.67% 47.06%', - '--heroui-success-50': '146.67 64.29% 94.51%', - '--heroui-success-100': '145.71 61.4% 88.82%', - '--heroui-success-200': '146.2 61.74% 77.45%', - '--heroui-success-300': '145.79 62.57% 66.47%', - '--heroui-success-400': '146.01 62.45% 55.1%', - '--heroui-success-500': '145.96 79.46% 43.92%', - '--heroui-success-600': '146.01 79.89% 35.1%', - '--heroui-success-700': '145.79 79.26% 26.47%', - '--heroui-success-800': '146.2 79.78% 17.45%', - '--heroui-success-900': '145.71 77.78% 8.82%', - '--heroui-success-foreground': '0 0% 0%', - '--heroui-success': '145.96 79.46% 43.92%', - '--heroui-warning-50': '54.55 91.67% 95.29%', - '--heroui-warning-100': '37.14 91.3% 90.98%', - '--heroui-warning-200': '37.14 91.3% 81.96%', - '--heroui-warning-300': '36.96 91.24% 73.14%', - '--heroui-warning-400': '37.01 91.26% 64.12%', - '--heroui-warning-500': '37.03 91.27% 55.1%', - '--heroui-warning-600': '37.01 74.22% 44.12%', - '--heroui-warning-700': '36.96 73.96% 33.14%', - '--heroui-warning-800': '37.14 75% 21.96%', - '--heroui-warning-900': '37.14 75% 10.98%', - '--heroui-warning-foreground': '0 0% 0%', - '--heroui-warning': '37.03 91.27% 55.1%', - '--heroui-code-background': '221.25 17.39% 18.04%', - '--heroui-strong': '316.95 100% 65.29%', - '--heroui-code-mdx': '316.95 100% 65.29%', - '--heroui-divider-weight': '1px', - '--heroui-disabled-opacity': '.5', - '--heroui-font-size-tiny': '0.75rem', - '--heroui-font-size-small': '0.875rem', - '--heroui-font-size-medium': '1rem', - '--heroui-font-size-large': '1.125rem', - '--heroui-line-height-tiny': '1rem', - '--heroui-line-height-small': '1.25rem', - '--heroui-line-height-medium': '1.5rem', - '--heroui-line-height-large': '1.75rem', - '--heroui-radius-small': '8px', - '--heroui-radius-medium': '12px', - '--heroui-radius-large': '14px', - '--heroui-border-width-small': '1px', - '--heroui-border-width-medium': '2px', - '--heroui-border-width-large': '3px', - '--heroui-box-shadow-small': - '0px 0px 5px 0px rgba(0, 0, 0, .02), 0px 2px 10px 0px rgba(0, 0, 0, .06), 0px 0px 1px 0px rgba(0, 0, 0, .3)', - '--heroui-box-shadow-medium': - '0px 0px 15px 0px rgba(0, 0, 0, .03), 0px 2px 30px 0px rgba(0, 0, 0, .08), 0px 0px 1px 0px rgba(0, 0, 0, .3)', - '--heroui-box-shadow-large': - '0px 0px 30px 0px rgba(0, 0, 0, .04), 0px 30px 60px 0px rgba(0, 0, 0, .12), 0px 0px 1px 0px rgba(0, 0, 0, .3)', - '--heroui-hover-opacity': '.8', - }, - -}) +); From cd781c4cf6721464b01a01236557b43f48019774 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: Sat, 19 Apr 2025 11:07:01 +0800 Subject: [PATCH 109/149] =?UTF-8?q?feat:=20=E5=9B=9E=E5=BD=92ajv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 65 +++++++++++--------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index 5552229b..da7f960f 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -4,14 +4,14 @@ import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { Static, Type } from '@sinclair/typebox'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; +import { isNumeric } from '@/common/helper'; const SchemaData = Type.Object({ - message_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), - id: Type.Optional(Type.Union([Type.Number(), Type.String()])), + message_id: Type.Optional(Type.String()), + id: Type.Optional(Type.String()), }); type Payload = Static; - export class GoCQHTTPGetForwardMsgAction extends OneBotAction { @@ -53,19 +53,21 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { + // 2. 定义辅助函数 - 创建伪转发消息对象 + const createFakeForwardMsg = (resId: string): RawMessage => { return { chatType: ChatType.KCHATTYPEGROUP, elements: [{ elementType: ElementType.MULTIFORWARD, elementId: '', multiForwardMsgElement: { - resId: res_id, + resId: resId, fileName: '', xmlContent: '', } @@ -96,8 +98,9 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction { - const ob = (await this.obContext.apis.MsgApi.parseMessageV2(fakeForwardMsg(res_id)))?.arrayMsg; + // 3. 定义协议回退逻辑函数 + const protocolFallbackLogic = async (resId: string) => { + const ob = (await this.obContext.apis.MsgApi.parseMessageV2(createFakeForwardMsg(resId)))?.arrayMsg; if (ob) { return { messages: (ob?.message?.[0] as OB11MessageForward)?.data?.content @@ -105,31 +108,37 @@ export class GoCQHTTPGetForwardMsgAction extends OneBotAction 0) { + const singleMsg = data.msgList[0]; + if (!singleMsg) { + throw new Error('消息不存在或已过期'); + } + // 6. 解析消息内容 + const resMsg = (await this.obContext.apis.MsgApi.parseMessageV2(singleMsg))?.arrayMsg; - // return { message: resMsg }; + const forwardContent = (resMsg?.message?.[0] as OB11MessageForward)?.data?.content; + if (forwardContent) { + return { messages: forwardContent }; + } + } + } + // 说明消息已过期或者为内层消息 NapCat 一次返回不处理内层消息 + throw new Error('消息已过期或者为内层消息,无法获取转发消息'); } } From f7556b5af3575b16a9e0e4587bc045bb75cda32a 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: Sat, 19 Apr 2025 11:10:04 +0800 Subject: [PATCH 110/149] fix --- src/core/types/webapi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/types/webapi.ts b/src/core/types/webapi.ts index c689d860..c9771cba 100644 --- a/src/core/types/webapi.ts +++ b/src/core/types/webapi.ts @@ -115,7 +115,7 @@ export interface GroupEssenceMsg { add_digest_uin: string; add_digest_nick: string; add_digest_time: number; - msg_content: unknown[]; + msg_content: { msg_type: number, text?: string, image_url?: string }[]; can_be_removed: true; } From 43c98c45b996ca61d0eb86b30b3a4b4cff2f8329 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: Sat, 19 Apr 2025 11:13:02 +0800 Subject: [PATCH 111/149] fix --- src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts | 14 +++++--------- src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts | 14 +++++--------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index 52387741..28e32c4e 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -11,10 +11,10 @@ interface Response { messages: OB11Message[]; } const SchemaData = Type.Object({ - user_id: Type.Union([Type.Number(), Type.String()]), - message_seq: Type.Optional(Type.Union([Type.Number(), Type.String()])), - count: Type.Union([Type.Number(), Type.String()], { default: 20 }), - reverseOrder: Type.Optional(Type.Union([Type.Boolean(), Type.String()])) + user_id: Type.String(), + message_seq: Type.Optional(Type.String()), + count: Type.Number({ default: 20 }), + reverseOrder: Type.Boolean({ default: false }) }); @@ -27,18 +27,14 @@ export default class GetFriendMsgHistory extends OneBotAction async _handle(payload: Payload, _adapter: string, config: NetworkAdapterConfig): Promise { //处理参数 const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); - - const isReverseOrder = typeof payload.reverseOrder === 'string' ? payload.reverseOrder === 'true' : !!payload.reverseOrder; if (!uid) throw new Error(`记录${payload.user_id}不存在`); const friend = await this.core.apis.FriendApi.isBuddy(uid); const peer = { chatType: friend ? ChatType.KCHATTYPEC2C : ChatType.KCHATTYPETEMPC2CFROMGROUP, peerUid: uid }; const hasMessageSeq = !payload.message_seq ? !!payload.message_seq : !(payload.message_seq?.toString() === '' || payload.message_seq?.toString() === '0'); const startMsgId = hasMessageSeq ? (MessageUnique.getMsgIdAndPeerByShortId(+payload.message_seq!)?.MsgId ?? payload.message_seq!.toString()) : '0'; const msgList = hasMessageSeq ? - (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, isReverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; + (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, payload.reverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; if (msgList.length === 0) throw new Error(`消息${payload.message_seq}不存在`); - //翻转消息 - if (isReverseOrder) msgList.reverse(); //转换序号 await Promise.all(msgList.map(async msg => { msg.id = MessageUnique.createUniqueMsgId({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId); diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index 4c356df2..5dcbedb1 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -11,10 +11,10 @@ interface Response { } const SchemaData = Type.Object({ - group_id: Type.Union([Type.Number(), Type.String()]), - message_seq: Type.Optional(Type.Union([Type.Number(), Type.String()])), - count: Type.Union([Type.Number(), Type.String()], { default: 20 }), - reverseOrder: Type.Optional(Type.Union([Type.Boolean(), Type.String()])) + group_id: Type.String(), + message_seq: Type.Optional(Type.String()), + count: Type.Number({ default: 20 }), + reverseOrder: Type.Boolean({ default: false }) }); @@ -26,17 +26,13 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction { - //处理参数 - const isReverseOrder = typeof payload.reverseOrder === 'string' ? payload.reverseOrder === 'true' : !!payload.reverseOrder; 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'); //拉取消息 const startMsgId = hasMessageSeq ? (MessageUnique.getMsgIdAndPeerByShortId(+payload.message_seq!)?.MsgId ?? payload.message_seq!.toString()) : '0'; const msgList = hasMessageSeq ? - (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, isReverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; + (await this.core.apis.MsgApi.getMsgHistory(peer, startMsgId, +payload.count, payload.reverseOrder)).msgList : (await this.core.apis.MsgApi.getAioFirstViewLatestMsgs(peer, +payload.count)).msgList; if (msgList.length === 0) throw new Error(`消息${payload.message_seq}不存在`); - //翻转消息 - if (isReverseOrder) msgList.reverse(); //转换序号 await Promise.all(msgList.map(async msg => { msg.id = MessageUnique.createUniqueMsgId({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId); From d766c4945e88ff471c05e03f2bc45c5366fc3500 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sat, 19 Apr 2025 03:17:47 +0000 Subject: [PATCH 112/149] release: v4.7.32 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 7f133dbf..18ee2ff3 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.31", + "version": "4.7.32", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index f80b2434..d6d19c5b 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.31", + "version": "4.7.32", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 64586862..b0fb1d70 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.31'; +export const napCatVersion = '4.7.32'; From b1047309c917b62c6d3fefc2bdf0bd9760c272b5 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: Sat, 19 Apr 2025 11:36:27 +0800 Subject: [PATCH 113/149] =?UTF-8?q?feat:=20=E6=B6=88=E6=81=AFcontext?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/action/msg/SendMsg.ts | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/onebot/action/msg/SendMsg.ts b/src/onebot/action/msg/SendMsg.ts index 26a93ad2..bb17807c 100644 --- a/src/onebot/action/msg/SendMsg.ts +++ b/src/onebot/action/msg/SendMsg.ts @@ -38,7 +38,7 @@ export function normalize(message: OB11MessageMixType, autoEscape = false): OB11 export async function createContext(core: NapCatCore, payload: OB11PostContext | undefined, contextMode: ContextMode = ContextMode.Normal): Promise { if (!payload) { - throw new Error('请指定 group_id 或 user_id'); + throw new Error('请传递请求内容'); } if ((contextMode === ContextMode.Group || contextMode === ContextMode.Normal) && payload.group_id) { return { @@ -48,7 +48,16 @@ export async function createContext(core: NapCatCore, payload: OB11PostContext | } if ((contextMode === ContextMode.Private || contextMode === ContextMode.Normal) && payload.user_id) { const Uid = await core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); - if (!Uid) throw new Error('无法获取用户信息'); + if (!Uid) { + if (payload.group_id) { + return { + chatType: ChatType.KCHATTYPEGROUP, + peerUid: payload.group_id.toString(), + guildId: '' + } + } + throw new Error('无法获取用户信息'); + } const isBuddy = await core.apis.FriendApi.isBuddy(Uid); if (!isBuddy) { const ret = await core.apis.MsgApi.getTempChatInfo(ChatType.KCHATTYPETEMPC2CFROMGROUP, Uid); @@ -78,7 +87,13 @@ export async function createContext(core: NapCatCore, payload: OB11PostContext | guildId: '', }; } - throw new Error('请指定 group_id 或 user_id'); + if (contextMode === ContextMode.Private && payload.group_id) { + throw new Error('当前私聊发送,请指定 user_id 而不是 group_id'); + } + if (contextMode === ContextMode.Group && payload.user_id) { + throw new Error('当前群聊发送,请指定 group_id 而不是 user_id'); + } + throw new Error('请指定正确的 group_id 或 user_id'); } function getSpecialMsgNum(payload: OB11PostSendMsg, msgType: OB11MessageDataType): number { From fda050d3fec5ff41dab176b7e452fee91d571631 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: Sat, 19 Apr 2025 19:50:52 +0800 Subject: [PATCH 114/149] =?UTF-8?q?feat:=20=E5=8A=A0=E5=BC=BA=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E6=80=A7=20=E4=BC=A0=E8=BE=93=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E4=BD=BF=E7=94=A8salt=20sha256?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- napcat.webui/package.json | 2 ++ napcat.webui/src/controllers/webui_manager.ts | 5 ++-- src/webui/src/api/Auth.ts | 13 +++++---- src/webui/src/helper/SignToken.ts | 28 +++++++++++++++---- src/webui/src/middleware/auth.ts | 7 +++-- src/webui/src/types/sign_token.d.ts | 2 +- 6 files changed, 40 insertions(+), 17 deletions(-) diff --git a/napcat.webui/package.json b/napcat.webui/package.json index bd3c4239..abe025ed 100644 --- a/napcat.webui/package.json +++ b/napcat.webui/package.json @@ -55,6 +55,7 @@ "ahooks": "^3.8.4", "axios": "^1.7.9", "clsx": "^2.1.1", + "crypto-js": "^4.2.0", "echarts": "^5.5.1", "event-source-polyfill": "^1.0.31", "framer-motion": "^12.0.6", @@ -88,6 +89,7 @@ "@eslint/js": "^9.19.0", "@react-types/shared": "^3.26.0", "@trivago/prettier-plugin-sort-imports": "^5.2.2", + "@types/crypto-js": "^4.2.2", "@types/event-source-polyfill": "^1.0.5", "@types/fabric": "^5.3.9", "@types/node": "^22.12.0", diff --git a/napcat.webui/src/controllers/webui_manager.ts b/napcat.webui/src/controllers/webui_manager.ts index ac472126..dfd3e741 100644 --- a/napcat.webui/src/controllers/webui_manager.ts +++ b/napcat.webui/src/controllers/webui_manager.ts @@ -3,7 +3,7 @@ import { EventSourcePolyfill } from 'event-source-polyfill' import { LogLevel } from '@/const/enum' import { serverRequest } from '@/utils/request' - +import CryptoJS from "crypto-js"; export interface Log { level: LogLevel message: string @@ -17,9 +17,10 @@ export default class WebUIManager { } public static async loginWithToken(token: string) { + const sha256 = CryptoJS.SHA256(token + '.napcat').toString(); const { data } = await serverRequest.post>( '/auth/login', - { token } + { hash: sha256 } ) return data.data.Credential } diff --git a/src/webui/src/api/Auth.ts b/src/webui/src/api/Auth.ts index 53e06315..5fb8c1f3 100644 --- a/src/webui/src/api/Auth.ts +++ b/src/webui/src/api/Auth.ts @@ -20,25 +20,26 @@ export const CheckDefaultTokenHandler: RequestHandler = async (_, res) => { export const LoginHandler: RequestHandler = async (req, res) => { // 获取WebUI配置 const WebUiConfigData = await WebUiConfig.GetWebUIConfig(); - // 获取请求体中的token - const { token } = req.body; + // 获取请求体中的hash + const { hash } = req.body; // 获取客户端IP const clientIP = req.ip || req.socket.remoteAddress || ''; // 如果token为空,返回错误信息 - if (isEmpty(token)) { + if (isEmpty(hash)) { return sendError(res, 'token is empty'); } // 检查登录频率 if (!WebUiDataRuntime.checkLoginRate(clientIP, WebUiConfigData.loginRate)) { return sendError(res, 'login rate limit'); } - //验证config.token是否等于token - if (WebUiConfigData.token !== token) { + //验证config.token hash是否等于token hash + if (!AuthHelper.comparePasswordHash(WebUiConfigData.token, hash)) { return sendError(res, 'token is invalid'); } + // 签发凭证 - const signCredential = Buffer.from(JSON.stringify(AuthHelper.signCredential(WebUiConfigData.token))).toString( + const signCredential = Buffer.from(JSON.stringify(AuthHelper.signCredential(hash))).toString( 'base64' ); // 返回成功信息 diff --git a/src/webui/src/helper/SignToken.ts b/src/webui/src/helper/SignToken.ts index 50865b19..495bad56 100644 --- a/src/webui/src/helper/SignToken.ts +++ b/src/webui/src/helper/SignToken.ts @@ -5,13 +5,13 @@ export class AuthHelper { /** * 签名凭证方法。 - * @param token 待签名的凭证字符串。 + * @param hash 待签名的凭证字符串。 * @returns 签名后的凭证对象。 */ - public static signCredential(token: string): WebUiCredentialJson { + public static signCredential(hash: string): WebUiCredentialJson { const innerJson: WebUiCredentialInnerJson = { CreatedTime: Date.now(), - TokenEncoded: token, + HashEncoded: hash, }; const jsonString = JSON.stringify(innerJson); const hmac = crypto.createHmac('sha256', AuthHelper.secretKey).update(jsonString, 'utf8').digest('hex'); @@ -57,8 +57,7 @@ export class AuthHelper { const currentTime = Date.now() / 1000; const createdTime = credentialJson.Data.CreatedTime; const timeDifference = currentTime - createdTime; - - return timeDifference <= 3600 && credentialJson.Data.TokenEncoded === token; + return timeDifference <= 3600 && credentialJson.Data.HashEncoded === AuthHelper.generatePasswordHash(token); } /** @@ -85,4 +84,23 @@ export class AuthHelper { return store.exists(`revoked:${hmac}`) > 0; } + + /** + * 生成密码Hash + * @param password 密码 + * @returns 生成的Hash值 + */ + public static generatePasswordHash(password: string): string { + return crypto.createHash('sha256').update(password + '.napcat').digest().toString('hex') + } + + /** + * 对比密码和Hash值 + * @param password 密码 + * @param hash Hash值 + * @returns 布尔值,表示密码是否匹配Hash值 + */ + public static comparePasswordHash(password: string, hash: string): boolean { + return this.generatePasswordHash(password) === hash; + } } diff --git a/src/webui/src/middleware/auth.ts b/src/webui/src/middleware/auth.ts index 67d73ecd..8e2d756c 100644 --- a/src/webui/src/middleware/auth.ts +++ b/src/webui/src/middleware/auth.ts @@ -21,17 +21,18 @@ export async function auth(req: Request, res: Response, next: NextFunction) { return sendError(res, 'Unauthorized'); } // 获取token - const token = authorization[1]; + const hash = authorization[1]; + if(!hash) return sendError(res, 'Unauthorized'); // 解析token let Credential: WebUiCredentialJson; try { - Credential = JSON.parse(Buffer.from(token, 'base64').toString('utf-8')); + Credential = JSON.parse(Buffer.from(hash, 'base64').toString('utf-8')); } catch (e) { return sendError(res, 'Unauthorized'); } // 获取配置 const config = await WebUiConfig.GetWebUIConfig(); - // 验证凭证在1小时内有效且token与原始token相同 + // 验证凭证在1小时内有效 const credentialJson = AuthHelper.validateCredentialWithinOneHour(config.token, Credential); if (credentialJson) { // 通过验证 diff --git a/src/webui/src/types/sign_token.d.ts b/src/webui/src/types/sign_token.d.ts index 5bd79b69..1b6514d1 100644 --- a/src/webui/src/types/sign_token.d.ts +++ b/src/webui/src/types/sign_token.d.ts @@ -1,6 +1,6 @@ interface WebUiCredentialInnerJson { CreatedTime: number; - TokenEncoded: string; + HashEncoded: string; } interface WebUiCredentialJson { From 556000c0025f5296211347e975eddc1278ff9a03 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: Sat, 19 Apr 2025 19:59:11 +0800 Subject: [PATCH 115/149] =?UTF-8?q?feat:=20=E4=BC=98=E9=9B=85=E7=9A=84?= =?UTF-8?q?=E5=9B=9E=E8=BD=A6=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- napcat.webui/src/pages/web_login.tsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/napcat.webui/src/pages/web_login.tsx b/napcat.webui/src/pages/web_login.tsx index 3f9a53eb..c171bc75 100644 --- a/napcat.webui/src/pages/web_login.tsx +++ b/napcat.webui/src/pages/web_login.tsx @@ -47,6 +47,22 @@ export default function WebLoginPage() { } } + // 处理全局键盘事件 + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Enter' && !isLoading) { + onSubmit() + } + } + + useEffect(() => { + document.addEventListener('keydown', handleKeyDown) + + // 清理函数 + return () => { + document.removeEventListener('keydown', handleKeyDown) + } + }, [tokenValue, isLoading]) // 依赖项包含用于登录的状态 + useEffect(() => { if (token) { onSubmit() From 8ff3ad824e1c6fa58b8e4055ad7044bd00098baf 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: Sat, 19 Apr 2025 20:03:00 +0800 Subject: [PATCH 116/149] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F=E7=A6=81=E7=94=A8ffmpeg=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/napcat.ts | 16 +++++++++------- src/shell/base.ts | 16 +++++++++------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/framework/napcat.ts b/src/framework/napcat.ts index 9f19cecf..8a8282ee 100644 --- a/src/framework/napcat.ts +++ b/src/framework/napcat.ts @@ -38,13 +38,15 @@ export async function NCoreInitFramework( const logger = new LogWrapper(pathWrapper.logsPath); const basicInfoWrapper = new QQBasicInfoWrapper({ logger }); const wrapper = loadQQWrapper(basicInfoWrapper.getFullQQVesion()); - downloadFFmpegIfNotExists(logger).then(({ path, reset }) => { - if (reset && path) { - FFmpegService.setFfmpegPath(path,logger); - } - }).catch(e => { - logger.logError('[Ffmpeg] Error:', e); - }); + if (!process.env['NAPCAT_DISABLE_FFMPEG_DOWNLOAD']) { + downloadFFmpegIfNotExists(logger).then(({ path, reset }) => { + if (reset && path) { + FFmpegService.setFfmpegPath(path, logger); + } + }).catch(e => { + logger.logError('[Ffmpeg] Error:', e); + }); + } //直到登录成功后,执行下一步 const selfInfo = await new Promise((resolveSelfInfo) => { const loginListener = new NodeIKernelLoginListener(); diff --git a/src/shell/base.ts b/src/shell/base.ts index 540e19cb..17258697 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -314,13 +314,15 @@ export async function NCoreInitShell() { const logger = new LogWrapper(pathWrapper.logsPath); handleUncaughtExceptions(logger); await connectToNamedPipe(logger).catch(e => logger.logError('命名管道连接失败', e)); - downloadFFmpegIfNotExists(logger).then(({ path, reset }) => { - if (reset && path) { - FFmpegService.setFfmpegPath(path, logger); - } - }).catch(e => { - logger.logError('[Ffmpeg] Error:', e); - }); + if (!process.env['NAPCAT_DISABLE_FFMPEG_DOWNLOAD']) { + downloadFFmpegIfNotExists(logger).then(({ path, reset }) => { + if (reset && path) { + FFmpegService.setFfmpegPath(path, logger); + } + }).catch(e => { + logger.logError('[Ffmpeg] Error:', e); + }); + } const basicInfoWrapper = new QQBasicInfoWrapper({ logger }); const wrapper = loadQQWrapper(basicInfoWrapper.getFullQQVesion()); From 36e3119d349acacdc8bad8056c2af4fd0637d343 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: Sat, 19 Apr 2025 20:16:24 +0800 Subject: [PATCH 117/149] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81https=20?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/webui/index.ts | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/webui/index.ts b/src/webui/index.ts index 17423d52..37e69b79 100644 --- a/src/webui/index.ts +++ b/src/webui/index.ts @@ -4,6 +4,7 @@ import express from 'express'; import { createServer } from 'http'; +import { createServer as createHttpsServer } from 'https'; import { LogWrapper } from '@/common/log'; import { NapCatPathWrapper } from '@/common/path'; import { WebUiConfigWrapper } from '@webapi/helper/config'; @@ -13,11 +14,10 @@ import { createUrl } from '@webapi/utils/url'; import { sendError } from '@webapi/utils/response'; import { join } from 'node:path'; import { terminalManager } from '@webapi/terminal/terminal_manager'; -import multer from 'multer'; // 新增:引入multer用于错误捕获 +import multer from 'multer'; // 引入multer用于错误捕获 // 实例化Express const app = express(); -const server = createServer(app); /** * 初始化并启动WebUI服务。 * 该函数配置了Express服务器以支持JSON解析和静态文件服务,并监听6099端口。 @@ -29,6 +29,7 @@ export let webUiPathWrapper: NapCatPathWrapper; const MAX_PORT_TRY = 100; import * as net from 'node:net'; import { WebUiDataRuntime } from './src/helper/Data'; +import { existsSync, readFileSync } from 'node:fs'; export let webUiRuntimePort = 6099; export async function InitPort(parsedConfig: WebUiConfigType): Promise<[string, number, string]> { try { @@ -40,7 +41,23 @@ export async function InitPort(parsedConfig: WebUiConfigType): Promise<[string, return ['', 0, '']; } } +async function checkCertificates(logger: LogWrapper): Promise<{ key: string, cert: string } | null> { + try { + const certPath = join(webUiPathWrapper.configPath, 'cert.pem'); + const keyPath = join(webUiPathWrapper.configPath, 'key.pem'); + if (existsSync(certPath) && existsSync(keyPath)) { + const cert = readFileSync(certPath, 'utf8'); + const key = readFileSync(keyPath, 'utf8'); + logger.log('[NapCat] [WebUi] 找到SSL证书,将启用HTTPS模式'); + return { cert, key }; + } + return null; + } catch (error) { + logger.log('[NapCat] [WebUi] 检查SSL证书时出错: ' + error); + return null; + } +} export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapper) { webUiPathWrapper = pathWrapper; WebUiConfig = new WebUiConfigWrapper(); @@ -107,6 +124,9 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp // 挂载静态路由(前端),路径为 /webui app.use('/webui', express.static(pathWrapper.staticPath)); // 初始化WebSocket服务器 + const sslCerts = await checkCertificates(logger); + const isHttps = !!sslCerts; + let server = isHttps && sslCerts ? createHttpsServer(sslCerts, app) : createServer(app); server.on('upgrade', (request, socket, head) => { terminalManager.initialize(request, socket, head, logger); }); From 35f24eb8061c4934a3d9b6c5c335f5424516df9a Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sat, 19 Apr 2025 12:17:18 +0000 Subject: [PATCH 118/149] release: v4.7.33 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 18ee2ff3..6dbe1046 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.32", + "version": "4.7.33", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index d6d19c5b..424a37c0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.32", + "version": "4.7.33", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index b0fb1d70..c69301a3 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.32'; +export const napCatVersion = '4.7.33'; From a47af60f58ded49006e6d02a59b34c91b8b93cb3 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, 20 Apr 2025 19:28:35 +0800 Subject: [PATCH 119/149] feat: disband --- src/onebot/api/msg.ts | 2 ++ src/onebot/event/notice/OB11GroupDecreaseEvent.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 86e943eb..7cc7e7af 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -1105,6 +1105,8 @@ export class OneBotMsgApi { return 'kick'; case 3: return 'kick_me'; + case 129: + return 'disband'; default: return 'kick'; } diff --git a/src/onebot/event/notice/OB11GroupDecreaseEvent.ts b/src/onebot/event/notice/OB11GroupDecreaseEvent.ts index 5a52664e..37a38b5e 100644 --- a/src/onebot/event/notice/OB11GroupDecreaseEvent.ts +++ b/src/onebot/event/notice/OB11GroupDecreaseEvent.ts @@ -1,7 +1,7 @@ import { OB11GroupNoticeEvent } from './OB11GroupNoticeEvent'; import { NapCatCore } from '@/core'; -export type GroupDecreaseSubType = 'leave' | 'kick' | 'kick_me'; +export type GroupDecreaseSubType = 'leave' | 'kick' | 'kick_me' | 'disband'; export class OB11GroupDecreaseEvent extends OB11GroupNoticeEvent { notice_type = 'group_decrease'; @@ -11,7 +11,7 @@ export class OB11GroupDecreaseEvent extends OB11GroupNoticeEvent { constructor(core: NapCatCore, groupId: number, userId: number, operatorId: number, subType: GroupDecreaseSubType = 'leave') { super(core, groupId, userId); this.group_id = groupId; - this.operator_id = operatorId; + this.operator_id = operatorId; this.user_id = userId; this.sub_type = subType; } From e4dd194d4a2669a4ccfd581545991410e6333e40 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, 20 Apr 2025 22:10:24 +0800 Subject: [PATCH 120/149] fix: #960 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 神经设计 --- src/onebot/api/group.ts | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/onebot/api/group.ts b/src/onebot/api/group.ts index bfe0f037..fac10bfb 100644 --- a/src/onebot/api/group.ts +++ b/src/onebot/api/group.ts @@ -250,7 +250,34 @@ export class OneBotGroupApi { 'invite' ); } - + async parse51TypeEvent(msg: RawMessage, grayTipElement: GrayTipElement) { + // 神经腾讯 没了妈妈想出来的 + // Warn 下面存在高并发危险 + if (grayTipElement.jsonGrayTipElement.jsonStr) { + const json: { + align: string, + items: Array<{ txt: string, type: string }> + } = JSON.parse(grayTipElement.jsonGrayTipElement.jsonStr); + if (json.items.length > 0 && json.items[0]?.txt.endsWith('加入群')) { + let old_members = structuredClone(this.core.apis.GroupApi.groupMemberCache.get(msg.peerUid)); + if (!old_members) return; + let new_members_map = await this.core.apis.GroupApi.refreshGroupMemberCache(msg.peerUid, true); + if (!new_members_map) return; + let new_members = Array.from(new_members_map.values()); + // 对比members查找新成员 + let new_member = new_members.find((member) => old_members.get(member.uid) == undefined); + if (!new_member) return; + return new OB11GroupIncreaseEvent( + this.core, + +msg.peerUid, + +new_member.uin, + 0, + 'invite', + ); + } + } + return; + } async parseGrayTipElement(msg: RawMessage, grayTipElement: GrayTipElement) { if (grayTipElement.subElementType === NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_GROUP) { // 解析群组事件 由sysmsg解析 @@ -282,6 +309,9 @@ export class OneBotGroupApi { return await this.parsePaiYiPai(msg, grayTipElement.jsonGrayTipElement.jsonStr); } else if (grayTipElement.jsonGrayTipElement.busiId == JsonGrayBusiId.AIO_GROUP_ESSENCE_MSG_TIP) { return await this.parseEssenceMsg(msg, grayTipElement.jsonGrayTipElement.jsonStr); + } else if (+(grayTipElement.jsonGrayTipElement.busiId ?? 0) == 51) { + // 51是什么?{"align":"center","items":[{"txt":"下一秒起床通过王者荣耀加入群","type":"nor"}] + return await this.parse51TypeEvent(msg, grayTipElement); } else { return await this.parseOtherJsonEvent(msg, grayTipElement.jsonGrayTipElement.jsonStr, this.core.context); } From 886fe2052ea38ee4be10a13918963a598b6572a5 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, 20 Apr 2025 22:12:12 +0800 Subject: [PATCH 121/149] =?UTF-8?q?feat:=20=E9=81=BF=E5=85=8D=E5=8D=B1?= =?UTF-8?q?=E9=99=A9=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/api/group.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebot/api/group.ts b/src/onebot/api/group.ts index fac10bfb..0badb5f1 100644 --- a/src/onebot/api/group.ts +++ b/src/onebot/api/group.ts @@ -258,7 +258,7 @@ export class OneBotGroupApi { align: string, items: Array<{ txt: string, type: string }> } = JSON.parse(grayTipElement.jsonGrayTipElement.jsonStr); - if (json.items.length > 0 && json.items[0]?.txt.endsWith('加入群')) { + if (json.items.length === 1 && json.items[0]?.txt.endsWith('加入群')) { let old_members = structuredClone(this.core.apis.GroupApi.groupMemberCache.get(msg.peerUid)); if (!old_members) return; let new_members_map = await this.core.apis.GroupApi.refreshGroupMemberCache(msg.peerUid, true); From 88b86611a31318686be8e15b65ca19d99768d24d Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sun, 20 Apr 2025 14:12:47 +0000 Subject: [PATCH 122/149] release: v4.7.34 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 6dbe1046..2e2ae048 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.33", + "version": "4.7.34", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 424a37c0..a8b9c119 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.33", + "version": "4.7.34", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index c69301a3..34619ddc 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.33'; +export const napCatVersion = '4.7.34'; From 5db7a90a2408dac64b35a7ab3ade083ddbf5603f 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: Mon, 21 Apr 2025 18:43:44 +0800 Subject: [PATCH 123/149] =?UTF-8?q?feat:=20301=20302=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=B7=9F=E9=9A=8F=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/file.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/file.ts b/src/common/file.ts index c75bcce4..180cf6d1 100644 --- a/src/common/file.ts +++ b/src/common/file.ts @@ -115,7 +115,7 @@ async function tryDownload(options: string | HttpDownloadOptions, useReferer: bo if (useReferer && !headers['Referer']) { headers['Referer'] = url; } - const fetchRes = await fetch(url, { headers }).catch((err) => { + const fetchRes = await fetch(url, { headers, redirect: 'follow' }).catch((err) => { if (err.cause) { throw err.cause; } From 6b8b14aba222f1f92e687069bbc2fa5f7ff1d161 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: Wed, 23 Apr 2025 11:47:58 +0800 Subject: [PATCH 124/149] fix: #963 --- src/onebot/action/index.ts | 2 ++ src/onebot/action/router.ts | 1 + src/onebot/action/user/SetFriendRemark.ts | 25 +++++++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 src/onebot/action/user/SetFriendRemark.ts diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index cbc14a2f..bd12979d 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -115,10 +115,12 @@ import { RenameGroupFile } from './extends/RenameGroupFile'; import { GetRkeyServer } from './packet/GetRkeyServer'; import { GetRkeyEx } from './packet/GetRkeyEx'; import { CleanCache } from './system/CleanCache'; +import SetFriendRemark from './user/SetFriendRemark'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { const actionHandlers = [ + new SetFriendRemark(obContext, core), new GetRkeyEx(obContext, core), new GetRkeyServer(obContext, core), new SetGroupRemark(obContext, core), diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index 711edef6..fe3acd21 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -35,6 +35,7 @@ export const ActionName = { SetGroupLeave: 'set_group_leave', SetSpecialTitle: 'set_group_special_title', SetFriendAddRequest: 'set_friend_add_request', + SetFriendRemark: 'set_friend_remark', SetGroupAddRequest: 'set_group_add_request', GetLoginInfo: 'get_login_info', GoCQHTTP_GetStrangerInfo: 'get_stranger_info', diff --git a/src/onebot/action/user/SetFriendRemark.ts b/src/onebot/action/user/SetFriendRemark.ts new file mode 100644 index 00000000..5cc3559c --- /dev/null +++ b/src/onebot/action/user/SetFriendRemark.ts @@ -0,0 +1,25 @@ +import { OneBotAction } from '@/onebot/action/OneBotAction'; +import { ActionName } from '@/onebot/action/router'; +import { Static, Type } from '@sinclair/typebox'; + +const SchemaData = Type.Object({ + user_id: Type.String(), + remark: Type.String() +}); + +type Payload = Static; + +export default class SetFriendRemark extends OneBotAction { + override actionName = ActionName.SetFriendRemark; + override payloadSchema = SchemaData; + + async _handle(payload: Payload): Promise { + let friendUid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id); + let is_friend = await this.core.apis.FriendApi.isBuddy(friendUid); + if (!is_friend) { + throw new Error(`用户 ${payload.user_id} 不是好友`); + } + await this.core.apis.FriendApi.setBuddyRemark(friendUid, payload.remark); + return null; + } +} From 3e5d35957d82ac38acd6a25408914d18c349a58c 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: Wed, 23 Apr 2025 16:12:56 +0800 Subject: [PATCH 125/149] fix --- src/core/apis/friend.ts | 3 +++ .../listeners/NodeIKernelBuddyListener.ts | 22 +++++++++++++++++-- src/core/services/NodeIKernelBuddyService.ts | 6 ++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/core/apis/friend.ts b/src/core/apis/friend.ts index c03a1999..5e3e327c 100644 --- a/src/core/apis/friend.ts +++ b/src/core/apis/friend.ts @@ -86,4 +86,7 @@ export class NTQQFriendApi { accept, }); } + async handleDoubtFriendRequest(friendUid: string, str1: string = '', str2: string = '') { + this.context.session.getBuddyService().approvalDoubtBuddyReq(friendUid, str1, str2); + } } diff --git a/src/core/listeners/NodeIKernelBuddyListener.ts b/src/core/listeners/NodeIKernelBuddyListener.ts index 5dcfe243..edf29044 100644 --- a/src/core/listeners/NodeIKernelBuddyListener.ts +++ b/src/core/listeners/NodeIKernelBuddyListener.ts @@ -40,12 +40,30 @@ export class NodeIKernelBuddyListener { } onDelBatchBuddyInfos(arg: unknown): any { + console.log('onDelBatchBuddyInfos not implemented', ...arguments); } - onDoubtBuddyReqChange(arg: unknown): any { + onDoubtBuddyReqChange(_arg: + { + reqId: string; + cookie: string; + doubtList: Array<{ + uid: string; + nick: string; + age: number, + sex: number; + commFriendNum: number; + reqTime: string; + msg: string; + source: string; + reason: string; + groupCode: string; + nameMore?: null; + }>; + }): void | Promise { } - onDoubtBuddyReqUnreadNumChange(arg: unknown): any { + onDoubtBuddyReqUnreadNumChange(_num: number): void | Promise { } onNickUpdated(arg: unknown): any { diff --git a/src/core/services/NodeIKernelBuddyService.ts b/src/core/services/NodeIKernelBuddyService.ts index dbb98165..1b2cdff8 100644 --- a/src/core/services/NodeIKernelBuddyService.ts +++ b/src/core/services/NodeIKernelBuddyService.ts @@ -106,15 +106,15 @@ export interface NodeIKernelBuddyService { getAddMeSetting(): unknown; - getDoubtBuddyReq(): unknown; + getDoubtBuddyReq(reqId: string, num: number): Promise; getDoubtBuddyUnreadNum(): number; - approvalDoubtBuddyReq(uid: number, isAgree: boolean): void; + approvalDoubtBuddyReq(uid: string, str1: string, str2: string): void; delDoubtBuddyReq(uid: number): void; - delAllDoubtBuddyReq(): void; + delAllDoubtBuddyReq(): Promise; reportDoubtBuddyReqUnread(): void; From 0caca473d6a393500b496e430e4e5986ccc370ef 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: Wed, 23 Apr 2025 16:18:48 +0800 Subject: [PATCH 126/149] feat: 34566 --- src/core/external/appid.json | 8 ++++++++ src/core/external/offset.json | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/core/external/appid.json b/src/core/external/appid.json index ab779947..1ec36fec 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -258,5 +258,13 @@ "3.2.17-34467": { "appid": 537282292, "qua": "V1_LNX_NQ_3.2.17_34467_GW_B" + }, + "9.9.19-34566": { + "appid": 537282307, + "qua": "V1_WIN_NQ_9.9.19_34566_GW_B" + }, + "3.2.17-34566": { + "appid": 537282343, + "qua": "V1_LNX_NQ_3.2.17_34566_GW_B" } } \ No newline at end of file diff --git a/src/core/external/offset.json b/src/core/external/offset.json index 78818c47..0fa97bc1 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -327,12 +327,16 @@ "send": "770CDC0", "recv": "77106F0" }, - "9.9.19-34362-x64":{ + "9.9.19-34362-x64": { "send": "3BD80D0", "recv": "3BDC8D0" }, "9.9.19-34467-x64": { "send": "3BD8690", "recv": "3BDCE90" + }, + "9.9.19-34566-x64": { + "send": "3BDA110", + "recv": "3BDE910" } } \ No newline at end of file From c7b9946d2f3f3c47f281b00f382974fbc2c4c68e 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: Wed, 23 Apr 2025 16:46:09 +0800 Subject: [PATCH 127/149] =?UTF-8?q?feat:=20doubt=20friends=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/friend.ts | 24 +++++++++++++++++++ src/core/services/NodeIKernelBuddyService.ts | 2 +- src/onebot/action/index.ts | 4 ++++ .../action/new/GetDoubtFriendsAddRequest.ts | 18 ++++++++++++++ .../action/new/SetDoubtFriendsAddRequest.ts | 21 ++++++++++++++++ src/onebot/action/router.ts | 4 ++++ 6 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/onebot/action/new/GetDoubtFriendsAddRequest.ts create mode 100644 src/onebot/action/new/SetDoubtFriendsAddRequest.ts diff --git a/src/core/apis/friend.ts b/src/core/apis/friend.ts index 5e3e327c..a8254ec1 100644 --- a/src/core/apis/friend.ts +++ b/src/core/apis/friend.ts @@ -89,4 +89,28 @@ export class NTQQFriendApi { async handleDoubtFriendRequest(friendUid: string, str1: string = '', str2: string = '') { this.context.session.getBuddyService().approvalDoubtBuddyReq(friendUid, str1, str2); } + async getDoubtFriendRequest(count: number) { + let date = Date.now().toString(); + const [, ret] = await this.core.eventWrapper.callNormalEventV2( + 'NodeIKernelBuddyService/getDoubtBuddyReq', + 'NodeIKernelBuddyListener/onDoubtBuddyReqChange', + [date, count, ''], + () => true, + (data) => data.reqId === date + ); + let requests = Promise.all(ret.doubtList.map(async (item) => { + return { + flag: item.uid, //注意强制String 非isNumeric 不遵守则不符合设计 + uin: await this.core.apis.UserApi.getUinByUidV2(item.uid) ?? 0,// 信息字段 + nick: item.nick, // 信息字段 这个不是nickname 可能是来源的群内的昵称 + source: item.source, // 信息字段 + reason: item.reason, // 信息字段 + msg: item.msg, // 信息字段 + group_code: item.groupCode, // 信息字段 + time: item.reqTime, // 信息字段 + type: 'doubt' //保留字段 + }; + })) + return requests; + } } diff --git a/src/core/services/NodeIKernelBuddyService.ts b/src/core/services/NodeIKernelBuddyService.ts index 1b2cdff8..dd025c08 100644 --- a/src/core/services/NodeIKernelBuddyService.ts +++ b/src/core/services/NodeIKernelBuddyService.ts @@ -106,7 +106,7 @@ export interface NodeIKernelBuddyService { getAddMeSetting(): unknown; - getDoubtBuddyReq(reqId: string, num: number): Promise; + getDoubtBuddyReq(reqId: string, num: number,uk:string): Promise; getDoubtBuddyUnreadNum(): number; diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index bd12979d..37dc07f5 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -116,10 +116,14 @@ import { GetRkeyServer } from './packet/GetRkeyServer'; import { GetRkeyEx } from './packet/GetRkeyEx'; import { CleanCache } from './system/CleanCache'; import SetFriendRemark from './user/SetFriendRemark'; +import { SetDoubtFriendsAddRequest } from './new/SetDoubtFriendsAddRequest'; +import { GetDoubtFriendsAddRequest } from './new/GetDoubtFriendsAddRequest'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { const actionHandlers = [ + new SetDoubtFriendsAddRequest(obContext, core), + new GetDoubtFriendsAddRequest(obContext, core), new SetFriendRemark(obContext, core), new GetRkeyEx(obContext, core), new GetRkeyServer(obContext, core), diff --git a/src/onebot/action/new/GetDoubtFriendsAddRequest.ts b/src/onebot/action/new/GetDoubtFriendsAddRequest.ts new file mode 100644 index 00000000..7b8ae921 --- /dev/null +++ b/src/onebot/action/new/GetDoubtFriendsAddRequest.ts @@ -0,0 +1,18 @@ +import { OneBotAction } from '@/onebot/action/OneBotAction'; +import { ActionName } from '@/onebot/action/router'; +import { Static, Type } from '@sinclair/typebox'; + +const SchemaData = Type.Object({ + count: Type.Number({ default: 50 }), +}); + +type Payload = Static; + +export class GetDoubtFriendsAddRequest extends OneBotAction { + override actionName = ActionName.GetDoubtFriendsAddRequest; + override payloadSchema = SchemaData; + + async _handle(payload: Payload) { + return await this.core.apis.FriendApi.getDoubtFriendRequest(payload.count); + } +} diff --git a/src/onebot/action/new/SetDoubtFriendsAddRequest.ts b/src/onebot/action/new/SetDoubtFriendsAddRequest.ts new file mode 100644 index 00000000..990d5607 --- /dev/null +++ b/src/onebot/action/new/SetDoubtFriendsAddRequest.ts @@ -0,0 +1,21 @@ +import { OneBotAction } from '@/onebot/action/OneBotAction'; +import { ActionName } from '@/onebot/action/router'; +import { Static, Type } from '@sinclair/typebox'; + +const SchemaData = Type.Object({ + flag: Type.String(), + //注意强制String 非isNumeric 不遵守则不符合设计 + approve: Type.Boolean({ default: true }), + //该字段没有语义 仅做保留 强制为True +}); + +type Payload = Static; + +export class SetDoubtFriendsAddRequest extends OneBotAction { + override actionName = ActionName.SetDoubtFriendsAddRequest; + override payloadSchema = SchemaData; + + async _handle(payload: Payload) { + return await this.core.apis.FriendApi.handleDoubtFriendRequest(payload.flag); + } +} diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index fe3acd21..6abfe642 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -10,6 +10,10 @@ export interface InvalidCheckResult { } export const ActionName = { + // new extends 完全差异OneBot类别 + GetDoubtFriendsAddRequest: 'get_doubt_friends_add_request', + SetDoubtFriendsAddRequest: 'set_doubt_friends_add_request', + // napcat GetRkeyEx: 'get_rkey', GetRkeyServer: 'get_rkey_server', SetGroupRemark: 'set_group_remark', From c658cd109621469fc44f60d215a049de5838d46f Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Wed, 23 Apr 2025 08:52:43 +0000 Subject: [PATCH 128/149] release: v4.7.35 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 2e2ae048..f6863684 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.34", + "version": "4.7.35", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index a8b9c119..788735fc 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.34", + "version": "4.7.35", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 34619ddc..31d1aee8 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.34'; +export const napCatVersion = '4.7.35'; From 380777ca046e5cb12d6e6d21b8809325dd617525 Mon Sep 17 00:00:00 2001 From: Me0wo <152751263+Sn0wo2@users.noreply.github.com> Date: Thu, 24 Apr 2025 04:11:31 +0800 Subject: [PATCH 129/149] fix: #970 --- src/onebot/api/msg.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 7cc7e7af..fd81f461 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -907,10 +907,10 @@ export class OneBotMsgApi { const member = await this.core.apis.GroupApi.getGroupMember(msg.peerUin, msg.senderUin); resMsg.group_id = parseInt(ret.tmpChatInfo!.groupCode); resMsg.sender.nickname = member?.nick ?? member?.cardName ?? '临时会话'; - resMsg.temp_source = resMsg.group_id; + resMsg.temp_source = 0; } else { resMsg.group_id = 284840486; - resMsg.temp_source = resMsg.group_id; + resMsg.temp_source = 0; resMsg.sender.nickname = '临时会话'; } } From 41036f8ee81b9f4fa81d72e8e7e647a18f47736f 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: Thu, 24 Apr 2025 09:50:26 +0800 Subject: [PATCH 130/149] fix: 969 --- src/onebot/action/go-cqhttp/UploadGroupFile.ts | 1 + src/onebot/action/go-cqhttp/UploadPrivateFile.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/onebot/action/go-cqhttp/UploadGroupFile.ts b/src/onebot/action/go-cqhttp/UploadGroupFile.ts index 906d7e91..5c636e16 100644 --- a/src/onebot/action/go-cqhttp/UploadGroupFile.ts +++ b/src/onebot/action/go-cqhttp/UploadGroupFile.ts @@ -38,6 +38,7 @@ export default class GoCQHTTPUploadGroupFile extends OneBotAction deleteAfterSentFiles: [] }; const sendFileEle = await this.core.apis.FileApi.createValidSendFileElement(msgContext, downloadResult.path, payload.name, payload.folder ?? payload.folder_id); + msgContext.deleteAfterSentFiles.push(downloadResult.path); await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(peer, [sendFileEle], msgContext.deleteAfterSentFiles); return null; } diff --git a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts index f17e3edf..1a37a21f 100644 --- a/src/onebot/action/go-cqhttp/UploadPrivateFile.ts +++ b/src/onebot/action/go-cqhttp/UploadPrivateFile.ts @@ -23,7 +23,7 @@ export default class GoCQHTTPUploadPrivateFile extends OneBotAction Date: Thu, 24 Apr 2025 11:33:11 +0800 Subject: [PATCH 131/149] =?UTF-8?q?fix:=20=E7=A7=81=E8=81=8A=E6=92=A4?= =?UTF-8?q?=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/notice/OB11FriendRecallNoticeEvent.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/onebot/event/notice/OB11FriendRecallNoticeEvent.ts b/src/onebot/event/notice/OB11FriendRecallNoticeEvent.ts index 4fd3d444..fec1dfbc 100644 --- a/src/onebot/event/notice/OB11FriendRecallNoticeEvent.ts +++ b/src/onebot/event/notice/OB11FriendRecallNoticeEvent.ts @@ -1,14 +1,12 @@ -import { OB11BaseNoticeEvent } from './OB11BaseNoticeEvent'; import { NapCatCore } from '@/core'; +import { OB11GroupNoticeEvent } from './OB11GroupNoticeEvent'; -export class OB11FriendRecallNoticeEvent extends OB11BaseNoticeEvent { - notice_type = 'friend_recall'; - user_id: number; - message_id: number; +export class OB11GroupAdminNoticeEvent extends OB11GroupNoticeEvent { + notice_type = 'group_admin'; + sub_type: 'set' | 'unset'; - public constructor(core: NapCatCore, userId: number, messageId: number) { - super(core); - this.user_id = userId; - this.message_id = messageId; + constructor(core: NapCatCore, group_id: number, user_id: number, sub_type: 'set' | 'unset') { + super(core, group_id, user_id); + this.sub_type = sub_type; } } From 7cbae86941aabe920bcdf39fafa79ca7e38a6691 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: Thu, 24 Apr 2025 11:34:07 +0800 Subject: [PATCH 132/149] =?UTF-8?q?Revert=20"fix:=20=E7=A7=81=E8=81=8A?= =?UTF-8?q?=E6=92=A4=E5=9B=9E"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 8ff7420a5e3f7a019911a8aec13149aa21179d88. --- .../event/notice/OB11FriendRecallNoticeEvent.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/onebot/event/notice/OB11FriendRecallNoticeEvent.ts b/src/onebot/event/notice/OB11FriendRecallNoticeEvent.ts index fec1dfbc..4fd3d444 100644 --- a/src/onebot/event/notice/OB11FriendRecallNoticeEvent.ts +++ b/src/onebot/event/notice/OB11FriendRecallNoticeEvent.ts @@ -1,12 +1,14 @@ +import { OB11BaseNoticeEvent } from './OB11BaseNoticeEvent'; import { NapCatCore } from '@/core'; -import { OB11GroupNoticeEvent } from './OB11GroupNoticeEvent'; -export class OB11GroupAdminNoticeEvent extends OB11GroupNoticeEvent { - notice_type = 'group_admin'; - sub_type: 'set' | 'unset'; +export class OB11FriendRecallNoticeEvent extends OB11BaseNoticeEvent { + notice_type = 'friend_recall'; + user_id: number; + message_id: number; - constructor(core: NapCatCore, group_id: number, user_id: number, sub_type: 'set' | 'unset') { - super(core, group_id, user_id); - this.sub_type = sub_type; + public constructor(core: NapCatCore, userId: number, messageId: number) { + super(core); + this.user_id = userId; + this.message_id = messageId; } } From edf81d0a2e6cd906562605d24ee348da89a76ac0 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: Thu, 24 Apr 2025 15:37:44 +0800 Subject: [PATCH 133/149] feat: 34606 --- src/core/external/appid.json | 8 ++++++++ src/core/external/offset.json | 14 +++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/core/external/appid.json b/src/core/external/appid.json index 1ec36fec..c5956064 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -266,5 +266,13 @@ "3.2.17-34566": { "appid": 537282343, "qua": "V1_LNX_NQ_3.2.17_34566_GW_B" + }, + "3.2.17-34606": { + "appid": 537282343, + "qua": "V1_LNX_NQ_3.2.17_34606_GW_B" + }, + "9.9.19-34606": { + "appid": 537282307, + "qua": "V1_WIN_NQ_9.9.19_34606_GW_B" } } \ No newline at end of file diff --git a/src/core/external/offset.json b/src/core/external/offset.json index 0fa97bc1..7bc43cc5 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -338,5 +338,17 @@ "9.9.19-34566-x64": { "send": "3BDA110", "recv": "3BDE910" - } + }, + "9.9.19-34606-x64": { + "send": "3BDA110", + "recv": "3BDE910" + }, + "3.2.17-34566-x64": { + "send": "AD7DC60", + "recv": "AD81680" + }, + "3.2.17-34606-arm64": { + "send": "7711270", + "recv": "7714BA0" + }, } \ No newline at end of file From 662530e507815cc17a792f545cce4f8f4856ffc8 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 24 Apr 2025 07:53:59 +0000 Subject: [PATCH 134/149] release: v4.7.36 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index f6863684..4aa5d9ad 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.35", + "version": "4.7.36", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 788735fc..f7a7de95 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.35", + "version": "4.7.36", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 31d1aee8..0829518a 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.35'; +export const napCatVersion = '4.7.36'; From 84382caebcf902e9d148e944f7f1c5e7a18bc9c6 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: Thu, 24 Apr 2025 15:56:55 +0800 Subject: [PATCH 135/149] fix --- src/core/external/offset.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/external/offset.json b/src/core/external/offset.json index 7bc43cc5..dc11f878 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -350,5 +350,5 @@ "3.2.17-34606-arm64": { "send": "7711270", "recv": "7714BA0" - }, + } } \ No newline at end of file From e82687454c96113571c688d874ae1395af59cdff Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 24 Apr 2025 07:57:16 +0000 Subject: [PATCH 136/149] release: v4.7.40 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 4aa5d9ad..41fda5ab 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.36", + "version": "4.7.40", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index f7a7de95..62776d40 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.36", + "version": "4.7.40", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 0829518a..77c13443 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.36'; +export const napCatVersion = '4.7.40'; From 7d2dcc10e563a3c6b192433a32ee38e68ab38887 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: Thu, 24 Apr 2025 17:43:13 +0800 Subject: [PATCH 137/149] fix --- src/core/external/offset.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/external/offset.json b/src/core/external/offset.json index dc11f878..f76a61be 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -343,7 +343,7 @@ "send": "3BDA110", "recv": "3BDE910" }, - "3.2.17-34566-x64": { + "3.2.17-34606-x64": { "send": "AD7DC60", "recv": "AD81680" }, From 33d4696155e9792961d7ee8700f5b85cad44fe91 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 24 Apr 2025 09:43:32 +0000 Subject: [PATCH 138/149] release: v4.7.41 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 41fda5ab..4fd59fcf 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.40", + "version": "4.7.41", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 62776d40..40229127 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.40", + "version": "4.7.41", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 77c13443..fd883cb3 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.40'; +export const napCatVersion = '4.7.41'; From 8e92a81bb94307f8b3905b3dda96d49c3a10602f Mon Sep 17 00:00:00 2001 From: Nepenthe Date: Sat, 26 Apr 2025 14:48:35 +0800 Subject: [PATCH 139/149] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=20=5Fget=5Fmodel=5Fs?= =?UTF-8?q?how=20=E7=9A=84=20model=20=E8=AE=BE=E7=BD=AE=E4=B8=BA=E5=8F=AF?= =?UTF-8?q?=E9=80=89=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts index 453db746..af8ca93d 100644 --- a/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts +++ b/src/onebot/action/go-cqhttp/GoCQHTTPGetModelShow.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; const SchemaData = Type.Object({ - model: Type.String(), + model: Type.Optional(Type.String()), }); type Payload = Static; From b5574d599983b268583dbe55cece03cd7a14b40f 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: Sat, 26 Apr 2025 19:00:31 +0800 Subject: [PATCH 140/149] fix: #976 --- src/core/listeners/NodeIKernelMsgListener.ts | 135 ++++++++++--------- src/core/services/NodeIKernelMsgService.ts | 15 ++- 2 files changed, 82 insertions(+), 68 deletions(-) diff --git a/src/core/listeners/NodeIKernelMsgListener.ts b/src/core/listeners/NodeIKernelMsgListener.ts index 379f0289..6518a82a 100644 --- a/src/core/listeners/NodeIKernelMsgListener.ts +++ b/src/core/listeners/NodeIKernelMsgListener.ts @@ -21,7 +21,8 @@ export interface OnRichMediaDownloadCompleteParams { clientMsg: string, businessId: number, userTotalSpacePerDay: unknown, - userUsedSpacePerDay: unknown + userUsedSpacePerDay: unknown, + chatType: number, } export interface GroupFileInfoUpdateParamType { @@ -97,112 +98,112 @@ export interface TempOnRecvParams { } export class NodeIKernelMsgListener { - onAddSendMsg(msgRecord: RawMessage): any { + onAddSendMsg(_msgRecord: RawMessage): any { } - onBroadcastHelperDownloadComplete(broadcastHelperTransNotifyInfo: unknown): any { + onBroadcastHelperDownloadComplete(_broadcastHelperTransNotifyInfo: unknown): any { } - onBroadcastHelperProgressUpdate(broadcastHelperTransNotifyInfo: unknown): any { + onBroadcastHelperProgressUpdate(_broadcastHelperTransNotifyInfo: unknown): any { } - onChannelFreqLimitInfoUpdate(contact: unknown, z: unknown, freqLimitInfo: unknown): any { + onChannelFreqLimitInfoUpdate(_contact: unknown, _z: unknown, _freqLimitInfo: unknown): any { } - onContactUnreadCntUpdate(hashMap: unknown): any { + onContactUnreadCntUpdate(_hashMap: unknown): any { } - onCustomWithdrawConfigUpdate(customWithdrawConfig: unknown): any { + onCustomWithdrawConfigUpdate(_customWithdrawConfig: unknown): any { } - onDraftUpdate(contact: unknown, arrayList: unknown, j2: unknown): any { + onDraftUpdate(_contact: unknown, _arrayList: unknown, _j2: unknown): any { } - onEmojiDownloadComplete(emojiNotifyInfo: unknown): any { + onEmojiDownloadComplete(_emojiNotifyInfo: unknown): any { } - onEmojiResourceUpdate(emojiResourceInfo: unknown): any { + onEmojiResourceUpdate(_emojiResourceInfo: unknown): any { } - onFeedEventUpdate(firstViewDirectMsgNotifyInfo: unknown): any { + onFeedEventUpdate(_firstViewDirectMsgNotifyInfo: unknown): any { } - onFileMsgCome(arrayList: unknown): any { + onFileMsgCome(_arrayList: unknown): any { } - onFirstViewDirectMsgUpdate(firstViewDirectMsgNotifyInfo: unknown): any { + onFirstViewDirectMsgUpdate(_firstViewDirectMsgNotifyInfo: unknown): any { } - onFirstViewGroupGuildMapping(arrayList: unknown): any { + onFirstViewGroupGuildMapping(_arrayList: unknown): any { } - onGrabPasswordRedBag(i2: unknown, str: unknown, i3: unknown, recvdOrder: unknown, msgRecord: unknown): any { + onGrabPasswordRedBag(_i2: unknown, _str: unknown, _i3: unknown, _recvdOrder: unknown, _msgRecord: unknown): any { } - onGroupFileInfoAdd(groupItem: unknown): any { + onGroupFileInfoAdd(_groupItem: unknown): any { } - onGroupFileInfoUpdate(groupFileListResult: GroupFileInfoUpdateParamType): any { + onGroupFileInfoUpdate(_groupFileListResult: GroupFileInfoUpdateParamType): any { } - onGroupGuildUpdate(groupGuildNotifyInfo: unknown): any { + onGroupGuildUpdate(_groupGuildNotifyInfo: unknown): any { } - onGroupTransferInfoAdd(groupItem: unknown): any { + onGroupTransferInfoAdd(_groupItem: unknown): any { } - onGroupTransferInfoUpdate(groupFileListResult: unknown): any { + onGroupTransferInfoUpdate(_groupFileListResult: unknown): any { } - onGuildInteractiveUpdate(guildInteractiveNotificationItem: unknown): any { + onGuildInteractiveUpdate(_guildInteractiveNotificationItem: unknown): any { } - onGuildMsgAbFlagChanged(guildMsgAbFlag: unknown): any { + onGuildMsgAbFlagChanged(_guildMsgAbFlag: unknown): any { } - onGuildNotificationAbstractUpdate(guildNotificationAbstractInfo: unknown): any { + onGuildNotificationAbstractUpdate(_guildNotificationAbstractInfo: unknown): any { } - onHitCsRelatedEmojiResult(downloadRelateEmojiResultInfo: unknown): any { + onHitCsRelatedEmojiResult(_downloadRelateEmojiResultInfo: unknown): any { } - onHitEmojiKeywordResult(hitRelatedEmojiWordsResult: unknown): any { + onHitEmojiKeywordResult(_hitRelatedEmojiWordsResult: unknown): any { } - onHitRelatedEmojiResult(relatedWordEmojiInfo: unknown): any { + onHitRelatedEmojiResult(_relatedWordEmojiInfo: unknown): any { } - onImportOldDbProgressUpdate(importOldDbMsgNotifyInfo: unknown): any { + onImportOldDbProgressUpdate(_importOldDbMsgNotifyInfo: unknown): any { } - onInputStatusPush(inputStatusInfo: { + onInputStatusPush(_inputStatusInfo: { chatType: number; eventType: number; fromUin: string; @@ -215,55 +216,55 @@ export class NodeIKernelMsgListener { } - onKickedOffLine(kickedInfo: KickedOffLineInfo): any { + onKickedOffLine(_kickedInfo: KickedOffLineInfo): any { } - onLineDev(arrayList: unknown): any { + onLineDev(_arrayList: unknown): any { } - onLogLevelChanged(j2: unknown): any { + onLogLevelChanged(_j2: unknown): any { } - onMsgAbstractUpdate(arrayList: unknown): any { + onMsgAbstractUpdate(_arrayList: unknown): any { } - onMsgBoxChanged(arrayList: unknown): any { + onMsgBoxChanged(_arrayList: unknown): any { } - onMsgDelete(contact: unknown, arrayList: unknown): any { + onMsgDelete(_contact: unknown, _arrayList: unknown): any { } - onMsgEventListUpdate(hashMap: unknown): any { + onMsgEventListUpdate(_hashMap: unknown): any { } - onMsgInfoListAdd(arrayList: unknown): any { + onMsgInfoListAdd(_arrayList: unknown): any { } - onMsgInfoListUpdate(msgList: RawMessage[]): any { + onMsgInfoListUpdate(_msgList: RawMessage[]): any { } - onMsgQRCodeStatusChanged(i2: unknown): any { + onMsgQRCodeStatusChanged(_i2: unknown): any { } - onMsgRecall(chatType: ChatType, uid: string, msgSeq: string): any { + onMsgRecall(_chatType: ChatType, _uid: string, _msgSeq: string): any { } - onMsgSecurityNotify(msgRecord: unknown): any { + onMsgSecurityNotify(_msgRecord: unknown): any { } - onMsgSettingUpdate(msgSetting: unknown): any { + onMsgSettingUpdate(_msgSetting: unknown): any { } @@ -279,108 +280,108 @@ export class NodeIKernelMsgListener { } - onReadFeedEventUpdate(firstViewDirectMsgNotifyInfo: unknown): any { + onReadFeedEventUpdate(_firstViewDirectMsgNotifyInfo: unknown): any { } - onRecvGroupGuildFlag(i2: unknown): any { + onRecvGroupGuildFlag(_i2: unknown): any { } - onRecvMsg(arrayList: RawMessage[]): any { + onRecvMsg(_arrayList: RawMessage[]): any { } - onRecvMsgSvrRspTransInfo(j2: unknown, contact: unknown, i2: unknown, i3: unknown, str: unknown, bArr: unknown): any { + onRecvMsgSvrRspTransInfo(_j2: unknown, _contact: unknown, _i2: unknown, _i3: unknown, _str: unknown, _bArr: unknown): any { } - onRecvOnlineFileMsg(arrayList: unknown): any { + onRecvOnlineFileMsg(_arrayList: unknown): any { } - onRecvS2CMsg(arrayList: unknown): any { + onRecvS2CMsg(_arrayList: unknown): any { } - onRecvSysMsg(arrayList: Array): any { + onRecvSysMsg(_arrayList: Array): any { } - onRecvUDCFlag(i2: unknown): any { + onRecvUDCFlag(_i2: unknown): any { } - onRichMediaDownloadComplete(fileTransNotifyInfo: OnRichMediaDownloadCompleteParams): any { + onRichMediaDownloadComplete(_fileTransNotifyInfo: OnRichMediaDownloadCompleteParams): any { } - onRichMediaProgerssUpdate(fileTransNotifyInfo: unknown): any { + onRichMediaProgerssUpdate(_fileTransNotifyInfo: unknown): any { } - onRichMediaUploadComplete(fileTransNotifyInfo: unknown): any { + onRichMediaUploadComplete(_fileTransNotifyInfo: unknown): any { } - onSearchGroupFileInfoUpdate(searchGroupFileResult: unknown): any { + onSearchGroupFileInfoUpdate(_searchGroupFileResult: unknown): any { } - onSendMsgError(j2: unknown, contact: unknown, i2: unknown, str: unknown): any { + onSendMsgError(_j2: unknown, _contact: unknown, _i2: unknown, _str: unknown): any { } - onSysMsgNotification(i2: unknown, j2: unknown, j3: unknown, arrayList: unknown): any { + onSysMsgNotification(_i2: unknown, _j2: unknown, _j3: unknown, _arrayList: unknown): any { } - onTempChatInfoUpdate(tempChatInfo: TempOnRecvParams): any { + onTempChatInfoUpdate(_tempChatInfo: TempOnRecvParams): any { } - onUnreadCntAfterFirstView(hashMap: unknown): any { + onUnreadCntAfterFirstView(_hashMap: unknown): any { } - onUnreadCntUpdate(hashMap: unknown): any { + onUnreadCntUpdate(_hashMap: unknown): any { } - onUserChannelTabStatusChanged(z: unknown): any { + onUserChannelTabStatusChanged(_z: unknown): any { } - onUserOnlineStatusChanged(z: unknown): any { + onUserOnlineStatusChanged(_z: unknown): any { } - onUserTabStatusChanged(arrayList: unknown): any { + onUserTabStatusChanged(_arrayList: unknown): any { } - onlineStatusBigIconDownloadPush(i2: unknown, j2: unknown, str: unknown): any { + onlineStatusBigIconDownloadPush(_i2: unknown, _j2: unknown, _str: unknown): any { } - onlineStatusSmallIconDownloadPush(i2: unknown, j2: unknown, str: unknown): any { + onlineStatusSmallIconDownloadPush(_i2: unknown, _j2: unknown, _str: unknown): any { } // 第一次发现于Linux - onUserSecQualityChanged(...args: unknown[]): any { + onUserSecQualityChanged(..._args: unknown[]): any { } - onMsgWithRichLinkInfoUpdate(...args: unknown[]): any { + onMsgWithRichLinkInfoUpdate(..._args: unknown[]): any { } - onRedTouchChanged(...args: unknown[]): any { + onRedTouchChanged(..._args: unknown[]): any { } // 第一次发现于Win 9.9.9-23159 - onBroadcastHelperProgerssUpdate(...args: unknown[]): any { + onBroadcastHelperProgerssUpdate(..._args: unknown[]): any { } } diff --git a/src/core/services/NodeIKernelMsgService.ts b/src/core/services/NodeIKernelMsgService.ts index 53baf999..abd6c969 100644 --- a/src/core/services/NodeIKernelMsgService.ts +++ b/src/core/services/NodeIKernelMsgService.ts @@ -425,7 +425,20 @@ export interface NodeIKernelMsgService { switchToOfflineGetRichMediaElement(...args: unknown[]): unknown; - downloadRichMedia(...args: unknown[]): unknown; + downloadRichMedia(args: { + fileModelId: string, + downSourceType: number, + triggerType: number, + msgId: string, + chatType: number, + peerUid: string, + elementId: string, + thumbSize: number, + downloadType: number, + filePath: string + } & { + downloadSourceType: number, //33800左右一下的老版本 新版34606已经完全上面格式 + }): unknown; getFirstUnreadMsgSeq(args: { peerUid: string From bb8a44b918e29661f4d882f980d310b9ecd77c56 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sat, 26 Apr 2025 11:02:25 +0000 Subject: [PATCH 141/149] release: v4.7.42 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 4fd59fcf..f04d5157 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.41", + "version": "4.7.42", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 40229127..7a92bec8 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.41", + "version": "4.7.42", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index fd883cb3..da40ebb0 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.41'; +export const napCatVersion = '4.7.42'; From bbaca3f0447b249f94647add078c7b2d5527c508 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: Sat, 26 Apr 2025 19:10:00 +0800 Subject: [PATCH 142/149] fix --- src/core/apis/file.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index 616ccb71..209d6844 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -345,6 +345,7 @@ export class NTQQFileApi { 'NodeIKernelMsgListener/onRichMediaDownloadComplete', [{ fileModelId: '0', + downSourceType: 0, downloadSourceType: 0, triggerType: 1, msgId: msgId, From 956b6cd172beeb70aa83cebcf279ad24a0f01a9a Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sat, 26 Apr 2025 11:10:37 +0000 Subject: [PATCH 143/149] release: v4.7.43 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index f04d5157..05296edc 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.42", + "version": "4.7.43", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 7a92bec8..fb838e9e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.42", + "version": "4.7.43", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index da40ebb0..269e7f2b 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.42'; +export const napCatVersion = '4.7.43'; From 014b4deb874c2f93a8948dfaaf9b645ba0ff977c 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: Mon, 28 Apr 2025 22:04:20 +0800 Subject: [PATCH 144/149] feat: 34740 --- src/core/external/appid.json | 8 ++++++++ src/core/external/offset.json | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/core/external/appid.json b/src/core/external/appid.json index c5956064..9a7ff556 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -274,5 +274,13 @@ "9.9.19-34606": { "appid": 537282307, "qua": "V1_WIN_NQ_9.9.19_34606_GW_B" + }, + "9.9.19-34740": { + "appid": 537290691, + "qua": "V1_WIN_NQ_9.9.19_34740_GW_B" + }, + "3.2.17-34740": { + "appid": 537290727, + "qua": "V1_LNX_NQ_3.2.17_34740_GW_B" } } \ No newline at end of file diff --git a/src/core/external/offset.json b/src/core/external/offset.json index f76a61be..48f84d17 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -350,5 +350,9 @@ "3.2.17-34606-arm64": { "send": "7711270", "recv": "7714BA0" + }, + "9.9.19-34740-x64": { + "send": "3BDD8D0", + "recv": "3BE20D0" } } \ No newline at end of file From 140e62fdcd9327dce1ee8466e23b0ff2dad41ed3 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Mon, 28 Apr 2025 14:04:40 +0000 Subject: [PATCH 145/149] release: v4.7.44 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 05296edc..2a996748 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.43", + "version": "4.7.44", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index fb838e9e..6f76191d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.43", + "version": "4.7.44", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index 269e7f2b..d5aefc86 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.43'; +export const napCatVersion = '4.7.44'; From e31d2810ad4b9fa5da89985fc6ddefe52d23084e 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: Tue, 29 Apr 2025 22:06:01 +0800 Subject: [PATCH 146/149] fix --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c842eb60..6d3d7f25 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,11 @@ _Modern protocol-side framework implemented based on NTQQ._ | Docs | [![Cloudflare.Pages](https://img.shields.io/badge/docs%20on-Cloudflare.Pages-blue)](https://napneko.pages.dev/) | [![Server.Other](https://img.shields.io/badge/docs%20on-Server.Other-green)](https://napcat.cyou/) | [![NapCat.Wiki](https://img.shields.io/badge/docs%20on-NapCat.Wiki-red)](https://www.napcat.wiki) | |:-:|:-:|:-:|:-:| -| Contact | [![QQ Group#1](https://img.shields.io/badge/QQ%20Group%231-Join-blue)](https://qm.qq.com/q/I6LU87a0Yq) | [![QQ Group#2](https://img.shields.io/badge/QQ%20Group%232-Join-blue)](https://qm.qq.com/q/HaRcfrHpUk) | [![Telegram](https://img.shields.io/badge/Telegram-MelodicMoonlight-blue)](https://t.me/MelodicMoonlight) | -|:-:|:-:|:-:|:-:| +| QQ Group | [![QQ Group#4](https://img.shields.io/badge/QQ%20Group%234-Join-blue)](https://qm.qq.com/q/CMmPbGw0jA) | [![QQ Group#3](https://img.shields.io/badge/QQ%20Group%233-Join-blue)](https://qm.qq.com/q/8zJMLjqy2Y) | [![QQ Group#2](https://img.shields.io/badge/QQ%20Group%232-Join-blue)](https://qm.qq.com/q/HaRcfrHpUk) | [![QQ Group#1](https://img.shields.io/badge/QQ%20Group%231-Join-blue)](https://qm.qq.com/q/I6LU87a0Yq) | +|:-:|:-:|:-:|:-:|:-:| + +| Telegram | [![Telegram](https://img.shields.io/badge/Telegram-MelodicMoonlight-blue)](https://t.me/MelodicMoonlight) | +|:-:|:-:| ## Thanks From a5a57b9e20751044773ba3c7cbd926c4407da738 Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Wed, 30 Apr 2025 20:31:03 +0800 Subject: [PATCH 147/149] fix: fxxking fake forward element - close #972, #977, #666 --- src/core/packet/context/operationContext.ts | 112 +++++++++++++----- src/core/packet/message/builder.ts | 14 +-- src/core/packet/message/element.ts | 39 +++--- .../transformer/message/FetchC2CMessage.ts | 27 +++++ .../transformer/message/FetchGroupMessage.ts | 30 +++++ src/core/packet/transformer/message/index.ts | 4 +- .../transformer/proto/message/message.ts | 12 +- src/core/types/element.ts | 16 ++- src/core/types/msg.ts | 5 +- src/onebot/api/msg.ts | 2 + 10 files changed, 197 insertions(+), 64 deletions(-) create mode 100644 src/core/packet/transformer/message/FetchC2CMessage.ts create mode 100644 src/core/packet/transformer/message/FetchGroupMessage.ts diff --git a/src/core/packet/context/operationContext.ts b/src/core/packet/context/operationContext.ts index 0e558058..d89e8899 100644 --- a/src/core/packet/context/operationContext.ts +++ b/src/core/packet/context/operationContext.ts @@ -6,13 +6,14 @@ import { PacketMsgFileElement, PacketMsgPicElement, PacketMsgPttElement, - PacketMsgVideoElement + PacketMsgReplyElement, + PacketMsgVideoElement, } from '@/core/packet/message/element'; import { ChatType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; import { MiniAppRawData, MiniAppReqParams } from '@/core/packet/entities/miniApp'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { NapProtoDecodeStructType, NapProtoEncodeStructType, NapProtoMsg } from '@napneko/nap-proto-core'; -import { IndexNode, LongMsgResult, MsgInfo } from '@/core/packet/transformer/proto'; +import { IndexNode, LongMsgResult, MsgInfo, PushMsgBody } from '@/core/packet/transformer/proto'; import { OidbPacket } from '@/core/packet/transformer/base'; import { ImageOcrResult } from '@/core/packet/entities/ocrResult'; import { gunzipSync } from 'zlib'; @@ -76,22 +77,24 @@ export class PacketOperationContext { async UploadResources(msg: PacketMsg[], groupUin: number = 0) { const chatType = groupUin ? ChatType.KCHATTYPEGROUP : ChatType.KCHATTYPEC2C; const peerUid = groupUin ? String(groupUin) : this.context.napcore.basicInfo.uid; - const reqList = msg.flatMap(m => - m.msg.map(e => { - if (e instanceof PacketMsgPicElement) { - return this.context.highway.uploadImage({ chatType, peerUid }, e); - } else if (e instanceof PacketMsgVideoElement) { - return this.context.highway.uploadVideo({ chatType, peerUid }, e); - } else if (e instanceof PacketMsgPttElement) { - return this.context.highway.uploadPtt({ chatType, peerUid }, e); - } else if (e instanceof PacketMsgFileElement) { - return this.context.highway.uploadFile({ chatType, peerUid }, e); - } - return null; - }).filter(Boolean) + const reqList = msg.flatMap((m) => + m.msg + .map((e) => { + if (e instanceof PacketMsgPicElement) { + return this.context.highway.uploadImage({ chatType, peerUid }, e); + } else if (e instanceof PacketMsgVideoElement) { + return this.context.highway.uploadVideo({ chatType, peerUid }, e); + } else if (e instanceof PacketMsgPttElement) { + return this.context.highway.uploadPtt({ chatType, peerUid }, e); + } else if (e instanceof PacketMsgFileElement) { + return this.context.highway.uploadFile({ chatType, peerUid }, e); + } + return null; + }) + .filter(Boolean) ); const res = await Promise.allSettled(reqList); - this.context.logger.info(`上传资源${res.length}个,失败${res.filter(r => r.status === 'rejected').length}个`); + this.context.logger.info(`上传资源${res.length}个,失败${res.filter((r) => r.status === 'rejected').length}个`); res.forEach((result, index) => { if (result.status === 'rejected') { this.context.logger.error(`上传第${index + 1}个资源失败:${result.reason.stack}`); @@ -100,10 +103,13 @@ export class PacketOperationContext { } async UploadImage(img: PacketMsgPicElement) { - await this.context.highway.uploadImage({ - chatType: ChatType.KCHATTYPEC2C, - peerUid: this.context.napcore.basicInfo.uid - }, img); + await this.context.highway.uploadImage( + { + chatType: ChatType.KCHATTYPEC2C, + peerUid: this.context.napcore.basicInfo.uid, + }, + img + ); const index = img.msgInfo?.msgInfoBody?.at(0)?.index; if (!index) { throw new Error('img.msgInfo?.msgInfoBody![0].index! is undefined'); @@ -137,24 +143,66 @@ export class PacketOperationContext { coordinates: item.polygon.coordinates.map((c) => { return { x: c.x, - y: c.y + y: c.y, }; }), }; }), - language: res.ocrRspBody.language + language: res.ocrRspBody.language, } as ImageOcrResult; } - async UploadForwardMsg(msg: PacketMsg[], groupUin: number = 0) { + private async SendPreprocess(msg: PacketMsg[], groupUin: number = 0) { + const ps = msg.map((m) => { + return m.msg.map(async(e) => { + if (e instanceof PacketMsgReplyElement && !e.targetElems) { + this.context.logger.debug(`Cannot find reply element's targetElems, prepare to fetch it...`); + if (!e.targetPeer?.peerUid) { + this.context.logger.error(`targetPeer is undefined!`); + } + let targetMsg: NapProtoEncodeStructType[] | undefined; + if (e.isGroupReply) { + targetMsg = await this.FetchGroupMessage(+(e.targetPeer?.peerUid ?? 0), e.targetMessageSeq, e.targetMessageSeq); + } else { + targetMsg = await this.FetchC2CMessage(await this.context.napcore.basicInfo.uin2uid(e.targetUin), e.targetMessageSeq, e.targetMessageSeq); + } + e.targetElems = targetMsg.at(0)?.body?.richText?.elems; + e.targetSourceMsg = targetMsg.at(0); + } + }); + }).flat(); + await Promise.all(ps) await this.UploadResources(msg, groupUin); + } + + async FetchGroupMessage(groupUin: number, startSeq: number, endSeq: number): Promise[]> { + const req = trans.FetchGroupMessage.build(groupUin, startSeq, endSeq); + const resp = await this.context.client.sendOidbPacket(req, true); + const res = trans.FetchGroupMessage.parse(resp); + return res.body.messages + } + + async FetchC2CMessage(targetUid: string, startSeq: number, endSeq: number): Promise[]> { + const req = trans.FetchC2CMessage.build(targetUid, startSeq, endSeq); + const resp = await this.context.client.sendOidbPacket(req, true); + const res = trans.FetchC2CMessage.parse(resp); + return res.messages + } + + async UploadForwardMsg(msg: PacketMsg[], groupUin: number = 0) { + await this.SendPreprocess(msg, groupUin); const req = trans.UploadForwardMsg.build(this.context.napcore.basicInfo.uid, msg, groupUin); const resp = await this.context.client.sendOidbPacket(req, true); const res = trans.UploadForwardMsg.parse(resp); return res.result.resId; } - async MoveGroupFile(groupUin: number, fileUUID: string, currentParentDirectory: string, targetParentDirectory: string) { + async MoveGroupFile( + groupUin: number, + fileUUID: string, + currentParentDirectory: string, + targetParentDirectory: string + ) { const req = trans.MoveGroupFile.build(groupUin, fileUUID, currentParentDirectory, targetParentDirectory); const resp = await this.context.client.sendOidbPacket(req, true); const res = trans.MoveGroupFile.parse(resp); @@ -203,12 +251,17 @@ export class PacketOperationContext { return res.content.map((item) => { return { category: item.category, - voices: item.voices + voices: item.voices, }; }); } - async GetAiVoice(groupUin: number, voiceId: string, text: string, chatType: AIVoiceChatType): Promise> { + async GetAiVoice( + groupUin: number, + voiceId: string, + text: string, + chatType: AIVoiceChatType + ): Promise> { let reqTime = 0; const reqMaxTime = 30; const sessionId = crypto.randomBytes(4).readUInt32BE(0); @@ -236,6 +289,7 @@ export class PacketOperationContext { if (!main?.actionData.msgBody) { throw new Error('msgBody is empty'); } + this.context.logger.debug('rawChains ', inflate.toString('hex')); const messagesPromises = main.actionData.msgBody.map(async (msg) => { if (!msg?.body?.richText?.elems) { @@ -251,12 +305,12 @@ export class PacketOperationContext { const groupUin = msg?.responseHead.grp?.groupUin ?? 0; element.picElement = { ...element.picElement, - originImageUrl: await this.GetGroupImageUrl(groupUin, index!) + originImageUrl: await this.GetGroupImageUrl(groupUin, index!), }; } else { element.picElement = { ...element.picElement, - originImageUrl: await this.GetImageUrl(this.context.napcore.basicInfo.uid, index!) + originImageUrl: await this.GetImageUrl(this.context.napcore.basicInfo.uid, index!), }; } return element; @@ -269,7 +323,7 @@ export class PacketOperationContext { elements: elements, guildId: '', isOnlineMsg: false, - msgId: '7467703692092974645', // TODO: no necessary + msgId: '7467703692092974645', // TODO: no necessary msgRandom: '0', msgSeq: String(msg.contentHead.sequence ?? 0), msgTime: String(msg.contentHead.timeStamp ?? 0), diff --git a/src/core/packet/message/builder.ts b/src/core/packet/message/builder.ts index 2503645b..8080cd48 100644 --- a/src/core/packet/message/builder.ts +++ b/src/core/packet/message/builder.ts @@ -24,12 +24,15 @@ export class PacketMsgBuilder { } return { responseHead: { - fromUid: '', fromUin: node.senderUin, - toUid: node.groupId ? undefined : selfUid, + type: 0, + sigMap: 0, + toUin: 0, + fromUid: '', forward: node.groupId ? undefined : { friendName: node.senderName, }, + toUid: node.groupId ? undefined : selfUid, grp: node.groupId ? { groupUin: node.groupId, memberName: node.senderName, @@ -40,16 +43,13 @@ export class PacketMsgBuilder { type: node.groupId ? 82 : 9, subType: node.groupId ? undefined : 4, divSeq: node.groupId ? undefined : 4, - msgId: crypto.randomBytes(4).readUInt32LE(0), + autoReply: 0, sequence: crypto.randomBytes(4).readUInt32LE(0), timeStamp: +node.time.toString().substring(0, 10), - field7: BigInt(1), - field8: 0, - field9: 0, forward: { field1: 0, field2: 0, - field3: node.groupId ? 0 : 2, + field3: node.groupId ? 1 : 2, unknownBase64: avatar, avatar: avatar } diff --git a/src/core/packet/message/element.ts b/src/core/packet/message/element.ts index df1a1d4d..7ed98fc1 100644 --- a/src/core/packet/message/element.ts +++ b/src/core/packet/message/element.ts @@ -10,6 +10,7 @@ import { MsgInfo, NotOnlineImage, OidbSvcTrpcTcp0XE37_800Response, + PushMsgBody, QBigFaceExtra, QSmallFaceExtra, } from '@/core/packet/transformer/proto'; @@ -29,7 +30,8 @@ import { SendReplyElement, SendMultiForwardMsgElement, SendTextElement, - SendVideoElement + SendVideoElement, + Peer } from '@/core'; import {ForwardMsgBuilder} from '@/common/forward-msg-builder'; import {PacketMsg, PacketSendMsgElement} from '@/core/packet/message/message'; @@ -146,41 +148,40 @@ export class PacketMsgAtElement extends PacketMsgTextElement { } export class PacketMsgReplyElement extends IPacketMsgElement { - messageId: bigint; - messageSeq: number; - messageClientSeq: number; + time: number; + targetMessageId: bigint; + targetMessageSeq: number; + targetMessageClientSeq: number; targetUin: number; targetUid: string; - time: number; - elems: PacketMsg[]; + targetElems?: NapProtoEncodeStructType[]; + targetSourceMsg?: NapProtoEncodeStructType; + targetPeer?: Peer; constructor(element: SendReplyElement) { super(element); - this.messageId = BigInt(element.replyElement.replayMsgId ?? 0); - this.messageSeq = +(element.replyElement.replayMsgSeq ?? 0); - this.messageClientSeq = +(element.replyElement.replyMsgClientSeq ?? 0); + this.time = +(element.replyElement.replyMsgTime ?? Math.floor(Date.now() / 1000)); + this.targetMessageId = BigInt(element.replyElement.replayMsgId ?? 0); + this.targetMessageSeq = +(element.replyElement.replayMsgSeq ?? 0); + this.targetMessageClientSeq = +(element.replyElement.replyMsgClientSeq ?? 0); this.targetUin = +(element.replyElement.senderUin ?? 0); this.targetUid = element.replyElement.senderUidStr ?? ''; - this.time = +(element.replyElement.replyMsgTime ?? 0); - this.elems = []; // TODO: in replyElement.sourceMsgTextElems + this.targetPeer = element.replyElement._replyMsgPeer; } get isGroupReply(): boolean { - return this.messageClientSeq === 0; + return this.targetMessageClientSeq === 0; } override buildElement(): NapProtoEncodeStructType[] { return [{ srcMsg: { - origSeqs: [this.isGroupReply ? this.messageClientSeq : this.messageSeq], + origSeqs: [this.isGroupReply ? this.targetMessageSeq : this.targetMessageClientSeq], senderUin: BigInt(this.targetUin), time: this.time, - elems: [], // TODO: in replyElement.sourceMsgTextElems - pbReserve: { - messageId: this.messageId, - }, - toUin: BigInt(this.targetUin), - type: 1, + elems: this.targetElems ?? [], + sourceMsg: new NapProtoMsg(PushMsgBody).encode(this.targetSourceMsg ?? {}), + toUin: BigInt(0), } }]; } diff --git a/src/core/packet/transformer/message/FetchC2CMessage.ts b/src/core/packet/transformer/message/FetchC2CMessage.ts new file mode 100644 index 00000000..92785163 --- /dev/null +++ b/src/core/packet/transformer/message/FetchC2CMessage.ts @@ -0,0 +1,27 @@ +import * as proto from '@/core/packet/transformer/proto'; +import { NapProtoMsg } from '@napneko/nap-proto-core'; +import { OidbPacket, PacketHexStrBuilder, PacketTransformer } from '@/core/packet/transformer/base'; + +class FetchC2CMessage extends PacketTransformer { + constructor() { + super(); + } + + build(targetUid: string, startSeq: number, endSeq: number): OidbPacket { + const req = new NapProtoMsg(proto.SsoGetC2cMsg).encode({ + friendUid: targetUid, + startSequence: startSeq, + endSequence: endSeq, + }); + return { + cmd: 'trpc.msg.register_proxy.RegisterProxy.SsoGetC2cMsg', + data: PacketHexStrBuilder(req) + }; + } + + parse(data: Buffer) { + return new NapProtoMsg(proto.SsoGetC2cMsgResponse).decode(data); + } +} + +export default new FetchC2CMessage(); diff --git a/src/core/packet/transformer/message/FetchGroupMessage.ts b/src/core/packet/transformer/message/FetchGroupMessage.ts new file mode 100644 index 00000000..ffd4c672 --- /dev/null +++ b/src/core/packet/transformer/message/FetchGroupMessage.ts @@ -0,0 +1,30 @@ +import * as proto from '@/core/packet/transformer/proto'; +import { NapProtoMsg } from '@napneko/nap-proto-core'; +import { OidbPacket, PacketHexStrBuilder, PacketTransformer } from '@/core/packet/transformer/base'; + +class FetchGroupMessage extends PacketTransformer { + constructor() { + super(); + } + + build(groupUin: number, startSeq: number, endSeq: number): OidbPacket { + const req = new NapProtoMsg(proto.SsoGetGroupMsg).encode({ + info: { + groupUin: groupUin, + startSequence: startSeq, + endSequence: endSeq + }, + direction: true + }); + return { + cmd: 'trpc.msg.register_proxy.RegisterProxy.SsoGetGroupMsg', + data: PacketHexStrBuilder(req) + }; + } + + parse(data: Buffer) { + return new NapProtoMsg(proto.SsoGetGroupMsgResponse).decode(data); + } +} + +export default new FetchGroupMessage(); diff --git a/src/core/packet/transformer/message/index.ts b/src/core/packet/transformer/message/index.ts index 16a5d338..78e757c8 100644 --- a/src/core/packet/transformer/message/index.ts +++ b/src/core/packet/transformer/message/index.ts @@ -1,2 +1,4 @@ export { default as UploadForwardMsg } from './UploadForwardMsg'; -export { default as DownloadForwardMsg } from './DownloadForwardMsg'; \ No newline at end of file +export { default as FetchGroupMessage } from './FetchGroupMessage'; +export { default as FetchC2CMessage } from './FetchC2CMessage'; +export { default as DownloadForwardMsg } from './DownloadForwardMsg'; diff --git a/src/core/packet/transformer/proto/message/message.ts b/src/core/packet/transformer/proto/message/message.ts index 24200ca1..fdae58cf 100644 --- a/src/core/packet/transformer/proto/message/message.ts +++ b/src/core/packet/transformer/proto/message/message.ts @@ -13,13 +13,15 @@ import { export const ContentHead = { type: ProtoField(1, ScalarType.UINT32), subType: ProtoField(2, ScalarType.UINT32, true), - divSeq: ProtoField(3, ScalarType.UINT32, true), - msgId: ProtoField(4, ScalarType.UINT32, true), + c2cCmd: ProtoField(3, ScalarType.UINT32, true), + ranDom: ProtoField(4, ScalarType.UINT32, true), sequence: ProtoField(5, ScalarType.UINT32, true), timeStamp: ProtoField(6, ScalarType.UINT32, true), - field7: ProtoField(7, ScalarType.UINT64, true), - field8: ProtoField(8, ScalarType.UINT32, true), - field9: ProtoField(9, ScalarType.UINT32, true), + pkgNum: ProtoField(7, ScalarType.UINT64, true), + pkgIndex: ProtoField(8, ScalarType.UINT32, true), + divSeq: ProtoField(9, ScalarType.UINT32, true), + autoReply: ProtoField(10, ScalarType.UINT32), + ntMsgSeq: ProtoField(10, ScalarType.UINT32, true), newId: ProtoField(12, ScalarType.UINT64, true), forward: ProtoField(15, () => ForwardHead, true), }; diff --git a/src/core/types/element.ts b/src/core/types/element.ts index 193f7a12..dd417b13 100644 --- a/src/core/types/element.ts +++ b/src/core/types/element.ts @@ -1,4 +1,15 @@ -import { ElementType, MessageElement, NTGrayTipElementSubTypeV2, PicSubType, PicType, TipAioOpGrayTipElement, TipGroupElement, NTVideoType, FaceType } from './msg'; +import { + ElementType, + MessageElement, + NTGrayTipElementSubTypeV2, + PicSubType, + PicType, + TipAioOpGrayTipElement, + TipGroupElement, + NTVideoType, + FaceType, + Peer +} from './msg'; type ElementFullBase = Omit; @@ -213,6 +224,9 @@ export interface ReplyElement { senderUidStr?: string; replyMsgTime?: string; replyMsgClientSeq?: string; + // HACK: Attributes that were not originally available, + // but were added due to NTQQ and NapCat's internal implementation, are used to supplement NapCat + _replyMsgPeer?: Peer; } export interface CalendarElement { diff --git a/src/core/types/msg.ts b/src/core/types/msg.ts index 083fb94b..9e542ad8 100644 --- a/src/core/types/msg.ts +++ b/src/core/types/msg.ts @@ -403,7 +403,7 @@ export interface NTGroupGrayMember { } /** * 群灰色提示邀请者和被邀请者接口 - * + * * */ export interface NTGroupGrayInviterAndInvite { invited: NTGroupGrayMember; @@ -501,6 +501,7 @@ export interface RawMessage { elements: MessageElement[];// 消息元素 sourceType: MsgSourceType;// 消息来源类型 isOnlineMsg: boolean;// 是否为在线消息 + clientSeq?: string; } /** @@ -565,4 +566,4 @@ export enum FaceType { AniSticke = 3, // 动画贴纸 Lottie = 4,// 新格式表情 Poke = 5 // 可变Poke -} \ No newline at end of file +} diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index fd81f461..ffef73b0 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -467,6 +467,8 @@ export class OneBotMsgApi { replayMsgId: replyMsg.msgId, // raw.msgId senderUin: replyMsg.senderUin, senderUinStr: replyMsg.senderUin, + replyMsgClientSeq: replyMsg.clientSeq, + _replyMsgPeer: replyMsgM.Peer }, } : undefined; From 39197438854e98bf087fc04bda2d4448f79288e7 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Wed, 30 Apr 2025 13:43:59 +0000 Subject: [PATCH 148/149] release: v4.7.45 --- manifest.json | 2 +- package.json | 2 +- src/common/version.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 2a996748..91c06759 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.44", + "version": "4.7.45", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 6f76191d..a2173903 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.44", + "version": "4.7.45", "scripts": { "build:universal": "npm run build:webui && vite build --mode universal || exit 1", "build:framework": "npm run build:webui && vite build --mode framework || exit 1", diff --git a/src/common/version.ts b/src/common/version.ts index d5aefc86..9894ffaf 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.44'; +export const napCatVersion = '4.7.45'; From 6421bb4f5c7a363801f7dabbc265185555fcee0d 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: Fri, 2 May 2025 15:10:31 +0800 Subject: [PATCH 149/149] feat: normalize --- src/common/file.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/file.ts b/src/common/file.ts index 180cf6d1..b62ad7b0 100644 --- a/src/common/file.ts +++ b/src/common/file.ts @@ -145,8 +145,8 @@ export enum FileUriType { export async function checkUriType(Uri: string) { const LocalFileRet = await solveProblem((uri: string) => { - if (fs.existsSync(uri)) { - return { Uri: uri, Type: FileUriType.Local }; + if (fs.existsSync(path.normalize(uri))) { + return { Uri: path.normalize(uri), Type: FileUriType.Local }; } return undefined; }, Uri);