From 573451badecb96d436ebb112d5433067db8a4f33 Mon Sep 17 00:00:00 2001 From: Nepenthe Date: Wed, 30 Oct 2024 21:07:01 +0800 Subject: [PATCH 001/233] =?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 6b3bfa1ee93902849f7b1b3c1c96e98c9c819863 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, 18 Feb 2025 13:24:37 +0800 Subject: [PATCH 002/233] fix #810 --- src/core/services/NodeIKernelMsgService.ts | 4 ++-- src/onebot/action/extends/ClickInlineKeyboardButton.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/services/NodeIKernelMsgService.ts b/src/core/services/NodeIKernelMsgService.ts index 6eb1f5b0..53baf999 100644 --- a/src/core/services/NodeIKernelMsgService.ts +++ b/src/core/services/NodeIKernelMsgService.ts @@ -465,14 +465,14 @@ export interface NodeIKernelMsgService { setMsgEmojiLikesForRole(...args: unknown[]): unknown; clickInlineKeyboardButton(params: { - guildId: string, + guildId?: string, peerId: string, botAppid: string, msgSeq: string, buttonId: string, callback_data: string, dmFlag: number, - chatType: number + chatType: number // 1私聊 2群 }): Promise; setCurOnScreenMsg(...args: unknown[]): unknown; diff --git a/src/onebot/action/extends/ClickInlineKeyboardButton.ts b/src/onebot/action/extends/ClickInlineKeyboardButton.ts index 124886ce..f27acfb2 100644 --- a/src/onebot/action/extends/ClickInlineKeyboardButton.ts +++ b/src/onebot/action/extends/ClickInlineKeyboardButton.ts @@ -7,6 +7,7 @@ const SchemaData = Type.Object({ bot_appid: Type.String(), button_id: Type.String({ default: '' }), callback_data: Type.String({ default: '' }), + msg_seq: Type.String({ default: '10086' }), }); type Payload = Static; @@ -18,13 +19,12 @@ export class ClickInlineKeyboardButton extends OneBotAction { async _handle(payload: Payload) { return await this.core.apis.MsgApi.clickInlineKeyboardButton({ buttonId: payload.button_id, - guildId: '',// 频道使用 peerId: payload.group_id.toString(), botAppid: payload.bot_appid, - msgSeq: '10086', + msgSeq: payload.msg_seq, callback_data: payload.callback_data, dmFlag: 0, - chatType: 1 + chatType: 2 }) } } From 95ea761b2d7b202a7bbedb323459cf7599904f58 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, 18 Feb 2025 16:51:51 +0800 Subject: [PATCH 003/233] feat: get_private_file_url --- src/core/packet/context/operationContext.ts | 40 ++++++++++++--------- src/onebot/action/file/GetPrivateFileUrl.ts | 38 ++++++++++++++++++++ src/onebot/action/index.ts | 2 ++ src/onebot/action/router.ts | 1 + src/onebot/api/msg.ts | 2 +- 5 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 src/onebot/action/file/GetPrivateFileUrl.ts diff --git a/src/core/packet/context/operationContext.ts b/src/core/packet/context/operationContext.ts index e9c89cba..d69955c6 100644 --- a/src/core/packet/context/operationContext.ts +++ b/src/core/packet/context/operationContext.ts @@ -1,22 +1,22 @@ import * as crypto from 'crypto'; -import {PacketContext} from '@/core/packet/context/packetContext'; +import { PacketContext } from '@/core/packet/context/packetContext'; import * as trans from '@/core/packet/transformer'; -import {PacketMsg} from '@/core/packet/message/message'; +import { PacketMsg } from '@/core/packet/message/message'; import { PacketMsgFileElement, PacketMsgPicElement, PacketMsgPttElement, 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 {OidbPacket} from '@/core/packet/transformer/base'; -import {ImageOcrResult} from '@/core/packet/entities/ocrResult'; -import {gunzipSync} from 'zlib'; -import {PacketMsgConverter} from '@/core/packet/message/converter'; +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 { OidbPacket } from '@/core/packet/transformer/base'; +import { ImageOcrResult } from '@/core/packet/entities/ocrResult'; +import { gunzipSync } from 'zlib'; +import { PacketMsgConverter } from '@/core/packet/message/converter'; export class PacketOperationContext { private readonly context: PacketContext; @@ -59,10 +59,10 @@ export class PacketOperationContext { const res = trans.GetStrangerInfo.parse(resp); const extBigInt = BigInt(res.data.status.value); if (extBigInt <= 10n) { - return {status: Number(extBigInt) * 10, ext_status: 0}; + return { status: Number(extBigInt) * 10, ext_status: 0 }; } status = Number((extBigInt & 0xff00n) + ((extBigInt >> 16n) & 0xffn)); - return {status: 10, ext_status: status}; + return { status: 10, ext_status: status }; } catch { return undefined; } @@ -79,13 +79,13 @@ export class PacketOperationContext { const reqList = msg.flatMap(m => m.msg.map(e => { if (e instanceof PacketMsgPicElement) { - return this.context.highway.uploadImage({chatType, peerUid}, e); + return this.context.highway.uploadImage({ chatType, peerUid }, e); } else if (e instanceof PacketMsgVideoElement) { - return this.context.highway.uploadVideo({chatType, peerUid}, e); + return this.context.highway.uploadVideo({ chatType, peerUid }, e); } else if (e instanceof PacketMsgPttElement) { - return this.context.highway.uploadPtt({chatType, peerUid}, e); + return this.context.highway.uploadPtt({ chatType, peerUid }, e); } else if (e instanceof PacketMsgFileElement) { - return this.context.highway.uploadFile({chatType, peerUid}, e); + return this.context.highway.uploadFile({ chatType, peerUid }, e); } return null; }).filter(Boolean) @@ -160,6 +160,12 @@ export class PacketOperationContext { const res = trans.DownloadGroupFile.parse(resp); return `https://${res.download.downloadDns}/ftn_handler/${Buffer.from(res.download.downloadUrl).toString('hex')}/?fname=`; } + async GetPrivateFileUrl(self_id: string, fileUUID: string, md5: string) { + const req = trans.DownloadPrivateFile.build(self_id, fileUUID, md5); + const resp = await this.context.client.sendOidbPacket(req, true); + const res = trans.DownloadPrivateFile.parse(resp); + return `http://${res.body?.result?.server}:${res.body?.result?.port}${res.body?.result?.url?.slice(8)}&isthumb=0`; + } async GetGroupPttUrl(groupUin: number, node: NapProtoEncodeStructType) { const req = trans.DownloadGroupPtt.build(groupUin, node); diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts new file mode 100644 index 00000000..d808b2d1 --- /dev/null +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -0,0 +1,38 @@ +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({ + file_id: Type.String(), +}); + +type Payload = Static; + +interface GetPrivateFileUrlResponse { + url?: string; +} + +export class GetPrivateFileUrl extends GetPacketStatusDepends { + override actionName = ActionName.NapCat_GetPrivateFileUrl; + override payloadSchema = SchemaData; + + async _handle(payload: Payload) { + const contextMsgFile = FileNapCatOneBotUUID.decode(payload.file_id); + + if (contextMsgFile?.fileUUID && contextMsgFile.msgId) { + let msg = await this.core.apis.MsgApi.getMsgsByMsgId(contextMsgFile.peer, [contextMsgFile.msgId]); + let self_id = this.core.selfInfo.uid; + let file_hash = msg.msgList[0]?.elements.map(ele => ele.fileElement?.file10MMd5)[0]; + console.log(file_hash,msg) + if (file_hash) { + return { + url: await this.core.apis.PacketApi.pkt.operation.GetPrivateFileUrl(self_id, contextMsgFile.fileUUID, file_hash) + }; + } + + } + console.log(contextMsgFile); + throw new Error('real fileUUID not found!'); + } +} diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index a9044277..c28a838e 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -106,6 +106,7 @@ import { SendPoke } from '@/onebot/action/packet/SendPoke'; import { SetDiyOnlineStatus } from './extends/SetDiyOnlineStatus'; import { BotExit } from './extends/BotExit'; import { ClickInlineKeyboardButton } from './extends/ClickInlineKeyboardButton'; +import { GetPrivateFileUrl } from './file/GetPrivateFileUrl'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -225,6 +226,7 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new GetGroupSystemMsg(obContext, core), new BotExit(obContext, core), new ClickInlineKeyboardButton(obContext, core), + new GetPrivateFileUrl(obContext,core) ]; type HandlerUnion = typeof actionHandlers[number]; diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index 7e065de9..6bed2aa0 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -10,6 +10,7 @@ export interface InvalidCheckResult { } export const ActionName = { + NapCat_GetPrivateFileUrl: 'get_private_file_url', ClickInlineKeyboardButton: 'click_inline_keyboard_button', GetUnidirectionalFriendList: 'get_unidirectional_friend_list', // onebot 11 diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 4f4a2e7b..d4f766fb 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -148,7 +148,7 @@ export class OneBotMsgApi { peerUid: msg.peerUid, guildId: '', }; - const file = FileNapCatOneBotUUID.encode(peer, msg.msgId, elementWrapper.elementId, element.fileUuid, element.fileName); + const file = FileNapCatOneBotUUID.encode(peer, msg.msgId, elementWrapper.elementId, element.fileUuid, element.fileUuid); return { type: OB11MessageDataType.file, data: { From fca2e3c51a42b3042be4d4c43ee06b951d3770a3 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, 18 Feb 2025 16:52:30 +0800 Subject: [PATCH 004/233] style: remove debug --- src/onebot/action/file/GetPrivateFileUrl.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/onebot/action/file/GetPrivateFileUrl.ts b/src/onebot/action/file/GetPrivateFileUrl.ts index d808b2d1..f592cc08 100644 --- a/src/onebot/action/file/GetPrivateFileUrl.ts +++ b/src/onebot/action/file/GetPrivateFileUrl.ts @@ -24,7 +24,6 @@ export class GetPrivateFileUrl extends GetPacketStatusDepends ele.fileElement?.file10MMd5)[0]; - console.log(file_hash,msg) if (file_hash) { return { url: await this.core.apis.PacketApi.pkt.operation.GetPrivateFileUrl(self_id, contextMsgFile.fileUUID, file_hash) @@ -32,7 +31,6 @@ export class GetPrivateFileUrl extends GetPacketStatusDepends Date: Tue, 18 Feb 2025 16:55:43 +0800 Subject: [PATCH 005/233] =?UTF-8?q?feat:=20=E6=96=87=E4=BB=B6=E7=A7=BB?= =?UTF-8?q?=E9=99=A4path=E5=AD=97=E6=AE=B5=E5=A2=9E=E5=BC=BA=E9=83=A8?= =?UTF-8?q?=E5=88=86=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/api/msg.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index d4f766fb..c69f1cd1 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -132,7 +132,6 @@ export class OneBotMsgApi { file: element.fileName, sub_type: element.picSubType, url: await this.core.apis.FileApi.getImageUrl(element), - path: element.filePath, file_size: element.fileSize, }, }; @@ -148,13 +147,13 @@ export class OneBotMsgApi { peerUid: msg.peerUid, guildId: '', }; - const file = FileNapCatOneBotUUID.encode(peer, msg.msgId, elementWrapper.elementId, element.fileUuid, element.fileUuid); + FileNapCatOneBotUUID.encode(peer, msg.msgId, elementWrapper.elementId, element.fileUuid, element.fileUuid); + FileNapCatOneBotUUID.encode(peer, msg.msgId, elementWrapper.elementId, element.fileUuid, element.fileName); return { type: OB11MessageDataType.file, data: { - file: file, - path: element.filePath, - file_id: file, + file: element.fileName, + file_id: element.fileUuid, file_size: element.fileSize, }, }; @@ -216,7 +215,6 @@ export class OneBotMsgApi { data: { summary: _.faceName, // 商城表情名称 file: filename, - path: url, url: url, key: _.key, emoji_id: _.emojiId, @@ -339,7 +337,6 @@ export class OneBotMsgApi { type: OB11MessageDataType.video, data: { file: fileCode, - path: videoDownUrl, url: videoDownUrl, file_size: element.fileSize, }, @@ -357,7 +354,6 @@ export class OneBotMsgApi { type: OB11MessageDataType.voice, data: { file: fileCode, - path: element.filePath, file_size: element.fileSize, }, }; From 708d5999660e995f73ecc33606d905236ad10c79 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Tue, 18 Feb 2025 08:56:25 +0000 Subject: [PATCH 006/233] release: v4.5.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 cbd5033c..5aa0f42b 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.5.22", + "version": "4.5.23", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 52521567..ac86a6c2 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.5.22", + "version": "4.5.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 0498c616..8b7a24df 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.5.22'; +export const napCatVersion = '4.5.23'; From 7b79f9cc17015cb59fbaf7e125d602660f980147 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, 18 Feb 2025 17:08:24 +0800 Subject: [PATCH 007/233] =?UTF-8?q?fix:=20=E6=97=A5=E5=BF=97=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/log.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/log.ts b/src/common/log.ts index 5d29867a..441179d0 100644 --- a/src/common/log.ts +++ b/src/common/log.ts @@ -232,7 +232,7 @@ export function rawMessageToText(msg: RawMessage, recursiveLevel = 0): string { tokens.push(`群聊 [${msg.peerName}(${msg.peerUin})]`); } if (msg.senderUin !== '0') { - tokens.push(`[${msg.sendMemberName ?? msg.sendRemarkName ?? msg.sendNickName}(${msg.senderUin})]`); + tokens.push(`[${msg.sendMemberName || msg.sendRemarkName || msg.sendNickName}(${msg.senderUin})]`); } } else if (msg.chatType == ChatType.KCHATTYPEDATALINE) { tokens.push('移动设备'); From c8b268b8063eb3a859bb4199d9eb8d27ba179599 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, 22 Feb 2025 11:50:54 +0800 Subject: [PATCH 008/233] fix: #791 --- package.json | 1 + .../extends/GetUnidirectionalFriendList.ts | 47 +++++++++++++++++++ src/onebot/action/index.ts | 4 +- 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/onebot/action/extends/GetUnidirectionalFriendList.ts diff --git a/package.json b/package.json index ac86a6c2..15b854df 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "@ffmpeg.wasm/core-mt": "^0.13.2", "compressing": "^1.10.1", "express": "^5.0.0", + "napcat.protobuf": "^1.1.3", "piscina": "^4.7.0", "silk-wasm": "^3.6.1", "ws": "^8.18.0" diff --git a/src/onebot/action/extends/GetUnidirectionalFriendList.ts b/src/onebot/action/extends/GetUnidirectionalFriendList.ts new file mode 100644 index 00000000..7ba60cc0 --- /dev/null +++ b/src/onebot/action/extends/GetUnidirectionalFriendList.ts @@ -0,0 +1,47 @@ +import { PacketHexStr } from '@/core/packet/transformer/base'; +import { OneBotAction } from '@/onebot/action/OneBotAction'; +import { ActionName } from '@/onebot/action/router'; +import { ProtoBuf, ProtoBufBase, PBUint32, PBString } from 'napcat.protobuf'; + +interface Friend { + Uin: number; + UID: number; + Nickname: string; + Age: number; + Source: string; +} + +export class GetUnidirectionalFriendList extends OneBotAction { + override actionName = ActionName.GetUnidirectionalFriendList; + + async pack_data(data: string): Promise { + return ProtoBuf(class extends ProtoBufBase { + type = PBUint32(2, false, 0); + data = PBString(3, false, data); + }).encode(); + } + + async _handle(): Promise { + const self_id = this.core.selfInfo.uin; + const req_json = JSON.stringify({ + uint64_uin: self_id, + uint64_top: 0, + uint32_req_num: 99, + bytes_cookies: "" + }); + const packed_data = await this.pack_data(req_json); + const data = Buffer.from(packed_data).toString('hex'); + const rsq = { cmd: 'MQUpdateSvc_com_qq_ti.web.OidbSvc.0xe17_0', data: data as PacketHexStr }; + const rsp_data = await this.core.apis.PacketApi.pkt.operation.sendPacket(rsq, true); + const block_json = ProtoBuf(class extends ProtoBufBase { data = PBString(4); }).decode(rsp_data); + const block_list = JSON.parse(block_json.data).rpt_block_list; + + return block_list.map((block: any) => ({ + Uin: block.Uin, + UID: block.UID, + Nickname: Buffer.from(block.NickBytes, 'base64').toString(), + Age: block.Age, + Source: Buffer.from(block.SourceBytes, 'base64').toString() + })); + } +} \ No newline at end of file diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index c28a838e..1d49b39c 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -107,6 +107,7 @@ import { SetDiyOnlineStatus } from './extends/SetDiyOnlineStatus'; import { BotExit } from './extends/BotExit'; import { ClickInlineKeyboardButton } from './extends/ClickInlineKeyboardButton'; import { GetPrivateFileUrl } from './file/GetPrivateFileUrl'; +import { GetUnidirectionalFriendList } from './extends/GetUnidirectionalFriendList'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { @@ -226,7 +227,8 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new GetGroupSystemMsg(obContext, core), new BotExit(obContext, core), new ClickInlineKeyboardButton(obContext, core), - new GetPrivateFileUrl(obContext,core) + new GetPrivateFileUrl(obContext,core), + new GetUnidirectionalFriendList(obContext,core), ]; type HandlerUnion = typeof actionHandlers[number]; From 8c4ea7f8f2f611e49110fc8441b5506957611a21 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, 22 Feb 2025 11:57:48 +0800 Subject: [PATCH 009/233] =?UTF-8?q?fix:=20=E5=BC=82=E5=B8=B8=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extends/GetUnidirectionalFriendList.ts | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/onebot/action/extends/GetUnidirectionalFriendList.ts b/src/onebot/action/extends/GetUnidirectionalFriendList.ts index 7ba60cc0..96de0f7d 100644 --- a/src/onebot/action/extends/GetUnidirectionalFriendList.ts +++ b/src/onebot/action/extends/GetUnidirectionalFriendList.ts @@ -4,11 +4,20 @@ import { ActionName } from '@/onebot/action/router'; import { ProtoBuf, ProtoBufBase, PBUint32, PBString } from 'napcat.protobuf'; interface Friend { - Uin: number; - UID: number; - Nickname: string; - Age: number; - Source: string; + uin: number; + uid: string; + nick_name: string; + age: number; + source: string; +} + +interface Block { + str_uid: string; + bytes_source: string; + uint32_sex: number; + uint32_age: number; + bytes_nick: string; + uint64_uin: number; } export class GetUnidirectionalFriendList extends OneBotAction { @@ -23,25 +32,25 @@ export class GetUnidirectionalFriendList extends OneBotAction { async _handle(): Promise { const self_id = this.core.selfInfo.uin; - const req_json = JSON.stringify({ + const req_json = { uint64_uin: self_id, uint64_top: 0, uint32_req_num: 99, bytes_cookies: "" - }); - const packed_data = await this.pack_data(req_json); + }; + const packed_data = await this.pack_data(JSON.stringify(req_json)); const data = Buffer.from(packed_data).toString('hex'); const rsq = { cmd: 'MQUpdateSvc_com_qq_ti.web.OidbSvc.0xe17_0', data: data as PacketHexStr }; const rsp_data = await this.core.apis.PacketApi.pkt.operation.sendPacket(rsq, true); const block_json = ProtoBuf(class extends ProtoBufBase { data = PBString(4); }).decode(rsp_data); - const block_list = JSON.parse(block_json.data).rpt_block_list; + const block_list: Block[] = JSON.parse(block_json.data).rpt_block_list; - return block_list.map((block: any) => ({ - Uin: block.Uin, - UID: block.UID, - Nickname: Buffer.from(block.NickBytes, 'base64').toString(), - Age: block.Age, - Source: Buffer.from(block.SourceBytes, 'base64').toString() + return block_list.map((block) => ({ + uin: block.uint64_uin, + uid: block.str_uid, + nick_name: Buffer.from(block.bytes_nick, 'base64').toString(), + age: block.uint32_age, + source: Buffer.from(block.bytes_source, 'base64').toString() })); } } \ No newline at end of file From 6b6ce4a76126b166e524d9cd4978870362955a44 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, 22 Feb 2025 12:59:37 +0800 Subject: [PATCH 010/233] =?UTF-8?q?fix:=20=E4=BE=9D=E8=B5=96=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E5=88=B0dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 15b854df..87dcad9a 100644 --- a/package.json +++ b/package.json @@ -59,13 +59,13 @@ "vite": "^6.0.1", "vite-plugin-cp": "^4.0.8", "vite-tsconfig-paths": "^5.1.0", + "napcat.protobuf": "^1.1.3", "winston": "^3.17.0" }, "dependencies": { "@ffmpeg.wasm/core-mt": "^0.13.2", "compressing": "^1.10.1", "express": "^5.0.0", - "napcat.protobuf": "^1.1.3", "piscina": "^4.7.0", "silk-wasm": "^3.6.1", "ws": "^8.18.0" From e5aee372e3743c5613ab870561feed41abfe973b 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, 23 Feb 2025 13:40:47 +0800 Subject: [PATCH 011/233] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 87dcad9a..b6fdf3df 100644 --- a/package.json +++ b/package.json @@ -60,11 +60,11 @@ "vite-plugin-cp": "^4.0.8", "vite-tsconfig-paths": "^5.1.0", "napcat.protobuf": "^1.1.3", - "winston": "^3.17.0" + "winston": "^3.17.0", + "compressing": "^1.10.1" }, "dependencies": { "@ffmpeg.wasm/core-mt": "^0.13.2", - "compressing": "^1.10.1", "express": "^5.0.0", "piscina": "^4.7.0", "silk-wasm": "^3.6.1", From 33cc23ada30a56007c7feff611d52b99f9a979af 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, 23 Feb 2025 14:29:26 +0800 Subject: [PATCH 012/233] =?UTF-8?q?refactor:=20=E5=8D=B3=E5=88=BB=E8=B5=B7?= =?UTF-8?q?=E9=80=90=E5=87=BApiscina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 - src/common/audio-worker.ts | 15 +++++++++++++-- src/common/audio.ts | 13 ++++++------- src/common/ffmpeg-worker.ts | 36 +++++++++++++++++++++++++----------- src/common/ffmpeg.ts | 32 +++++++++----------------------- src/common/worker.ts | 29 +++++++++++++++++++++++++++++ vite.config.ts | 3 +-- 7 files changed, 83 insertions(+), 46 deletions(-) create mode 100644 src/common/worker.ts diff --git a/package.json b/package.json index b6fdf3df..0b0cbbb3 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,6 @@ "dependencies": { "@ffmpeg.wasm/core-mt": "^0.13.2", "express": "^5.0.0", - "piscina": "^4.7.0", "silk-wasm": "^3.6.1", "ws": "^8.18.0" } diff --git a/src/common/audio-worker.ts b/src/common/audio-worker.ts index 64d48039..c1984946 100644 --- a/src/common/audio-worker.ts +++ b/src/common/audio-worker.ts @@ -1,9 +1,20 @@ import { encode } from 'silk-wasm'; +import { parentPort } from 'worker_threads'; export interface EncodeArgs { input: ArrayBufferView | ArrayBuffer sampleRate: number } -export default async ({ input, sampleRate }: EncodeArgs) => { +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 }); + } + }); +} +recvTask(async ({ input, sampleRate }) => { return await encode(input, sampleRate); -}; +}); \ No newline at end of file diff --git a/src/common/audio.ts b/src/common/audio.ts index 07a69fe3..190a8a4d 100644 --- a/src/common/audio.ts +++ b/src/common/audio.ts @@ -1,4 +1,3 @@ -import Piscina from 'piscina'; import fsPromise from 'fs/promises'; import path from 'node:path'; import { randomUUID } from 'crypto'; @@ -6,16 +5,16 @@ import { EncodeResult, getDuration, getWavFileInfo, isSilk, isWav } from 'silk-w import { LogWrapper } from '@/common/log'; import { EncodeArgs } from '@/common/audio-worker'; import { FFmpegService } from '@/common/ffmpeg'; +import { runTask } from './worker'; +import { fileURLToPath } from 'node:url'; const ALLOW_SAMPLE_RATE = [8000, 12000, 16000, 24000, 32000, 44100, 48000]; -async function getWorkerPath() { - return new URL(/* @vite-ignore */ './audio-worker.mjs', import.meta.url).href; +function getWorkerPath() { + //return new URL(/* @vite-ignore */ './audio-worker.mjs', import.meta.url).href; + return path.join(path.dirname(fileURLToPath(import.meta.url)), 'audio-worker.mjs'); } -const piscina = new Piscina({ - filename: await getWorkerPath(), -}); async function guessDuration(pttPath: string, logger: LogWrapper) { const pttFileInfo = await fsPromise.stat(pttPath); @@ -46,7 +45,7 @@ export async function encodeSilk(filePath: string, TEMP_DIR: string, logger: Log const { input, sampleRate } = isWav(file) ? await handleWavFile(file, filePath, pcmPath) : { input: await FFmpegService.convert(filePath, pcmPath), sampleRate: 24000 }; - const silk = await piscina.run({ input: input, sampleRate: sampleRate }); + const silk = await runTask(getWorkerPath(), { input: input, sampleRate: sampleRate }); fsPromise.unlink(pcmPath).catch((e) => logger.logError('删除临时文件失败', pcmPath, e)); await fsPromise.writeFile(pttPath, Buffer.from(silk.data)); logger.log(`语音文件${filePath}转换成功!`, pttPath, '时长:', silk.duration); diff --git a/src/common/ffmpeg-worker.ts b/src/common/ffmpeg-worker.ts index 38b0afa8..40228a8d 100644 --- a/src/common/ffmpeg-worker.ts +++ b/src/common/ffmpeg-worker.ts @@ -5,6 +5,17 @@ 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 }); + } + }); +} class FFmpegService { public static async extractThumbnail(videoPath: string, thumbnailPath: string): Promise { const ffmpegInstance = await FFmpeg.create({ core: '@ffmpeg.wasm/core-mt' }); @@ -137,15 +148,18 @@ 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}`); } -} \ No newline at end of file +} +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 dbb543f4..737c761a 100644 --- a/src/common/ffmpeg.ts +++ b/src/common/ffmpeg.ts @@ -1,6 +1,8 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import Piscina from 'piscina'; import { VideoInfo } from './video'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { runTask } from './worker'; type EncodeArgs = { method: 'extractThumbnail' | 'convertFile' | 'convert' | 'getVideoInfo'; @@ -9,42 +11,26 @@ type EncodeArgs = { type EncodeResult = any; -async function getWorkerPath() { - return new URL(/* @vite-ignore */ './ffmpeg-worker.mjs', import.meta.url).href; +function getWorkerPath() { + return path.join(path.dirname(fileURLToPath(import.meta.url)), './ffmpeg-worker.mjs'); } export class FFmpegService { public static async extractThumbnail(videoPath: string, thumbnailPath: string): Promise { - const piscina = new Piscina({ - filename: await getWorkerPath(), - }); - await piscina.run({ method: 'extractThumbnail', args: [videoPath, thumbnailPath] }); - await piscina.destroy(); + await runTask(getWorkerPath(), { method: 'extractThumbnail', args: [videoPath, thumbnailPath] }); } public static async convertFile(inputFile: string, outputFile: string, format: string): Promise { - const piscina = new Piscina({ - filename: await getWorkerPath(), - }); - await piscina.run({ method: 'convertFile', args: [inputFile, outputFile, format] }); - await piscina.destroy(); + await runTask(getWorkerPath(), { method: 'convertFile', args: [inputFile, outputFile, format] }); } public static async convert(filePath: string, pcmPath: string): Promise { - const piscina = new Piscina({ - filename: await getWorkerPath(), - }); - const result = await piscina.run({ method: 'convert', args: [filePath, pcmPath] }); - await piscina.destroy(); + const result = await runTask(getWorkerPath(), { method: 'convert', args: [filePath, pcmPath] }); return result; } public static async getVideoInfo(videoPath: string, thumbnailPath: string): Promise { - const piscina = new Piscina({ - filename: await getWorkerPath(), - }); - const result = await piscina.run({ method: 'getVideoInfo', args: [videoPath, thumbnailPath] }); - await piscina.destroy(); + const result = await await runTask(getWorkerPath(), { method: 'getVideoInfo', args: [videoPath, thumbnailPath] }); return result; } } diff --git a/src/common/worker.ts b/src/common/worker.ts new file mode 100644 index 00000000..f14ea3bb --- /dev/null +++ b/src/common/worker.ts @@ -0,0 +1,29 @@ +import { Worker } from 'worker_threads'; + +export async function runTask(workerScript: string, taskData: T): Promise { + let worker = new Worker(workerScript); + try { + return await new Promise((resolve, reject) => { + worker.on('message', (result: R) => { + resolve(result); + }); + + worker.on('error', (error) => { + reject(new Error(`Worker error: ${error.message}`)); + }); + + worker.on('exit', (code) => { + if (code !== 0) { + reject(new Error(`Worker stopped with exit code ${code}`)); + } + }); + worker.postMessage(taskData); + }); + } catch (error: unknown) { + throw new Error(`Failed to run task: ${(error as Error).message}`); + } finally { + // Ensure the worker is terminated after the promise is settled + worker.terminate(); + } +} + diff --git a/vite.config.ts b/vite.config.ts index 9ff471cf..9d9429b6 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -8,8 +8,7 @@ const external = [ 'silk-wasm', 'ws', 'express', - '@ffmpeg.wasm/core-mt', - 'piscina' + '@ffmpeg.wasm/core-mt' ]; const nodeModules = [...builtinModules, builtinModules.map((m) => `node:${m}`)].flat(); From 0051df3741faf15e3e4598b0e84e5798785bae1b 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, 23 Feb 2025 16:57:55 +0800 Subject: [PATCH 013/233] fix: #824 --- src/core/apis/group.ts | 8 +++++++- src/onebot/api/group.ts | 2 ++ src/onebot/event/notice/OB11GroupAdminNoticeEvent.ts | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 4ac216b7..b6d06f5d 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -165,7 +165,13 @@ export class NTQQGroupApi { return this.groupMemberCache.get(groupCode); } - + async refreshGroupMemberCachePartial(groupCode: string, uid: string) { + const member = await this.getGroupMemberEx(groupCode, uid, true); + if (member) { + this.groupMemberCache.get(groupCode)?.set(uid, member); + } + return member; + } async getGroupMember(groupCode: string | number, memberUinOrUid: string | number) { const groupCodeStr = groupCode.toString(); const memberUinOrUidStr = memberUinOrUid.toString(); diff --git a/src/onebot/api/group.ts b/src/onebot/api/group.ts index 0018e05f..243bcc21 100644 --- a/src/onebot/api/group.ts +++ b/src/onebot/api/group.ts @@ -49,6 +49,7 @@ export class OneBotGroupApi { duration = -1; } } + await this.core.apis.GroupApi.refreshGroupMemberCachePartial(GroupCode, memberUid); const adminUin = (await this.core.apis.GroupApi.getGroupMember(GroupCode, adminUid))?.uin; if (memberUin && adminUin) { return new OB11GroupBanEvent( @@ -113,6 +114,7 @@ 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); diff --git a/src/onebot/event/notice/OB11GroupAdminNoticeEvent.ts b/src/onebot/event/notice/OB11GroupAdminNoticeEvent.ts index b64e5c7f..a5b58c5d 100644 --- a/src/onebot/event/notice/OB11GroupAdminNoticeEvent.ts +++ b/src/onebot/event/notice/OB11GroupAdminNoticeEvent.ts @@ -3,7 +3,7 @@ import { NapCatCore } from '@/core'; export class OB11GroupAdminNoticeEvent extends OB11GroupNoticeEvent { notice_type = 'group_admin'; - sub_type: 'set' | 'unset'; + sub_type: 'set' | 'unset'; constructor(core: NapCatCore, group_id: number, user_id: number, sub_type: 'set' | 'unset') { super(core, group_id, user_id); From 3ac618bb4e3f9da5a8592d84e169100b23d2a738 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, 23 Feb 2025 17:01:00 +0800 Subject: [PATCH 014/233] fix: #822 --- src/onebot/api/group.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/onebot/api/group.ts b/src/onebot/api/group.ts index 243bcc21..6f2f4314 100644 --- a/src/onebot/api/group.ts +++ b/src/onebot/api/group.ts @@ -121,6 +121,9 @@ export class OneBotGroupApi { member.cardName = newCardName; return event; } + if (member && member.nick !== msg.sendNickName) { + await this.core.apis.GroupApi.refreshGroupMemberCachePartial(msg.peerUid, msg.senderUid); + } } return undefined; } From 88b1ee8c31978556611f1f564d732da7ace356a2 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, 23 Feb 2025 17:17:52 +0800 Subject: [PATCH 015/233] docs: todo #819 --- src/onebot/api/msg.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index c69f1cd1..c63da53e 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -654,6 +654,19 @@ export class OneBotMsgApi { [OB11MessageDataType.node]: async () => undefined, [OB11MessageDataType.forward]: async ({ data }, context) => { + // let id = data.id.toString(); + // let peer: Peer | undefined = context.peer; + // if (isNumeric(id)) { + // let msgid = ''; + // if (BigInt(data.id) > 2147483647n) { + // peer = MessageUnique.getPeerByMsgId(id)?.Peer; + // msgid = id; + // } else { + // let data = MessageUnique.getMsgIdAndPeerByShortId(parseInt(id)); + // msgid = data?.MsgId ?? ''; + // peer = data?.Peer; + // } + // } const jsonData = ForwardMsgBuilder.fromResId(data.id); return this.ob11ToRawConverters.json({ data: { data: JSON.stringify(jsonData) }, From 9accff7323fc5fba7f98ce89c6e785dfcb38d689 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, 23 Feb 2025 17:28:30 +0800 Subject: [PATCH 016/233] fix: ts warning --- src/core/packet/highway/highwayContext.ts | 36 +++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/core/packet/highway/highwayContext.ts b/src/core/packet/highway/highwayContext.ts index 76904cfd..21413dae 100644 --- a/src/core/packet/highway/highwayContext.ts +++ b/src/core/packet/highway/highwayContext.ts @@ -144,7 +144,7 @@ export class PacketHighwayContext { const ukey = preRespData.upload.uKey; if (ukey && ukey != '') { this.logger.debug(`[Highway] uploadGroupImageReq get upload ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0].index; + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; const sha1 = Buffer.from(index.info.fileSha1, 'hex'); const md5 = Buffer.from(index.info.fileHash, 'hex'); const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ @@ -181,7 +181,7 @@ export class PacketHighwayContext { const ukey = preRespData.upload.uKey; if (ukey && ukey != '') { this.logger.debug(`[Highway] uploadC2CImageReq get upload ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0].index; + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; const sha1 = Buffer.from(index.info.fileSha1, 'hex'); const md5 = Buffer.from(index.info.fileHash, 'hex'); const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ @@ -219,7 +219,7 @@ export class PacketHighwayContext { const ukey = preRespData.upload.uKey; if (ukey && ukey != '') { this.logger.debug(`[Highway] uploadGroupVideoReq get upload video ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0].index; + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; const md5 = Buffer.from(index.info.fileHash, 'hex'); const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ fileUuid: index.fileUuid, @@ -244,16 +244,16 @@ export class PacketHighwayContext { this.logger.debug(`[Highway] uploadGroupVideoReq get upload invalid ukey ${ukey}, don't need upload!`); } const subFile = preRespData.upload.subFileInfos[0]; - if (subFile.uKey && subFile.uKey != '') { - this.logger.debug(`[Highway] uploadGroupVideoReq get upload video thumb ukey: ${subFile.uKey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[1].index; + if (subFile!.uKey && subFile!.uKey != '') { + this.logger.debug(`[Highway] uploadGroupVideoReq get upload video thumb ukey: ${subFile!.uKey}, need upload!`); + const index = preRespData.upload.msgInfo.msgInfoBody[1]!.index; const md5 = Buffer.from(index.info.fileHash, 'hex'); const sha1 = Buffer.from(index.info.fileSha1, 'hex'); const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ fileUuid: index.fileUuid, - uKey: subFile.uKey, + uKey: subFile!.uKey, network: { - ipv4S: oidbIpv4s2HighwayIpv4s(subFile.ipv4S) + ipv4S: oidbIpv4s2HighwayIpv4s(subFile!.ipv4S) }, msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, blockSize: BlockSize, @@ -269,7 +269,7 @@ export class PacketHighwayContext { extend ); } else { - this.logger.debug(`[Highway] uploadGroupVideoReq get upload invalid thumb ukey ${subFile.uKey}, don't need upload!`); + this.logger.debug(`[Highway] uploadGroupVideoReq get upload invalid thumb ukey ${subFile!.uKey}, don't need upload!`); } video.msgInfo = preRespData.upload.msgInfo; } @@ -284,7 +284,7 @@ export class PacketHighwayContext { const ukey = preRespData.upload.uKey; if (ukey && ukey != '') { this.logger.debug(`[Highway] uploadC2CVideoReq get upload video ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0].index; + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; const md5 = Buffer.from(index.info.fileHash, 'hex'); const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ fileUuid: index.fileUuid, @@ -309,16 +309,16 @@ export class PacketHighwayContext { this.logger.debug(`[Highway] uploadC2CVideoReq get upload invalid ukey ${ukey}, don't need upload!`); } const subFile = preRespData.upload.subFileInfos[0]; - if (subFile.uKey && subFile.uKey != '') { - this.logger.debug(`[Highway] uploadC2CVideoReq get upload video thumb ukey: ${subFile.uKey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[1].index; + if (subFile!.uKey && subFile!.uKey != '') { + this.logger.debug(`[Highway] uploadC2CVideoReq get upload video thumb ukey: ${subFile!.uKey}, need upload!`); + const index = preRespData.upload.msgInfo.msgInfoBody[1]!.index; const md5 = Buffer.from(index.info.fileHash, 'hex'); const sha1 = Buffer.from(index.info.fileSha1, 'hex'); const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ fileUuid: index.fileUuid, - uKey: subFile.uKey, + uKey: subFile!.uKey, network: { - ipv4S: oidbIpv4s2HighwayIpv4s(subFile.ipv4S) + ipv4S: oidbIpv4s2HighwayIpv4s(subFile!.ipv4S) }, msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, blockSize: BlockSize, @@ -334,7 +334,7 @@ export class PacketHighwayContext { extend ); } else { - this.logger.debug(`[Highway] uploadC2CVideoReq get upload invalid thumb ukey ${subFile.uKey}, don't need upload!`); + this.logger.debug(`[Highway] uploadC2CVideoReq get upload invalid thumb ukey ${subFile!.uKey}, don't need upload!`); } video.msgInfo = preRespData.upload.msgInfo; } @@ -347,7 +347,7 @@ export class PacketHighwayContext { const ukey = preRespData.upload.uKey; if (ukey && ukey != '') { this.logger.debug(`[Highway] uploadGroupPttReq get upload ptt ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0].index; + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; const md5 = Buffer.from(index.info.fileHash, 'hex'); const sha1 = Buffer.from(index.info.fileSha1, 'hex'); const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ @@ -383,7 +383,7 @@ export class PacketHighwayContext { const ukey = preRespData.upload.uKey; if (ukey && ukey != '') { this.logger.debug(`[Highway] uploadC2CPttReq get upload ptt ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0].index; + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; const md5 = Buffer.from(index.info.fileHash, 'hex'); const sha1 = Buffer.from(index.info.fileSha1, 'hex'); const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ From 2d921c4577eaf03fae55247fd4fd610445a40c0f 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, 23 Feb 2025 17:30:01 +0800 Subject: [PATCH 017/233] =?UTF-8?q?feat:=20sisi=E7=9A=84=E5=A6=99=E5=A6=99?= =?UTF-8?q?rkey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/file.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index a6847ac7..01f43f14 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -41,7 +41,8 @@ export class NTQQFileApi { this.context = context; this.core = core; this.rkeyManager = new RkeyManager([ - 'https://rkey.napneko.icu/rkeys' + 'https://ss.xingzhige.com/music_card/rkey', // 国内 + 'https://rkey.napneko.icu/rkeys' // Cloudflare ], this.context.logger ); From 337871693aa7172d1328ab44f8ee830c4fbedb43 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sun, 23 Feb 2025 09:31:19 +0000 Subject: [PATCH 018/233] release: v4.5.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 5aa0f42b..6942bfad 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.5.23", + "version": "4.5.24", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 0b0cbbb3..841e33aa 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.5.23", + "version": "4.5.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 8b7a24df..1b2570b5 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.5.23'; +export const napCatVersion = '4.5.24'; From 3e6024f183f6db565749cc96008e9fa5cda73a49 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sun, 23 Feb 2025 09:31:55 +0000 Subject: [PATCH 019/233] release: v4.6.0 --- 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 6942bfad..7d1b697d 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.5.24", + "version": "4.6.0", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 841e33aa..d65e5c0f 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.5.24", + "version": "4.6.0", "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 1b2570b5..7bcd8a8f 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.5.24'; +export const napCatVersion = '4.6.0'; From ea3d069e490c7465bc1787fdc5d05311642a4ba0 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, 23 Feb 2025 17:54:19 +0800 Subject: [PATCH 020/233] =?UTF-8?q?feat:=20vsc=20build=20dev=E4=BD=93?= =?UTF-8?q?=E9=AA=8C=E5=A2=9E=E5=BC=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 115 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..f30e5309 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,115 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "dev:shell", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "dev:shell" + ] + }, + { + "type": "node", + "request": "launch", + "name": "build:shell", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "build:shell" + ] + }, + { + "type": "node", + "request": "launch", + "name": "build:universal", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "build:universal" + ] + }, + { + "type": "node", + "request": "launch", + "name": "build:framework", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "build:framework" + ] + }, + { + "type": "node", + "request": "launch", + "name": "build:webui", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "build:webui" + ] + }, + { + "type": "node", + "request": "launch", + "name": "dev:universal", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "dev:universal" + ] + }, + { + "type": "node", + "request": "launch", + "name": "dev:framework", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "dev:framework" + ] + }, + { + "type": "node", + "request": "launch", + "name": "dev:webui", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "dev:webui" + ] + }, + { + "type": "node", + "request": "launch", + "name": "lint", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "lint" + ] + }, + { + "type": "node", + "request": "launch", + "name": "depend", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "depend" + ] + }, + { + "type": "node", + "request": "launch", + "name": "dev:depend", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run", + "dev:depend" + ] + } + ] +} \ No newline at end of file From f9ccb8c97803fc8d114656853bee5fbd0afdbec1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 09:06:38 +0000 Subject: [PATCH 021/233] chore(deps-dev): bump globals from 15.15.0 to 16.0.0 Bumps [globals](https://github.com/sindresorhus/globals) from 15.15.0 to 16.0.0. - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v15.15.0...v16.0.0) --- updated-dependencies: - dependency-name: globals 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 d65e5c0f..8fa17c1c 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "express-rate-limit": "^7.5.0", "fast-xml-parser": "^4.3.6", "file-type": "^20.0.0", - "globals": "^15.12.0", + "globals": "^16.0.0", "image-size": "^1.1.1", "json5": "^2.2.3", "multer": "^1.4.5-lts.1", From 85741a4b60e4f3b5edb722bbf588b899a3916b43 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 Feb 2025 16:14:39 +0800 Subject: [PATCH 022/233] feat: 32690 --- src/core/external/appid.json | 14 +++++++++++++- src/core/external/offset.json | 6 +++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/core/external/appid.json b/src/core/external/appid.json index 563b0039..99b6f7f0 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -186,5 +186,17 @@ "9.9.17-31363": { "appid": 537266500, "qua": "V1_WIN_NQ_9.9.17_31363_GW_B" + }, + "3.2.16-32690": { + "appid": 537271229, + "qua": "V1_LNX_NQ_3.2.16_32690_GW_B" + }, + "9.9.18-32690": { + "appid": 537271194, + "qua": "V1_WIN_NQ_9.9.18_32690_GW_B" + }, + "6.9.66-32690": { + "appid": 537271218, + "qua": "V1_MAC_NQ_6.9.66_32690_GW_B" } -} +} \ No newline at end of file diff --git a/src/core/external/offset.json b/src/core/external/offset.json index 7b52b619..b85c337a 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -246,5 +246,9 @@ "6.9.65-31363-arm64": { "send": "422CEF8", "recv": "422F710" + }, + "9.9.18-32690-x64": { + "send": "39F9630", + "recv": "39FDE30" } -} +} \ No newline at end of file From 0e49e17f6893c41fad104c8eebe98d9264e8e60d 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 Feb 2025 16:34:09 +0800 Subject: [PATCH 023/233] feat: 32690 --- src/core/external/offset.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/core/external/offset.json b/src/core/external/offset.json index b85c337a..5103b39a 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -250,5 +250,13 @@ "9.9.18-32690-x64": { "send": "39F9630", "recv": "39FDE30" + }, + "3.2.16-32690-x64": { + "send": "A5E24C0", + "recv": "A5E5EE0" + }, + "3.2.16-32690-arm64": { + "send": "7226630", + "recv": "7229F60" } } \ No newline at end of file From e36cf1100428d7a87707fe22d0b364318ee95624 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 27 Feb 2025 08:35:02 +0000 Subject: [PATCH 024/233] release: v4.6.1 --- 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 7d1b697d..93f5cc27 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.6.0", + "version": "4.6.1", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 8fa17c1c..3d126a56 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.6.0", + "version": "4.6.1", "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 7bcd8a8f..7599ce32 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.6.0'; +export const napCatVersion = '4.6.1'; From 2e7176304ba94ef80a29d3308391543feadc958e 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, 2 Mar 2025 14:24:51 +0800 Subject: [PATCH 025/233] fix: #843 --- src/onebot/action/extends/SetSpecialTittle.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/onebot/action/extends/SetSpecialTittle.ts b/src/onebot/action/extends/SetSpecialTittle.ts index c512c9bf..e344180b 100644 --- a/src/onebot/action/extends/SetSpecialTittle.ts +++ b/src/onebot/action/extends/SetSpecialTittle.ts @@ -5,7 +5,7 @@ import { Static, Type } from '@sinclair/typebox'; const SchemaData = Type.Object({ group_id: Type.Union([Type.Number(), Type.String()]), user_id: Type.Union([Type.Number(), Type.String()]), - special_title: Type.String(), + special_title: Type.String({ default: '' }), }); type Payload = Static; @@ -16,7 +16,7 @@ export class SetSpecialTittle extends GetPacketStatusDepends { async _handle(payload: Payload) { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); - if(!uid) throw new Error('User not found'); + if (!uid) throw new Error('User not found'); await this.core.apis.PacketApi.pkt.operation.SetGroupSpecialTitle(+payload.group_id, uid, payload.special_title); } } From 4f6073ee86bbaf53bfec9b5045af25fd0ebebc92 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, 2 Mar 2025 14:26:28 +0800 Subject: [PATCH 026/233] fix: 837 --- src/onebot/api/msg.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index c63da53e..2c8305ed 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -354,6 +354,7 @@ export class OneBotMsgApi { type: OB11MessageDataType.voice, data: { file: fileCode, + path: element.filePath, file_size: element.fileSize, }, }; From 6d8bb49a37d9d0b8da9253ce2cf428d8b6c9209f 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, 2 Mar 2025 14:27:09 +0800 Subject: [PATCH 027/233] fix: #837 --- src/onebot/api/msg.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 2c8305ed..8905bbbd 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -354,8 +354,8 @@ export class OneBotMsgApi { type: OB11MessageDataType.voice, data: { file: fileCode, - path: element.filePath, file_size: element.fileSize, + path: element.filePath, }, }; }, From e617f9452db1e0337f5267e4a7bcb1db210d5e70 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, 2 Mar 2025 14:32:21 +0800 Subject: [PATCH 028/233] fix: #841 --- src/common/store.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/store.ts b/src/common/store.ts index 6c6b21c8..c88fb57a 100644 --- a/src/common/store.ts +++ b/src/common/store.ts @@ -163,7 +163,7 @@ class Store { const current = this.get(key); if (current === null) { - this.set(key, 1); + this.set(key, 1, 60); return 1; } @@ -180,7 +180,7 @@ class Store { } const newValue = numericValue + 1; - this.set(key, newValue); + this.set(key, newValue, 60); return newValue; } } From 6bb4362ed4dd7cd653ca72d99ce020e0fc47d04a 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, 2 Mar 2025 14:36:11 +0800 Subject: [PATCH 029/233] feat: 32721 --- src/core/external/appid.json | 4 ++++ src/core/external/offset.json | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/core/external/appid.json b/src/core/external/appid.json index 99b6f7f0..28399976 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -198,5 +198,9 @@ "6.9.66-32690": { "appid": 537271218, "qua": "V1_MAC_NQ_6.9.66_32690_GW_B" + }, + "3.2.16-32721": { + "appid": 537271229, + "qua": "V1_LNX_NQ_3.2.16_32721_GW_B" } } \ No newline at end of file diff --git a/src/core/external/offset.json b/src/core/external/offset.json index 5103b39a..dd7f393f 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -258,5 +258,13 @@ "3.2.16-32690-arm64": { "send": "7226630", "recv": "7229F60" + }, + "3.2.16-32721-x64": { + "send": "A5E24C0", + "recv": "A5E5EE0" + }, + "3.2.16-32721-arm64": { + "send": "7226630", + "recv": "7229F60" } } \ No newline at end of file From 038d0c5412420f58766ebca52223893aa8d207b6 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, 2 Mar 2025 14:55:47 +0800 Subject: [PATCH 030/233] fix: #785 --- src/onebot/action/group/SetGroupBan.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index aa5cdf26..fd98030e 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -16,6 +16,9 @@ export default class SetGroupBan extends OneBotAction { async _handle(payload: Payload): Promise { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error('uid error'); + let member_role = (await this.core.apis.GroupApi.getGroupMemberEx(payload.group_id.toString(), uid, true))?.role; + if (member_role === 4) throw new Error('cannot ban owner'); + if (member_role === 3) throw new Error('cannot ban admin'); // 例如无管理员权限时 result为 120101005 errMsg为 'ERR_NOT_GROUP_ADMIN' let ret = await this.core.apis.GroupApi.banMember(payload.group_id.toString(), [{ uid: uid, timeStamp: +payload.duration }]); From 709adfd81230784e3052b5525c3e08ee470ff047 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sun, 2 Mar 2025 07:11:16 +0000 Subject: [PATCH 031/233] release: v4.6.2 --- 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 93f5cc27..3c0f59cf 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.6.1", + "version": "4.6.2", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 3d126a56..ec7ac4f8 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.6.1", + "version": "4.6.2", "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 7599ce32..62900583 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.6.1'; +export const napCatVersion = '4.6.2'; From 47401af856afd787c7a1c4e9dcb756e8090636f9 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, 2 Mar 2025 16:07:27 +0800 Subject: [PATCH 032/233] feat: searchMsgWithKeywords --- src/core/apis/msg.ts | 14 ++++++++++ .../listeners/NodeIKernelSearchListener.ts | 27 +++++++++++++++++-- src/core/services/NodeIKernelSearchService.ts | 4 +-- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/core/apis/msg.ts b/src/core/apis/msg.ts index dda4af1a..51b67951 100644 --- a/src/core/apis/msg.ts +++ b/src/core/apis/msg.ts @@ -136,6 +136,20 @@ export class NTQQMsgApi { }); } + async queryFirstMsgBySender(peer: Peer, SendersUid: string[]) { + console.log(peer, SendersUid); + return await this.context.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { + chatInfo: peer, + filterMsgType: [], + filterSendersUid: SendersUid, + filterMsgToTime: '0', + filterMsgFromTime: '0', + isReverseOrder: true, + isIncludeCurrent: true, + pageLimit: 20000, + }); + } + async setMsgRead(peer: Peer) { return this.context.session.getMsgService().setMsgRead(peer); } diff --git a/src/core/listeners/NodeIKernelSearchListener.ts b/src/core/listeners/NodeIKernelSearchListener.ts index cd7d3a10..e0a34e9d 100644 --- a/src/core/listeners/NodeIKernelSearchListener.ts +++ b/src/core/listeners/NodeIKernelSearchListener.ts @@ -1,4 +1,4 @@ -import { ChatType } from '@/core'; +import { ChatType, RawMessage } from '@/core'; export interface SearchGroupInfo { groupCode: string; ownerUid: string; @@ -56,7 +56,7 @@ export interface GroupSearchResult { nextPos: number; } export interface NodeIKernelSearchListener { - + onSearchGroupResult(params: GroupSearchResult): any; onSearchFileKeywordsResult(params: { @@ -94,4 +94,27 @@ export interface NodeIKernelSearchListener { }[] }[] }): any; + + onSearchMsgKeywordsResult(params: { + searchId: string, + hasMore: boolean, + resultItems: Array<{ + msgId: string, + msgSeq: string, + msgTime: string, + senderUid: string, + senderUin: string, + senderNick: string, + senderNickHits: unknown[], + senderRemark: string, + senderRemarkHits: unknown[], + senderCard: string, + senderCardHits: unknown[], + fieldType: number, + fieldText: string, + msgRecord: RawMessage; + hitsInfo: Array, + msgAbstract: unknown, + }> + }): void | Promise; } diff --git a/src/core/services/NodeIKernelSearchService.ts b/src/core/services/NodeIKernelSearchService.ts index 56eeb992..7eda4f8a 100644 --- a/src/core/services/NodeIKernelSearchService.ts +++ b/src/core/services/NodeIKernelSearchService.ts @@ -1,4 +1,4 @@ -import { ChatType } from '@/core/types'; +import { ChatType, Peer } from '@/core/types'; import { GeneralCallResult } from './common'; export interface NodeIKernelSearchService { @@ -54,7 +54,7 @@ export interface NodeIKernelSearchService { cancelSearchChatMsgs(...args: unknown[]): unknown;// needs 3 arguments - searchMsgWithKeywords(...args: unknown[]): unknown;// needs 2 arguments + searchMsgWithKeywords(keyWords: string[], param: Peer & { searchFields: number, pageLimit: number }): Promise; searchMoreMsgWithKeywords(...args: unknown[]): unknown;// needs 1 arguments From 48aaddd32be2f860fde03ed2b427557d6bf90cc9 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, 3 Mar 2025 12:28:55 +0800 Subject: [PATCH 033/233] feat:rkey --- src/core/apis/file.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index 01f43f14..f058a15a 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -42,7 +42,7 @@ export class NTQQFileApi { this.core = core; this.rkeyManager = new RkeyManager([ 'https://ss.xingzhige.com/music_card/rkey', // 国内 - 'https://rkey.napneko.icu/rkeys' // Cloudflare + 'https://secret-service.bietiaop.com/rkeys',//国内 ], this.context.logger ); From 122a9ca2cc81aac20f64f3c2d163809e16f8feb2 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, 3 Mar 2025 17:16:36 +0800 Subject: [PATCH 034/233] =?UTF-8?q?feat:=20o3=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/external/napcat.json | 5 +++-- src/core/helper/config.ts | 1 + src/core/packet/client/nativeClient.ts | 5 +++-- src/native/packet/MoeHoo.linux.arm64.node | Bin 1301880 -> 1302216 bytes src/native/packet/MoeHoo.linux.x64.node | Bin 129784 -> 134216 bytes src/native/packet/MoeHoo.win32.x64.node | Bin 134656 -> 146944 bytes 6 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/core/external/napcat.json b/src/core/external/napcat.json index 44952ac2..dcce2174 100644 --- a/src/core/external/napcat.json +++ b/src/core/external/napcat.json @@ -4,5 +4,6 @@ "fileLogLevel": "debug", "consoleLogLevel": "info", "packetBackend": "auto", - "packetServer": "" -} + "packetServer": "", + "o3HookMode": 1 + } \ No newline at end of file diff --git a/src/core/helper/config.ts b/src/core/helper/config.ts index bc6781da..0c2540c1 100644 --- a/src/core/helper/config.ts +++ b/src/core/helper/config.ts @@ -10,6 +10,7 @@ export const NapcatConfigSchema = Type.Object({ consoleLogLevel: Type.String({ default: 'info' }), packetBackend: Type.String({ default: 'auto' }), packetServer: Type.String({ default: '' }), + o3HookMode: Type.Number({ default: 0 }), }); export type NapcatConfig = Static; diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index ad3ae995..356734b5 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -11,7 +11,7 @@ import { PacketLogger } from '@/core/packet/context/loggerContext'; // 0 send 1 recv export interface NativePacketExportType { - InitHook?: (send: string, recv: string, callback: (type: number, uin: string, cmd: string, seq: number, hex_data: string) => void) => boolean; + InitHook?: (send: string, recv: string, callback: (type: number, uin: string, cmd: string, seq: number, hex_data: string) => void, o3_hook: boolean) => boolean; SendPacket?: (cmd: string, data: string, trace_id: string) => void; } @@ -42,6 +42,7 @@ export class NativePacketClient extends IPacketClient { const platform = process.platform + '.' + process.arch; const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/MoeHoo.' + platform + '.node'); process.dlopen(this.MoeHooExport, moehoo_path, constants.dlopen.RTLD_LAZY); + this.MoeHooExport.exports.InitHook?.(send, recv, (type: number, uin: string, cmd: string, seq: number, hex_data: string) => { const trace_id = createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex'); if (type === 0 && this.cb.get(trace_id + 'recv')) { @@ -55,7 +56,7 @@ export class NativePacketClient extends IPacketClient { // console.log('callback:', callback, trace_id); callback?.({ seq, cmd, hex_data }); } - }); + }, this.napcore.config.o3HookMode == 1); this.available = true; } diff --git a/src/native/packet/MoeHoo.linux.arm64.node b/src/native/packet/MoeHoo.linux.arm64.node index 99c45b31e8414b1ad8b1499f747afcb77c5e28b9..bd2c2eee57606763111d5395c0b1f8de6e262d5b 100644 GIT binary patch delta 229292 zcmZ_X3%vAtUEljWvNsNbG=REOMM-;**VI#AuhjO~Y0K#=o@yPzOSIaKt-7;i1A}ZK z;#Q+lC*Ekh2c9ZZZ;iE=94|G3z;M%mAOTSWqDDXr7InNwi|zEh&h4M%leH$_*EzFa z^Q^tz-}&YC|Nk=owVw4n&*e3rQ@{RmGUxIBkKM6`hd=&mS?O=Q_!B<)Q$GJoA3uIR zf3&RWRl~23G|%|KDUTm~!uY!RWBAkKr&jyoAGz;we9T9TTE6(L_y4u_te){9ntJ1r#zVoDy{l1_6lBd7>ZNL5GUwixu9{Ip~zHR#@ z-}|0_Hss%Io}YX7FYi40-ok&>Pv>_(?n6H9S+DQvZ}`1m{P3rhKVrS{*~vYhmOSP& zs=s*Z_iiIES>5xw(^jp|ztB9t2n+c*e0YX=KFd6xZJvAce6D$Zxp_t} z{fbY%=VK1$|E#Y!&lj5K@JV8x!{eLG^F`zTS=PTYA5-)E4)gp@^Zah}{2udsiFw{N z&+j$Qmzw9lG0)-g{nH2Q2hGPHGS8gP=MO*1|NMtxmp?YE`N$Q!k)JUC_mk%NQ|9?H z^yPf~8T0X#=J_h~JelWf&GYr<`LpKvbLLr@=NruP=gsp?<~cmxY@WYho^LVFx0Kk!n&*Er&;M?o|Hs`2?mXe8-u|A|o&Wppx83t+EB9lw z&-=5#`2%lx`3vuT@|}A==I6fag?IBuR-f4Z@HCT6$<5;t=8%scIZe_Tzvr=*_4r|% zcRv5_<38-ZJKu5luRZF%yUm9>_YN1w9+JEL%DMLiAIj_Qed1hk?{GfjEAD*sP^`c|Uj3yMJqS-<|Kf`;8|5l1I+y&3HZ^y!#GwRxiH$DdzY#X4})be$TM2I}eYq`_^&4pLBEV_l^3gPaF4mcl`C|hjY2}g7Fnk8eVblr_9H9Z+&yE9yf07a`#8f z6{?52d!PSN^A&phe68+$|J|Q9SLYeyYhOBS@!lW3xiXKv+3HK?qrUf{`P}Yx=WX0; zuKjer_kPn{ap!BtEk0}5;@y+E>i_F_oU8ejcmDo3lCPb&d)Irccju>uS0DbN*~a6{ z3@VvHD|1G}<4?`q@A1~7t?sYfGk*U0?#Wy4k_`7p7OPDEJqg@ktKoshshd zGxnzaT8}h!!*+@{P8%rknAclRzq&%h4ffkPv!gqm*;6TaI#;53{8Vtn|KTI19qfL7 z+QGvd=>PfQ(;06bJ-y!H^^Y*GAFkZ?KTj{5Px!OV0Ud_GdD>L)MHIZBBaJ`VRGP;_ z_*2+Wz=o#7wX7fg$Y}>HC-B5+bCzT7rNj1PXL{w6+0Jh~Zu0cgKV&$6%L)ko2Untg z;#BY;{`(ZPpT0b^PsAZ-3gq^+?XR-7c@h@ab>{_D@ci zZo{R18fSd@n0Z6&nc2Sir0L2%b&9Q=p(!3SZU0}hosT{+8!dMVeDlKL@sIKFvnMwP zK0dyM16?zT*7zrIsdFy1i~l)0c9;{h_ng2Xq`!R%{+LM@f9AB~4gTRAP)WOfCVn4h zoIYkcRTqE!aQ8D;uKwuB=ehOS41qNb&B2N&_!7p_m9hL#b3nrls*xL1!I`;#WjfHm zGhK1(Y4}fk*yL>9`Z2bD{>Rr>)QtbT%zMvpq?fl(gYpxM&CkqNLJnwcX4ξyu#~ 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 nV|-I2pkzO9%1tPrFZhy~@mE) delta 226987 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ξf;p_TU{02@#M(f3h!bVOxsuCZ3jc8`zyTpfF-X~ zc#i^}Er9_TEI&};Jq}pnhF&nruU2@s0+zg1;k^ua`Cx@tst0?e72ZaGxo=i@`v4Xm zukfy~R{+L|3h!AET!2>qOWuQEeN+IL23T^k!s`S~J&l$ErU9M-bOL@y<$qRqdxRij zfRh39{#D^U2e{^Jh1V2{2z*%KO$D@nT;ZJyxb=L6_bydYNJPW&DmV_9b_ee0Ce3!4ghX_07J3pOR3Tu5{HTb8v*t)RC?0@3jqfJdH@}O*7}v+ zxqx|%D!pp}rN))s62Lxy#{mZcmIIbIE~xb02XYyNka!pXYy@}%Fb%L0Z~&mx1cm_v z0OtZW16%``2Dk&T4`3-^F5nr!$$*yu^8tSWTmvXIKtlk-0bPL2080vhWB@4z90Yh2 za6DicU_Rhk!1aJP09}9~O)I^J0aF3b0_Fl<0XzyAoPbC)tMv8&JPVi$=mE?FtOQ&M zC^fJ2ZUqbhd=0Q57f2b9$$%FDj{@EWEC&q6d%s7ME4}RiqgzyZ`vBSjM*+G3^8n8R zt^~XbxD_zBB@6=|1uO&f0A2(Pc&yTU127fvK430jh!x|%1c==VLQ17~GGHO#V!(31 zLO@5WO7C7kC*V=Q62NjmdupZk7GN%5fDL+pEdh@L4gjnKoDOJhjR*p|>Qs3HT0c4?rj2bilm$D(_yvJ`Jk8R{#ekz(8B@6RW(r zfRYV{08^8yyl1K0q{+Qmeeb0ImTH>44;HQ{~M8ENollT?6QBSLH3Ea{DUpeL#DMDsQ`vFbp^y zFt=lscL$))yhVWas;UBS2@od;#{tU#%K@W*ukzjnOudB=XTUIE5n$e*2r*zO;1$4t+g095 zz(PQ47xeX=D(@h`HFr@Fpi~V#Kquf?Ko{T@z|?z)Y*$3;UO|<&5fCQ`X@D-kL4Y2> z@qmN=s`BOo<^!$=JPPOnEV+-Cc7p>Cs=O@$^8j-JF9WUwv_Gu!mI9UlUI7g8BKhpF z1K1AmC}0lY-5x;Z0tu0R_pSlV13V0P8PEf0H~j7m&V(VrG{6w!@80o%`GAFhM*;Wp zZA~ldzps6qM zwaqN)e)oaj;2$=#^oxu5-5|xqVYbSLxD|iFFoCc4l}sP=l;)Nh=8M2nck(^WEltc4 z1AiAk-`vu*&UjRx2Ro*R9e7l-!h-a(o~W}VzGF8}At-YDw@M*jN}ksD@`<;)t(XcZjF zL+dhj!Xa{$@#QVh$}4a#br(O_!jfL^JMho$!V*pqd6nO8Vd>DO8KMx5t=lL-(=JRl z)QFcF?QEE}DXGYo#S^wR=(E|nC2?DPaoqOU9Wlmy{&Y)AWW7Adx7>v70qL#c%UfC| zrclJKX4qSX9U5@hvc6>6$+9*XiwsYG^EEY?WO_iR+{I%bvm}@&10S`AcO`s1@PNI1 z>|>U$e&xXL^L>w5I>rXmE)<)$XflaU5Bym{JARPge$0}UG#U8f*RjhaCO*XP;fKKw znunVDIUkW?NjIN?ob^p!oMK6iy#+k~P;Jh|Lni%lEo;HVI^SR?~{zEHE8*?Avi;wVxR7(@Txxg!V-&Eu&?N84f z;~P>fOU)VBn{GYMEv+rd=IOwrPw=ePmLzi#@VpazD$&mXzkGrhx3&y4M`L(g{DA+~ z+LF?10PvE3VQ)n3!-s~51GLvb)51c$xuBKm80La@A2cn7M4Jwpbm`Gp z)3)CPnjIsHKBf380xk6mKDC48pt%ne!!PrMj+U4Bi5*(1#X)(2+g8Zaipfd}sx!AX13* zf;~WU`p|MgTMU{ON|K)rTAmNh3EFrcS`lcuJ~X=U8xUAo@QA_VAliKd%Ry@gnm#h$ z2|4Od`j9hsLCf)x3y#DD2AU?<5^`41=7Qz`E@kqE85qlhK-(M0n{>gNOIMmbf^Zc= ze0&gGX$NSNK_guIP@RVbJy;Nlb{4epkk!+!fadU_Rf0AOG+IaKL%OCYT;CSz1g#)O zN1-c&_-|b-39)pUdlYfR+oIzK%-J_6ApudxS{W;FUfGqd_y(eYBF6phbhG z^%6N~2d$-!Mm?7U8jhoryI~1i3EWYakLZR*zXtpUWYcs`mVp*r50`p6+C|XPKwGb) z-2m+{Xj*nr58nr^3^XlZByPnY9T}8^UPJ`3>FBY^$p7kQsauc+W)GYLXemMp13>Eo zTAEHl*`@STcPUh99%M#AMrnMHN2fL77lJAVZuOB<0IV^rzJBp`6#{t^PFL{SSSS`y5zsC0u!p@*kGQ9hN-y4LD zN)O;=Kk(SWSb5d}KYoKhJ=l^ISPDG&CmcE`lPTXh7_v7&JM$BNZ!lI|YYTXPliwbU z6~zI(<vG`Jf93m$9*kBve&g4&vFZ;3{!3M**Q46*Is~@Y zfL8Q7e|iXH&j9z_;>AN~7xNhW{*(U(dSDLllG`}X;I>>#1kcK`So~IkR>_~tv2+Y9 z1A6f;jxkiT2XkQdE@+FZ`S~2UoSK69<{mc>#Xc+tc-}ppJQU5|3ViW>K4YjQCGZ?@ z=|QEpQnm5UP}nfF!q9xczZ?qJ?7-JQm;hhr<= zs5LeWCVp=?{O<#Nr5{hoMOan>FE!(WSFLY$F8F1j^$6fwa?w5$&Kk-C`Iott`DQ2Z z9*y|0CqX|0+tewt-Myfty~P)fu*42K1H2FT8G=tXFM~E0 zG&EcJ5bYPx3PH20B&BZJl^)m8sE%;ZZoI{Bj=;R10X+I`ZW)RF_YUCYNBHcK=)cRr zbB^+ZBP}T@!R;|!9(~lV6|{4p<%+r}4(&h-ImUxVVRjl1eDX1#PIwXUv&Z;U;IU_b zOYhvK-b5z1hl!J<&h9RBzGLNa-B`0m3P3}^qo$56o}tJFysV(=P3lR zM@Ize1dn|h7bkhZFY;MWTbdeobmR%6ElqgY(-xE8SqnFe6YjPFo^OZAH|IK`M}W_Z(D(ndY{h#9(xq{;`eKFj3(1_pgG@H-MI_=FqvuU z*QgWC1caIg0c}~vcfw&aoj*+$cnR>mWqhdvR{kco`5le?hs|WfU$y}D$30S6c=QYRg|OkblSsP zJE$!ve_n;Xg`rYWcKFb9ML9&ko^bk?5T&dQRAlff^1fi^kp=ulzuhQ}s0YLQyWT3#5;z z*ec59PE|ppmx{8(hdxM@B_I0T0#(0MKrN|DMA@Oj0!gbNS1>{Z)ad0)g&_fHjiOJU zDBA^WsFEeCC`$rb1l_Yl*b%U)LP!1;3W7sGn@|`e%Bccc1-){yFeD(BA>~sj%7X-? z^_o7ZqFlL1)zjq5sZ9A_=)=ep0-c%Dc$t6)4X7?LQL;d>S6gH>DkxJ20@ zpk~M}%9V3e`Tjz_T$G&xYW5wXY%LIoR)HkSrL!M3zFH!3B?=hW#GBcdXQ3!8-N0o3nrr{hY&Th#zhoGrVUNIB74tFfcu@?P(k>VOgx| zN!aq}oueeagw^;g9QNoITsu`-Mr<7+POYp4r#*Tc?j?uEci@so zFThcc9v049t;2^`)PS>CT5F|Yzel&=+F??U##i7ZRy!7ldxtvlW*(`d;|k^!533aw z;3!t(!*J^mNvwJu&SJHm6zuez@C6AtiqaHm3w+g0S2x zqyAh;*uri@0X5loeD0q)Y_>aOfBH~h{@4aW^Btdk;=_SsR@Wa6q({ssyeIKRYzbS& zR#wkg9XNboZ0~)E>%Z@_SJVUVj_q_s=yrXpzkNwy+fge{AMo3)k%PW`=}~bxjdng| zcoRXZ0_#n)Dl9!S_rc*!iEqGCtGQna7w~uCWx{!@hj1kUefTQaS}j#w4g270U_bl~ zI0Rn{N8lnHg|Bnj%##?x^#sJ>8{hZE+!)f@Na0V{HIe59l&O9w5+)O|j zUIAC(Ti_aeD_nM$k#rg>@43;6W`Kz=KRuo(ey zSa0zr;UWBKSntSW;2{1Stao?{@I?G2c#`zrT+kp)CZGmyyfqB#9orVHcWT@47L@P8 zdPleqZ-w9YV;Ql$-j@s^OeY`$hv67J15UtO!zozzaT$0f{v513&7yGL+Kzw{0eYOO zz!CgacotlTcYvF)d5r3Q+OYFb%K3ERodm7E%Vzv{M({l#L!vh{LvR#-1fC7Y;9cPa zyc?W?cZW0Z9&pZKXZxFnNA9OUfZkOr!RD!r`zgbEgQW`ZgTDsroty?d2Y(CJYpsr9 zcm92afF1$+!ItwA6Z46?|2GFZSZ^1E;QjGO-~-?oJP%I5^Wjv@=jOK#L`V~`0M5V( zI0x&k-y*EHgi5g9v#P*{P`(Q5HCe5emmccXUV{L=dT+r=Drm!c@z#a)K1L7L8!&y? zIgfQdzEzS>?{9?i2*--w3d6_2Q8)$1;N#&0d;*+;PlPk@NpKEc1m}wgCnJ>LQ{W1m zhHLO*xB)MLTkxrH2VM$y;nRfkRv+PX0(=k35S;;s;0zpr&xB*}S#TWwDx84NhEwo4 zE}Qw6K{%IyEPNhZfU|HBJ|8Z_7r<5cLbwiJ1UKP}9d_n_8{umNbl^+iE}Vn=@TIWz zkc`;ZVITZoa0tE(4#SrlcGq77;R*s`u2JMvwmm zgl`Z~gs+9ma1pM+*TGfzdbkeX05{L(p@$F8oaj^xzU~JuE}M9QMOE z!y$MD9D#3vqwuXd#4!XthfBaV1yXPsPQ$muS@>IU4*oV=guerq;rty4RfO-tb@)!W z30L4Yyb|uhcfo!5ZrJyTjMzPJNH}kO4-R@F-k^SHpF<4maS( z;3oVy+=8Eg+wf1|j$wEH{S=`~z>{zfehTix4cOvRZ4K;$*TR1IXK)C98V*0o@&6fw z2m#N+QTXR@3~s`4cpaR8pM#U|FW?mXJe+=%TgBF}b!-D$ zzGAf7$tK*wwy_;-7u&=3vDRbmNaQV_{9%Q#VQd5&#m2D-Y!aKorm@-QWr#D%*c`Ti zExOjs{}MtOTftVbHEbQ*z&5chY#ZCbcCkHdA8S3%9B{0&{`?3bY#1BCMzJw$9Gk!< zu_ZDL#4HnxN9Vtd#=)_Q^wc!KrsM+jlV z*a$X?jbY>11U89HVbjXx!FI7dY#(d= zgb~Q|haVflhOrTB6dS|Fu?cJvo5H5C8Eh7t!xpglB7c;yWo!jo#n!NOYy;cGwytX>7(`Xyh41u!JpRE7+=izHO4U!49^I?P2@& zy-t$Q)3gN}vDZ0C5?~UW!ltnqdxMjt3|6pJYz`Qx z7#p$AF9-ITk_NNb0=8tYcPg)g4Q$iiU`h>H&r0P!tlyq>yV)cuFpbTuKL7T>O9KN5 z^AF$!&KPVorBus)>)V0z%+_A~oxmvrjn(VF6WDBEcKbQ;cCcM+58KCDzaY20;SMuP zQue~{1{O@Ip*FBBY{y>z-N5z(A$#!7!1O5zj%_JD#$j{znRl9~n!WPQz~NK;zmyDN zY!n-}XID&=39baD+oeh%G|;vmGtzAT3zWb{uu*Ib8^!Igo?R89f1s5xxuiqZC$ zR|fW-Qb#af@O94>8gSFTbYE>*CIEn&;p3f-%~RcsAg$2PD{Yzy1QcCcM+ zPprNDJ%JfRp%>{3HexTlCvf=O99X~>u_bI7TftVbHEi8pbx&aXp$^!^_UxDM2~3~s z|Ft9yVZ+!6Hj0g58&G*e>%Gk4hVCH7YUigE+`$L7_Ns$uP{1BuXm^{=3+t{vsZ`JIL zLoZ2m#NJR1>^GDHi`cTg_};+wvsz#W+rwIIDecFG?GNq^96ne8OZM^i1^zXo{IWz< zuvKggTelbAADBF&1-7vrY!}!Dg{JYyn%umat{}%pV61pV0+-*gn>JgVD0r{5Y^+oBrjp_wloylekk@ z%j~X#4+M_cBvcr^`qT#kr;Qj4y(Kk7>w zrEm-zx7V5I-LhZ~8>TrOnpZ$CV!M}*wl{ew@NPbxm-c6{S!@p5!gjH7YzmviCa|5~ zO8dH4y;jX}b^q)(qHupBZ~Yu0L%`E;7Jdd!!D}~>3exb;;0WA+i*OT;!)xG@%jODY z9YRzq*hUg0v;Z7a|8C+>svpkvhFr&3aa#p=5H7-F;F81671DTwG69>y6?ha}g=K@8 zA2GqS->Sm{#5dp(a1)*YCqEvNE40lJ%Jk@W)L4OkyM+W);XlDO_+7XT|Az7n_}BQG z@E_sUBV3`qgU}|xymQn2bl|_>@4|n^--AEJ--kcJueXpk;P*W$lk-LVe!WApo&ddv z^Z{({A-N5C3y#1q!+HzpZdh+2-2>|_q(@1Zp!_3nGLP^ug5E=V2u|aF5YE7>V7-O3 zl7t2PRs4EOsR$SG-@Ap(lDs}`pEHwf{6p#Smasl;{|>BA+kXP<)An(&K5V}c)`#se zSRb~Bgv}Eg5|#_-xDRgw`*_rRHynbugCp?hnRyxV7{WIQNWkBRQ}Fh12L1t@ zQ~&PF5%t6Ruzef2jQ{RDLKR`Rky3#^Z4biww0#AvPum}You}>2=S#3YY`-7YhwXd8 zJ{}$CCnJOqY&Zh1hGXz9Z~}e+PQkNbeb_z(XYenFbHaIR6+)4KS+G8BzZcf0?Xzdf z2vvz6f@_)p)`#t@V13v=3vRpdX8zxc(4~UeY!ZFiJ_PqQ0qk2PL%s?Q!Lwj}*nTgp z58L+`$((cIo%J^nAwdPV!uquR5jcZ?Cs?1h{|GMP-(#jE(1-04VSU(sE9^XMch~P^rCs?1h{|MHn?R(IpE(s^X`mp_0*!Q4}&?9gN-U*I8$npP22r&Y_JW_g~PusVE z6ZpRkr{E{x3_KRrhwV4O`mlXJxcDG zZ-;a6V{ic;gp2TXa2eirq}zeKRYBNF1gi?)0oUQ5!cBNQyzyx}+`+%^Oc|jrycMhu z+wXAMng2XX{wV?aw0%4r!haJSf%m0H`m}v3IEMcYIHC2!DR{iYPJVsbeiH%uv^_S` zIL#+Vfe>7T%WxU4!&TS^*Wn`EgugOV@>^|$X-059UHH3jAAS<{ahg2=4#EEor_6=L z=RX-(Hi+pEY%WaP{f|{d;3U;5!y~Ds3hR|nh$|UcE9Q+luwH7#V7=5zz&Zln|Xxm zsGzM(1zlw-=qpo!??LInrp_Bp%_jtho{l;0K3Csg>02q}2^8&Y8gz8TKJ zx4a?oMYs%?;alMgj;Y0eg&?>ufi?(wfFKeWL<>U39ufO7QO+8;5XqY zydF-#FT!c~*KiL04P1hMn@6Z3{0?rwFTriN4fo)eVc%+LaE)aef>*&2_(3=Z=O02y zAoQ42Dflxu3;z#Xg#Q6o;D5q(_8XIwV(|L+Jn0#?99cxa8xkuvOut8fsm!vVMnPl4NT2<|%UtiM5oJ^?=1 z_n3^pSU3cafg^C?MrmM7`G>*@<$Huv@G{~vhTZjFx>5G^IRY%W2q)n(oPw)x8m_|` zxCv+BHk^aIk8%7TiO?rt9PE2sMqqO|1aApPU>_WVXTk}1M>qxV4rdf>Y`6{k;cgz`B7{DC8SHyPMj!--;4mD4BXA6k!U;GAr{Fl8 z&mbfaa&VDJQiKQam*FGeDttU#hZn<5_)NGBpD&!Zx(JsN(1%CCzMseljE6(;L^uL( z1;^k)I00`9r{JAjHuFD&um=G-cwe{(&xgzKp>P#G2Cl=4;3j+;+=kC_*jayFgdqa@ z@Wrt2r!oSU!y$MI9D!%RF?bf7fM>%gcyGh*`p+QDB_Ibcgp2TX%!x8Q0)G`g60XB1 zz)g4w+=kD(QO-ZCF2V%_^x?0=z9(e_M#CX^0vv%S!7+FmoPfu`DR{dZx&NO**qMMF zyeC|QzXF%x1K}!s7+i;sg`4ona2q~7kI+Rp7w*FW*!Pr-z}Mgqd<7hVr@}FKYd8V# z0H@&mt_T@~ec&9tKU{gGCT#Y!c*Zo9DXKeGfY;zwRSj!xM3vWq$1Ri=tI12yuDv3|P=AZg>g?tL(7=#SG2+qN$!A1BS zxC~zmSK-UyIy@e3!V`t_RvTd}0=n?Fa39_Y_B|~lvIiW3_k|D-Y2(H4H!F6~X+=MrG*jayVge?i^!ZYDMyd&&;Mn+(F zI0VmuBk(*p1|I?^;1{mq`agy6tPz}DY;2j_!Hbk-(&V`B7b#n=kRd)?miQce4+)BJ ztRnt0yea-Fd|ZL+|2o1c1T^6@;5K|7+=VZJ`*0riJu4%$861Kq!x4CTAy1DHwkIF~ z?*gabz2FSIADn|1z(x3QxD1bmtMIYf;yS{~1T^8(;Wm6O+=age_u(sG-_KkyVBB)*!pu5O+2wvgfK(U>4kf zBXA2I&^xEfdgoM`JEuKm?ws~rHtVmAQxV{8ot}=@DT4Oal7K ze-!qulM%As5%w#8Djb5tY@#q+CSeqwfj_p6td!Xp`xK70dy-*Ylz^K_EK^WjJy z;Xs5KyZ}zX2{;8Wgfs9#a1K5gF2W~2E4%J8d;tD@72#BbI=mEaD*si6xD6jqg(DxVt^^>p*$MN^!xv=kfMgR`M2RQ7kzX(EtfEc_GPQVAjDfnPG z1E2UFhiiBdT!d4^m*KQwcl}op&LW@=e-&=RXTxpy9JmXg3-{skVBarg1Qx>~c*(~5 z{|KiN5QCS(3HUTP1)mOQ;4|PHoPmq*nQ$3C!QB6Mc7RqD;S>Vu@bL^`6W*~Q@ojh~ zxC=+%K0FKdy&xkHg~RadJVFd%S2zjB;0(MsT!8n1%WxR3!ZYAHye-^<^D_}T2xH+M zJO;LYB|Y%Nes~BD!vQ!72jMupIh+*ETN4q|1Wbmr@Hn^tkB3X}1h@ik2G`(8a08wO zw_G;!--pm4U=Z%XTf$aLMqn97Ge7KO#}b0K(MPZF3^)dF|BTF`gu~AI+nRtB0bw`; z`{A52&vJ{(@5+v;tjwd_s&Ya6b=b#gebcbJ{;$)c8v(a-G1`R-1!-{~4p5 z1-|Lv=M<}q|2u55Dm((t*R=wKCcG=$hOaJI?j-2KHx^`0=+|_D9B%vgE1W}Gzm^et z>1m1g!>y;?4(F{f!g>*`DEwR zlMy%%_QP47)nSD535dcMz;XCOI0-L?)9^)b7QPrRz+Zz)aQ+g63PKL9!I#1f`0H>B z{x7%#Uk3N!%VFy!8G$9RUpQ}Ffevt;B|1xu)F?$|C;RED+Kg(PYC}3ZonVFEjYuzzN5_5a1TCP zj|DHw2%L@I|1!t_ECFExvIIooi}1&l@h9ON{Wddq&9DhR@e+wSO-%-ZjgU`foy(%Mcrug%gAK@GV!pc+-h0n(ySH_=&FUFr% z#-D{R#a~c%{bv4`5H2U6qD%!fcs~AyGX5645PwG*e-AzszxA4oz@d)cS$}?nBM1m9 zQ$Z9y27g=`e-b_(e_9!T7G8wEpltl^`Y$0YCZM8B1vU6I{0(LNEqE^ejxzopJcQqR zT}EK&9ghEggwYL7D&cDyva5{3Bc2tGDRa3VSLT*X0uH|{^(EmMa0(uHmh1nF3VI7g z`L9wz5iW9NRDugMu%gU!znXGK8r)E(d<(ud&zH?QD$v88G7lcDH)P1JrN@3{dK`vt zCt(!6j)ZaeHX59S^S9CBv<6T?R+$P4@Mvz$mf%~7ufVsEAhJpt?B}|mhJOlI&kbQS z{|IOiVCmgzWeW6^xmj(!DG9c~?}tNh7@i78Vc%Njkjo~&kAS!akU)Q6Fo{d41pa{D zy{3ng;UxYMd_6Cv{DCCQD08nl>#(!_MsPPfM}Sq50!6q0m*G|PpbFREx-ui!RHlP% zWjfe3?5_W7n1p=-u7Z6X8R9G95PUV0G@^bcWlUL@A^Zv_94YusPFOM>j{j`}as<2v z7vY!TGW;rBh2Mbd@QCYV1e>Z_!!bAvC*UZYg5$z@D}#_EAP1-6BAkWG@Bmzehu}K=*BfNl-Grk>nGo0@QA|MBM;3C|E%kca3unK<+ z*WthE2*Ce>+wcoFaQyEgJZl8g9;**;%ZT`XFC(xM9D?_NBk;a(3?2n1;PG$@o>=7g zpF!A)fE+v@F2aYxW%wAl3NM1|a2RgFzta(b-?)L}e;46@3FyN%?0Z*6;7&LMk7koZ z;O*cTd?1{FPlr?Rrg?-6!uD_uUH}*2GvG2j60X8C;W|7IZo*69Hk==Y&_&o5?!)t8 z-+M9wr@mXcDKo7nd zw*Dw1@GaO6-vx)^``{@2ARLDuhm-JH!|wV|BRoey7Jd;fz^}k1_-(iX{{gPSpTG_H zGq?p`rN{pc!VLuU;1#g-p^U({VLyB~9ER_Qqwqs;9DV{$!l`0j&Un%YA@)pJI75K~ zJOG#AG+cp?glq8ra05OFZownW!NEP8br8nDJ$Nc?{Yge30Q=#aIUI-KZ^2P`861a~ z!$~;55+RMS3eLi7-~zlJF2QfX6?g+&gO_tZprPEA4!4B!)^ctjbO^AxeC{cKAO(ti z3Dx5A+4@LE#Nz7N4-Zg2tW5c+GUes{0A~Jg&gFAlE9B}nsmv{yv@%z_S!J$v3-BQR z5ptn6 z2OHq#{|}A;m(u^S5y<~%m!I|jumAtx9=UjDy{HPX^! z#&CU*Fjv1`gN9TS@2Gc+%%p^YN|U+na6=O*UmOpzI1r2DPZiC?4-nPcsm$-#-6 z1gxs_$7J)50Jyxl)v`A@+_48k!ClP3^@xxO3t0{4j|B&{J^eV*v|@xc)>2*HDwT3u z_kWI)=uW@ww?o05r|!<$*3PJZ-ZXoMDZ!odwR?w;+f!~J(hpz)O_-FVscIxbBd|GyN_@9~j$V|@Dm67OF#yg{1Se7jw%F!rnF zS8OhhwPHW}yu-3SGrH5`_yeM6ai3tUqt|L8G|{g>uRJQkNxVx*>-XCOQ-c$?@LR8Y zW{d{J?AcR;lNb8=R;;#C-QF3#l6d zY<@7jk(xATFE>NGYhl~rx&P>HnDLhCp<#29xM{g3e!uGNm!O642V`V?UUW@&wnWoXaKIEo7?!p@bOk}r{P;hM>G-}Ud;+=RrbIy z&YIlY{=?R$RsMxv?2qj;yt@0{>hcXwxbrU@IMYz|7#pyS-X}hS?z|_|i4PwnX?I7T zjh;f^5q&XwQS`iZ*(>7FZI|77_;6fm(3yCpFN8hh9tC$wpcl}$bM(9^5Z-fmfjuY?N7vVIrqGk|BsfN zv$34({)ZOx=>OFCeTT=7Gq-u%spQeeqx-)yJbr@cd8_1cY^4SElLAqt-bkuK@8aaj9H0o5-;_j&Xjx*vU85?qNMLzmht ztB4*)pXbCobL2rBMNfh@dI|ji5{xj{H_lMEJ@FCr&gT=DGDo6E4jA6CoYBp_f$>%p zhub1kphtn6r@&IP8*o>lC;q?Do1S>*?Zi%e%M`ji z5k2jRpKf0L>eOHL#Aot2YMugjqW3)oUPQMJlqPC}{(+uAH&e&`Y;7*Soy1A>?a_Bc z&*yNMP2zrb#ZmAiI1#<+i7%kHJn^g1Lkpy#W?r9c*48x%5EDNaRoPyCbUEl+}d z%^8^!A38`9YyEZfsL|c|uL+izcSt)0a-IS{^I*WyOX%8z{m|Q<_z!dwc;Z*+COCLw zgJk_(Kt)L$nqUKZ`QHWHjk7nKriQK^n82p#d*aVFPcobi_z#i98b2vy@;i=-Pq3*_7er@CMm#-n`ic zIJCfAwq?OnpiSbEC;m9|yv%86#}oe|de0MolsPYR;^Rk{208QJY%2HD!jX0y=A#Wd zV!9Nlp=!{%g zo@Ua8(X|8TGU>9O_&c{S`JJICc?wKps5_nlQ)iI)=;0%DE_xDOd;BDN))W61^v2Qo z;XR0KEeSfF0#~3%kCAw@2X#OHWE&^ZwZ~VmDJ!1%7WFhV-W`8a)pq9e)ENo?vBMMO z(4**@U?qCN6Mqw{pyG*N!Yb%_;`0sNH6Ay7NY7$&rO~y=1N6Ayi7%kHJn?^GPV_wS zw#*6hY&0c_&HlmtG}+;#(Y415m=iTm`~hssmM7ju4^nKCa&g1BL3QUVgV*e?_dwc?V7Tqig_j5CP z30)iXEA);h-Zx9?&s%9pupbp2gd>iw35w`xbnQVCz2b=9E=U_u$BS3cQV88dkuv zX6`5nTAuhN=sk2Dp}Wwdrw(t>9B0!w=l@9@+T$GCtcD(@XSdPgmM8v2^ypGapz&kr zKoVW+PoUR~?#_QL@P_t`0y?DsL=T@fJi!`W1?W152IxS+6aNF9EB}sn^IPxZ=y(b& zBe8Y5B-R9L(BtUZfzVE}Y0~Jr3HCy-c;b)T$>ev|cLRqG(TNlYpCO6kmVDBh09_k& zrY7*jpNrl>*ZS{AkL5FxU>pg4k0XhG40?EHX=oLF0(uI)fqo?Vt>~dMrGAYcfgVNA zYl5%fDB;jO-6iN1bd7%)-8xGWX#5N4espcnhv?bi@p)_XF4D7tr@#T|9dz9hU50Lb zRT9so$B&~Y(KY_h=vj2_Ks4&)HRt~=9J-^(xDNB|0R1Qud=EW&wj|d0H_)@_2M|AP zHgn4pe*${P(Vh9PJt*Udo-;f_Kog^D4-P}Gp@&I)Eqcon|1^5^T&drQck){=k~oP& zd%OX?_PGL1e3j+eLf0O5(ZlEcJAo5_r7l-=jbFQ?$?q(`lBd8FRzVG2M<|AFWrrsi zx2p_w7+ptbB6HfwM-RuL6!->u`~qo^Ca9n%(KW%7=oL?V8@+~pF!kpr?j}QLT__23 zRv(5QM(5j@*7fLVPyF9VP(arX>`r_OJxt=YqUWt14sFp}6o_9W4blQvF^SUXU#6m; zp;tWdQ*|4oYX|m5w=Q<-H{-7f{z2lf>#!{C!KmG3gtF*y5-*{m8oD;Z=r`tY%@YVPy9q98pec?#@;UPIRg#n5}`aT@dx zJEG|2!xOJZPom47)U5w8tot;M8C0|Yz2vFr9)_-lZcc*T&jaWkPy8+HpsXvTK>^}_ zYw znSG~om`{3+;Fbm^aE-GW|2UqJm&q4&{!oPSvF;jju)g(jG`k0ef_>(TE>^t31b zGV~g{4)tB=El>O_`gc@g#vqPVsvfL zeDpMWocKS|G$@X~2tA3e4LS=wi@rbc7os=N z4@CbVy6-xvpYtEfdJBgi$9xKmGehExPzqh=%5Lasblt@+Mz5hyqn;bkTb}s*cX5QS zmlo-A`Z0PKeFPOfjvn#EuSJh~;zzPN;^~GEHGTqm8a+-ulh7-k_%M3o^YM98 zXgeI%jgmM-Mb4Mv++~Tb3HC%!qicf>Krf){WIP1DiM|>2A7^y;{J(=khxB9$^gR0M z=+;fr&@dIf%*ch&&6aXMe@Bmc;?JU<o;FJbibNCBD;_M_#w_$r7zclQa= z(7Wg#qPNi7d${rDpVYze@^HsS{ay6ho|3@FYWx(v?tD|&e0D@1h)YAeG0`tWpNyW_ z=kxJ-^KW$FD1TWT&x^74)&l#9(6QumFnYrI%CY%e%}AusTlK5Pd{~?Yx1q#PXMY?I8 zaub}dj-EbV^cMP9vmbI-Q{MS%x%oVgV>=wyBGEtO*s!P3 z-TmGQIVPky1S~|4pC)>nbITNZ@A*yL`jchXSWD4c-xNJR%^YN%&&4=uJBnk=Q$@cD zy|hkxtom~F0*sqxDt{t}V%)+!t=94kkNr-@#;MGA~Dr$o-@ zZS>Mg(f1!E`oIA)LhbL1o)Fm@haRS(xRX!Um^i`|kRF(C=^t!=c7)kOwl)Ci<)JgVDyITuTwvI-pWcn)(1G^8>B!Q{V(Vh^bY#KJeg;O zPb5BsJ|4Y-9%k!IL2vx+^Y!N~Yg-)QzBo!$G#kB!F0;n6_C>FI^o5!LJx)Expj&^J z`itm`9o@OdQo^A%bu|fafI<$tp#x1f=is(M! zRooqWgPZU<-0YnHhC6G|IL=vUzZl-0G4q|75j4LxJ;J!B`kAq5nk&O%_A4pp_k7#k zHZ3@M%gwB#J-qLJqHIp_ZjNdtOcj>tcx0Kc-dZbi?1CVHES?nf`PA#?_;MfcId52cv(w$Ysd@7QxsH0!j; z2EPn<$ZSaGm#*f8D8{{{^tR~wqrL-;+gV|Ly8k?_ScIPZpW&^$7(K>{j1!-7?HKd( zdHWA122WlR87l*DH2!x?xq!*jo+A2E^v}@shj$V5K{LIa_{IX+9x?RI(bMzo`%W@H zKQ9NRzM1$F_~TRUPaMBLF6DjrufgxT&)#QIaOV+?+4fn+?pnHE`l(lXTO1_$tCNSf zH;V3y+s`cu?y!^7#yUS`)VX{rF^MfCcbt=t^Xv_a%#yekcbBGzY1$p=IhwpB`h)1D z{iHhGe?N`xXNYvkw6y*)()2j>bX?t9aq7TO{!?OdTMX~s;K9;uAHVz4VGE-d*sMBz zc0(^Rd{Ucb9gN=ptqkj*X~QDX16IVdU9$H1rvxX@zKL=PPN=e!`@YskU$sv)w^;sn zxWijY1GbcrvOY8V)@BRoZ~OaHx6dKc&G=La)S*tGCm3q&{_*IoA4zwzVyr7f&s&{A zNj#GTw-|?$Sby`ci~Ap{^Uorwe(IsppfJBb)p{;Oukl-4ZD`);PW|!{f^Ez_EL!w3 z1^V>Nf#p=UOl`LxxdfB5dq@H+F#!K&VoPu5+E!#uS88f2itrR~YA4k)! zrhs0&orG?qcbS-B^!ttOY$$zGiSCbgH^)Ht(8opKQsNh&=iKof)M?3%?pnC;~Bu;`a^OX=Yr=)Fy)?YE%s ziyodQx~`H#(97(EBV;?tO*8uf+%;BXoa(MHy0hAAo>hILG_vBFtsbOwVJDfbbLitb zqr0>I9n5c3Wi)TZVN;;SsivNo++!~`?Va*d+bN4do{(0waW{S;?%l^oxsO!mIFhEi5%%n}%``v6HH(*> zC|%65g*E9d=zaEDB}!M(^*tlH?|nq|`7#zd{Tq_zCEVV3v-HrLY-dgX52HIfN8Vm# zUBt3Dz|`yRcZOsl>3-@kdyVN-ekpE!sfwOWWzkd2zsu-N4!!DGv{#`==}naQThVju zgXf{wMW1BF8AhF#&l`uFGrjJ%aN);B7&4ckUDkDs8pbS=juqGsgwQ7%-PsRRJo|we z_FLzetvK60|6F6t&cre2iMdXE-*jp5N^16d*5qU8HP6~!N5-lrW1IMlr;8s+(xAQg zJktd8qEXY5DPJ~^Go9_E?}@pE?i}vA7ca%Fui^>gJ`Y`QNB;!-=RlWPuA?o!IZ9M_CEF=l&~tdtccP=pc_;EcK*3vu(1y z_yRNdJJ{>bH|79)xkE>~CV#e;VTY(|B9C77jL0qMEzd>bN^~EqSx4$e=-v~7k3`?W z>T^o9yCt9hr9j4WhCF%ovI~P>J;=VI72I_7rcVZcw~70wJ!Nh1{M8SvHE#l5z56r4 z@dK+remeNZgw^l4T9H17)D`sLuBL)PB(1Y5PweAy(`cSEWz z*!McJz8X^P=JuMc$4s|lz&oPtjD_;pt8m~8P zUAtn#ra`;4^%%e1bSiY;6KPtfHe`QbDh%jbBGvw6Q~R)g4o%sj7d-yGT)*HdS#`i9e@HtC1Zt~(A!O-{}e=GX90oDIMTJqt} diff --git a/src/native/packet/MoeHoo.linux.x64.node b/src/native/packet/MoeHoo.linux.x64.node index ac4c5b9d5905cec347d48103e40d99a5fe240b02..851dd577543004c6c03786e37208ff7fcad776e6 100644 GIT binary patch delta 24711 zcmch93tUx2*Y}|L1qHkv6&2AC6ckhxRP>;zXjp2Rc)`1Z2&SeT6fjRmj2vsL zSz%e3-6(w0%nI+9Zdg`Urc_qvWF?uJS$W?7nmrq~JiXu3`}^MS8-8=vtpBW8b6c}! z_CANXe%1H*X1}t~7BTUP2+2B8{4DB2-Qyeib=7<`E(Nw#UDsa|Ts{be@5DQ?gd) z8`8E@b=;ulaz4mPoW64q zpZ%QT->a%*O>zh8$u@%(1~oRtJFZOa-KNaDkYq<7QW%9e2Jv>pOvLes6A&rfg*X{; z3gR?HX{1a?VkY7&eo7r46#jPU%H=)hCD)8wTd~3X z6-z72(n-VqbIS-HQ1M@h)gd_eh=Lv+=1bdn%S1{fvTHPNq3 zD#a`OLM@FgQYXvQ3q(>6c#wY#YpVl~k*xhKYP!-y2^xu}A#@ijM^Rq$Rg{jvv&b|M z2I>Z_{EX2h`3$*;&eMuPh(gN=e`Bl8f2$Ma3MlDGCUZl0Q76holml*8%E|r^-qwjy zf-Z@Q@6>^bXds0iSUQB)N=47e1|5JRs#rSAK`i8^)N7AtXgLawM#>0w)?qwvs%CuV_*j5Zh}>cK(>&w`b?)&s{W|uMUVx zo1L9Mb;k6ma~I9ZQ5H?hojWyuPF~JEQ?v8(a`Kc}1vBPP&FQUYkmS;73ktHQPS43% zpiG^*B!3#RXUv&Db=I`G3;2enYx%0CZ)xp*W}PZ?0)j2ttc$EUf2KvZ%9<8VukKT4 zESolU+JXf+Gp6NdPt9I7BRe;LZq6cQ>ZHuHjFB^-kOV~am2+FQ_3EG~UJCWYOR*?E ziZ3Yr5yeuX6yF}6#$Dl=JgBud43y#TL2^vUwIXJ8S&ngUsvHMKf%2a<biU%rBLRRP0ziqq53AuS&7XNd}HOJg%8T$Q|8^qHB`RL{Om_c8~H$ZPhez%R- z@O+f!k}nViyp?v~DKPAbk4a_32hW`gu94DR%5Qq;5%kngi8soN278GHQz!Gor~|5! zjC`uU?j%6lEQJhdS2nrp8+cG(nconX@^f-@gEr)=Ueftx4e%O&9WT#gqJFWzlWG8> zhFn>ICJc+OE)<&Zz&cb>)|qf=;v%=qgr}P1H`n2)zm+MYye>mgr27%MJ59J;?EllnQ+6hDQ}Jm$9k#@xhCA$94T{| z35NsF1I>S-DT7X>Mp$RUvB2v>nF+tU4po%RCVZ3$FE`=F37N8Y0vGm2z0Ecis4x|f z#}Sdc*Mv)7B=9N|F3(c}KW@T}&6F~#>v6j{=L>0koT<;izEmG-Ot?HZiAM6Mo%M|6i!i0A<;d@PZqzSJw z;oVI5aTA_p!m9}<`=cp{GG&}G6&P;9YfN}|6YetMJxqA53BS#RUpL|QbW?^ReLFQM z+JyU=@SY|-$b`q3@K6&TYr?H2yqAts{}mz_U!aJTnV?jtL(i5d9<9gby^~%M6@)HOQ1vXk-9O zHsR|`_>ju6oxS`w#x%B{!o!`dq$*$aRNIOU`yCPmJn>%x_H@30&%pM{ND)7W^4v8Z zgwCH6PaStx3;sjmX>)d03H~JUv?seO1b>it+Kb)gg5O6x_FB8*E)&431khp4T`2fn z#FG`da|Qn-@w9ikvjo4Dc-k}F8G_$PJnfb4WWhf`JnfP07{RY0o(_U;tKe4<-;@@Q zJ4gU|1kje`Rs=tfcse1vYi|PRJe_#jg4{KNpF}*pVRBasejM?%sU;;qEj z2>x^8$~j(BoQ?kd5LAfCLDyF&1T ziKq4IE*E^ifp!4oe%xgO=tTnLcHD)6k0PGjjXPKH9f>C|o+Xt%AQ{PXdrcK#%|~6Hji&tqA@H;>o+XYyS{7KzuUsHG=<~ z_!Q!+1^*%OgNd&a{7K@65MLqqgTxOdzFhG3eFUTuP$qy^iKlaqyHN1Eh^H;goh$e! ziMJ7-CHSqxrxBka_>IJmAU;{}4-ikM5O<8=*AP!TmfK2vr_L(~ptG(!NC@N+Kbm+& z@RR!SD{)=BY==RlIR`}8N<8@%7YAo^TyotD6$0%)AOi48o)X_Wf{c?gZOF7aS7qo$ zM(F5U$c9+O({gb)?ZwUrh}6hf^n@mRr&7c1&}HXiy!x2UDdz+B|i zgbK)}Cw`9#<3#;>qtX+91JaQYJ89MX*+NLvwa}YbDEkouB!)Lp4DV0WO28ij4r~uA z61^?@(a%b7X!!3U^Xz%SIxJ*YiVcPD?u~hP~3?Qxn*}kYo=@3i-K0K7RU6KA>-F z^=e-}v2WX`&H$By?&EDmNt5~_X>)v=-vkX<)DLZPqnECknERuaznTVt!H94fOp zLk{$zVakV62(N^uHWyF1LT;EweZ0+aRW!3SsV%oAbW)f9##0k|*q{F$Ls>tTG(jnu z5dQ1!rf3yP{E7|)!GOQU_dmDv!!Ncf&2hoC6$)(5rtcs-_QTj~==3PZSJaHvsJ^5s zuw)DM+u0-n9cuL&4Z%6e{YdYw-Hx(zP!{E=xGXzNlr5Mp%entmS8khL&W2*${;gP` zUaY$;_GW#tY!pjzU_Q>I!XBE`b(r@|Y^#=C=c5x_se7*T*@^e7=dSSD#5>j0>pZPr zw)*}xUePbkHwLO)Ew1s4{o>U3uJ8{1<3_Bm1T-CbVM_&+o^=)GvG|(4rroyda&bG3 zxYJGPF*2QUr>%52j3C7SHU32Z_G-WtUe!ND^{M2a_J60t=g^hr^p0@H!raPI_L7Oj zo*)PEGkJnHuJS_zhO6IS<4uzK*ylmmS%8uKobpy)p$Qp}IV5d;{=?vFylqNqD zlx`~>8exT(fuE@Ol|aLVKB;q&w$juDJ-u!Eb5jH zz>y_928OWmD!+4}P5tXK-#)NM>KN3W4(AI!!CtVabjLB*#adKN6_rkjv>iK$af9zk zjT}{SA-@Urt~JV}l?HpKJHE3y&b#*4^5%mEsG~3Qj6q>74n4t?eKg1zV4Gvq1lROS zeC43_cWnV)mhSjkSZ#WQpQ~K-8mWsf&oUek44~V~Fn~C;_u}qZWw9qNZUnXv4%JnL zR#6||+uZ{&zD9cB6@G2dh;VOI>3a5OeWmop`J0x%)hlpqcRne(ga3AvrZp7Hi<8F> z{S|WQSmjwR_fHiVUGErJ zJb|}O2~~&J^1dln|09=l?MXZbo2(swCDsPw4YRDQC zvSD9Mcigm{`q_5slB@Pd+Md3G=Z<)h2JljvjXK5VRn5PPZ>$CzMv?i*#bFXv?0ahMN8wyLp0s)xNS73>lIyihZOz{mBwBp zbJ>eyB^9rtW?&748eJ-l-wa`DO)6SrgB6Be>;hZB_SQfyLdvx@B*NS{KQo=$n$&{p;+x`$6yU1Y6N{-=!%wXFBjAm!EB4 zeqQd3=$zis7n>QwP~>8^qG{JX`K@haTe@>t{%hKkr5oRl`ex5N)Cmq0S$>m|81pt9#`KV_|2j1n$1SL z;BSK+~+$t@R(~J6s0>up6^O~d77gt%{ju)_S-LMP8A23>NLkGI!q;F ze$t(jWkGBx8KY?3(sE5ptPL#2ahzritNEw=V9KUltJY3>5>MrS35$i(N_SlHg!Dis zMD29&tv{?{8yP1WS9iP|B3Ru->P|p`C5$X!^&@UxzofcxsVJiz5kS;z>?R+NuG9bZ0zX~kz@+iba?pCbgY6Pn*%3B*Jr4i z2GNh^B&ei{w#87ge``8EFjFDtJL9F0y?8h(cFz`dCgUvOehSrkfnpuN|JM`hLs% z+San~_*=Hn_TT9PET4Q_l9kV9pMA%#+LF~{7kJ;awkR+@%^Lo#zO4=w#*~lQpk){P zp)2PCe-J|7@)y&r_(v%vUeld3BO=`^g+YmZDddsua;r&= zz2I7p7P>don;RTTYzI-FYxOsL)yOvN0^d4vRv2nCeD}R_RN?a6tH0-A>D~O%TB^6` z8$L3utBiwP!EwsU_=ew?-VVQtdMv#Ieq;1@`eR5>85N7q2l4q8KQJmBpJzw) z$7ks1@xD8rKvzf9@chwh*?IoQ=m_A}F;Twf9|ykhJRdve9#+Foj9Jj)D~|^!J2G)U zdo+2`wdc7lqc=*e%n0|bcntC#&hf`G3R<7LrD1R`&k=&wZ9m6v8(W?HC2><=TB#UD zcwelw?_3WM>Rbh6ir-Q1_6j+dL-4Qtwn1@Q$}CO#;!&hmpXEv8hBgC&voSrai6cn* zS-x>xAv?=k+}^ME6Q3Kyc+B-H(!w=6hD5qvLn%4Ft|-~4!JxCsc;VPp$zS|!!wCJm zhHa&WQ6?IOM=sau&v{a2qWaw#zAW<&_67eSv$LA;8NZe}FhnT+q_`@-9UcAA^GmKH zpYgQubJde)`0nv@?DY-4=&v{M*v00q@H5n)^RA7b!A!q|jLVM@=e?0>iGN~TR{#g+ zmzGFxTow=q>6s+`a-GH_u1=!*ORoN)M(+b9))h3cJ%99$@#?#qD=**iqN=uiq;mVj z_f+;_WzOWseAs)u>5Ti>yL|nOe)v2#BLbg4&e-2F!l@`neHGiW;q=N@32Zjp+ig9; z-DYbCAkpn09%_60(&6#EtLQk+(|$nH>G*%%wFJDa zbP1jnaPmL@I-Rs#FQ4G{?1)|`&CY__KPxcD68r$xpz{ttQwwa)KB5u+$N9(Eo!N2z zM|LDT!6Rn%#AoKLpngBY|MryOp4odya^7TS`B#r++U-`UyS#6Qw!Q za^&5Qp5%S!-mCiO^Ud?4__?{ATR(S*Chn3e7M0nYZ=6Bj>4jL3tLg}EH!n3{IaH&z zaZ7M|{_+T4Jg;Lwnhtd&=*1&^`@FE=%Xk1IE#at3d;{RhI>O(d7uDu4zSVHOj5>~5 z_N>9qjU!(XzQ!m!YI!b?2hU%lcFsdnMm9QeKvyvKF#lrSM@+xoa>p+=#|^aMTp_pSwpYI`cN1)8#JDh1{zB{M3^0#2J8G ze?pyJ9oi@++V$M)q~>Q)qiccCdC7J74Gim88rDYpc|`t;>SOovkMaw9rOlybe{jk9 ziw9>>JwLA?Q@MnRcp0x!+$&I`{y>2I*p-zf1u0DJaxXu=G=ja(e_Co)1MlU5_uQ_2 zy@JoYryJYLH{8=!J+*?rcu#-z^a}pNJgAOs%PX0hxs3O_ zH$4_|n1fjZzGe&ODoYQjBy!^%5DDsQz*@+|qw_>GlQ)EAfXiK|*Si@b#2EC=Q^ zt-gl_F#h$WykylH^{)c%e_vGFw51rD3po3`??MOU$$n z7#{xZVzkHE+*X<&;xy@MW`PsbI^*gP5s-+bP4 zO&fLbd_HPTN!TvPi9A;_9Sg~d7vPBg>kItiny$gSV00;aF+kXrUV<4pEt}`@E=B#@ zalIH0@34cH#Hl)dIE2%jgIqb!b9+&H^}Z#%9M1sH)5r-AK?`Jc9>1+P!d{ez)*Z#+ zEw;){PYiPWU6ni0hSL0qZX$ulxZ@O02 z6-(BOT@*lkrcve~%FL!R)D`zxUR`Wq&+|`;yLeZ@y7^*9aNjei2@Y|l%kwOa!*`+u zDf{V5ShQmvDRee1f;5gU7$!XMp;4Xk_{fq3Ya(F0n$dFrzm9rQP%|p;;Zf-)C?n-;y8-;K*dKfYOb+Q^Y`w*E$+#uF@>d;tFsm5;%#*sf*4+!>LAx@ z2&9&fO!-2x-H?;BdGxwab!jfQtsC7g3kB00pNW0J(h(AA&QX48&hcc+D{}bmb=}!c zUbC+CuD!g5x)Y(;V(J#~Bp49U}%^u~o+`lfTn{S?Bs52V{2}6mk9Z z3{P>S_Qo7whVF80cR)(-IE{7C(gXqSqMhoh|TkaFnAK4V}D*Pj?PeFD&G{ zoE=rqT>ieZ1ACg+I%lblg?z&LvgQFZXt?5=VoXY4jg~uS@Ehw#uqSzH=~(ss1$=X9 zM1-mpboHlIJUVS;*X{>BG8s>2pkMm%`aTm5b}kJvOq?Kg+#ZtAFh zGKX*4v{Y@LUD@Q}GB33(n?Jt!e$|;>*>%fTs+wNS8*S^YK0AXC+V-3pH{+=vwy_qc zun{sG6bF2o=2#U3AH=5fzaINl?Jl#E5CX6goPcf zeDTEztnC5hISvLEzx+F#$R0nO^1M%uD(!L7R@(H>4o`J_nc;BIsUn-b%^el<@OhSS!|r1I3r357Z4AFkt@Xx68B)5>tZ-^; z{`SA<;A(qq9J^Zi=xa?F3*$TY(3$nUJ@2qz`IfzFRBy)HzMhDTJ71sG3-4;&P5&hC z2$hysyl5YOfAx1B{AvMJRAB0-;5(wgJqdxY4Y&!eXDfc`^{}>7?BE};QJlG2;%&wr zMLfQuNtQ2K^3MBWgGeGD611ON!n|1JtbHnLS*xpc&$&reCZmoJrZRrt8wu>p%jOu3~I$12T@*b>Z?Yu<0EfyMMg4)*{|3@Y)$UThSK!zSxpaS?9=E$`xp zM5E>YPH*pigTI2Z$bUidfv;tFyDw3TXGQZ1`-539|9yWKc7R*ojKY5ijeIjqRnUt! z%bD783HN(Dy;Tc%ucKbRDeDHuJH3li{0Fyzx|j3#{I?%w%_~{eS4^F^h+jCcK@C{M z^AD!0n-}qe2gkBN9(<^~x_nV(%ArpgYg!q0L6oi{mSaJaqgcBC}3J zkv(iY(LcnWDNgS-{zKXvOZ8?Wt%}pq4FX@E=uZOePlmRE0CM-@OsKej!8c*Y@Y=Q+ z$yNI?e*4Kd6~u8en@H`+A?^I|HDAexjv;LVOIlzPIyxl2)4on93(MZ%%lO!LmbCFT zX`G3#(n#Z7h0r)3I%?kOtm2``_uXMc#=JX}$iwdrCvxuH1Qicbq3@*Mld@x&uMMPKssWQfUoO+hX$EWab8;m#oa01Q2 z><^bR=BYgQQH;v|w=H}aSa^@?yXD^zWfq#g|&R1^vCkty$ROPIi<}gOS^s9Mx z{M&?e$()>m1v9OSvX^G(S*K@PXXj<(Un26X`E#Z%vgYJjvlkakTVT!40gz3?dHL2Q z`FZ${4eN|)xzlFM&0nsFf4|7HE}6R`+d6m2f6!nm>n{ppdX&mDUj;R`58xgT#Xq*{ zl+ukK^?1S&iJmm!N5LENJ&_)UNOV178p=_md?URN_&bP1n{M-X#vqU4ruwwqGX#JY z0MRL+zk+W0Z{q)co?WldjtV>fhxq?Q=ASA(zY!b#KZyTRIs1Q7`cD*+%pk;XANtR+ zft>xnE!05pZ{_~)WibELYEone?feho|E8S%pD6pMGPI~SVY!xLxvfK_bgrb7rZ_?J z$&%WQ41-2CC}80Kloq0rQ(HWqAkcph?Lz2(P~e{^{f{#B^u8gUp6x&!eI#FxN- zgLt&uj(q?v*^HJi2VIR`{)V^$@idm_FQD%r65bO%&ol7`PV#|}HOf+YIb^A9F{lUh zZqRVVrJFpShY?8^#r@=pzc$5IQhV_I zyL9c`NyC%$8N_NtN*|Y$(iE!@?FRFAbZ>(Ke<$;Q!YWXnwf5>Cgm*a8;3qO~-1PK7 zI@5F0lLuNJPveb z42%c#N-X9NG`N??a{<)5H{{UsIM6uIO?}W1(1-+&2mf@c#DNBb=7aVCJ)P+BWD(yF z9R=OdA0r4lGYNVE@EiQyNZ63LFc51Mw0IDf3egk{T_Acq6w3|t0_b|snW<0!dIj_f z<&QuQ@ukM$k;n(#k&dY$9`rEi1<*5~S3rLRjl&DA$Yv-9I-nVTgTEVz2>`Bu=7PqJ zLytkdZ$|_0oBGqB37|VNF~>yjfI`rj_&G|G7BHrX9#1~#VbD#Wr$KjudQZaY0o?&w z3wmiLrVd}|oX&;~fDWAv8wj>T0EzVguH-;5XvAU+VF(%m+5@y0G#NBF&*RAi-2t2V zlk!)?Ww(T)2e9*jo(A0pdSL^m3N#<@H)ghiJm@meE1>H^5AVVVf}$!#(UKxrYac7V zzgH~U-I1(g&+C8O^uSW;0>(^SIAO(FfMtmgfzMpTHlCZ>%aN>Yv=t0}K^_MoC#aGd z5VTeu6%eCNY!nbQB*1TQV%l8V>bD$uw8|ysXiU+S3P&kMlz=j0` ztyfb5Lf3kw1z3x`heOS!MgdkJDFH!)1N>4Ni~n}cgzP%3NSLn()Ka|aQ;LDXwnebv zb0x5{5bcp}Y?#k+q_4EpzV62Q_;}+t7n@sY?V{ND_H+9xO6%55eEsOhTNx-sU0ja_ zSs~;-M%xG>^=co@9mP6@Px$?&Cm#9UU%^fgdLTBzYOHRhb?MHcd^z*RFPF?K_rSzv;n5DBhQ->3DcVqz0~Ic$^^l^ID%CY?L}N zUMuMV`6iHW0~zlXx_mm)c&t-wa5tMtex7!;2OHL@3e(w%$#eOX8k!Tj`L*8^R#x$A@ZX6ft@zDJc-aP}gz!=t2TOG}MHs0jp z@m!-uvOY1L7zRnzx+)y+*nwf4eo zEVPs7>P^q{XovSvxC#WCF&C6xZ{+dN9U0zl1yBz=YRh}F_S)$v)(eO+wtN=(T}3WlkAj}TFkc5oS1ov7YodJ+hvDrO%lfIQ zFin5YXdyFyQcPH(Ooi-UeLqi*+?>Cv8u@!krCJ*6ta|D%Ur*^Fu>*$k!^vs@GyWUuow9(jNw0XU;c6KAZH%8mqoAvX#g7mUp+UF#b zjBflGr*(B*Tb}|li4ZtQ-o2Ye+XZ`Fek&eN} z^AWW-6Vp2btxan@37^9n=LPuDDk+D|kC1_<7J;zcz^(&>x39x!^YR`5&nq#SExIZ} z0hWN(pulvc^Gea3SGo2@JZn2T6z1lQ&Cc*lWOqHt1cA*55q6i3CJk*YTr+KonaG3j zi@dp*h{;H10biM<4eP@u`BWi2IazzA4~zD>g7o!dEub%pYD5zjiPgF(h4|>klaY=Y zjDs{&Xw9|OruQXZ2=wp}?IlR~{E2kNQ0?o!Y`V`(^zBTlHX?zAM;9X8DV zJB%Io4uPPfperF4bh|b^k=lrK@Lk$ViLB2s+Kv4t*ZX@aLOR;e`~XiO0D-U=U;}_T z1cFTvbSSXBleMUR?8)#SkuIN$UsK4oPWam*8JxWO*{{^}u5C zwY>f?>(fYIzen5GpRI__#Jcf&(BtVKWktV$MF1NmF*1{tz_K3HrVk*qMf%D{?ePK3 z5waSK{R=-!vA^=YU$ZiQ#Y1UrKoXlVsOL;AdGXyyXwD8y8|27hnWYYY=4L#q}R%o~{!y z^K@H>nSWODus9L+OTMk-(`5#hBL(f#QMijM@++MS(+O_v&~A)k?bM8gTKH%d-O(zQ zz_W>v1=mIa{zHUC0ouILtbGvur~v`{iU@PGEkHY#3V4?ebYi5G4R!!1`KdqOij<@D=_{^^A~ zP|D>$7~hJAD#*&)^{tZ<+%Pp2^o_?AFq zuhdeIomM?ahw1P|VIwHRT~6gSI$&7eqY~fQ0Dl2E)wWsN4t4gRVY(VR9#Ob1i&Zoz z<`3hiVsFS+lXIdlP~zfn3jTS4;%62T-_=J4Mo9c|iA%rGLRlj-_9BD&vA0GWahOH3 zE86nItY=s`4$05b1ywOj?p<^Yt--4;A>o8^xW#sauA-GW5(4 z@?>0EzauPqde#CxhmPtL=prksr%KjijQXomUvjQ4*F(ymlz8r99T)#BgXBetXWXNm zL_KQmb?pXdc$FL$eKFu4-Z4E4Hdm3S4L-_-jV#BHCn*^F+9Hu3p!ne{K?;TkTOrF; zNn4E(xr(w@%3Hmd_R&$6s%G`p!jG|GYVN7c#Jt8__vl|Z2-ygO3@lw|zZ7zLxl zR*4UY*FHbShO<#x$Kx#8ZhcTlDYJB<+zBxn=c-~INI<_S&^1ofFT*FE#okNd9w}cT z$AR`Y3S8o4Qa@M`o|k&gd@P!0S7fu5f5`$tkLiNOrhh_|{C78WR?1hM)#XpfhW;q= z+Glj!7~nsFQwJhW>*E6RM8J~v^U(*)xVdSuJWIC#P9qVsL|0@ij0lP6%8Ezn*-Dbc zGoIA}<8(1X;$^FK{39uUH*ox$H_qYsIU$8)@u?_zlmWb<+pX@d7GS@vr^GcX`6;gT^D$OV!fuz z8@LZPTIxWTTZS6nGy_+aTXrB(zY-!ca9tjLpGHBhJ*Ah#%cT)T>)Fb1L;kQ1JV*~S z2or!)#TRtrs)vpVjS2cn-0c{%su$qXVE zG?+%Bra^<~(Um$}D2-aPy~`r)4R_ioS=w;UvT;fuiJxttb)eK*o})`{lm$i`dd|pk z0#D&CDIcWIH*S&?FdiIbMvSyT>4X$I1(O%Asga7Ln|WB^nEg+5JVsyD%Ck~WZkeul zr1S#EB_1Rdi)SlZ1fR+byfYHvh-}bQY5K`>jT-Ll2SZVnE?6Yx|CD%4sSf-g+uI!T zNb_NBV1aadp=!s3lwmPaz@vu<17v|@Szwb?G@J@Rz9L_j+brejg)LQ3UZo2b%0)e0 z;;sf$wm|B^3o+dZfEVFDnUVW|&f~FA1Wn@A4Myli;9|d#8`?IE7=^t8Z>40(k*mfD zlft`FPwhgT2dg`QZ$yEAKgInn3sg%dpy}n5FwCj2iCVpd7ju>;lR2C>K)*kqPEme~fHMJUBe@#EFS2c@b`faaHaog)t z^l5p!F&;3*1-PFIp59T23vpu`;c@5h?&a(#@rL(r#?j@p_DRU?h^{oeg>$Pc)$rof zw+;DBy(e$WE_Q{t5PIaMYTz3ru3xB%!;2g$7jPJ&rk!HV!hA4s)bxgToQ7xza22pt zdy2KwuAO4dV<$?%3VED%%Gx(byx~2y2eeMd=OfCJ85~FJw zSBK3)N{p~&g@KLQfE4w%;cc+*Vet~)@Lt>>ag_PH4*o$n)f^Uu!4MJ?^)79fZYEh< z{1G1Q#v_{)H@qnK9Pq!pe)f_m);0`Fl(aUy0<|Y_y`LjULbPBuQljm5>Mby?)?KNw z)3}fMK|#Wv3)VF@ylk~fWXGPC*$wYjbxFM8eY@SXUr2e9PBH|s%nC7Dx7J9p&AP;H zogCN67lMRcf)w?#;l;2mw68wK*mc2z7lV+Zcg(o?_6~_RysUVED8^pX$wgfW!wx`7 z8s1ty8zJKH@t9nvB+lk>tvfw_Uhy_K`g(ZsFh~DZBx7t`8&gU1h}w^ zwl7f%J#2Vm@hL-seWP_agT7wV#)7o9gzJ56c%g7p;G#}TSEO{^{V4_A4b5VulnCDQ z${Dt_aSL%r?yXnh?&)%YeW*5Vc(-n6t>qW2S7&*z?Z01qo18pk!i1E;X;WjPduv_4 zXRBMtn{dq;d!GHCP4jP5e>Lu&8?~$h^OZOA?g_ul&NA)#uXs13Fm2Km7TwHvU1ZQI zZOawbv$^p~#-MnM^f`$euVf5bt%Y4>JsV}U(M=SuiN;-JeVQ9DW(xbeEl zpmVg(t}?rd@6aY)W6_O__chjdZR0hlG2YV{^y>54=Okymr-}SZYyKPS8&s>;ZoH;> zSDW}7>)FhBJ7dsbZ41Hj<&5!?MtN8J>^Bw@B;U*!Z)g^4Vb{?y|&c50vf&ieWrY)R;Htry!Ku5G=6wlVsm N4grtHyY{kn{{=;&)J^~Z delta 23264 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 delta 33650 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 Tlizs;Kl?tFpnmoD)9lSZ+nGyD From d291724f069fccf505fd3d98dc76cc55edf1a3fd Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Mon, 3 Mar 2025 09:17:03 +0000 Subject: [PATCH 035/233] release: v4.6.3 --- 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 3c0f59cf..89726a1c 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.6.2", + "version": "4.6.3", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index ec7ac4f8..0ed96a00 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.6.2", + "version": "4.6.3", "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 62900583..6723c33a 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.6.2'; +export const napCatVersion = '4.6.3'; From a3b70d0f1fe98ad02e5c07a65ba4720369bc38ba 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, 5 Mar 2025 21:14:52 +0800 Subject: [PATCH 036/233] fix --- src/onebot/action/group/SetGroupBan.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/onebot/action/group/SetGroupBan.ts b/src/onebot/action/group/SetGroupBan.ts index fd98030e..3f30aa1f 100644 --- a/src/onebot/action/group/SetGroupBan.ts +++ b/src/onebot/action/group/SetGroupBan.ts @@ -18,7 +18,6 @@ export default class SetGroupBan extends OneBotAction { if (!uid) throw new Error('uid error'); let member_role = (await this.core.apis.GroupApi.getGroupMemberEx(payload.group_id.toString(), uid, true))?.role; if (member_role === 4) throw new Error('cannot ban owner'); - if (member_role === 3) throw new Error('cannot ban admin'); // 例如无管理员权限时 result为 120101005 errMsg为 'ERR_NOT_GROUP_ADMIN' let ret = await this.core.apis.GroupApi.banMember(payload.group_id.toString(), [{ uid: uid, timeStamp: +payload.duration }]); From 7e0da2f929bab9388d63ff0e648f6e0401adcf3a Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Wed, 5 Mar 2025 13:15:11 +0000 Subject: [PATCH 037/233] release: v4.6.4 --- 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 89726a1c..04608c5e 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.6.3", + "version": "4.6.4", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 0ed96a00..b718557e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.6.3", + "version": "4.6.4", "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 6723c33a..77a97eb3 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.6.3'; +export const napCatVersion = '4.6.4'; From abc4a4dcbabc0092ff00acee8a2d7dc7b79ea37f 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, 6 Mar 2025 18:09:14 +0800 Subject: [PATCH 038/233] feat: 32793 --- external/LiteLoaderWrapper.zip | Bin 68535 -> 68745 bytes launcher/qqnt.json | 30 +++++++++++++++++++++++------- src/core/external/appid.json | 8 ++++++++ src/core/external/offset.json | 12 ++++++++++++ 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/external/LiteLoaderWrapper.zip b/external/LiteLoaderWrapper.zip index d586a6096310d859e584166bec67bbcc4e1896af..990c0c5b5db01467155a5e87ea96f936d9ac13e7 100644 GIT binary patch delta 12962 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 delta 12808 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 Date: Thu, 6 Mar 2025 10:09:45 +0000 Subject: [PATCH 039/233] release: v4.6.5 --- 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 04608c5e..da45e073 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.6.4", + "version": "4.6.5", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index b718557e..640e25b5 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.6.4", + "version": "4.6.5", "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 77a97eb3..afbb9569 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.6.4'; +export const napCatVersion = '4.6.5'; From 03dafe727eb17b9f805ca805bfdc78d5142efd97 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, 6 Mar 2025 18:51:05 +0800 Subject: [PATCH 040/233] fix: win --- src/core/external/offset.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/external/offset.json b/src/core/external/offset.json index 1d25670b..3825a785 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -268,8 +268,8 @@ "recv": "7229F60" }, "9.9.18-32793-x64": { - "send": "3D3051B", - "recv": "3D3F48C" + "send": "39F9A30", + "recv": "39FE230" }, "3.2.16-32793-x64": { "send": "A5E24C0", From c5c7dcc6f2ec3786f7aba5dfe4a9dc25e8cdfe9a Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Thu, 6 Mar 2025 10:51:30 +0000 Subject: [PATCH 041/233] release: v4.6.6 --- 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 da45e073..73adb7d3 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.6.5", + "version": "4.6.6", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 640e25b5..66eaed74 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.6.5", + "version": "4.6.6", "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 afbb9569..10220e95 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.6.5'; +export const napCatVersion = '4.6.6'; From c626bbab742a840f99be96ccd52417486357f967 Mon Sep 17 00:00:00 2001 From: bietiaop <1527109126@qq.com> Date: Fri, 7 Mar 2025 10:25:38 +0800 Subject: [PATCH 042/233] fix: #854 --- napcat.webui/src/components/onebot/api/debug.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/napcat.webui/src/components/onebot/api/debug.tsx b/napcat.webui/src/components/onebot/api/debug.tsx index c699edf6..f857bb9b 100644 --- a/napcat.webui/src/components/onebot/api/debug.tsx +++ b/napcat.webui/src/components/onebot/api/debug.tsx @@ -136,7 +136,7 @@ const OneBotApiDebug: React.FC = (props) => { 请求体 From 6a15908a9351a4435a3e55195c6af87fb55eee3c Mon Sep 17 00:00:00 2001 From: HDTianRu <3291691454@qq.com> Date: Sat, 8 Mar 2025 16:36:17 +0800 Subject: [PATCH 043/233] =?UTF-8?q?feat:=20=E9=A2=9D=E5=A4=96=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=8E=9FmsgSeq=E6=9D=A1=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/api/msg.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 8905bbbd..73519ff1 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -809,6 +809,7 @@ export class OneBotMsgApi { message_id: msg.id!, message_seq: msg.id!, real_id: msg.id!, + real_seq: msg.msgSeq, message_type: msg.chatType == ChatType.KCHATTYPEGROUP ? 'group' : 'private', sender: { user_id: +(msg.senderUin ?? 0), From bca152a047214fc2564d82f2b5e761e98ba0a341 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, 9 Mar 2025 10:08:49 +0800 Subject: [PATCH 044/233] =?UTF-8?q?feat:=20readme=20=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 83 ++++++++++++++++++++++++++----------------------------- 1 file changed, 39 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 3b8fc828..19a9a00c 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,62 @@

--- -## 欢迎回家 -NapCatQQ 是现代化的基于 NTQQ 的 Bot 协议端实现 -## 特性介绍 -- [x] **安装简单**:就算是笨蛋也能使用 -- [x] **性能友好**:就算是低内存也能使用 -- [x] **接口丰富**:就算是没有也能使用 -- [x] **稳定好用**:就算是被捉也能使用 +## Welcome ++ NapCatQQ is a modern implementation of the Bot protocol based on NTQQ. + - NapCatQQ 是现代化的基于 NTQQ 的 Bot 协议端实现 -## 使用框架 +## Feature + ++ **Easy to Use** + - 作为初学者能够轻松使用. ++ **Quick and Efficient** + - 在低内存操作系统长时运行. ++ **Rich API Interface** + - 完整实现了大部分标准接口. ++ **Stable and Reliable** + - 持续稳定的开发与维护. +## Quick Start 可前往 [Release](https://github.com/NapNeko/NapCatQQ/releases/) 页面下载最新版本 **首次使用**请务必查看如下文档看使用教程 -### 文档地址 +## Link -[Cloudflare.Worker](https://doc.napneko.icu/) +| 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/) | +|:-:|:-:|:-:|:-:| -[Cloudflare.HKServer](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) | +|:-:|:-:|:-:|:-:| -[Github.IO](https://napneko.github.io/) +| 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) | +|:-:|:-:|:-:|:-:| -[Cloudflare.Pages](https://napneko.pages.dev/) +## Thanks -[Server.Other](https://docs.napcat.cyou/) ++ [Lagrange](https://github.com/LagrangeDev/Lagrange.Core) 对本项目的大力支持 参考部分代码 已获授权 -[NapCat.Wiki](https://www.napcat.wiki) ++ [LLOneBot](https://github.com/LLOneBot/LLOneBot) 相关的开发曾参与本项目部分开发 -## 回家旅途 -[QQ Group#1](https://qm.qq.com/q/I6LU87a0Yq) - -[QQ Group#2](https://qm.qq.com/q/HaRcfrHpUk) - -[Telegram](https://t.me/MelodicMoonlight) - -> QQ Group#2 准许Bot / Telegram与QQ Group#2 为新建Group - -## 性能设计/协议标准 -NapCat 已实现90%+的 OneBot / GoCQ 标准接口,并提供兼容性保留接口,其设计理念遵守 无数据库/异步优先/后台刷新 的性能思想。 - -由此设计带来一系列好处,在开发中,获取群员列表通常小于50Ms,单条文本消息发送在320Ms以内,在1k+的群聊流畅运行,同时带来一些副作用,消息Id无法持久,无法上报撤回消息原始内容。 - -NapCat 在设计理念下遵守 OneBot 规范大多数要求并且积极改进,任何合理的标准化 Issue 与 Pr 将被接收。 - -## 感谢他们 -感谢 [Lagrange](https://github.com/LagrangeDev/Lagrange.Core) 对本项目的大力支持 参考部分代码 已获授权 - -感谢 React 强力驱动 NapCat.WebUi - -不过最最重要的 还是需要感谢屏幕前的你哦~ ++ 不过最最重要的 还是需要感谢屏幕前的你哦~ --- -## 特殊感谢 -[LLOneBot](https://github.com/LLOneBot/LLOneBot) 相关的开发曾参与本项目 +## License +本项目采用 混合协议 开源,因此使用本项目时,你需要注意以下几点: +1. 第三方库代码或修改部分遵循其原始开源许可. +2. 本项目获取部分项目授权而不受部分约束 +2. 项目其余逻辑代码采用[本仓库开源许可](./LICENSE). -## 开源附加 - -任何使用本仓库代码的地方,都应当严格遵守[本仓库开源许可](./LICENSE)。**本仓库仅用于提高易用性,实现消息推送类功能,此外,禁止任何项目未经仓库主作者授权基于 NapCat 代码开发。使用请遵守当地法律法规,由此造成的问题由使用者和提供违规使用教程者负责。** +**本仓库仅用于提高易用性,实现消息推送类功能,此外,禁止任何项目未经仓库主作者授权基于 NapCat 代码开发。使用请遵守当地法律法规,由此造成的问题由使用者和提供违规使用教程者负责。** From 78d1919d7ff544ab420c70ee604c196dea9e6df5 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, 9 Mar 2025 16:30:43 +0800 Subject: [PATCH 045/233] feat: 32896 --- 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 16e04c28..d6606e3f 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -210,5 +210,13 @@ "3.2.16-32793": { "appid": 537271279, "qua": "V1_LNX_NQ_3.2.16_32793_GW_B" + }, + "3.2.16-32869": { + "appid": 537271329, + "qua": "V1_LNX_NQ_3.2.16_32869_GW_B" + }, + "9.9.18-32869": { + "appid": 537271294, + "qua": "V1_WIN_NQ_9.9.18_32869_GW_B" } } \ No newline at end of file diff --git a/src/core/external/offset.json b/src/core/external/offset.json index 3825a785..dc74aefb 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -278,5 +278,17 @@ "3.2.16-32793-arm64": { "send": "7226630", "recv": "7229F60" + }, + "9.9.18-32896-x64": { + "send": "39F9A30", + "recv": "39FE230" + }, + "3.2.16-32896-x64": { + "send": "A5E24C0", + "recv": "A5E5EE0" + }, + "3.2.16-32896-arm64": { + "send": "7226630", + "recv": "7229F60" } } \ No newline at end of file From 91e457eb0365b5182c4d92ebe47bbdbaa517f896 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sun, 9 Mar 2025 08:31:07 +0000 Subject: [PATCH 046/233] release: v4.6.7 --- 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 73adb7d3..d182acc1 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.6.6", + "version": "4.6.7", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 66eaed74..e9d76eb4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.6.6", + "version": "4.6.7", "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 10220e95..91d0e4e0 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.6.6'; +export const napCatVersion = '4.6.7'; From eeb19a04cc7e457ab0cd8a1c989b08bc10fcf46d 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, 14 Mar 2025 17:39:37 +0800 Subject: [PATCH 047/233] =?UTF-8?q?fix:=20packet=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/external/offset.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/external/offset.json b/src/core/external/offset.json index dc74aefb..ed6bec37 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -279,15 +279,15 @@ "send": "7226630", "recv": "7229F60" }, - "9.9.18-32896-x64": { + "9.9.18-32869-x64": { "send": "39F9A30", "recv": "39FE230" }, - "3.2.16-32896-x64": { + "3.2.16-32869-x64": { "send": "A5E24C0", "recv": "A5E5EE0" }, - "3.2.16-32896-arm64": { + "3.2.16-32869-arm64": { "send": "7226630", "recv": "7229F60" } From 40a63b9c66106c672993032a2728c5565d8d5888 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, 14 Mar 2025 17:53:03 +0800 Subject: [PATCH 048/233] fix: #870 --- launcher/launcher-user.bat | 2 +- launcher/launcher-win10-user.bat | 2 +- launcher/launcher-win10.bat | 4 ++-- launcher/launcher.bat | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/launcher/launcher-user.bat b/launcher/launcher-user.bat index 86410c9b..224ea4eb 100644 --- a/launcher/launcher-user.bat +++ b/launcher/launcher-user.bat @@ -19,7 +19,7 @@ for %%a in ("%RetString%") do ( SET QQPath=%pathWithoutUninstall%QQ.exe if not exist "%QQpath%" ( - echo provided QQ path is invalid: %QQpath% + echo provided QQ path is invalid pause exit /b ) diff --git a/launcher/launcher-win10-user.bat b/launcher/launcher-win10-user.bat index debf0acb..84050e0b 100644 --- a/launcher/launcher-win10-user.bat +++ b/launcher/launcher-win10-user.bat @@ -19,7 +19,7 @@ for %%a in ("%RetString%") do ( SET QQPath=%pathWithoutUninstall%QQ.exe if not exist "%QQpath%" ( - echo provided QQ path is invalid: %QQpath% + echo provided QQ path is invalid pause exit /b ) diff --git a/launcher/launcher-win10.bat b/launcher/launcher-win10.bat index 0ab1677d..8e458178 100644 --- a/launcher/launcher-win10.bat +++ b/launcher/launcher-win10.bat @@ -27,8 +27,8 @@ for %%a in ("%RetString%") do ( SET QQPath=%pathWithoutUninstall%QQ.exe -if not exist "%QQpath%" ( - echo provided QQ path is invalid: %QQpath% +if not exist "%QQPath%" ( + echo provided QQ path is invalid pause exit /b ) diff --git a/launcher/launcher.bat b/launcher/launcher.bat index a263f2eb..970a7edd 100644 --- a/launcher/launcher.bat +++ b/launcher/launcher.bat @@ -27,8 +27,8 @@ for %%a in ("%RetString%") do ( SET QQPath=%pathWithoutUninstall%QQ.exe -if not exist "%QQpath%" ( - echo provided QQ path is invalid: %QQpath% +if not exist "%QQPath%" ( + echo provided QQ path is invalid pause exit /b ) From d6a0830cfe23a7e9be499c5949af6b6ca7b53a8f 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, 14 Mar 2025 18:07:03 +0800 Subject: [PATCH 049/233] fix: #875 --- src/core/apis/group.ts | 4 ++-- src/onebot/action/group/SetGroupAddRequest.ts | 6 ++++-- src/onebot/api/quick-action.ts | 6 ++++-- src/onebot/types/message.ts | 1 + 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index b6d06f5d..31a3b4c2 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -345,9 +345,9 @@ export class NTQQGroupApi { return this.context.session.getGroupService().uploadGroupBulletinPic(groupCode, _Pskey, imageurl); } - async handleGroupRequest(notify: GroupNotify, operateType: NTGroupRequestOperateTypes, reason?: string) { + async handleGroupRequest(doubt: boolean, notify: GroupNotify, operateType: NTGroupRequestOperateTypes, reason?: string) { return this.context.session.getGroupService().operateSysNotify( - false, + doubt, { operateType: operateType, targetMsg: { diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index 5f5f7cd2..235bd810 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -20,11 +20,12 @@ export default class SetGroupAddRequest extends OneBotAction { const approve = payload.approve?.toString() !== 'false'; const reason = payload.reason ?? ' '; const invite_notify = this.obContext.apis.MsgApi.notifyGroupInvite.get(flag); - const notify = invite_notify ?? await this.findNotify(flag); + const { doubt, notify } = invite_notify ? { doubt: false, notify: invite_notify } : await this.findNotify(flag); if (!notify) { throw new Error('No such request'); } await this.core.apis.GroupApi.handleGroupRequest( + doubt, notify, approve ? NTGroupRequestOperateTypes.KAGREE : NTGroupRequestOperateTypes.KREFUSE, reason, @@ -36,7 +37,8 @@ export default class SetGroupAddRequest extends OneBotAction { let notify = (await this.core.apis.GroupApi.getSingleScreenNotifies(false, 100)).find(e => e.seq == flag); if (!notify) { notify = (await this.core.apis.GroupApi.getSingleScreenNotifies(true, 100)).find(e => e.seq == flag); + return { doubt: true, notify }; } - return notify; + return { doubt: true, notify }; } } \ No newline at end of file diff --git a/src/onebot/api/quick-action.ts b/src/onebot/api/quick-action.ts index aa81a88d..1cd9a66e 100644 --- a/src/onebot/api/quick-action.ts +++ b/src/onebot/api/quick-action.ts @@ -84,17 +84,19 @@ export class OneBotQuickActionApi { let notify = (await this.core.apis.GroupApi.getSingleScreenNotifies(false, 100)).find(e => e.seq == flag); if (!notify) { notify = (await this.core.apis.GroupApi.getSingleScreenNotifies(true, 100)).find(e => e.seq == flag); + return { doubt: true, notify }; } - return notify; + return { doubt: true, notify }; } async handleGroupRequest(request: OB11GroupRequestEvent, quickAction: QuickActionGroupRequest) { const invite_notify = this.obContext.apis.MsgApi.notifyGroupInvite.get(request.flag); - const notify = invite_notify ?? await this.findNotify(request.flag); + const { doubt, notify } = invite_notify ? { doubt: false, notify: invite_notify } : await this.findNotify(request.flag); if (!isNull(quickAction.approve) && notify) { this.core.apis.GroupApi.handleGroupRequest( + doubt, notify, quickAction.approve ? NTGroupRequestOperateTypes.KAGREE : NTGroupRequestOperateTypes.KREFUSE, quickAction.reason, diff --git a/src/onebot/types/message.ts b/src/onebot/types/message.ts index ff14e8fb..756d5b5f 100644 --- a/src/onebot/types/message.ts +++ b/src/onebot/types/message.ts @@ -10,6 +10,7 @@ export enum OB11MessageType { // 消息接口定义 export interface OB11Message { + real_seq?: string;// 自行扩展 temp_source?: number; message_sent_type?: string; target_id?: number; // 自己发送消息/私聊消息 From 9fcd218a5a345d6ecfe95e9c3a7fba95e71e1bcd 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, 14 Mar 2025 18:12:58 +0800 Subject: [PATCH 050/233] fix: #873 --- src/core/apis/group.ts | 3 +++ src/core/services/NodeIKernelGroupService.ts | 2 +- src/onebot/action/extends/SetGroupRemark.ts | 22 ++++++++++++++++++++ src/onebot/action/index.ts | 6 ++++-- src/onebot/action/router.ts | 1 + 5 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 src/onebot/action/extends/SetGroupRemark.ts diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 31a3b4c2..80555d98 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -27,6 +27,9 @@ export class NTQQGroupApi { this.core = core; } + async setGroupRemark(groupCode: string, remark: string) { + return this.context.session.getGroupService().modifyGroupRemark(groupCode, remark); + } async fetchGroupDetail(groupCode: string) { const [, detailInfo] = await this.core.eventWrapper.callNormalEventV2( 'NodeIKernelGroupService/getGroupDetailInfo', diff --git a/src/core/services/NodeIKernelGroupService.ts b/src/core/services/NodeIKernelGroupService.ts index b991c83b..babcad73 100644 --- a/src/core/services/NodeIKernelGroupService.ts +++ b/src/core/services/NodeIKernelGroupService.ts @@ -165,7 +165,7 @@ export interface NodeIKernelGroupService { modifyGroupName(groupCode: string, groupName: string, isNormalMember: boolean): Promise; - modifyGroupRemark(groupCode: string, remark: string): void; + modifyGroupRemark(groupCode: string, remark: string): Promise; modifyGroupDetailInfo(groupCode: string, arg: unknown): void; diff --git a/src/onebot/action/extends/SetGroupRemark.ts b/src/onebot/action/extends/SetGroupRemark.ts new file mode 100644 index 00000000..a8dbf5a9 --- /dev/null +++ b/src/onebot/action/extends/SetGroupRemark.ts @@ -0,0 +1,22 @@ +import { OneBotAction } from '@/onebot/action/OneBotAction'; +import { ActionName } from '@/onebot/action/router'; +import { Static, Type } from '@sinclair/typebox'; + +const SchemaData = Type.Object({ + group_id: Type.String(), + remark: Type.String(), +}); + +type Payload = Static; + +export default class SetGroupRemark extends OneBotAction { + override actionName = ActionName.SetGroupRemark; + override payloadSchema = SchemaData; + async _handle(payload: Payload): Promise { + let ret = await this.core.apis.GroupApi.setGroupRemark(payload.group_id, payload.remark); + if (ret.result != 0) { + throw new Error(`设置群备注失败, ${ret.result}:${ret.errMsg}`); + } + return null; + } +} diff --git a/src/onebot/action/index.ts b/src/onebot/action/index.ts index 1d49b39c..fd2f74f9 100644 --- a/src/onebot/action/index.ts +++ b/src/onebot/action/index.ts @@ -108,10 +108,12 @@ import { BotExit } from './extends/BotExit'; import { ClickInlineKeyboardButton } from './extends/ClickInlineKeyboardButton'; import { GetPrivateFileUrl } from './file/GetPrivateFileUrl'; import { GetUnidirectionalFriendList } from './extends/GetUnidirectionalFriendList'; +import SetGroupRemark from './extends/SetGroupRemark'; export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCore) { const actionHandlers = [ + new SetGroupRemark(obContext, core), new GetGroupInfoEx(obContext, core), new FetchEmojiLike(obContext, core), new GetFile(obContext, core), @@ -227,8 +229,8 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo new GetGroupSystemMsg(obContext, core), new BotExit(obContext, core), new ClickInlineKeyboardButton(obContext, core), - new GetPrivateFileUrl(obContext,core), - new GetUnidirectionalFriendList(obContext,core), + new GetPrivateFileUrl(obContext, core), + new GetUnidirectionalFriendList(obContext, core), ]; type HandlerUnion = typeof actionHandlers[number]; diff --git a/src/onebot/action/router.ts b/src/onebot/action/router.ts index 6bed2aa0..51b3892e 100644 --- a/src/onebot/action/router.ts +++ b/src/onebot/action/router.ts @@ -10,6 +10,7 @@ export interface InvalidCheckResult { } export const ActionName = { + SetGroupRemark: 'set_group_remark', NapCat_GetPrivateFileUrl: 'get_private_file_url', ClickInlineKeyboardButton: 'click_inline_keyboard_button', GetUnidirectionalFriendList: 'get_unidirectional_friend_list', From d3acd1efc13ef973489476e497bdebb3fd8cb67d Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Fri, 14 Mar 2025 10:13:29 +0000 Subject: [PATCH 051/233] release: v4.6.8 --- 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 d182acc1..0be19374 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.6.7", + "version": "4.6.8", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index e9d76eb4..1f047ebf 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.6.7", + "version": "4.6.8", "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 91d0e4e0..fafd5795 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.6.7'; +export const napCatVersion = '4.6.8'; From 805e014a75c9f06b19370531116a008162bb9bf1 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, 15 Mar 2025 18:54:51 +0800 Subject: [PATCH 052/233] fix: #877 --- src/framework/napcat.ts | 4 ++-- src/webui/index.ts | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/framework/napcat.ts b/src/framework/napcat.ts index b1451dc2..d96e1ff3 100644 --- a/src/framework/napcat.ts +++ b/src/framework/napcat.ts @@ -7,13 +7,13 @@ import { SelfInfo } from '@/core/types'; import { NodeIKernelLoginListener } from '@/core/listeners'; import { NodeIKernelLoginService } from '@/core/services'; import { NodeIQQNTWrapperSession, WrapperNodeApi } from '@/core/wrapper'; -import { InitWebUi, WebUiConfig } from '@/webui'; +import { InitWebUi, WebUiConfig, webUiRuntimePort } from '@/webui'; import { NapCatOneBot11Adapter } from '@/onebot'; //Framework ES入口文件 export async function getWebUiUrl() { const WebUiConfigData = (await WebUiConfig.GetWebUIConfig()); - return 'http://127.0.0.1:' + WebUiConfigData.port + '/webui/?token=' + WebUiConfigData.token; + return 'http://127.0.0.1:' + webUiRuntimePort + '/webui/?token=' + WebUiConfigData.token; } export async function NCoreInitFramework( diff --git a/src/webui/index.ts b/src/webui/index.ts index a4eae968..716e84fc 100644 --- a/src/webui/index.ts +++ b/src/webui/index.ts @@ -29,7 +29,7 @@ export let webUiPathWrapper: NapCatPathWrapper; const MAX_PORT_TRY = 100; import * as net from 'node:net'; import { WebUiDataRuntime } from './src/helper/Data'; - +export let webUiRuntimePort = 6099; export async function InitPort(parsedConfig: WebUiConfigType): Promise<[string, number, string]> { try { await tryUseHost(parsedConfig.host); @@ -45,6 +45,7 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp webUiPathWrapper = pathWrapper; WebUiConfig = new WebUiConfigWrapper(); const [host, port, token] = await InitPort(await WebUiConfig.GetWebUIConfig()); + webUiRuntimePort = port; if (port == 0) { logger.log('[NapCat] [WebUi] Current WebUi is not run.'); return; From 1146454fec551e9864b7dcede33a902846bc25ae Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sat, 15 Mar 2025 10:58:09 +0000 Subject: [PATCH 053/233] release: v4.6.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 0be19374..d4490489 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.6.8", + "version": "4.6.9", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 1f047ebf..938fa14f 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.6.8", + "version": "4.6.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 fafd5795..27e8d9bb 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.6.8'; +export const napCatVersion = '4.6.9'; From 99b504b5f65d8012a09e3a6649dbb61d565926db 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, 16 Mar 2025 09:12:52 +0800 Subject: [PATCH 054/233] fix: #880 --- src/onebot/action/group/SetGroupAddRequest.ts | 2 +- src/onebot/api/quick-action.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index 235bd810..8cd69bcd 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -39,6 +39,6 @@ export default class SetGroupAddRequest extends OneBotAction { notify = (await this.core.apis.GroupApi.getSingleScreenNotifies(true, 100)).find(e => e.seq == flag); return { doubt: true, notify }; } - return { doubt: true, notify }; + return { doubt: false, notify }; } } \ No newline at end of file diff --git a/src/onebot/api/quick-action.ts b/src/onebot/api/quick-action.ts index 1cd9a66e..709c1f20 100644 --- a/src/onebot/api/quick-action.ts +++ b/src/onebot/api/quick-action.ts @@ -86,7 +86,7 @@ export class OneBotQuickActionApi { notify = (await this.core.apis.GroupApi.getSingleScreenNotifies(true, 100)).find(e => e.seq == flag); return { doubt: true, notify }; } - return { doubt: true, notify }; + return { doubt: false, notify }; } async handleGroupRequest(request: OB11GroupRequestEvent, quickAction: QuickActionGroupRequest) { From 1e5bc9bbeafe54d67c54a6c7c4917e96ce66da1d Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sun, 16 Mar 2025 01:13:17 +0000 Subject: [PATCH 055/233] release: v4.7.0 --- 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 d4490489..7b98278f 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.6.9", + "version": "4.7.0", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 938fa14f..1d5c72b0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.6.9", + "version": "4.7.0", "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 27e8d9bb..e51272e3 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.6.9'; +export const napCatVersion = '4.7.0'; From c641246056fc1a0b22e66f128e5887575a169ce0 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, 16 Mar 2025 09:33:06 +0800 Subject: [PATCH 056/233] doc: code of conduct --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..cca4546e --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +nanaeonn@outlook.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. From b0cf23f7756d9d828710c83d3a5402734a2ede1b 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, 16 Mar 2025 09:36:27 +0800 Subject: [PATCH 057/233] doc: security --- SECURITY.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..faee4747 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,11 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| > 4.0 | :white_check_mark: | +| < 4.0 | :x: | + +## Reporting a Vulnerability +you should open an issue From b39d8bae273f47f19c207cbbee06d0a0e1f78635 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, 16 Mar 2025 10:42:15 +0800 Subject: [PATCH 058/233] =?UTF-8?q?fix:=20login=20timer=20/=20add:?= =?UTF-8?q?=E4=B8=8D=E8=A7=84=E8=8C=83=E7=9A=84promise?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listeners/NodeIKernelLoginListener.ts | 2 +- src/core/services/NodeIKernelLoginService.ts | 3 ++ src/shell/base.ts | 28 +++++++++++-------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/core/listeners/NodeIKernelLoginListener.ts b/src/core/listeners/NodeIKernelLoginListener.ts index 91046e0b..51d05711 100644 --- a/src/core/listeners/NodeIKernelLoginListener.ts +++ b/src/core/listeners/NodeIKernelLoginListener.ts @@ -1,5 +1,5 @@ export class NodeIKernelLoginListener { - onLoginConnected(...args: any[]): any { + onLoginConnected(): Promise | void { } onLoginDisConnected(...args: any[]): any { diff --git a/src/core/services/NodeIKernelLoginService.ts b/src/core/services/NodeIKernelLoginService.ts index 8c90144a..c3f7602c 100644 --- a/src/core/services/NodeIKernelLoginService.ts +++ b/src/core/services/NodeIKernelLoginService.ts @@ -60,7 +60,10 @@ export interface QuickLoginResult { } export interface NodeIKernelLoginService { + getMsfStatus: () => number; + setLoginMiscData(arg0: string, value: string): unknown; + getMachineGuid(): string; get(): NodeIKernelLoginService; diff --git a/src/shell/base.ts b/src/shell/base.ts index ecd8e0b4..66f50b92 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -30,6 +30,7 @@ import { InitWebUi } from '@/webui'; import { WebUiDataRuntime } from '@/webui/src/helper/Data'; import { napCatVersion } from '@/common/version'; import { NodeIO3MiscListener } from '@/core/listeners/NodeIO3MiscListener'; +import { sleep } from '@/common/helper'; // NapCat Shell App ES 入口文件 async function handleUncaughtExceptions(logger: LogWrapper) { process.on('uncaughtException', (err) => { @@ -113,7 +114,7 @@ async function handleLogin( quickLoginUin: string | undefined, historyLoginList: LoginListItem[] ): Promise { - return new Promise((resolve) => { + return new Promise(async (resolve) => { const loginListener = new NodeIKernelLoginListener(); let isLogined = false; @@ -199,20 +200,23 @@ async function handleLogin( } }); }); - + let network_ok = false; + while (!network_ok) { + network_ok = loginService.getMsfStatus() === 0; + logger.log('等待网络连接...'); + await sleep(500); + } if (quickLoginUin) { if (historyLoginList.some(u => u.uin === quickLoginUin)) { logger.log('正在快速登录 ', quickLoginUin); - setTimeout(() => { - loginService.quickLoginWithUin(quickLoginUin) - .then(result => { - if (result.loginErrorInfo.errMsg) { - logger.logError('快速登录错误:', result.loginErrorInfo.errMsg); - if (!isLogined) loginService.getQRCodePicture(); - } - }) - .catch(); - }, 1000); + loginService.quickLoginWithUin(quickLoginUin) + .then(result => { + if (result.loginErrorInfo.errMsg) { + logger.logError('快速登录错误:', result.loginErrorInfo.errMsg); + if (!isLogined) loginService.getQRCodePicture(); + } + }) + .catch(); } else { logger.logError('快速登录失败,未找到该 QQ 历史登录记录,将使用二维码登录方式'); if (!isLogined) loginService.getQRCodePicture(); From 55847f6e10d84fd05c72004449b7d20378881dbf 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, 16 Mar 2025 11:39:38 +0800 Subject: [PATCH 059/233] =?UTF-8?q?fix:=20quick=20login=20=E5=BB=B6?= =?UTF-8?q?=E8=BF=9F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shell/base.ts | 226 ++++++++++++++++++++++++---------------------- 1 file changed, 116 insertions(+), 110 deletions(-) diff --git a/src/shell/base.ts b/src/shell/base.ts index 66f50b92..1a899c7d 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -114,124 +114,116 @@ async function handleLogin( quickLoginUin: string | undefined, historyLoginList: LoginListItem[] ): Promise { - return new Promise(async (resolve) => { - const loginListener = new NodeIKernelLoginListener(); - let isLogined = false; - - loginListener.onUserLoggedIn = (userid: string) => { - logger.logError(`当前账号(${userid})已登录,无法重复登录`); - }; - - loginListener.onQRCodeLoginSucceed = async (loginResult) => { - isLogined = true; - resolve({ - uid: loginResult.uid, - uin: loginResult.uin, - nick: '', - online: true, - }); - }; - - loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => { - WebUiDataRuntime.setQQLoginQrcodeURL(qrcodeUrl); - - const realBase64 = pngBase64QrcodeData.replace(/^data:image\/\w+;base64,/, ''); - const buffer = Buffer.from(realBase64, 'base64'); - logger.logWarn('请扫描下面的二维码,然后在手Q上授权登录:'); - const qrcodePath = path.join(pathWrapper.cachePath, 'qrcode.png'); - qrcode.generate(qrcodeUrl, { small: true }, (res) => { - logger.logWarn([ - '\n', - res, - '二维码解码URL: ' + qrcodeUrl, - '如果控制台二维码无法扫码,可以复制解码url到二维码生成网站生成二维码再扫码,也可以打开下方的二维码路径图片进行扫码。', - ].join('\n')); - fs.writeFile(qrcodePath, buffer, {}, () => { - logger.logWarn('二维码已保存到', qrcodePath); - }); - }); - }; - - loginListener.onQRCodeSessionFailed = (errType: number, errCode: number) => { - if (!isLogined) { - logger.logError('[Core] [Login] Login Error,ErrType: ', errType, ' ErrCode:', errCode); - if (errType == 1 && errCode == 3) { - // 二维码过期刷新 - } - loginService.getQRCodePicture(); - } - }; - - loginListener.onLoginFailed = (...args) => { - logger.logError('[Core] [Login] Login Error , ErrInfo: ', JSON.stringify(args)); - }; - - loginService.addKernelLoginListener(proxiedListenerOf(loginListener, logger)); - const isConnect = loginService.connect(); - if (!isConnect) { - logger.logError('核心登录服务连接失败!'); - return; - } - - logger.log('核心登录服务连接成功!'); - - loginService.getLoginList().then((res) => { - // 遍历 res.LocalLoginInfoList[x].isQuickLogin是否可以 res.LocalLoginInfoList[x].uin 转为string 加入string[] 最后遍历完成调用WebUiDataRuntime.setQQQuickLoginList - const list = res.LocalLoginInfoList.filter((item) => item.isQuickLogin); - WebUiDataRuntime.setQQQuickLoginList(list.map((item) => item.uin.toString())); - WebUiDataRuntime.setQQNewLoginList(list); + let inner_resolve: (value: SelfInfo) => void; + let selfInfo: Promise = new Promise((resolve) => { + inner_resolve = resolve; + }); + // 连接服务 + let isLogined = false; + const loginListener = new NodeIKernelLoginListener(); + loginListener.onUserLoggedIn = (userid: string) => { + logger.logError(`当前账号(${userid})已登录,无法重复登录`); + }; + loginListener.onQRCodeLoginSucceed = async (loginResult) => { + isLogined = true; + inner_resolve({ + uid: loginResult.uid, + uin: loginResult.uin, + nick: '', + online: true, }); - WebUiDataRuntime.setQuickLoginCall(async (uin: string) => { - return await new Promise((resolve) => { - if (uin) { - logger.log('正在快速登录 ', uin); - loginService.quickLoginWithUin(uin).then(res => { - if (res.loginErrorInfo.errMsg) { - resolve({ result: false, message: res.loginErrorInfo.errMsg }); - } - resolve({ result: true, message: '' }); - }).catch((e) => { - logger.logError(e); - resolve({ result: false, message: '快速登录发生错误' }); - }); - } else { - resolve({ result: false, message: '快速登录失败' }); - } + }; + + loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => { + WebUiDataRuntime.setQQLoginQrcodeURL(qrcodeUrl); + + const realBase64 = pngBase64QrcodeData.replace(/^data:image\/\w+;base64,/, ''); + const buffer = Buffer.from(realBase64, 'base64'); + logger.logWarn('请扫描下面的二维码,然后在手Q上授权登录:'); + const qrcodePath = path.join(pathWrapper.cachePath, 'qrcode.png'); + qrcode.generate(qrcodeUrl, { small: true }, (res) => { + logger.logWarn([ + '\n', + res, + '二维码解码URL: ' + qrcodeUrl, + '如果控制台二维码无法扫码,可以复制解码url到二维码生成网站生成二维码再扫码,也可以打开下方的二维码路径图片进行扫码。', + ].join('\n')); + fs.writeFile(qrcodePath, buffer, {}, () => { + logger.logWarn('二维码已保存到', qrcodePath); }); }); - let network_ok = false; - while (!network_ok) { - network_ok = loginService.getMsfStatus() === 0; - logger.log('等待网络连接...'); - await sleep(500); - } - if (quickLoginUin) { - if (historyLoginList.some(u => u.uin === quickLoginUin)) { - logger.log('正在快速登录 ', quickLoginUin); - loginService.quickLoginWithUin(quickLoginUin) - .then(result => { - if (result.loginErrorInfo.errMsg) { - logger.logError('快速登录错误:', result.loginErrorInfo.errMsg); - if (!isLogined) loginService.getQRCodePicture(); - } - }) - .catch(); - } else { - logger.logError('快速登录失败,未找到该 QQ 历史登录记录,将使用二维码登录方式'); - if (!isLogined) loginService.getQRCodePicture(); - } - } else { - logger.log('没有 -q 指令指定快速登录,将使用二维码登录方式'); - if (historyLoginList.length > 0) { - logger.log(`可用于快速登录的 QQ:\n${historyLoginList - .map((u, index) => `${index + 1}. ${u.uin} ${u.nickName}`) - .join('\n') - }`); + }; + + loginListener.onQRCodeSessionFailed = (errType: number, errCode: number) => { + if (!isLogined) { + logger.logError('[Core] [Login] Login Error,ErrType: ', errType, ' ErrCode:', errCode); + if (errType == 1 && errCode == 3) { + // 二维码过期刷新 } loginService.getQRCodePicture(); } + }; + + loginListener.onLoginFailed = (...args) => { + logger.logError('[Core] [Login] Login Error , ErrInfo: ', JSON.stringify(args)); + }; + loginService.addKernelLoginListener(proxiedListenerOf(loginListener, logger)); + loginService.connect(); + await waitForNetworkConnection(loginService, logger); + // 等待网络 + WebUiDataRuntime.setQuickLoginCall(async (uin: string) => { + return await new Promise((resolve) => { + if (uin) { + logger.log('正在快速登录 ', uin); + loginService.quickLoginWithUin(uin).then(res => { + if (res.loginErrorInfo.errMsg) { + resolve({ result: false, message: res.loginErrorInfo.errMsg }); + } + resolve({ result: true, message: '' }); + }).catch((e) => { + logger.logError(e); + resolve({ result: false, message: '快速登录发生错误' }); + }); + } else { + resolve({ result: false, message: '快速登录失败' }); + } + }); }); + if (quickLoginUin) { + if (historyLoginList.some(u => u.uin === quickLoginUin)) { + logger.log('正在快速登录 ', quickLoginUin); + loginService.quickLoginWithUin(quickLoginUin) + .then(result => { + if (result.loginErrorInfo.errMsg) { + logger.logError('快速登录错误:', result.loginErrorInfo.errMsg); + if (!isLogined) loginService.getQRCodePicture(); + } + }) + .catch(); + } else { + logger.logError('快速登录失败,未找到该 QQ 历史登录记录,将使用二维码登录方式'); + if (!isLogined) loginService.getQRCodePicture(); + } + } else { + logger.log('没有 -q 指令指定快速登录,将使用二维码登录方式'); + if (historyLoginList.length > 0) { + logger.log(`可用于快速登录的 QQ:\n${historyLoginList + .map((u, index) => `${index + 1}. ${u.uin} ${u.nickName}`) + .join('\n') + }`); + } + loginService.getQRCodePicture(); + } + + loginService.getLoginList().then((res) => { + // 遍历 res.LocalLoginInfoList[x].isQuickLogin是否可以 res.LocalLoginInfoList[x].uin 转为string 加入string[] 最后遍历完成调用WebUiDataRuntime.setQQQuickLoginList + const list = res.LocalLoginInfoList.filter((item) => item.isQuickLogin); + WebUiDataRuntime.setQQQuickLoginList(list.map((item) => item.uin.toString())); + WebUiDataRuntime.setQQNewLoginList(list); + }); + + return await selfInfo; } async function initializeSession( @@ -288,6 +280,20 @@ async function handleProxy(session: NodeIQQNTWrapperSession, logger: LogWrapper) }); } } + +async function waitForNetworkConnection(loginService: NodeIKernelLoginService, logger: LogWrapper) { + let network_ok = false; + let tryCount = 0; + while (!network_ok) { + network_ok = loginService.getMsfStatus() === 0; + logger.log('等待网络连接...'); + await sleep(500); + tryCount++; + } + logger.log('网络已连接'); + return network_ok; +} + export async function NCoreInitShell() { console.log('NapCat Shell App Loading...'); const pathWrapper = new NapCatPathWrapper(); From e27d4c4302d445d7903e7f5c2680176e37b12f2a Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sun, 16 Mar 2025 03:40:48 +0000 Subject: [PATCH 060/233] release: v4.7.1 --- 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 7b98278f..65f03b80 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.0", + "version": "4.7.1", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 1d5c72b0..e5df8f13 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.0", + "version": "4.7.1", "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 e51272e3..d88d8434 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.0'; +export const napCatVersion = '4.7.1'; From 91df57d932787c08f6fa3b21046c87cc90800c16 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, 16 Mar 2025 11:55:00 +0800 Subject: [PATCH 061/233] fix: async error --- src/shell/base.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/shell/base.ts b/src/shell/base.ts index 1a899c7d..963e91f4 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -31,6 +31,7 @@ import { WebUiDataRuntime } from '@/webui/src/helper/Data'; import { napCatVersion } from '@/common/version'; import { NodeIO3MiscListener } from '@/core/listeners/NodeIO3MiscListener'; import { sleep } from '@/common/helper'; + // NapCat Shell App ES 入口文件 async function handleUncaughtExceptions(logger: LogWrapper) { process.on('uncaughtException', (err) => { @@ -114,18 +115,20 @@ async function handleLogin( quickLoginUin: string | undefined, historyLoginList: LoginListItem[] ): Promise { + let context = { isLogined: false }; let inner_resolve: (value: SelfInfo) => void; let selfInfo: Promise = new Promise((resolve) => { inner_resolve = resolve; + handleLoginInner(context, logger, loginService, quickLoginUin, historyLoginList).then().catch(e => logger.logError(e)); }); // 连接服务 - let isLogined = false; + const loginListener = new NodeIKernelLoginListener(); loginListener.onUserLoggedIn = (userid: string) => { logger.logError(`当前账号(${userid})已登录,无法重复登录`); }; loginListener.onQRCodeLoginSucceed = async (loginResult) => { - isLogined = true; + context.isLogined = true; inner_resolve({ uid: loginResult.uid, uin: loginResult.uin, @@ -156,7 +159,7 @@ async function handleLogin( }; loginListener.onQRCodeSessionFailed = (errType: number, errCode: number) => { - if (!isLogined) { + if (!context.isLogined) { logger.logError('[Core] [Login] Login Error,ErrType: ', errType, ' ErrCode:', errCode); if (errType == 1 && errCode == 3) { // 二维码过期刷新 @@ -172,6 +175,9 @@ async function handleLogin( loginService.connect(); await waitForNetworkConnection(loginService, logger); // 等待网络 + return await selfInfo; +} +async function handleLoginInner(context: { isLogined: boolean }, logger: LogWrapper, loginService: NodeIKernelLoginService, quickLoginUin: string | undefined, historyLoginList: LoginListItem[]) { WebUiDataRuntime.setQuickLoginCall(async (uin: string) => { return await new Promise((resolve) => { if (uin) { @@ -197,13 +203,13 @@ async function handleLogin( .then(result => { if (result.loginErrorInfo.errMsg) { logger.logError('快速登录错误:', result.loginErrorInfo.errMsg); - if (!isLogined) loginService.getQRCodePicture(); + if (!context.isLogined) loginService.getQRCodePicture(); } }) .catch(); } else { logger.logError('快速登录失败,未找到该 QQ 历史登录记录,将使用二维码登录方式'); - if (!isLogined) loginService.getQRCodePicture(); + if (!context.isLogined) loginService.getQRCodePicture(); } } else { logger.log('没有 -q 指令指定快速登录,将使用二维码登录方式'); @@ -222,8 +228,6 @@ async function handleLogin( WebUiDataRuntime.setQQQuickLoginList(list.map((item) => item.uin.toString())); WebUiDataRuntime.setQQNewLoginList(list); }); - - return await selfInfo; } async function initializeSession( From d5a60074f7141c67d36185f93852abc5c4f7daf6 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sun, 16 Mar 2025 03:55:17 +0000 Subject: [PATCH 062/233] release: v4.7.2 --- 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 65f03b80..b8616932 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.1", + "version": "4.7.2", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index e5df8f13..e7f6b963 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.1", + "version": "4.7.2", "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 d88d8434..a5b75bcd 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.1'; +export const napCatVersion = '4.7.2'; From 5eda1f287074c193698ce5261309d7fbd7b2a672 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, 16 Mar 2025 11:57:28 +0800 Subject: [PATCH 063/233] fix: quick login --- src/shell/base.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shell/base.ts b/src/shell/base.ts index 963e91f4..a6887028 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -119,7 +119,9 @@ async function handleLogin( let inner_resolve: (value: SelfInfo) => void; let selfInfo: Promise = new Promise((resolve) => { inner_resolve = resolve; - handleLoginInner(context, logger, loginService, quickLoginUin, historyLoginList).then().catch(e => logger.logError(e)); + waitForNetworkConnection(loginService, logger).then(() => { + handleLoginInner(context, logger, loginService, quickLoginUin, historyLoginList).then().catch(e => logger.logError(e)); + }); }); // 连接服务 @@ -173,8 +175,6 @@ async function handleLogin( }; loginService.addKernelLoginListener(proxiedListenerOf(loginListener, logger)); loginService.connect(); - await waitForNetworkConnection(loginService, logger); - // 等待网络 return await selfInfo; } async function handleLoginInner(context: { isLogined: boolean }, logger: LogWrapper, loginService: NodeIKernelLoginService, quickLoginUin: string | undefined, historyLoginList: LoginListItem[]) { From 8753ecfd929b82969ed6a66f5a5e81d9145cb940 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sun, 16 Mar 2025 03:57:48 +0000 Subject: [PATCH 064/233] release: v4.7.3 --- 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 b8616932..2908cc07 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.2", + "version": "4.7.3", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index e7f6b963..cc576313 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.2", + "version": "4.7.3", "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 a5b75bcd..b705f2d2 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.2'; +export const napCatVersion = '4.7.3'; From c6354966771dff00791395916c38ad1cfd3e7746 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, 16 Mar 2025 15:57:27 +0800 Subject: [PATCH 065/233] fix: msf Status --- src/shell/base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shell/base.ts b/src/shell/base.ts index a6887028..b6381477 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -289,7 +289,7 @@ async function waitForNetworkConnection(loginService: NodeIKernelLoginService, l let network_ok = false; let tryCount = 0; while (!network_ok) { - network_ok = loginService.getMsfStatus() === 0; + network_ok = loginService.getMsfStatus() !== 3;// win 11 0连接 1未连接 logger.log('等待网络连接...'); await sleep(500); tryCount++; From be37b8cbbd6273047b29dfed5624c5da251d8499 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sun, 16 Mar 2025 07:57:45 +0000 Subject: [PATCH 066/233] release: v4.7.4 --- 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 2908cc07..67ef74bf 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.3", + "version": "4.7.4", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index cc576313..ee81d8ae 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.3", + "version": "4.7.4", "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 b705f2d2..462f17a3 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.3'; +export const napCatVersion = '4.7.4'; From 9eef570d37757a79341a9dc1489e16facb2c08ff 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, 16 Mar 2025 16:07:51 +0800 Subject: [PATCH 067/233] fix: network prepare --- src/shell/base.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/shell/base.ts b/src/shell/base.ts index b6381477..51c730aa 100644 --- a/src/shell/base.ts +++ b/src/shell/base.ts @@ -119,9 +119,6 @@ async function handleLogin( let inner_resolve: (value: SelfInfo) => void; let selfInfo: Promise = new Promise((resolve) => { inner_resolve = resolve; - waitForNetworkConnection(loginService, logger).then(() => { - handleLoginInner(context, logger, loginService, quickLoginUin, historyLoginList).then().catch(e => logger.logError(e)); - }); }); // 连接服务 @@ -139,7 +136,11 @@ async function handleLogin( }); }; - + loginListener.onLoginConnected = () => { + waitForNetworkConnection(loginService, logger).then(() => { + handleLoginInner(context, logger, loginService, quickLoginUin, historyLoginList).then().catch(e => logger.logError(e)); + }); + } loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => { WebUiDataRuntime.setQQLoginQrcodeURL(qrcodeUrl); @@ -173,6 +174,7 @@ async function handleLogin( loginListener.onLoginFailed = (...args) => { logger.logError('[Core] [Login] Login Error , ErrInfo: ', JSON.stringify(args)); }; + loginService.addKernelLoginListener(proxiedListenerOf(loginListener, logger)); loginService.connect(); return await selfInfo; From c5234375063987eadd6b13d802ba55b5ff2cf2cc Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Sun, 16 Mar 2025 08:08:15 +0000 Subject: [PATCH 068/233] release: v4.7.5 --- 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 67ef74bf..e2569070 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.4", + "version": "4.7.5", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index ee81d8ae..bd9c8c34 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.4", + "version": "4.7.5", "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 462f17a3..b1547e29 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.4'; +export const napCatVersion = '4.7.5'; From 073745030c296f4604a18402044cabd5b44620f5 Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Sun, 16 Mar 2025 20:07:47 +0800 Subject: [PATCH 069/233] fix: #843 - maybe a temporary solution --- .../packet/transformer/action/SetSpecialTitle.ts | 13 ++++++------- .../packet/transformer/proto/oidb/Oidb.0x8FC_2.ts | 8 ++++---- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/core/packet/transformer/action/SetSpecialTitle.ts b/src/core/packet/transformer/action/SetSpecialTitle.ts index c7dbb2ff..9edeb008 100644 --- a/src/core/packet/transformer/action/SetSpecialTitle.ts +++ b/src/core/packet/transformer/action/SetSpecialTitle.ts @@ -9,15 +9,14 @@ class SetSpecialTitle extends PacketTransformer } build(groupCode: number, uid: string, tittle: string): OidbPacket { - const oidb_0x8FC_2_body = new NapProtoMsg(proto.OidbSvcTrpcTcp0X8FC_2_Body).encode({ - targetUid: uid, - specialTitle: tittle, - expiredTime: -1, - uinName: tittle - }); const oidb_0x8FC_2 = new NapProtoMsg(proto.OidbSvcTrpcTcp0X8FC_2).encode({ groupUin: +groupCode, - body: oidb_0x8FC_2_body + body: { + targetUid: uid, + specialTitle: tittle, + expiredTime: -1, + uinName: tittle + } }); return OidbBase.build(0x8FC, 2, oidb_0x8FC_2, false, false); } diff --git a/src/core/packet/transformer/proto/oidb/Oidb.0x8FC_2.ts b/src/core/packet/transformer/proto/oidb/Oidb.0x8FC_2.ts index e96dd951..4f96409b 100644 --- a/src/core/packet/transformer/proto/oidb/Oidb.0x8FC_2.ts +++ b/src/core/packet/transformer/proto/oidb/Oidb.0x8FC_2.ts @@ -4,12 +4,12 @@ import { ProtoField, ScalarType } from '@napneko/nap-proto-core'; //设置群头衔 OidbSvcTrpcTcp.0x8fc_2 export const OidbSvcTrpcTcp0X8FC_2_Body = { targetUid: ProtoField(1, ScalarType.STRING), - specialTitle: ProtoField(5, ScalarType.STRING), - expiredTime: ProtoField(6, ScalarType.SINT32), - uinName: ProtoField(7, ScalarType.STRING), + specialTitle: ProtoField(5, ScalarType.STRING, true), + expiredTime: ProtoField(6, ScalarType.INT32), + uinName: ProtoField(7, ScalarType.STRING, true), targetName: ProtoField(8, ScalarType.STRING), }; export const OidbSvcTrpcTcp0X8FC_2 = { groupUin: ProtoField(1, ScalarType.UINT32), - body: ProtoField(3, ScalarType.BYTES), + body: ProtoField(3, () => OidbSvcTrpcTcp0X8FC_2_Body), }; From 40fe73317d7d555beb563f07f8335c2f02dda27a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 09:21:48 +0000 Subject: [PATCH 070/233] chore(deps-dev): bump eslint-import-resolver-typescript Bumps [eslint-import-resolver-typescript](https://github.com/import-js/eslint-import-resolver-typescript) from 3.9.1 to 4.0.0. - [Release notes](https://github.com/import-js/eslint-import-resolver-typescript/releases) - [Changelog](https://github.com/import-js/eslint-import-resolver-typescript/blob/master/CHANGELOG.md) - [Commits](https://github.com/import-js/eslint-import-resolver-typescript/compare/v3.9.1...v4.0.0) --- updated-dependencies: - dependency-name: eslint-import-resolver-typescript 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 bd9c8c34..e72a4e99 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "cors": "^2.8.5", "esbuild": "0.25.0", "eslint": "^9.14.0", - "eslint-import-resolver-typescript": "^3.6.1", + "eslint-import-resolver-typescript": "^4.0.0", "eslint-plugin-import": "^2.29.1", "express-rate-limit": "^7.5.0", "fast-xml-parser": "^4.3.6", From e3feb6a73c82523864cb2a1b6092077d6ff1164e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 09:23:32 +0000 Subject: [PATCH 071/233] chore(deps-dev): bump image-size from 1.2.0 to 2.0.1 Bumps [image-size](https://github.com/image-size/image-size) from 1.2.0 to 2.0.1. - [Release notes](https://github.com/image-size/image-size/releases) - [Commits](https://github.com/image-size/image-size/compare/v1.2.0...v2.0.1) --- updated-dependencies: - dependency-name: image-size 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 bd9c8c34..3ef76716 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "fast-xml-parser": "^4.3.6", "file-type": "^20.0.0", "globals": "^16.0.0", - "image-size": "^1.1.1", + "image-size": "^2.0.1", "json5": "^2.2.3", "multer": "^1.4.5-lts.1", "typescript": "^5.3.3", From 30abd1f904e563ae0466a8237e2144fe6941771a 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, 19 Mar 2025 10:45:56 +0800 Subject: [PATCH 072/233] fix: #884 --- 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 3c47a9df..98dbcecf 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_remark: '', group_id: +payload.group_id, group_name: data.groupName, member_count: data.memberNum, diff --git a/src/onebot/helper/data.ts b/src/onebot/helper/data.ts index 0227661f..8fa7f3cd 100644 --- a/src/onebot/helper/data.ts +++ b/src/onebot/helper/data.ts @@ -73,6 +73,7 @@ export class OB11Construct { static group(group: Group): OB11Group { return { + group_remark: group.remarkName, group_id: +group.groupCode, group_name: group.groupName, member_count: group.memberCount, diff --git a/src/onebot/types/data.ts b/src/onebot/types/data.ts index 52b97436..2957e22a 100644 --- a/src/onebot/types/data.ts +++ b/src/onebot/types/data.ts @@ -57,6 +57,7 @@ export interface OB11GroupMember { } export interface OB11Group { + group_remark: string; // 群备注 group_id: number; // 群ID group_name: string; // 群名称 member_count?: number; // 成员数量 From 2759a34d96b741cc5733728e4146d0d02995932a 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, 19 Mar 2025 11:09:57 +0800 Subject: [PATCH 073/233] fix: image size --- src/core/apis/file.ts | 37 +++++++++++-------------------------- 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index f058a15a..d28d64d1 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -17,8 +17,6 @@ import fs from 'fs'; import fsPromises from 'fs/promises'; import { InstanceContext, NapCatCore, SearchResultItem } from '@/core'; import { fileTypeFromFile } from 'file-type'; -import imageSize from 'image-size'; -import { ISizeCalculationResult } from 'image-size/dist/types/interface'; import { RkeyManager } from '@/core/helper/rkey'; import { calculateFileMD5 } from '@/common/file'; import pathLib from 'node:path'; @@ -28,6 +26,7 @@ import { SendMessageContext } from '@/onebot/api'; import { getFileTypeForSendType } from '../helper/msg'; import { FFmpegService } from '@/common/ffmpeg'; import { rkeyDataType } from '../types/file'; +import { imageSizeFromFile } from 'image-size/dist/fromFile' export class NTQQFileApi { context: InstanceContext; @@ -44,7 +43,7 @@ export class NTQQFileApi { 'https://ss.xingzhige.com/music_card/rkey', // 国内 'https://secret-service.bietiaop.com/rkeys',//国内 ], - this.context.logger + this.context.logger ); } @@ -137,7 +136,7 @@ export class NTQQFileApi { if (fileSize === 0) { throw new Error('文件异常,大小为0'); } - const imageSize = await this.core.apis.FileApi.getImageSize(picPath); + const imageSize = await imageSizeFromFile(picPath); context.deleteAfterSentFiles.push(path); return { elementType: ElementType.PIC, @@ -301,18 +300,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++; } @@ -356,20 +355,6 @@ export class NTQQFileApi { return completeRetData.filePath; } - async getImageSize(filePath: string): Promise { - return new Promise((resolve, reject) => { - imageSize(filePath, (err: Error | null, dimensions) => { - if (err) { - reject(new Error(err.message)); - } else if (!dimensions) { - reject(new Error('获取图片尺寸失败')); - } else { - resolve(dimensions); - } - }); - }); - } - async searchForFile(keys: string[]): Promise { const randomResultId = 100000 + Math.floor(Math.random() * 10000); let searchId = 0; From 9ab776d53a8e5a97cc9b153518f50a55f6cccd8a 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, 19 Mar 2025 11:54:29 +0800 Subject: [PATCH 074/233] fix: moduleResolution --- src/core/apis/file.ts | 2 +- tsconfig.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index d28d64d1..2a02e031 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -26,7 +26,7 @@ import { SendMessageContext } from '@/onebot/api'; import { getFileTypeForSendType } from '../helper/msg'; import { FFmpegService } from '@/common/ffmpeg'; import { rkeyDataType } from '../types/file'; -import { imageSizeFromFile } from 'image-size/dist/fromFile' +import { imageSizeFromFile } from 'image-size/fromFile' export class NTQQFileApi { context: InstanceContext; diff --git a/tsconfig.json b/tsconfig.json index 8e2fcaed..6f209645 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "DOM.Iterable" ], "skipLibCheck": true, - "moduleResolution": "Node", + "moduleResolution": "bundler", "experimentalDecorators": true, "allowImportingTsExtensions": false, "allowSyntheticDefaultImports": true, From 129b67b751c57c02f68ceb52ad25abadaf8d6d4b 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, 19 Mar 2025 11:57:55 +0800 Subject: [PATCH 075/233] Revert "chore(deps-dev): bump image-size from 1.2.0 to 2.0.1" This reverts commit e3feb6a73c82523864cb2a1b6092077d6ff1164e. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aed0c71a..e72a4e99 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "fast-xml-parser": "^4.3.6", "file-type": "^20.0.0", "globals": "^16.0.0", - "image-size": "^2.0.1", + "image-size": "^1.1.1", "json5": "^2.2.3", "multer": "^1.4.5-lts.1", "typescript": "^5.3.3", From dce4eedf7df1282eaf3535de5f51f4cd7c67e5f2 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, 19 Mar 2025 11:58:16 +0800 Subject: [PATCH 076/233] Revert "fix: moduleResolution" This reverts commit 9ab776d53a8e5a97cc9b153518f50a55f6cccd8a. --- src/core/apis/file.ts | 2 +- tsconfig.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index 2a02e031..d28d64d1 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -26,7 +26,7 @@ import { SendMessageContext } from '@/onebot/api'; import { getFileTypeForSendType } from '../helper/msg'; import { FFmpegService } from '@/common/ffmpeg'; import { rkeyDataType } from '../types/file'; -import { imageSizeFromFile } from 'image-size/fromFile' +import { imageSizeFromFile } from 'image-size/dist/fromFile' export class NTQQFileApi { context: InstanceContext; diff --git a/tsconfig.json b/tsconfig.json index 6f209645..8e2fcaed 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "DOM.Iterable" ], "skipLibCheck": true, - "moduleResolution": "bundler", + "moduleResolution": "Node", "experimentalDecorators": true, "allowImportingTsExtensions": false, "allowSyntheticDefaultImports": true, From 4ab751696b3e78ad2bb3c2c0fa49e4b202810833 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, 19 Mar 2025 11:58:19 +0800 Subject: [PATCH 077/233] Revert "fix: image size" This reverts commit 2759a34d96b741cc5733728e4146d0d02995932a. --- src/core/apis/file.ts | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index d28d64d1..f058a15a 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -17,6 +17,8 @@ import fs from 'fs'; import fsPromises from 'fs/promises'; import { InstanceContext, NapCatCore, SearchResultItem } from '@/core'; import { fileTypeFromFile } from 'file-type'; +import imageSize from 'image-size'; +import { ISizeCalculationResult } from 'image-size/dist/types/interface'; import { RkeyManager } from '@/core/helper/rkey'; import { calculateFileMD5 } from '@/common/file'; import pathLib from 'node:path'; @@ -26,7 +28,6 @@ import { SendMessageContext } from '@/onebot/api'; import { getFileTypeForSendType } from '../helper/msg'; import { FFmpegService } from '@/common/ffmpeg'; import { rkeyDataType } from '../types/file'; -import { imageSizeFromFile } from 'image-size/dist/fromFile' export class NTQQFileApi { context: InstanceContext; @@ -43,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 ); } @@ -136,7 +137,7 @@ export class NTQQFileApi { if (fileSize === 0) { throw new Error('文件异常,大小为0'); } - const imageSize = await imageSizeFromFile(picPath); + const imageSize = await this.core.apis.FileApi.getImageSize(picPath); context.deleteAfterSentFiles.push(path); return { elementType: ElementType.PIC, @@ -300,18 +301,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++; } @@ -355,6 +356,20 @@ export class NTQQFileApi { return completeRetData.filePath; } + async getImageSize(filePath: string): Promise { + return new Promise((resolve, reject) => { + imageSize(filePath, (err: Error | null, dimensions) => { + if (err) { + reject(new Error(err.message)); + } else if (!dimensions) { + reject(new Error('获取图片尺寸失败')); + } else { + resolve(dimensions); + } + }); + }); + } + async searchForFile(keys: string[]): Promise { const randomResultId = 100000 + Math.floor(Math.random() * 10000); let searchId = 0; From 0fa1b3f044583833e91e3de4f9908f005997b6ba 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, 19 Mar 2025 15:26:55 +0800 Subject: [PATCH 078/233] feat: 33139 --- src/core/external/appid.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/core/external/appid.json b/src/core/external/appid.json index d6606e3f..26a18c18 100644 --- a/src/core/external/appid.json +++ b/src/core/external/appid.json @@ -218,5 +218,13 @@ "9.9.18-32869": { "appid": 537271294, "qua": "V1_WIN_NQ_9.9.18_32869_GW_B" + }, + "3.2.16-33139": { + "appid": 537273909, + "qua": "V1_LNX_NQ_3.2.16_33139_GW_B" + }, + "9.9.18-33139": { + "appid": 537273874, + "qua": "V1_WIN_NQ_9.9.18_33139_GW_B" } } \ No newline at end of file From be6671923b0df03bf7e3294852738ba7149c9666 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, 19 Mar 2025 15:34:33 +0800 Subject: [PATCH 079/233] feat: 33139 --- src/core/external/offset.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/core/external/offset.json b/src/core/external/offset.json index ed6bec37..224d6026 100644 --- a/src/core/external/offset.json +++ b/src/core/external/offset.json @@ -290,5 +290,17 @@ "3.2.16-32869-arm64": { "send": "7226630", "recv": "7229F60" + }, + "9.9.18-33139-x64": { + "send": "39F5870", + "recv": "39FA070" + }, + "3.2.16-33139-x64": { + "send": "A634F60", + "recv": "A638980" + }, + "3.2.16-33139-arm64": { + "send": "7262BB0", + "recv": "72664E0" } } \ No newline at end of file From 7792ad9ea073048214a0eb905dbc432cb6862084 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Wed, 19 Mar 2025 07:35:12 +0000 Subject: [PATCH 080/233] release: v4.7.6 --- 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 e2569070..e49fc469 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.5", + "version": "4.7.6", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index e72a4e99..1a4b0d39 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.5", + "version": "4.7.6", "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 b1547e29..a35d069b 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.5'; +export const napCatVersion = '4.7.6'; From 79aa1dc67fec26bab15bf96dd50e57e8565d7cfd 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, 20 Mar 2025 10:32:13 +0800 Subject: [PATCH 081/233] fix: #883 --- src/onebot/action/extends/GetProfileLike.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index bd6f39c7..afcc5676 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -6,7 +6,8 @@ import { Type, Static } from '@sinclair/typebox'; const SchemaData = Type.Object({ user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), start: Type.Union([Type.Number(), Type.String()], { default: 0 }), - count: Type.Union([Type.Number(), Type.String()], { default: 10 }) + count: Type.Union([Type.Number(), Type.String()], { default: 10 }), + type: Type.Union([Type.Number(), Type.String()], { default: 2 }) }); type Payload = Static; @@ -33,8 +34,7 @@ export class GetProfileLike extends OneBotAction Date: Thu, 20 Mar 2025 10:32:30 +0800 Subject: [PATCH 082/233] fix --- src/onebot/action/extends/GetProfileLike.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index afcc5676..288754d8 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -7,7 +7,7 @@ const SchemaData = Type.Object({ user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), start: Type.Union([Type.Number(), Type.String()], { default: 0 }), count: Type.Union([Type.Number(), Type.String()], { default: 10 }), - type: Type.Union([Type.Number(), Type.String()], { default: 2 }) + type: Type.Union([Type.Number(), Type.String()], { default: 1 }) }); type Payload = Static; From 6534d05b76e4105a9fe27b80664e9cce5200599f 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, 20 Mar 2025 10:57:54 +0800 Subject: [PATCH 083/233] Revert "fix" This reverts commit 2d7de174c5f701d749e79b620bfe0b2f581c1a2e. --- src/onebot/action/extends/GetProfileLike.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index 288754d8..afcc5676 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -7,7 +7,7 @@ const SchemaData = Type.Object({ user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), start: Type.Union([Type.Number(), Type.String()], { default: 0 }), count: Type.Union([Type.Number(), Type.String()], { default: 10 }), - type: Type.Union([Type.Number(), Type.String()], { default: 1 }) + type: Type.Union([Type.Number(), Type.String()], { default: 2 }) }); type Payload = Static; From 58d2bd3c81a70f470f24a074b6b84f46410262fc 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, 20 Mar 2025 10:57:57 +0800 Subject: [PATCH 084/233] Revert "fix: #883" This reverts commit 79aa1dc67fec26bab15bf96dd50e57e8565d7cfd. --- src/onebot/action/extends/GetProfileLike.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/onebot/action/extends/GetProfileLike.ts b/src/onebot/action/extends/GetProfileLike.ts index afcc5676..bd6f39c7 100644 --- a/src/onebot/action/extends/GetProfileLike.ts +++ b/src/onebot/action/extends/GetProfileLike.ts @@ -6,8 +6,7 @@ import { Type, Static } from '@sinclair/typebox'; const SchemaData = Type.Object({ user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])), start: Type.Union([Type.Number(), Type.String()], { default: 0 }), - count: Type.Union([Type.Number(), Type.String()], { default: 10 }), - type: Type.Union([Type.Number(), Type.String()], { default: 2 }) + count: Type.Union([Type.Number(), Type.String()], { default: 10 }) }); type Payload = Static; @@ -34,7 +33,8 @@ export class GetProfileLike extends OneBotAction Date: Fri, 21 Mar 2025 19:40:47 +0800 Subject: [PATCH 085/233] =?UTF-8?q?feat:=20=E7=AE=80=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/native/packet/MoeHoo.win32.x64.node | Bin 146944 -> 135680 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/native/packet/MoeHoo.win32.x64.node b/src/native/packet/MoeHoo.win32.x64.node index 82bf80c2dbc4c69102834dbf99357b000591e52e..0c5db04e3061eb5c46ddab96d6391982516c50b0 100644 GIT binary patch delta 28313 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 JOM)=z{{aQN$yxva delta 39455 zcmeEvd0bRg|Np%g28PWU5D*Y$L{Jn(TrvwaP{@md;%=seYx?9u3TlfE1}->K*s(^- z3boA2jKV!NT)`zp+g!@9#Rh4i)g^U)@6SEwG6PS~@B2K@@ArEB{`t+z&wS2jJ?DJR za?f%Z^ItRO-!hiuTU)PM@Y&e<&?Pzynio=-1$xlDAc30~J_dUD@+C_~0dJTeQuv^T zg9?e>pWmYJVc@a#EtVu`{N{xZXgE~p)h^-s!5Tem`lM-;m&8BuQdXKIOkYz2GrDX1yYg%NfRFR}_cYzPZpoH8h3vwYU@rRZf ziDoQ9Y29qtCM2ONZ3Yfv_bX98)u85p+QVik5zVyRQ3|OUSe@7lP(axv{FClw`$3^Z z8r8e}iV`DRZ*G?)wFv)`jcSo$T%sbWm4*pG^f8UDm};^b9^%|dK;Ga&Asa~}l9h(m znri-i8McZ&R7|xvpgmZQ3$0Oh5byiRl3H*$uD0`TNjj;2)Pf(>jG~Mf3oG(m(8`0# zu%se)lv=!?y;|^njaoF|dYzwYJK=C_W33IXmE^xzUqf4E#8fuPFhSXMlN~j5QB2#| zHN*W%WjVXgD?({|lRfAat@N70tX}zwp`6Ly8OqN0*%0se5aos>W!MH7(~AeonemnB zw$B|uUuVyHcUKm@&klR1C}oqFxA6t#t3TPR#@ouYGWLp3gpyIl_V{!(ulZAwGHr)b zY@e&Pj~pFuv)_FZBO=Qrsjj7J`^+)8k+|j->+9QD890H>^xdzV-^x1sMJW5WvUER- z()#B&qwc-%REJiA@REqm2KB zwQ07;`yPbRQSw&#*Uj3=%B?qu;QRd#s2~JHmE^w zuxmllO8Ylh%jPM{x0~2Q%~j>aO{60K!j3dgQ+jS9CsAy)TXUXNiw%JuXy_tYEjVDT z9lwL61b0zdDQr$~+i}$$5dGq`pKYP(wv&#`j?_s;8P$R(!c6l#R9jF+aptuQ+x=lA zP2tiwwO~=QX`ZKQ8x;q!6XISZj)oYnyltaYBISoRyH_fFuq?7DU>g>=+GqP zn~m(@&|b=$8`;{>G-cvORuh^Q)p8?pE?N|(R^D$hp{pLf-ze>wMt#wrX0}kfpLBe_iOp}(+GrVpnmQszu$No33BL5cB>j0v&JEZTrWu}gbI%+LXc(hD7=uNphTg730IvWf)r? z-cbot*tYO^<=I$vIlQZXyI4uWXz#400(vc(Zu@v~v67N;#& zi&A4ODZ2wv4um98wT(o{Pdn6@2J1HLRzx4=nJkvnGFF+J#U{2K+N<~#SfBYR{mf4& zN$xF4a)z9`PIW#^{ z1xk^n+6R?Gqv3&;e0+CBVW)x?{WT#hFIPp=7 zL(YOvZnLA=Ymw2`7Vv5tX(rA{WTfSmVXIe*?m7t(qLPOh7H0c3#VSWA`WG@xKn^y_ z!3#M+Y)4w;q2)*ZF1MkaQe(2~tZGrKCEQ&*KTUr=sC4v%PL-IT;m-&DCc{VFyWP(c zKO0pO>?y=vgFI%i$65s^Ui*u@o_6FlcyEqUrhwc1Eb%Xb-@O9eN~LbKwv=se71jH4 zCZ8ZJH&NtAU*cUOo`_8#N*o7-Tq4#WA@?I<=}XLvX}7t;`n8T%siW!7WP%^ z{z|BY#Y9ERzp?>QsmeQ1tT-xKDT-q6McuEYM6nxDU6f#jb+lwC$Jeq2mPx)-)>6?8 z&%xPumV(&k2>pS}7?|{Skh0m%UW`tAXo8(&hw3O| zzx=@?cFJLk6cIC0#L`iF)wV7s8&5iQ@nJJi%EKuSrHoG*_wYmG4>_JwDPSwL@1@#z zzV`iu%KEfjpbU9|?QGjhNqm8Q*0!G#_X3NEc~D6nP(D9qvaGB>&%TTusSG^NdbGQI zPtSc)ZL3b!zjx?4LrohygX=-I^%mRNf)XKDcnt^{cnGGZ1>Q_x{ z3mJ-Z(TJFw<*6~b={7IbX8co@^8z4Fk&A}<9F@cBVpJQRF*SEk(lFD~2_96A6f-oW zqAa7@yE4V7WneS>WTfHzS-S1Cvl_EoZ8erOyQd*jN2h1V=p4;ly)fyS3SR^_waCKq z;w}EPwn8(jamb&oj}NwH6iqM#!c0+xkU-|F%XU;#i=oBhHWx^&A?1s zaNCq=8gN+M9osg#@Y{92o}hW@shBb95@&8q`tEWn2Y`2!6w?k*v)a8X-SqA;)tPuu zP5OM!4{FWuBRHe>aL)|Z?+bY#17gbZ*q4cE6+=W^_sBXP5 zS~hqgM6E7iEFumC2NP*5PILHQbvpGBrE4*Mwvq%XiVj7RuoPlbhc>7XpEWhq_mQeLTL3%ayX%70`pb!nx{sAYS) zq$)jY-%sox$}l~c&{rxq=hwoZ1U>kCTK_iR$PrOKeCtgc&(^3fF**nOt* z$|o$p`)DQY6L!9POJ#Wx);}#-V2=dlom=H8Jysf(ck|il-aW0?{*)^L z;D(&{n`#>rhUl$_uH)6t)c5kfLW?gZ|44t@vimV-NGdm;sb_k~8T zXeDVD`@B!8^~UeARQn`Nsj+vEMC`5+XS&AuopXL9&S;Hum28^1; z;+;RP;ECHT_B_R?X&}HS}Y7Jpmp&A zYnvSFKY20QEWQTK@nSt2k-S~mxS#o@M7DVzqc#;&8*R6$oFSWt>=pa$OVwysosd%qH55Qgr6{;rDcM`pV}UrGOz1q_H%N_QL&8TZ87muCMCt+7=quD44|orJBY-XsAWYG&$eTjG(7$aloh0a)z`d zv8`EJ_hT7Jwj&wz429Sk(nI5ayxSK!J45cE=x82lwm>vB$qEi9r#ys}=7WcvAwQpB z_VkWQ{P*lodWX)I;}Fvl0<$v8(YYE0Ui?%{Ha$*}?=g@W*lr}Fq({!O@PXZw$9`d% z1Mdx7a*P`;nL(pGWbiSzW?uPAoeH+(J&2qk2dl`xsS*P6pNGATA^HrPJSfFy8AZ@$ zFxRuKgWCBxex`zltUANK926FN8dS<|tS`trPIu71oFP{$sZtg2o;TJRahxdsQiYv=OMo$Zxm;}mKuOHlHmm{ zxxk3Iyr@snJhnaKer4@xb~~e`GC7AuWVY&3{1eRZSZJdy$ekgtA4SD7Vqy?$RV@mb zMdBjE!-Q-hRVUfh%=XG7N7=KPadCHj1129`Sh`aQfBR8J(Jte`^9xd$Hb;i-u7~s3 zSDCGpR?_V`yHVszxh#8dXXWl6*|URN2M#y_ZxnK1ggovD z+dsH#o6exLkhg@v@{iDk?^BojX)1gK&5p9|_<@;++~e~N9;zrw?hkC(ke)4m2bJQy z-<)YXm0}xgriGr((EbPZ>W~EG-I?t4knX`(YZ_`%t<|E><~kOd72Rni4QgA+5)FN% z7LP&i+I5H?eWoRFD`gaIi=hpaGvw(*Y;smN(^3c<`o!fE?DeckqHYAYR}RB&XD0qrR>V5?6E}4vQ^p6IYxU?GY6Qt$@-7j_MsM^ z?`t&&WgoFiLt82ZkFvjp#wMS<)T9PCX_=givacX@+b`&BDZ4E2?hGkAKzZg`;CUwZ zHR>alJ*>4d^#IEs*2O#%a^54+v0GIhV;>IdVg98;E6Q<)mU-Pt<}tjBGVmX)$MCMP z%f4*LJPX0d?=uow$P{xQ^1YCIA7+ILRxu)2`ED~S9UdArRg1_eJm(xw{^WF;c6j%$ z&9kVJ9+nZA2_LafhbJlnK4RV@;*{?`WL-y0?eHD;8X3iW)0%F3(2{POi#^3R4H1k{L#J z3jW|?Lp4xYI0#vMg{6(`p$xjho*daSaO!?7ZtXK{LyWL`_BeZEWTG6v&W%ho2Se5n zv%6*;WnrU|16J-s6fiMjy&Ym?Q${5#pHF3PjB2MuU0|n2#ReK7M;TiQhr5q4!{~O( z?!D9sri#7p9wXSJqx*#Q1}_7%DSXCZ2OyTS?T)dE(ecWvDeTA515Az&L=OzY5b1xI z^&j)3()R?b7;|^@K1^7SWbD7OQCv&2TCrhbAbF&gKp8)+V&M;@_ZvoPpE_u_d#cjI z8LP!|YGr?IXB4u942$MsbM}#=3`%vaY)7G(5?@i^FckHh2S0)AwFl<4e(n({YLDQm z&qQFCl-)=BqS*mQkFj23rz;;+vW;VhD0^OGGsm?k_j}MFD<_Y#pmCeR4r8FxndHej zr}G1h0;#Se96xlFRgVi+&K+S_#w94zvRUZ(5z5UYY{vK`<;NrJ&GC0D-yUIKk1td< z9bwZR>Y-$vWv@KcA!0ndrP9s=H6D(%{uIeP!Y)75Um5dIdAo;G13s+3d;ep~2ZM!I&IPkd?z~vfBs8x&&E|X#({z)^b8b@U>M9uCnHE!5o%8 zp?&aPm!S7tP0(X5D}-RNOOTqY33}(U4<|$o80-?Ld72;@NcA}GyxeDTm?X{bl-sBC z!WNR$=XbPE1m69bgkDMl0tIu%#3GdYMqkz}f8h#2rSS#9rjo zq?RmyZU8HrRHe%oO}^QXoN~pbdijwytZZrkE17=U&lDv!xVSu}C99v_jwMfxW;K)T z#;GMDqeWBRWF>QhS=l3fTwdOr7FJ#|{Xx0M^tUiM#ctHTU)R3x*1p%iN&J_z?~k|Xww*CK@*N9DxJ=JG)~GIn*_+2F@IcYANK)0tvgUFmTk)#LggTj7nwYLub~=Sm}c z^|ux7&L+~MS}hvctIj*4IAHN&_ReE*ay9$xu|9G*3!XFDHzpsC1N6Yie3mz-tM4{J zuFhv=bJqEcu}V@nSQ7hXVl;bpia)ENhM3!<^)g7-0p0@~1zZHw0}Rj(&u3rHT^fCO zk<*!qXZx7+;-~Y!pzwI2&*Q=hC%GxMZ7XUnl&{D=sVJX4$;QlI5H$|lG)+CTcmt_t z7RMZ>Q;ittK3#Kx{XD;~+=nGBh?4u14_+|HLm9rk{G}(06=lSItmC36<;gTQXwf5z zlE$_znkoCSXzKvqTH&8E0|EZUk~AB572pLx zLUH+qr*q}N(Ao6lC{(gm@nN)zwJ+=wai>I*Ji+k=m;s@HNI=(BY*Ar+V8JY>v)I#D zU6W$kxiY!Ttgtn96Y-F)Z+M!W0mb|4v@%oZJ$D3^W(hjX?RZ#3%Qo9G|RVf8GCglYcEW(+fKW3S?-(>GDZ7ttnrHIzMV=>yY? z3uChCSjqBW6!rDx50Zsa6dTHGw!Ai$9LZ^>gKWER_-@#+<;bSiG^yaX=khF zHk4Nsw~&2DPR2}OD_pkV-SW%N7-igEUVS!Nwy=Pb)=JsC<(*5~%Svz=8?|bqe6IZF zs_U}vy$=hEvhrK3Sb@cg7gF(k`h~Ulo^GE)X?vJ5^se$+`&n5z(~a$08?Q|6#;&gI zrj&JMtzWb#r@EFWznH5iUvyzR)^&l!m33{DU%D`#mt#OAyxcSB9QvQn{gIUeJmo;2VG^;8}pq&qVquH(KYDet&?lwQ9r-FvwWKcKbEp-GEbo)vrp@Jb-7Z zBqc&dP=K@tcsisDIq8s$;5>K)SDL^~$XWur3Yb}Hm86eB1g^(?3H%K3RlwN|D8NQZ zY7O`T@H3!blO&Y^UKa2s7Rdx-@ig5BShQJ^3ITao*n2%7(VA)8;2e zPNe%4GYvM}u;4_eHus@|J_}G@DR1NlGLT~iz6&dI!>|V%YNP2XU@VX`kXs_DH}NjCP^=FG5fS7^%L0pWOwl>P9s#@Q7t`^^|@Ar22HTYkh+(C1Y| z4FsMvxTD3FmbJ(=mpfXhIf`=SI)nHPxjqCcuhwQD>~W~bFbWvggu&g2zW?}|L&J_3br4H+sGMM#|Ue()&f?Mj1j1?%`$OY7%Fvh*Q^0{2h3^C-s| z&|i#pbcRft4z_l@lV`vURUPeBmO-K&eT*U@b|_cCTtUnt1A{M3cCU~f2XiTy-7B=% zJ&Ghe;SM7JxtX4?sPkrr-|8U;vm0-NOdxiWy(VRvmDz-(_H3;%f;%9gU1 z&b{(tucgMsAdz2b_;eYYxn(xy!Y{XUo_yyNm|D0?kSORAj*g0O7vS5`3}NEfRz6*J%h7r$4e6i;Up%33Sqr?ACk zJ+1pRFR3w!=yGv%5u)AT+6)T|c%)mM}% zl`qgJLrd)hL5bUp#!GWm>fDN$F9FN(^hTG09ta)RM_4FL!Z_%&C*OeB*zet zwRC@&Vf#8W{=1B%?@Uj7g0vYf!_fhUvRO72ZbdxO3vQWBPrrtgT5#KJTJ{v$MSJ@r z-F7SfBW?8Bek=Ii^zoGp+YzcucDn7X^HjRWZO31kxJb;vOkhD%u{+^)v0OzzVZ=8S=|0ZndHc2xBoP)An&j{HN&! z74@1e{56;z#Ij^iitRw#gS5@h?e$xVX?BEm_iWl%HPvdGecW~cE`P(`$}}2xg}qvw zFcoe<@Kjt^T1@3etne*pT*wp*FSIp!2J z0bZKRrK7B0>5w@~jsF9ASaGKaDm&BTHg%0e6vWFk`Y08oA}=ztIHjI0A&Uo_9YY6c zCu}$gJzDFBT+)-SE<~3KH z6}TZ#X*-`@@J)@W@E}DKI|2iZuEG@l+)u+Of5O`UGBgdwcx7d$nDP$X!BpvnY^nh z1(zdp`=`gB!5-?~BQ#7e-%5`^aOBQx^Wm>&u2hcP&OLGDkBeumusVpg3jYlwYj+f~ zi?6~Zna9B+*XQ#!IuhwgXSI4GR=JOZpesyV9McLO(x#SNfDG$%j~=L1{yZS(?#K3| z0`FU(8tL)JrkZBaIFsmNzI!VAt7&$>dep!?)s%Z+s_F9z)WTauEw0opMXBi7z;_Gu zjfP;Qp5fLo>TecIWaiPBF)cVD#W){IuVL8YO#5(R`X%~Y7+eoFyLCKmd>_jT$D4a` zcpCzDK%*?_1rD=gvdYgSsq^(RmG`pYc7Ms)yzSjk=5d&u@xnqfy$zt!%HZKcXg4pl zD6CAbyWB7V^F-~VH=Ryx8lPasAU51Ogt1(df`d-OjfW|T0v^CTuU&DX*ym|8R2=XQ zWE7wxY^{bvSv8sh701ItG!Ymanh(6sg!?nxKOcfE`~1B?WyZto>U$ABVO(qdAr|m{ z>!=QY>*->k=IN8a5ZP%#SLG7=N*ovT#kPIwWe-P z>E1}wvzqNJZx;TrA98kliMy|pwR0)WAI6UP>{5Aj->N6D()kJffgZeQ_-nd2394}6 z?dXZIUl;CZ3))uYsO+b)J-cD$=BQwOx3y1r8>ftg6?w!8a@>oa55n8=Cb)G!l;Qm$ zIHsq+gIT$jnsQnW{$8%cU z@(hmOHC5rT`!PozRTLT2nvom%z!Sy$s9`azWrwFXOrOQcrzl*o<9?`v@PXwa@awKp z@vPbcg-0{Lj|x-Cc0TVBEE?wj!?DjtD^eV8wqsDNZjd_0pb!|#RLpycRy8^|0rl^W z2fm@zhg6m-=WlqMTZRJK%@>GB!XTRi9W{Kp0HrLGyYt?^+kjchF%kJ`?GuJe{au-8 z^{Mw5X5Q^|<}FYs1(YIz&N2RO)_F(1^$j#k_p@jtzru@{S(b(P!XbC2*Ty*?wOMgK z*R$|!p1Ym5FjOo1amwKhd4e)>>Nw!>ven~P8~-R3TO`G*w;sEv<{A!;S=f>$bTKB z$u9yq?2uO)I(2|o1zwZ8IT0xZTL&Bp=iTSXA&*!U7xa=aTVfmxVf%N7`Avmsit~)q z&^3=;-rZOEC6~3?(<1d;E<*Ow4N-VYL7ykUQ1ZGv-bLn)7tn4F0~{8_P6VHtBnh?d zel~dpUcyDnwBwv(J9}zR?~Y?2w|aN4sQnIQD(>gRA;|n>tl@9%L2=Lr4aH;RI-@gW z+(`EIo{1sLIXkx*ZZWm@Xq_S7jbIOa5UUK{!}31}RW^-aYd$!}iuR5-{V@xz9b12& z(}WGom$TR(dwYd8pMz7Ef+{(+$Y4aW&Knya=VPq@zI&BJk1^}M?_}s*ENayTNoWTF(JOF~GRd#<#Y>#v&j)Z@u(xHf~G-rv6C z{a9|Qi;uE$KX0Urdj6g2>JFNS$ z#7FnK4~@nj4gsjb$=Yx4)+S%==nDg{d&ND58Sscr@S%d(_hz#hA4V&S2D6e6k#75y9hgwaE7QFS+&Q< zQ>xHLIo|AwBpz1lMwGJGZp?kqGlNGnyte=Qr~^jIezdORO=?A~D|;azug^xsY3+bF zRB;1fxQl3;;Tb|j1}8<-mYRt*M3KP*yh_7)uqfY3!^cR`_(bOtsa@#zlKN-`JO)so zP%AxU>M}0AEnwetw(3Chc*k_gAj8uF)freVI-GckssxqkbqMp-C|VmOV>WSye4fEh z9|%*nXRz7>cPaBSnB`#1KqFay&~3w4o!7=AN1T%6ss&SM-I8f`h78Q0`lXpw>}#DN zg@Z8NSEyYnozK(7nPHq(GuSf+@3AhKM%5gLy~Q z_?b*P+j96m8mu4V^1DwfAustg3A7PVR0@Uanjo{LMr}igxO0rVQK2`KbGut!!b{Wo1z+%RUyR z1jMk#$3k=`;qX~{EXtjnaJ&)u>#^SM(q4_FO_Wz0@9eI8;CMrYDI-TCvfOkcz@u#? z4TId)Xwv;iITm-&#!9n2)TQxCkTc|sH`#rs1}LNMD_?$UoUDvVW>-$%RDSQxzOGJ4 z-7*Q4O{&T@I9jxWzSi3OIcp0j8H-uuhBG(8@pN1Cy?}hs^osB~#~#qsWWfl|KPIse zXVSu=A#~=^6Mzo3oFOmuCX;}%?7cIV)^!hHxORjQ`oQ2l`A{exxY#i;Z)ot*|3J7_CZ9dyySs%fEJR7M8mAXyyk7L})l#e^Oler(C37DOYsKB|! z8S+C?`LItyJe2Q-v+1AP+O7$4I&(XuPr_d+d5kiecK8-tHVriGFO)^Ml*@|BTbw(l zgl`F=tJ57u$W_P#Nxotw^}rh!qI_Ibn~UyL`o&Yq?PDzbiy_LlgV{g67@>G|WffnP zDUs&#IbZt9t;~4;Gu@Wumb2yy1HuQc*IsJqE<{!|BFn$O^teZ>PJS5J9wXfx+#`y9 z4=fgbJwcBJk&dr3+{wP*e4zC2#Qyr`$5yWy;ihP)n;W+XFvEAlTHW=()yVzMqI*Wj z*n#7be(nw&P3RxKySv|e9sh2BH0eteq}Z@+75Yt)Ym259@a^9gjjwJ0R;?RBZ&nYF7s82p;- zbh^3)E<&ka+^QSvpGTfURlGCc%vM?OZ|$tAfBG(M;RkYtz=ySj68* z;Qc;43Y{SxB4|`S(xIQ|sb82yaZ)hPi3&YfN6bmB^no#ZVm;S;cC0BaP?73h*LMiE^SEg!d=5{SW4N}Qiv)_83*@lj=}dOC5yfPu zy-R)(!PC?Cp};4t`c^~pGZJ>YX)=YY6z-}Yxk`a6IDs>N-TFB^lfe9UjA@!kGF;?7eT0;RPtafCSzXhKtqY!V@kWgDG!%5u0rN@P4&3f7HAU(bC7X z?+3N-FExH8(qd(R0@?>829Gg7HoTi)|# zXSq#sBG%-lr@uyU(-&WtEV!!-rGykF%@6p~@O*bx_}4W>da-=rtpr(#d6B(yd#kcH zk&VA|P*GnjZ{u7eDa;M=NP}$>9jv$kUJ>7z3k5!d zVO%s(agLRS#^#8XN@d6e-#*SuwkTN!`ywy7Tf(>RqSg)GS7cfoXThO0IR&yopwYGc z?U%gd)`4r@qqhXpa%>}~;rc4uQD_hFmZRiO_RijNL{#8$N*n{KkfALzQ7uv}j(a(QosSyl z=xp!gBe#yeN@}PT*89AcI5oZMxL)aW7A#1V78xBs+GqI4NiD|5(BkG;?m)a$JAu+T zq%QdSIxF>Vbyq?D)0*eFBdph;D-cO1@0zrYmTjwA{gHu<{7Lz zz;T(thXp<-@Ku48gIq62;Anxn37jhMFo7ouyg=Y8Ek7%M_d#S_D)3T)=LkGT;NAk) zAL1D+f;I~rEwC1Qe60}~87sKH&R;6%62i#8;j>2=Y!!I5$Y`&?y5hPf4krrvK!Fnk z4iY#=;Ln8L!vZe_U(0`;Pt``d11pf(vJ2uJq3qgM(@JWFW3%p0*GJ&%Mo+vOX zG+L|FW|6^bLU2^jdX209A>~sLb)4)cYjk!Ktn26d+b=Ye+j;IiBIVlyhsdd8H^0O! zO51Wz6-gYAob~9e+4E;vrYx8=B`0_K>{+^tm;YYhvaTtA=Zhw}wT!c1?X&Z=882cg z73n+A2FZhytdgvFcpALC1@e|S>CKUswh?D0(%03upoLR`-IvQ7&OggRI?2Ogfh z06^q`NH2;2cZjNM8R)dYghTx?Ev6V_qKD1Fl8KVF^1Az%~Ip@Gql(%>$ZTU?3sqe9Qx! z)-cAu!Aq;7Rsc_408g!kU~4r15(Us`L_idPV~~0QxEuqY7l31sLe6Q-1DqyI@W{-xxh+;obzR!2G+*E7jJYP0bT%412qW+2AGf@ z0ivl7XtcmU_$T@R$Q^kH4%D8E{ObD1e4R>IKkfL_idPV-L>;doEXmTwtX^&iS%V zTSWpl0Zj|QX~jdsiia-ew5-ztd;F8V&{sHCn#u*;@ch?iK(w9F8`Ged7iMF0MS}s8 zBFB_AczSv?rFA~ZJUu*=|4H6N->T?_WbC0R@_*>ypX{4t@K5r_`B@cN&zLe-WUS&u zXpBC-e*OW?Ogw-()yyPmOBokU{Y0lopX^;6vUgEj?nYZ-;39d3ya2jOUI3lq4m=I+ zw2N}tyUP_1ozmql+DZ;}Qpb7(xVjzzPU!{k@^;Y_0Z#F69s!q}BG6dgKwGsC>ty2s zxI6GPG=8cm!N>-Ur;} zlox2LFc4%zQ}6<~JD^r}chH#DDOU}t)m{2J<&tx$RcCPWpCdpn2>2*)Ipm|jMNm?@AeJs2BfUlo> zA0Uc!UGo5^b=#(WK-bsj0hb(kTQSM#3|^GRA>?D*)dW;nU7rfzPV1CjA*z78T&G-e zqYwJOD?_gAiijQoR}H9+jSJvT>rz(+eB|o|)+v`9`#<*raA!>m;L4CXp}Rgsz@6q) zV|#Zw%>#}5fL4E(0g3f?xw8J1ulKw2i)XVY|2QihlEqE z0`VqrcR;P|(&v4^MRRFmdv|^61MU&P^S?2JsK1MVUPB%aSB5+SE}CrJGvE<$$tePE zaw~>WBL+t3-xa{!fv3UEfi?`?X_7XrfV*7raF<(Y9J@0bkMzcUfY0rEk07e?JiuvJ z=8c~Px<2m%L;>jePZ8kl&kb}+?-P0-a5>;3U2`BNB6oXT>Td5Y=ktJn0P(cvKlK4} zt{ZTy7lW^8s8;R;;1n+~?*o+Pw63fB<9)y-=ktJ;AAkN+1W2qKaH?qm+#T>IzOGLN zaJT1FV|#ZwUk{L6JpUz`#4ZD(TYr#aE|~{e-{Dw0?;Gdy$RfD zvUT^zBjD1f2taNXJ)e&PcLNgta{=5P&=cRihK*^Wn%cYT(|SNV|8v!#v4MYp-pYCt zHKtvZF4wbj?*qPmF8}(-=W>mr_ID}p+UPW=+-t~N-Pccdz(=~S&-;MOAD1?^CtY2i z`T+XBy8?+^G*Nn;cqip`b}s-8Rox*U1umLw-TmqFfUb`S(DUDwA)g0aG@1W%0bChS zaT?nZmiJQ zKpa8p26$RFE)Y?T?Hkkj*^(Zy#`bvr>qjepui!rS^I>Oh*37?|zrQbmzpt-R$CUOp z8oip*I-g`lFE7tVax0ik6`InzAsKsldMb?^{1^7_{;lM+X$DPcJ!8t;Q^ETXO`5JlG}5-@huwm|6psafe>nj z|IIa;-UPVO(jq{YS=#A2F!cegK-BnDK%FK`=l_I-1FnEZ=QZG%ND%>k%cau-1HlD_ z7=3_8K-hx>pSWDkY4=++?ff5X-2uc>VMP(E(e<7e|n9^8=W@+`J+JmTeoQ1{Rb5Q>STx-XommcH5wIKZ$gY{ ztpNYlEt-|C(RKWl07EQbVN4SKzw=@@CfK~PUBg?BOua?C`W8*U|NlR{M$=|KYAQbPy)BWEVUb~B z!31H!!Dby(I@oOXZ=kJ$p$kZ8#^Rzu;a|v`>g#r7ON)|!*WRid>R5O1KV{HVU$<+z zB644Xxi9HNq}=!ayc6jLW}{Jm)rn&fTCPQ*)&`w6U2CHRa(e!|p7;E@&mX|9rXhQ- zPk1aTahH1A>H7hl*0Cil%p7Jm8wsdz_*16;?T5)87HdM|I%nKF9W7G)k5s~lVpE;#VUD{XOB|O3%2JEkFa{_7jolsJVV_yz}?0rV*q3OfB-6NAl7!T*C32n_5485056SUrG76>|+H=$J0L|!WBAR*r+=tx1I z6EyxhN&8%HEVoKwt9cXX3cUoaI~XJAw!%Tapz#MQ+NV^|7C~1DI!e$ELF4ZnwU7CE zo*%cz_)8QFlTb(&wB7`%g2vxSYoDwp`q_fk3s@*`2+Ia?XoRoSA z8h?qWeWnQ-f3Bo`mJ3>+s@DiQP{_*!t=y z1x>%fMjy8fG@52Q8shpecTH5PCYPFybED{`x&daYMh=>ef~++=hmDax^9srrC8-ct zTD$Y!hvfv>s{fCY_|t3YcXX{8>t$&MlclZxva~t?e1$c25<|RKfY$)40rLS<0LKA40TqBZ0i}SF z=6KG`MPdTruV7jF9q=RI3g9cir+^cH1Av`?4?^%?X#(B>Yy!LrcphK_EC$R6Yz&p9 zb%5sq&j6MI@&S(n<^UcAG<@t^hR6?wZ+@LOPV6sDlEZy-prEdkCCfVQ(K0~x49x~Z|KuaR z8E{?8GPEBV=sw*&k`wn&DfD!XyI!@HQK-G*DcLi~;btT#LepWUCX@?SufioCd)0gd|dUjG-BuYOsCGYc7xfl=ZsZsE)UL;sXC_8371e;3X%uh=_IK?xzQfypj+f7jjo zg}vIigbV(KKRDqHUIm3|FiL)vmyo(p&wMcSPl;Qacx0e|++#THReQ&&qJ%KnCH&Pa zk_}cj7v|ExZ<TjOSnzq*t>@;&l1;G+iVPMDFBfp_8eEDi(WcSzFnfc1bs z06{zPJE#C_8~jya=pIRm1|*MKg^@aJRI_=N(%rvS?tNqP*h z;;ba?1uVnQo_c(Oztsf1^SLB-yoq0IHONwXz#_owfHq#T)D!RsU=`qva9KJXj;ZVy zBzi>P=S2bi0OJ5t0W$%Q0Tu$50agRn1Ihs(0L}u=1L&7Hr{60{75F8Jd^{!V=i~q2 z9flv#Vtp7bp^Qb+wNyWy7ojGfK6=e)SQ#wY3Zd*8W@Gn3>w2{3PPX z`6zliFD5Zj$^kD654{Fnx2~FxY%C=>Z-Hcq#9ZHC_xNNa5iS1z|0YbIJRx^N3`&B{ zL9{IO0!~OwoHX?jsiSlb3|gcm^dB}NW=#JSQmSdp8%aEe{k>^&^FH;BMCqD3{;1Z? zMS6cym)bVsjU^V=1JmKc+(?w6iNYH3vNX4r#ym|g&OQ__tcegI_@dAwG*L2m`SZY= zL$yVe*W%$J>omm?t%RAERwG;|W(1O$re$d*T1)We5Dzw2kzX z?B7h61Fg$n7gd~-J1HhTMJsbjBi>l8U~AlYBe-5^BOceoQ$<3aXwn(@FA?yo#Gq+8 zO?1pyu2Tjc)jVOrWUE%ovhC=@=v!b=8!sS3`v0CSWH^}`KBgP-Jn={9F)m(r;>CeC z&Bg0Myb|#6_s6~4)8p9aKjvVS&1Zl{ddWWO^*j)e!f1g4Zb=7 zJe!$Y$Wnr(h5aq~2;Yloatzqi-{K}9F;mk?Y+?Uyrfjix^phfcBubHTJIP$%tj53E zx5Aj?o$Zx{++eu{${4~@+;$|+0sMWlP@y);y@aY~WrZQD9QrE7*Vn`>3BD=4(emV$eDNx|LBIrgV!$zf4chnUT%LuY*T0eCg5 zraIJX6$!JK&yqVdr{d&5Hjs+*I1sG`<=(+o(bk5lGGQl8B(qH_VAV(^Du`r=-4ODk^5TL;h9x}khC#-O6J@U z$v7fXDjkO3UI&D2fgk)|qQ-B7HM-AmjDMXsxs^n8@(8SBi3cA|Y4Xuv1G&53@U{ji zP!5VRdggd!D;O43ko;u)FCA?>B$FIwRO*Rm?>kqHj-X%i>JQi@GIG)OCm^Q)yfPQR zTtGgmsWMujqos;*=oRC!G2VUcPclBCp!G4%^u zcRJkSB{h>mI~|UP34WGG(v7u@ zsRbrS!ZunenS|dc062uLI~^Y5Ed@>PDg|L=2g#izKT-HB*}fx}2jfDn+`1zbstf_u zg3%+~SUnX#F#d=nP20+Y;iB!)dED;)Jb7?L7ADfb$0g~O&~wrDt$FyF2n737p4`*7 z%!VJt2P}Bk-fW&6(UH>U0fp~!|4nH({bBRuv!lY}{iVohm@(w$Qb4_5jZd|Ag(1f? z+apU!q_U%068eD@HrYoC8v%@2C9GR;jt|X^(UNrTE50FLR)z9n`tSQw5wtu~EwXwo0$B^xrs8{-{8+;8dL7&#rL~jD_BJA7!g;501 z<%0Hrf_>r>a>pROvY-8l6Y*q}+{SHt|VxJn9^ATD9!2JSitc>sfb3EV2Q3-f;}q^iliT ze}bOJ_3g6VG(ZmV4cmdWHlS>~wsBN)`r1c5CAXLR+7~^AnSJ>V`_`xA(1=o~Q~}&S zL{;^*U*hUO(W??Y?VT3NM#a2SGxO%2WqZqoa)h!|WI1goPB8!?%f7T%rH{V33PXDN zA&u4Oi}uL$an~z3Y>$9%k8`^7>y4d<(zdm!k-soX-X%(uy{l1)LTPW>)aWEPQa10> zsy4U+Hni|;`l0P&Q`^GpE-kXCZ-;GSGXB?P=+Xjo*B%Of!dO~((kB;-P5NvQ^bUcm z1$GF0N8m`I-&5cWfwKjEVb9JzR{4FUn;yCuSg2AKR8)d7ptAwf0QE^=^ub()bje=( zrl;k>){6bSK#)k53RxP{2CIn=UA#ZRs{pUmjTd$RLlaA?b8fc1z{`PNn48{M@XEk* zxbdCtUv)&?s_!(Mns4)m+$=cZ<08ugL(UeCzcp7~utt{)=LhF<4}duQA>iyP>_ zORe0QSR#kbPDMamjkMhCj5-x zyLK2jk^=8~bNI*3gzz1J^#>4?@Wr;~7Sd+muK{7$Te!A5vbN><2ew72&>=hzFd1pW zPXP*%&IjgOC;T8X(qEwK{D1-xb^wgfA^Z~{2I=}1SW16~eNzUM>Kpb?*fU~M90phi zCBnIYGRgpW4K8zP5TR1wF920Y*8oSh;^{2lr$xF9*snF`n}O3sns&HbwX_wXMuP9} zWes~pVQ+@LIpJ0S6=@6bF#u&&4cy)$G6ODci$YV+i=g;1IW;`EO*jg$1!)U#GJyIP;h}(YNL#a!cuWxaz+-yw8e{|S#A%2pO6ocpLHmK%vnTor zj0ukd1S5lN;Ott*|sRIIkn2xOs(iOnd2lBAb2EGDVN&G?Rlo>p;EZ}{BTf_(U$6k_}!?ll;wf*Jy zgYgmr_L$!fwqj+9o$~J>Tsvl2+g%?9e;XVT{s~ZpG~qu1Umz`IVF&??u$6`a4?|xd zKfrdtYUsG{gxz<^4LfKn3}|Z|IZ~3wAx$_2kb^Yg9)NtL2@eI7Ae{}II|@S!8RP@s zd;lW|n>achngH;`W-!pi{XkapkA(k}O19I@U4pYSn2@KzksS0nN86!cCw z%?3Vz?duk#UE5aNLt;C7emZ72@Cp9~SckOq4@o)=(B=T(k&p6pHn2Pc1%gg8aG&}3 zpYtdUycLO}-=zSdM5Rodq0V!_x+7 z*M1lO83K6v-k9*)#fThq2=668nsC1obU>u5t*hYFjt&K)26)_B%+W|^1GjsL_ufR{ zjQ1pr8)OXJY8yre(iY(H+c8xmoeex_2QouC1K4XPkAx9;6M#m+X5i#q7~;?&d;wrp zL41M4$Gb6~BmD{R!aaO)$OnFE9{_y9&jV=ESOa`mq^p5vA3&2qCkObwgS-M2z(WsV z!U3N)Jcj|)OoaUo^Wo}$7~@|BK?1_h3PB0*Nx>&3rZ*0OR}UvA{2$!TBQ6>wxzHs0nI-<37gR06yVy04fmSE}tMX@DqX8 z19~I<8gSO9)czoHKSkREw9W&I>;|zy|=; zNFN6N>l~U2Y0vX`XaUIoIN&1}Fja$Jbphl5`-^yxfY|aS9x4EG>Hto<#53*&aE%5eQbTk|p>;m5X6FMoJA>fE`%WHT#Asq?)3V>=uXABhpO4k5){tGsU#Nk_* zJ#TZq3cLV7{f01p5kXoGoqXV#GAaU}_`j>A>i`+xZ8Ne@jVThr|>wqr<$j`UH9ld$F6Yw07&c*Mx zNk;%w>MGz4M!fWbA(sPO2B0P&d_kmZfW3S;-wZrjq_LThW&)N|#=vd-aLWTf_yJ3) zA7Bi1M&PM{Y^3vn2l&&^a-s$~NaO>I6baxTgG9}mqn!a^;1k{)%K0_GUMZ3xqG zE%6D{Q7xqj)2S<^3DfE756~w}r>OO)G2w3klTjJMbiz4po5~Y({7J@y>1dUd2-C4D zIU;;Rr0Lj^ZsSRxa0%et>$IoKwl{00Bza~l(n8w(Hs6`u4F3_MwRFSg4P_g4ZK&8# zy`g5q^$p1z)s0yjb2cv6n7?uP#*&R|Hdbt+P3He9$!v8ahJhfQ9xBYS!c={L8W#Ey z!dg@r9yC1E8Xh#e!1WRT?rvbA;X%W~Jc1vgkxB=QH00Bartc&+{^G4)Jow;O|KqE_ z`{sYW2yY>T8t!3^r>NsOns|veF7YF&bV@qe1Zhn*wX~(4hCJpei!AeeeLWtYzg5x2 z6kDLIrIuE<(#wD&PAE{~j0!axvgUh;0z{=en{9$|zhSYX%0_3LVkq0 From b6430e6eb625749f93c0f4cc19d695ad7fc3b106 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, 21 Mar 2025 19:44:31 +0800 Subject: [PATCH 086/233] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/native/packet/MoeHoo.linux.arm64.node | Bin 1302216 -> 1302216 bytes src/native/packet/MoeHoo.linux.x64.node | Bin 134216 -> 134216 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 bd2c2eee57606763111d5395c0b1f8de6e262d5b..d4ebb90f43411120e9aebb69889e72a2034e626e 100644 GIT binary patch delta 176059 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 delta 176613 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

TcIV@MGu-$d7&ip8R!U8 zh7IYfhQ&CMY0PIINX#=p(-`oQ1Xe(xNsc7&h9odv2t0UD=C?dp?N6@GM)Xw!S`U{5 zUy%fd2*LA`AcV@r`vI&+Kh+-EM-uA=`k*Poa{8$OF

p3~&lo9VwmGgGbZXK>scY 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ྠgz>Ko3=sl064@1)3rMQ2}8U67PLJUw4Ic0tiO739W-gz)dZ~Ii(4#s zn=E)g%Gw=6VM`N?zf6?+Eiw)5To$yiENEX)T4?txXwoiH0vz~>8a!+s3XF3sC+Gl^ zp@MOz5ujw;w<(RDm!E&;N_dk%D<&SdZ~JUy8Z8*f0rbn(9}+Er52bVq-L@ZqChgB% zG=~T+Q`+}KfdTd$38d*4v8iSmtOuoA=)L|rXad`91xrDJ0hUMtY5FDY7m1cMi>I{M z5DoxMVCyVkIWZ_O!0M4entp-13(*pogVHU!^37p8&;+)~1QVAxjB9D;eQG;+jehe1 zJx`Lsh|MW?Y*mFSkt%hgv@~RGloqy*0zE|n(~q@{_XJD@t|Lww3S0#}T9V21V<8LF zkepMQWNPUFLjfdr+sqy{G;TUh_7>B44{7L+ukHPv~!unOms-EA;1Y?^Q z;CAtP;u7(>;4vtxC6tvqN`8~_AOY;D&sDdaC6AHLlcX02=?GI=?@aM%fWj&rx6c(g zG%->*okeNkENejfSmkjy5sw(^;VO^W8B@V%bVd$n%@ksXKF8EP8kt7Bvp`#W;#Dda zJuwtC^~A*sWuxt}nhz8>hUWb!Enc0-1$|hTUx`gc&SL?(SpZTwfIfmpg5F^QJXSuz zBHxnB>w`7}^oBC|IPu~lY|kIhNTzE5M#FS5pjVU$#juz>m@WdD#z+p6m_tC5nHHD= ze9-Bykr@vA1b0|(@LEk?jc|p@D+{dY5|%#jYOr7PaD(iAk*UNT&}3)hp;=7`>wS=2 za1CXo)MyikZAL3vo{|8LbAYrmfJzd;AptPJ3h<`{u!95iECaZTw4uSz0-%Egu<#f( zSSJDezyZ?B01iq3D+EAe34nsV=a&+|BIf(0YVY|OvW(7~FXU>Pa=O=`v-M6lpK^X6 z$;|-mZOX7^U*JmL6p3LnXjNi3_61&u93wG|0)6W|A1vhT73R%XP%ekxmnba;3e|q* zKVZNRyn)0&{~_GjBHV!s>jPvs=xzTY+u9-<&t>&VY(P;sUUd2o;Rd{W zhSZ0Q(LHrQyUK}_-|N(})EC0*GhdMnq;yk#Jx$n+ zSz^5Z0h;RSZpulq!??ezPj*|lc*l*B_>V%owInXWMcGv!+DkUW{6e8?ImzNLjnQQs zF8nKG87*Hd;OdxgtlL*;1>or0_aEQ z%Ek!0@|7B_jO2U+he?<(3(N~9ujmEwlw3@k1HdPbslJpJ3$`54hfH}k@oTt87i1dB zbOOCoVp#Dt-fK)ireUO35_3Fg>Z=Wsz-1)tP?5ZmY8ynZAlIA z$u04xw1^H=_lN(Fd=*nZhp!;qIDkHl)(8FeV*sqP;O)((b#8zjS3$aPe^6*xWglp==5uBR{PCgkJ6n_w-k&AVErPeL#7jF{&mRa- ztm0Pdbu6bWVfkf3u7M=i(4_|V&qIOX0}DVqOop<(nm()Qw_oQ;{7%pTkKs3NKThL% zguW$-Oabj~iZB`*G2@UaclT&Yi|(Ee`sP{Fh+N=hi@*z9K=0mZpifx^p0fy~a{)c- zj|aU^5}?C3rGu_|3d#)YB!d1);-dozeAJP;)3XuE3{xY}e**-(*Stcl&(40MHfQgB zqt;}tzE!Jx&j0}39KyW~x^K-ke*>P}Z^0Asty)t(v5B?$R;>Zy6{}ECW4Rhtb;1BX zv0d53mVc|(3Ej9!_ZE8AlkgZc#m8dU4)M1TQLW%aQ%SyE_tG)`>!-vd`+PUbgm8ji~iw2i&G~4?Cbf&PI zgPnrBdSxT?TE#8faGe@nFVbmTt367*`~nr83gMFBK}oiBBYSNXZ2kxGXoQl@yIFLg zj#4(TDc`|{Yr$vOd<`pE4fXf2fbU@P#jN#r+~k~nj?O+)VxP_yeFyesY$Mo1$4eF7 zKV81j9N}dhVX%ad!8%ffQ`n2EQ6cV`t>zU{bLk6#Yt#UDYF`UouYT+y*h1?|6)m$= z#I0LHugES{*bimxW-a!s)!3aM)atzHAF-?- zV4<~a<`1a)ZK>+Yma56EBS$}`>Jd`auj*CfVnN(mSiB$WzqWkMVVxudvVA*B3%?x3 zHbN>i9$AI~)}Jch(_D*s5{6;W+Q>5u8X*jt#9l0b7T#=T0oP*INwt31qxEKQkOKE8 zEfff6mmm;&30Z~$BPiZu4wy~Le!8BiZ~o}> z>zblxiLKh8)($1WDPZB(g<*5De+2UA;pG*u ztJi+yHzNtalvUB%q_2gE|g= z17gxfwRWR_0oPTkm!^hG$iwtT0opmJai_gWDFmV0cN5#aQLP)d1}sSv_0Kb{0!?xC zX~2k?g^Tt|DR1e2S!r6Mz3E(I1{t+^KU?4yxrBvZT5wAe7(jv90?@Fpj z^btktZ&>D5Ox|Cz_$_!vEr#{mq6YhYXkl`$V|7NUwVs}ae8a8Y0Zn77s@Y7j&!Pu+ z`W@^^;NdYy8OxkMsiEq~b?oTRYKYy5f=kECsmp8j9e@H^J=}07_3#<7t+<@tS=5Pd zQhkU6lMsmj11#W)RUm!GlkiT+ql1aufQ}z z5k|)?N=u{XUrLKc1Ob5DWfVXvc7LGJ{m#CKkrZA}NZ8~7#{{-<7Yt7dSi_%GPvvhm z{AV>NYB$QMh3Te}qJ{ot9gSa~`~`s%XC^;m!obI6@W*}_g3Ze-#XNq2d*xd+SW>`h z{iN1vy#V<+lWkdv$4b-ba=0FtvJ05dAf$o@x^q*jKF~FIPuE}y*TC@w1Rs@HJ4QDN z360W)Ue$$O`KRHA(P(0B_uF{gI$?vKobpdjXfcXh%WAb94Y0QR5wP#~}>PXa=LJqv{ z^#OSNbVLrg5P&gLCBPgB@C^Z2T3qJs>;eRGMo3JrO2R{hz(rF)AJt{g$@FM35PYRRxC@n2)lPN70wnK<+pf9do z08J*_Y*xl-V(;Au1qOHn5|F^7DJ`Z|ilcQXEsiTwi5B1;Koj_43wUe*3Jh>R5|F^X zC@pDTjV;=Nuook+-mzfyyYqvIbrZCVb&b-JqL(N=+1@i-+=h0zh4;h<6r=GQKXa&F zQg*1Ng49D&1^-wo_>0n#vb!iP%uLD(^6S(s(VUg=r6iCctJ^ zz$ z7cFUw@kGIyJh-C;xGklnMkaCK$2-m-lx;Gx`S8hkN&w0i1Y(e9gspm@4GTwsCetl7 zK`JO%Q{WlFq6VcU1^p>KIS}tV^P^Gr?k?5SI}Vvn6I5RWX~ZdQCrZCZ8vSc%O528e z$SV=&&$mI7b`wmX3ff&37>0J|DJ^Mtn$o&vJ}wU^FvJ97SB_&-e2_W*!iw}BE7^m^ z(GKu;H(A8OD1y(!#(s7y+qfGNC%A<7_mGG;C3Mhlbe0`D%jaN;lvoDt!6niUNi!U) z7~8ycEOsw0k{I`b z=yQ5y<8<9SL1L#V!AN%{Nw--hXNhV8mbE5}u$g#rFU|mPF^;UaG9bkLQGxy5YW*$W8>{i~tO9?n3jF7Fe)~!AzYKo4?|JXMazL%-yAP$Z1MFsRA5iNy z{uS9q|97lV*%K8iTd!B9e9vwkP~XI_(~Li;4zC}BU*EyELd0|7DcFIH2ClJQrSwRo z`MY9=@X&1t5{{h2xfHS9XYq&BZuI*{htwo|+NK78jE#~4!ItdEAvMS|j_|~b=zW=T z7+bP%7Is+e0v8;1SPf3_1w+w{X6#Puv(}6IpiAJt0*1VlV_kz+z+kR(F2cMF}Rfoir0nYNM)Rpa%8B(qw`?By~o zmI#@8rp#mK=1;*V+i&wK)?lw180AEM!2cur9_v9ZTgq$no&bqQ2YK)EuA;?)UzP>_ zLml3G2=XsjnDP6A9B(qmi|P)Rzf6|LYTsVB?GW8g@sQXE2@%s)(tJiS4NvA)oK%z8 zb0_hHxcVu2#%bZAS&wx;rG~H;CsjXuqu|s@dYrkEd7V<}K{27!G-souE6b1fgDdst zWA|6G$*0shLEBJnjQdox35*ZQ4Jb5xW8F&DpjfS?9$3jfKdJ@=3b_Ur^-z6%b^{NW z+3TmF9)8yGG@jOWIHOi)8&0cU^2EyCKLfV3)nJ>$9B05*3^woM2g;j;H~0xWBh(RJ zW$TD_+*u%AJYyi%XB&uvgSBHl&Vs||9Kb%ZfN}NG&w+KqdDI)h&JpWUVjXE=<;#mB zE6SVizzW@b_g1i}=U~3yP;Qv7695o4xkvH%v>t_q`3hEW^C|x@$3>jJxtQZTpOdM( z^kv2;ma6b{^1S|Z^1NC%=xwQ@%2GwtPqoHL6^$VnY3(^56=RgxhY5ho|CHCV)<8-4 zd5dta5Ka@q`y^rRA?+mLlof3G2`t$L^Crf|37G;@MhuLQ3bQX3C9q1zCm^y^V(0Ix z;^@@+ZKe>Z)*#UG<2~AV;ZyQ}vsV`y%rYU_vWr*)DZJeK{&JjQN@cU|TY z6OxPrG}-e@t6ZQYXJ?Zjmt0+vt19H)H|5HfUB*#@4LtIB$%Aj%!K-RW<1plp{|~uK z-2XdEttOB3PAkdmXJ~BYW z3w1vt9rz!L;PTGD_~`T7hM0JVE+1+4a$*|45uu;g>Sspdz+;4!F`)16msQpI4W}56 za=IyzEge?9Y|8t%UPR)Y3BdSGf#+Gt4b>jk+hla5gZ>A6Vl~2_x6>d=!ZUZOjJ{z- z8@^6#(RDm*e+BHu|L|Iav{_Br0>0N^y-ZRDC)+W$TMvF zFX-2S@jsi4Pk2$2&w_8zWcQxZVHRt7Q}t|H1xgr3I07azLdO52)L!t(Hu;myys3sd zt|GfLM9Y~(dWu!Zwt-D4;oRN_!QIrXhliJukbnU^BMMC0qumm8( zDJ`A;4&^PgPe(Q>d&(l8(%T~6Q^?Dm+ZB0+5~%`crvyaLYEu$PP~0`5*0iz!k#fzD zS0aunpB6xC0VH~dKSg5&cho0yzBF^W4;mksGoD8U5t4Y+<}YfZSQJmR7_$yHn==k+ zrxi;K2?NVb!cugs4E~U(js+|d>B;{Cj2!ykWv1;(L0J(y(jy=%f-{T34=lj#eDABF zF$W=Mc-Y^d4O{;OnmVnwBsYWPw&`+PB)QF!+y)_sAM`4#kABcWS*6RlB)P98xi5uW zT}h5FHRekKSUcatQe)OK?&ML^giLi)Mg$G>eT7_JZR~ids@Fl^`>RYnA!2@U`88c+ zh$Qj?=(AQ4>B#JPE)x2zB$5VtzbV3(8tpqE)3A11(B)U5=6B=TNI)$?Q%`J?z-aj8 zJcR;z_&rH!Y53KnbejHxWfuXm)CAFELfLageVz&hpWy;EKz{~)BYtJ$qL}n_G^fA^ z4D%!gx=Cg-;A@yDHx!BmJx!{dt_)I8qDj)a54h(tmADPsu-FaIWQnmH$DOYw?u zKU1D9e1yI2+brvmYVVON@l67)n0$}D4muhNgZ4NKAT+RugH%lY*&CjM_E=V7?WgngyVe1fWrwuw*>}@TL{u zMt*q>t|Dz{aEZ#q2WkBTz;Fvd%25e`_RK}-vjY;ye$euQ{2tQOdCyva6ntb}(d-S2 zB-u@dtXPL17qYFbvdfvT3fX)~_A5iy_@IT5jgn;Ps%5v2P$2ig91fzt!!(P^$_5_3 z`H99&r*g4gco#G^rkVvbVWI>wjzG}K#?wKvP__gzQh;3FQ|5F0A#0NtA0wC{3HBF) z#gZU3DYnOB1Ur+UctNP61k#SJ(zIaj7{2gN@=#_tb|kH9#TL0~cBL6BqCfcJy_*)( zqAsLp)$2labREJ>3aH{IV|&w2`GgT*~&lY0*jlF4eUdLrC~Au~iG>x;ejN2*lIiH@cU) z?>K&>T(dVif@~x39|TRk*x$5cxjhCgqjs|rcbH-aoA0iL#{NvwxR*|jy#;i;|B%Gb zZ9?*u@4=QC*^Wn zLtiC9Y4QIurQ7Hq6r~P$fzox1$xMI4e<1PSfSnO@0{ca_hQ)**UVhO2ZT zxJvq0c}B5C$Wq#}?<;FD3f^?7tOdmAo=xT{=Ndq0K%$bSIF*EJct%OeV0T(Y3wX-J za6m4YTeSOMHE0Ez@q#{v+E^kfNuzuJUbXGUf*B>XbUa0cQcdM0T6jF%Ck zxL=3$MWzuD$d`L@0sTe%o@|o07HS`jEHcEOy6i4`x=#HamS~Y}CCSFKQ{Gy*y^oN^ zZ*x(-T$a{EVNn)Y2ba~CdH9hBAI%;fOj%-O7btM%OE?q;Qarevu5T64M))wkC#NBg zTT!e#>k6Q$5)j>u&AG9}bd_tMt#jf<Z>q`sep zN}?p&T9P%MRWwH)cNOuh;&}nI)&k^NUjo8w(f*pfw!@GWTcfr@Hcyfr;;%W{`AD*! zpp6z+69O|$fwDy}S&7aNXk|`|-_kGnBfOxy81R!MetHgz?&UvCop~9BhPf|*HYz#` znoK(kf=M;?R~bA|`49=nx_UVT8RH0yEJRA+%liSEz42}o8N1qBpwj>&b|W;{xz5I- z>=)woVqF8Z#yPFQhlSU!vR}@WowIF;lSYM{PNPQBa}< zNB3e`;EPKI!rrnUday^gN1BSM)@L}ahsz{R>+!w~+a07esutr+hCNSUf5~#+QT^%G zVGXShZhuUyp(WtY`Wjl8`d~3TSVMau0L=UcKlOFovBl=s*S+>5k=a0R=>5fPa0+>?6`3h>tm@(DQVY7K8e5qu;H`JDnX>OM- zuMWE&q774G)(#BS!j;-&)S&2WI&gzAsd6tUXl%484_n%rS`vOCiN9>jy-s)Nn_sY7 zHMI;>d?ic^(0bxZ(1TnfviHKZ zf%tPaTn)JM} z2)`$UXGQe8K(tsNv%NHEE-t)e(=&A(Nz#voWaHyAI-33qerF()IpK9~iIbo`;Nklh zVx90A|H?T_b!cJ1|Dd4kbLOIZ9OK3o>{&a-p%p3ZY1u*1hwL=AU;wy@?oKcr;%^uSIErj=On!Ai{5_P$XEXzq@Ii zt-p?6<5&`4%@4szQ9Ugd9^9~=77*-!wDCObjcqsz7O#AVvi|k>C^UOH zn||b_p0-V?zqVg}EkIFTS(_EDc_^L}KPL=YZUwqtWz%A`?Mgg*_DSv2oZmmgPh{C_ z-$(f7ru_=q=4M+{?4FzU6X^)G* zyM??$zudIGY!yK~D-~TtQ3e(_-KD%U$Rm@aN_oeTS6nSOtsPSu0wPH&`Ugdcuuv;0 zZ!hw4;d#xZyq(C)Lyt9PJqRLJD*B1gpJ7jzq(jDo%hkEa*#16VI%4|NlX^%dI zm+me7ej?HtNZ&)+@Kh%$guI(l-uuW)MBY^??_J~()&)Ip0PoqU$fU|oBeVES=^E}< zU^*@djt5T!`r?R`H=5+omVc0E45fXb3s04(buSxf)Cyq|np3614qJ>C=?vLJ?lh66Ae> zbaI|24w}(#0HZYV&_a(??##wF*BS;yph*ko<4s-6mio`;1i0R18=Gr`y=kz#i0UD= z%V7&;4db<7_2W<2rW7sGcROTW|D;Pi%~@ocR5mFdE2Rx=TfEjj@D~{FCJ>(im)=oW zC4Z_*&a+7Rvpy}fRMjz`wRuK+lI>}s)k^vR^4Gxk_nf4=&@8%mP~y5o)fTr{v0WW( z3wLH$vh^5j({>BhoQ^_$@i=H)_Be-4ol%Q5YN>_$rUBxgG9`mtdst>mZ78~lc0Ug% z{>^HS=|Y*hghm1i0Q} z^IK`tT828ax9E2`Z)>V+TuqzbLs&8c%rHxI9-3i8GZvv4Hq@hy%N&=jYBP#8yX$M# zzqR(RlEqH7)>`_0{xP1=l)(qO(6BaIcHAO>k$ndOFubO16m@Wf3J(K&mBc}{suV@m zqF$j6cjS3FZAlrm*02L@wAzXXd)P)x@$Ci9F=fE`00irips|kK0lXSTWONA6F4lrv zjzTZzdE_||t7y_M1x@bg054UZ=WR=W4kJWAa0+w{0$qtUO2nS{8fUE;Z5OOXzP9vr z&I@$Ue*sTP%t&09cdztmvc~b2w!6QuDM{FKJ;UZFX*pHj5NdzU9LWfw zV?>e(6P8>qO)tXaN-ca%l+6}pi5R@&(5ex9EY*yj!?KdK+Ohq?c7l(antU~s43=>a zc>v?lcEvD=ioiXH;ZqwyeV%80g2}4sGdH9cSQa60Q;qFJjW3HD9rsJqr--ryQI;vn zlJ1qJFT$)ya?M3qU)Cr^3yo?hl05{gQd*j>c&A#0mareXIt!lE)3^1F3**dqzw3T_Ru-p)$Gd6c*K1Yp9ld%zCv& z{9nq>wbf$$7C~E6C4|V2n5&1@j=kDWt66IvASg7_Fq&dvR6b$@I%|#DKkc+HecPkZ z2wbBv2!3TV+iMfuJ3xLJ^X#C-G;sq5jns^TNq0*$|7hANmVSr@Ga9x84O@bSEkVP+ zzzF^l4*eG5!5vF?HVjZ@%F+;?6rW)SOLopp9OR=dlG4eg|5YMJ#*ulfX{y#q zJwJ~^cXaHrd8UY?RpQ(x&~G>T1P)Z5t+XoPwKy-WW81=c~1LT~3*wxFxl1wp4FyVR9OpC}g4jpsPo zi`}%;`cn|W9l2i4H&DwGH1Rpj#`Pm4DjOt_MzaImv`irNW39Vu9UFQ(f8)jo;FD$) zl=*V5;fr=xme7ZzX9PJnvhTZVb=~b?L+iS0-NGM%BNGUirB>2JNVAj*HzDn5j_%e& z3kY+9fqVh$2yCf?oimXh4MXOl^Yd7v7Fv*RA!;@4=O;r)3o+}6Cty&%$xmP_vf%pY1&d>FK11ZWKUOm2(8%Io>~_rjQ!kGs~we# zGA!*}2+GluKvS&AM4%)EZ(wfhfGU4wp6Oa>Nby{K?Bdsr?_Tejlz+2dGG^(mOApRv z$?00Odqc1;XIbe`NnvlNYuWDAku!rmOxI#V^}V*8%#ylC*!AT z&lz;CH_PdzMFlTH7eqjq0;WDK1h_s!UMSnx3zPCxRss;uiF3#Rf&2(#9IM(}YZ)>g zOn02+1xF+Ax|40{r9~>e*p%Lo>^9Go?9TEbS*-`Ss4uU~WtV$vb)tR-3Wc(OCvAS@ z^hqc$L|%};&94NVLlu9+;-AwR`c{Xg9;1o@;NBH5V!*DW0V=coEKl~x+L| zH3p6InpFl}?BiSxTEUaPZ`l04T2Scc@CpTuSE|^0B<#|%wki6`+<|q<_P*%mQ0K#m zTb5EFre$U<`b+Qfh_$7CwML428vtx%3;JuJto!rY8%kyN$Mcv;&(AI&j9y_%e~r1H zL{)={ds|&E=PvLV(Y(-&!im4@U5i|0k{ie_4$yq?lGnolT7B$Y@>uLuEKU{QxhZEkW6@SB%6_`#e_#YTcG4trKX=I zy;;>+(#&>uziOMI`-{J8JlmJ4wZz>r-$B}^bv{J{`5N*8&HACPQs5?4PFzRRAsK+d zLGR6Cdj@IA@ll|OH{-6(tAIDWIgXX?=;?8LWl2 zt%s^;);*Q2-x4a(+@ps9awlN)#em(Fg0vlrb#jZjH%p%$DAbF%saLU;eLEP@^RCD) zzOHBQWBUf9moFk4(xVdp)w6$NRbSBd2COzfF6h~_pywub?F9tbubA(Ph-OpPM!l$2 zRcl8(Z8%-UkZF{601G!*(P0a4MkGeecn%n(d@t5xh}KUn{eUeWqD54F!nsIIjIZ&g z7yEk%PWe7$?k{U20{%dYDnpMmXnf*Mz0##?r@f4Ax$kQzBOUSE7u?{TnDUBtyTy}a zOH%zuJ-f~w9RX`ho#adbyE-GOt_NWo`Yr}I5}pH+K7tHrtx)7}cW3FfkTSL+PB z)}9-tEmYl?qRfNMd`){dF!OzU?z=3ygt|^mw5=y(MgW$0WC!p|J%c zw3fl?klZ^1Zh+>OXrbIKx*=~TyEX!=`{u0bNIX$F$99j@f>`H~T21A!PUjN+r%taS zddphy3|7K6qH(Q&cpr$3@i(uMZH;0}yj!dVlYvKRs~b-POBKP=6#C}fE&X1vJlHh~ z`SGwti59|@nGD{C(^=DOEz!dlabe*n1XPVp$<{g|Aa2h_T=ZjSvbC55AATNS2qr_Y zXnOgUwMO0s655a8?l8SWYW6as5=9w}Ek5JV@A z)XDn>j|?hqX%&wA@gBIT&NXs1KcB*FBUGGr|duM1q`H0>7>W zx#xi`oPGPc*4}+4$m(q4SZx_^O=l#7aQbZkK9BUFX>8M2?Z<$c06uZwEUSmIui4CT z+G@x7X*d8!5jFA!tg=!Nf#gPh&N9bq@o3*HB7)eO@mdI`tJ;DsmmL_dg`s$yUhFeL zt5tEUc6&_Y`JIUP9v z;%&!_RLh_-BZV4tp|7(B(NM%OF5K@EH2r?Idp=%$oTxdv`8cZ?jF{dkgGTTBH8=7w zov8+mDXbLkN7L3r{M8Na=e!4+I)FlQ8e23`Tc+4qmp8P5IpJu}UG%2|B{cJgB8_7$ zew0S(Af#!DmMO~ZNYgAqGsH^t1O)~hMj~DWy54^egJB@f^+D&0GDkJN>}`~h-%!^~ z1)ZbWE(~|rSj;5NqmkYD89d{&6g!q-!LHAmO#LJTr-}VwW(Dilw=u^Xd#blEA<=$n z$RsUH>B8Qgq&ceiJKwUo&nSJ5EuW+XcI*T25`=Mw&6Y~DL|de}8EpC@FAJ!oL^tFE z-IsV;fiBi+y3$Z)g!=^MIazD3Jje4<=-eyZRoxH(7fk)gPa(bepk=L+UZ>^1Gx!h|5h< z;2LOSWu9?M-{N$KjJ!18#fIi+-IPM+`=%Dmy5?%td>iVT^5{eR*A?ti4%&g=n<-=Q zv9Qc$LvytmVV>x+ktm{dmTiD7-EfJ@|3}%IKsQybVgDyR0fI8LVQ9*j3P?bZA|ORU z15VMaSQI4=Xb{kN6)h?n6>ox~20?9{c2LovsIj6J6$y?3QR9FX$Ec{m0izdh(|a9) zS8x8$KKt1a`hDxa)|a))bAIpp?(yt>hJ8)~?0*+kOU!}cKG;E6>O@ckHx-7vZ%pn> z-DQ`e#^Z2|Id^|!A&x6e(-OU6_d>CAThF`!JJ}o@I}jgu_Y35YW%h2KXWEzVwz{ov^DL;U z1Ri~38~Yn~JZgW-7RmiR9dlS5+@vno3FnYU zg5_M6&3_Epsd-z|yawAcoow=IY@-F(b~P7GTk|S#^(g$#_K=!We?P)-)^>A^JaVwH z@b?Ovcz-EY*B%$&FEwi?I%D5-iG0w8y35YStu2-Ud*PwEdY7yg_UyqGSj_L+eAAxx z^=iIcOu5k( za;0$+#@#2KjjA(muITSTLL0`LOtcu|&<>VsEwYu9%>h_GY`Qd9jLWVH7_t9SEP zH;O}UHczo_6}Bj@Cnv+LMqYKZTt<3HY`huM{3+!f*uje>(Wp7A%7l6EniD3PSS8I* zqIh{6cPHd^S#|R=(P^1E_IUY4|C;7=kp`2vbt)#WTurFOssavbEnncErY9_3_z7KW z+Lq5mtiC-;MvR%(L7*^9gqN8$oxVdUC~%oMy!)Iz)$7$fU2I#1i=ZdO&&$jS!$-&5 z{y=DsVN|-4?&Vkl{zUdq9R0SqY!bS}@wZ?SI>gFbFbS`MS9L{Av+S|omx}jpF^{eI z@kY^iIVPBYkKffCfk4zp@WC-TxUAz1veg3#{nvs!#29{& z>~C^V9Vb@ZYS!XtDo5Q>7(vCQdIZ&sJciqP1TD1cr$*2b@L5ORK%dyDd+Ob**^A2Q z0pyLS0rVhZ%a2@x!RKMN$=QD9V7zJ|rrc&8W$Pi9+=foP4&L(d^w$mIg`3fdZA-=f zZZi*Xp3}kq)eYj1+s!kpj)J{>NWCUj-EN-MWsbZrcaIgN+s!4mn>H+I!s21o<2UFs zdN<3X zUOWq8`}YH~_r8rHIPY6YiX>l1x~J*5I{O3-6!@bVpL;$HE%&o6wQ#seAo@8v&CzeYv17xcW%TH z!w|q7&*YeOk#3B`eC*vk*FP_HDE{V*$G0@?#5 zrw;GE%L#9aJ%M;$Om)4KWoOF#%%D9-~f8W2zbQ}_h6P)ig)fYM}*tq zLu0L;mc3ry+p?!+17uIv2Gq%4_H+Vi*wZ6_UZS>DLwm+*tR7Z#W+!}B&nJ4v{);ra z=kti+oawjGJ3&pF;}B4O)Wzz*FlSY)zh2IQYVnsa_pchdClht(T_bAZIEwBE^WK?I z(|n6q5;vEJyI==@a=@qe%I^Aq8Bnr`E~Jr7{AlE-_hNaj`CYIcP`Q$A&w#oTcHOMG zXx4Dq&DD`pjxh&Mw+`C!aRh!YJ+_q3Lchh`o9wGcm}%?afhI5gYF9iw-G!NK#1qrK0|L{HrK>M7QtPJY zE;3#|Ol-Ori&@r+`@MKSaj+PDpIKdV8j6&So{vMvcSm`5TT2C|z4=2i`#$qRvq#J> z-n!2meO%AjE=1PyFmXI8oQde}>fL-dyLi)i)v<37$I-db7$;kgb#gfcBYk6Eh}bG~ za8*x)?A^((=G(=lRpzN8eZSecOSLsWaZb1&t6@E2Pm6)8tm5(I(mlohg5oYOE8bgH z{HJDzmNdt8szDVNi?@>I)FC}%k0CqRt+IRNXujb(b=@Gdkh}IGG5T?H zA*T9m_^*MBFSgsVdX7iw9UPZ?rfmCu>T>&*7Qp0M~Y8zHbdNLMF0t%ME5&sx#kvkD#>y0@iu$Ll zLE{(4KV>C5S*&`>N>*VY|o(iT@g|~eV2)`&zL8R$_Gq)_wO*mWHvH8+(5LLN7mR-S_Gw;D8+khY0u&0 zJ~3q-RvCN59u%|JnWM3Br?_>Ub-Z4T67+!k49Waul^w>)Vlr53s0+&~?4Gr6h4BbU zR`>xVFRw6O5PHU3gdKaLc>Ea*Q)lc*@#Qnt;nB0$I#N`fjU?qqitVCmJ$BfNXRRHE zRrhDjlQ3HTdyV+lv(~t2yG9Ip&f5C+8ZrGjYutPymON)=|CU()oV8!^g3fcO(9Uc2 z%^gS2_0|BoRV-R>jfAD*t@T#YtHfXHt)u~!^sWv`d#j4Aecr0r;o{}zt@MY8sts29 zVd9t#R(iboDT|)gAw7ol26K+RI`-o=qI1e@z`)O4EzV4t9vu1Jx<>WJUsvy2UySMv z=ncn4t596`Z8T?%_!qit0Rp2?tc32_&ry^phl91laB#xgUmLMf+*iIqvk^6V8fnV+ z4&Eo&Xr4Od1!OY`uCtL`t!7|=R(N;M1naYqF-2XiF7J@V{^Gh9u!H-?aI}2^mjcx> zELXjV{^%*s%rD~jb}n+?EY`hfP95Ge_A`>};dTNXZ-rEm`Wu1kP-H-Cs>fk^)Jx__ zWcQIc<0YJ^Y)B~Yq}4>~i}!IJdC8oO_giFplcMX(7~j?M+2hOB^+;S?{jxdul<$z; zaY!js$#-X_;U(0^P^3KEpNGpV{X!5r3`g_+R%Y^Ps(u;h3Z&iBp_rD9SF63W26>c^ z*`cE56>C)C-2RGHfuqFMSIpXAP3&MR3%mh@qxug>wkJDWoD7Fg_r_9G)r4OkDO$^m z#>LVAus&KOY{qz#d2U%d)z=JS(>=wvk!YVmw?X zwrw$oh5N?V!uW7`V8Ru9Ob4RO0JiTd_eWf@2kGC0jQrTXv)mtW#RUCJkiG%i%gg;< zSL}BBr#2wK2e<(NvR1M~^4Mt?T&W)N&W5^w-+PonZeO;v$S<69y?`k#Qh&=RNYVIyW-Uc_xb(Jx&s~L+qfbw#? z@F;Y#v2aKAgW|Eb@%n#dtkci3tExwKN2t;AmvylIeQt%dm@RL1uZ11eX`1HlB^Mp6 zh3(()CXy^#E^t4AYAoSyiK2*lZ2tsXd6VP{scw=?Cz~_`ix+baLx%G8YI$qF5{a(1 z_FMJHo!Cx1@qbpvuPbBp5|_V&b@L;{WAB&;;k<1VAHRe1cF)*Pi$uk{)@9p|SBOL3 zH9gqVxNUgX+T~ls%6D;p(KCia@>cWs&Ugj=3cNDhdLJ&2F5YT7kLnq_1w}XEY2%*x zg#+P@u*q>C$HOTJ|NhUtgM9;H5ABft8Q8|ch98cwjw3ss+M8a$_ru=whcrJ1 z!+{+#cnG#y*zQ@Uo}BMkyElX7;^p_ulfyS7q%)K0J$yZEHrP(Lv)q+?k6#zTzF}{< z%~v7zx69S|-vxEA-8)Gu(W8CY%Twiog1296f7q&EllLp=X|eo$b9BwwG81&%A8^Wr z%*17X&6LkjJ`vmA$1A*t!@cKrVc}oa?SgD-`PuK$4OOisew(RB>_+kWHtVo{iD=)3 zi+~=n1!C9-mIZGzd|-~n-IzYrA17}80ITqL)lbSK@%jfiVaHI5U(l5D6ZT9nPuQ5V zd+yJ0GWtJH*s{mvV6mEv6ZXI>)a~dD>ff9(1) zR?Xb~V%N~W8i~e{+c-p1M>IH-D5T!Ezj*@EPSgU9+@E~H}J0smTy{jaq?$opQ^13%lAOv=99#t z&&-pnK0{mO!u+9FnEw<{@g|9nVa6+-!#+2!9rzHua$(Pn#O2Q}?}r^PIDU?^$6X9@ zb_lr*cJ#{U_(G>V6xTKwV(=H{l&X^vx3}TFo8K1;zQC*JX|eGOJQy1TuRdDI?#A=) zFRbU^6SkYRHdD;nj+KV)v5}a%R_iKy#D-&g4tJ~@g+3^DY&VC9*6n7uPQAc*zjnJh zc5u(wBglIy{ug&SzP@VQw-$IU_Dj5~{!i=`*&7ql8^548{w8ky5?`r!2GM(We&6Op z#10w#YKQ2-V#-(Mal=+3S`VMVpMP5OJhD#?)y;-@{412O{Trvp0pIoqVL6{y-U z1~z@G6X>B4ei4dUk~8n@ERPCJms%IxqT3GaFFOo3h=DuI%d0kDT7H*O(>zVA z-eKO}`4#lo6ejV1V~*;(QpWwhcW%qQJX8g2c|WTbVV#5!qp z>JZ!TEv{obs-pgLw%pOs5||JV3`@%k6XHe@z97DHyT8uDa(0=I2= zUUMHZ9Bx&S1t$i_ZlZrRVvp3Zc$U*79{=8)g4>KnZN!0cg!uJ)T*24G=8Azk%}L<_ zv6=MBqPpuytni=>f6h>6b;x9+FkGA@)?neqA1$7!W&x{#um!JN!D< zhwYDaY*@B8G9WgN!JClruCm}M*nUd~%h@%jGik$Ai_7CO$h%2^@e%TYZVEgNGKW;kS(&^En>#_Z5x!>)I zZKA){jts65>+=15c>!INAf*`AU7y>hVL<*+>KHE6e!`Vq zb!?Q_{gXKb8@QYPr?r6vpMRQTaV1q+AfEcC>BH8p1>%o?nv=1$eStV^mpK{nxI)-v z#p4AMwSfl#YU6$}>1Xrqo`Ygnq6%`#?LgJWh%bLerw)q!okrQyL$IwEAGXNt^7`fm z#?ED|+ySn#*p1l!760q?o=!^)jLl@M?BMQYu}@+9Cmn0e^}xW`@eG#ZrlKtPVQhb` zgXLUz4~!kbSh+KPzj$wj+ZC z4hr}hiN?df11op3b%Wv4Pj1~;sWbZNh$+7&_(aTTGw%pvb+>=40H5q~*$at_!|OW0F(pxd9h7xJSwVwwJbQ*tBspP zOl{!7gWA9X@^4nm>0*Z3z-pA*I8rFm=D?lhQ57BR29u*@WolIzuP7g!taRd{xn}k1@OS)FD&TR;5o(Yzi^LL6N@sH9O+ZV z-7tn-v1@2tjdqR0_BJkY;W`B0Gj_!;qrVo34#M_Z<^BkM#D{)42<}Vz|J5*4`R4$>&6W2E_{{b66KF@>Iv#gJNgN zoQMAV^zM`Fa%8`G_pSCvpmG=sBS(+)Ku6{p3vj#J>#ND zUKB0}?!76<<^F5k6s+lx6ieR~_OtK}=tULwsVHi)*jQnejq`)r!1=+nEI2=41AF|> z3&abiU7i(oU4Yj|t*z}Bh{No5o*(R1JjSou!1+OK;QY|Za;*?oce3}d{T>zcp+a(b zU>Xj(dU?Pa061p-Cf4DJuMJ;x?PNb_>{dkA{r^PEDN(-qKSvDfY#&~A=lT0y2IGNX zXZtMY)iCe98n15NJzu=h*?xlaCX}LY$9}`@*v|9C0bT6!$uGWx(Z#+8#B+mEyL5nt?YKWjjBZ0=@TOn%j5 z$5qB|8?J<95A1m8`cwXOzBr|u{U#g!ho)}!akfiE_wM$=6<^F32Y0vk>t2{AA4S+E zy^G8KjpDTK_K6j3^Tlo5?ML8SU|YM}Pr@61{d?F)*lIT%)5AW{Hn2K20-a?{#`~W5 z2AiBsH=wZd@Y2pSV~7a%w9oJJHEyh;a53;=~W>?uK+SYBjyUIS?W*aVEcG}x)hl?kB+0QVmVp-9(H==69 zgx>Z!SiXEttOQs5dftXNdfUA=vscV7y7sl-*Wl`H#8cnZEWzY8SvJ zzwwDLhmQQUmv{H3&hl3}UQ5b%!Q7aYG0~~oKFhXT%&tZiW^cH=8oguNDAw25Pqx9? z&wfmonwUJ9ZWc58+0WR&2EV^xvkZ@mf&J|@;=O+Mqoox;xGBSKm)6-s)LgzNv}#LZY~jyPwaeWv3GE1&!v@xnm6->Q~;jky=rJq8Y9J>`Fs+^c!L_<4}s zB~}fxA0xvmhFI47q}6K9^~$hBg)JCtpH|y)d4-G|YDHc!2lwLmf|(cN;_~V4<>@Z+ z?Hz<+&-HTKpR`qoO>X<}iefJN|m$uP6R0H&hO*nz=h1T;5iy z>|q#1==Ls#;aSmEDnNr!y8~Z-hI*hWs27@s&V*Lp+E!XB?a&;w{+!bIE@%N7M?S76+Dh+23(#)J$Nf}W zsU8h%eY&l5HZ-xWtrUS~Uu-LF=@EwGrM8mM(=hVT-q6C!2!vL?(pGAeoNg#d*V{@7XzC3#s0#VMiJpKqX4*)<0BwR^0d4&m1w(^v=m{4pUO>g6k^i74p~e5S zg-fm)B=`jxKwF>zXe;yzX#Tgh(sR(wP$0B7)EHhU9SzMw7egyOg;EpL15HBfp)Wyw&{n7) z`W-Z!z(x@pEzoZGmZ~wLP^yEvphrs{Stwl$4L~E%DD*C99-4$!9)ygcUT7;c0sRhY zj6%Lp544*bJqL9|L(uWi1k~ro{4Zc5Bn_hrr35q!eGck6xKPSKlhEzZ4730(KpnNH z$e2QD6f^<#LbK3$P@@jJ3|bFe0}VpAK=b>xm%L+<9y${m=+$1@GB%71s@qGhL(mde zd#N7U(67C;7@C2ufu{Pmm$pNj2DF!YkHg>@hzy{aLG7g`sLzdzprP9Kk}+P6mG;un zP|tzL2ioFkFQuT#5$&aJ6R>L!YA^Yqkx}iXP#7DD(e0(@q~YN9(k^J@nD)}pLosNe zKB)VU_RSp&V#na(gN4nuLs|w3jABy+@)((8{T(5HvRp1wmV9x0kLs3|+SiErGWD++NB- zTcN)|U2UlF;plQ`J+uLOA~X$M3e7{~P*(xzp?>JQ&}gAOT*_f11H&&+M|*q8F&Q<3 z)DNZUt`H|6F%?Ufik-;MHb8VA?i^Rqx>QUX?i^_wDi#cPj_EV%rnVAJ z$<{}vUtvQ{#k%3nUKPFX6K@Q6PP6$$SC8|^3S*Tx!Q(vMdFw8l(Z4?qEFpxu@i$&P z;&EP!u-XyMgOKk@BM`j;U-28^JiTJg&0^;W=V2Aus5oFGGDFozI`6bKh}|QdJmJxGCqkrDTPhvWc8?*vf6S5idb2R>B4dSrnDv)bld_LNFgso209E{G2 zKC`#81|YN^J-1lQKG-?fwnkicu=8BopW@4dQJ^2c59yq1TPx;|aZa?Y5Ua*G52`RW zh_}a}3qBIv>zp^>r<-DR&M`KR*i?rKN5qek@}g#}^Hke+V!>E+PfDyF>+Ci9C0u^E zWcBdrjlVUx*h<4DxAg}{BjY7$7dyr}C-%wWN<|M1H(U-}KD{eOAA-8M#f(ExVXs(t zi1VmUL*HpDeI#nfIs1zD4{_F1WZn^j#yLld+#ybTry^2aEC!Clu&LZCP8o;(jfzd< z&?L9mJPjV^;xlQJo@!d@%nhQXr}miJQ8;MSR63HdF2e_8OC~63V(MYeUNv_)a3)j%h6j2ydLjzjVlj1wvyZs`FsF0a_Ock6 z^HRjLcCf`o4B2&B3s*{P!{(H=h>+3pBlRP=k{wdzVY?r;@}~bO<3#P@$YM>0EQX>f zi4L}U*kl&vMV$y+Tr8AX$o7@Hu7InlgDnc%3fOc%$oTtVi-=9gV%QZOTwCA@cCcl| zHiUNC1y_Tpnv8;vMnrkDdiRA3HrdJYBMb4sHm^h6WY`+T9AsfzDi%$~41G>KG8q$W zW>;MFSV`5Kd>4Ts(LUK(Jt71bCXV%y`4-{2qJynlwajYHwzzZy*t>>hRuUtGIRFoGZ`-3$)k{Z zDO~s^rX$dkjriq794Csxb|lIg&>a_jW!13PpxLmkD6`2Mi!HF}J&CbtjDoFI%sA3n zjib?pM>>b}nb`vu&`jlqE=Gi3tcDBcgV&G5Y`a2yFJ*=3ZBJW5tUeh% zdzV;$vhz~Num&87BjV}?#I%Z)4LHoaE52-S4(~J|k4ttnB?rxL4#E+A$_yM7uMmr7 z;8-$Qte@dL9OsPo890V77Q;>fVGx~y!|k61+_tEcubhIEYs8n*TM#v;qOiNff>WJ` zcS`+=>u0fg7H0hBQ=NS)jNirQr#cVo^xf~cZdQp8o{7XO#7Q$z?9uqqFSIQp9-oOS zt`I-ZbdKv(`6sTeRqSD>AvPnRBlAF0pDB>YMJ=UTRgz|2+%I zXNo?4B+rR6{J1W_5mpjTp=V%kXT;Pq(8(W()6Q^?8L{ix_B}gO4&N)rVY=d z85V`@Px0g#m~`Wx!&Rx}FsuXUM{xPX?lYW&NBH5IOqa~bfuu`eD<9bdU`vRpXJS~s z3zwJSGDmrJUlbRfi5hxD>`a`=bE5rBbl5yG`Yi0l7BS~6B-_3LSEWoQNAtW1@@i?> zSs2YBu~AA^{0Qk&`2w!587QmZI24T&qt8ZGX))()YXUC9+u1m__~9yVW)`lcur;zQnZ+*Ha-wQB>ibJsxSYtnC(8OxnvM3gh?TQ(QS#kO zV$eCx13SHIdD>yZpnweTG_+nGw&kX1JjZFrE|c4x7sFinicEAsS2+)p;1k8xb1+FR z7C%G!taxSb4wO^>Pee3{+H;Zh7IBgkLu@-2*(T0Kwv(;xPHQL0<0s4q;Rp*EBHRI| zqfg=0z3r6;Nf+)-25guTz$o*2FSg^fY_s3h)mU0FKE9u^tHR#0pOG+qu;lDnTd}LL z)*;=y9MaL$)&5*pqopfS{USFvteWFIqe6t{IbC7*ov`9lN$qSAjx2X5dz#vV_5`_! zs*m@L--MygB28+GK$4)Lu`s-i7axohO7 zk=)S1UPrF9G;A1sRXj>o8Rc$Qii4;1X(hK%`_Y~t$EmzbGn&ZJj`qV0 z!%ai$Z7RTWz@8yTsK>|z_=L!H)MJ&|$la>ar>TQ!kB}RwSYWh1bzoUO)<0E3ouGAv z;ufm5H6{50Jgf?dMoE8D#y7iqKKGMP;Pzt>iRSUm>-So2Ubs zPlOy0wHG+6!*xWRormnE>OGfR#&%Q3FuNvlfI6CXFS)WqeBm&aPdaL8*f^dE63SpS zQgucRWP_^Xb2qDunyA{|NOpIy8|0RoR63tkF7|N~4c>hm7<%N^8_N^mW{TX{!5$>L zsd}io$gNBF%_k#Sjvf^5 z(vgNieiBr-MOdcMOvPD2eaPu0Djm*y)+a#@P<6bQZ0xnm_M>GH7EIL{MaW*N&d5#9 zg*y~X4p4C=V12w~gNkKA>y!Hj4T*oKjC6ts+1tVHCg-l(H$F{{P;~(Tvb#gPK~6U; z-Z!HJIY8AJdC5kH_}sNBeS$hxjJ*i68f$E-f!8Q^6ZIt88_9K4oM)|1CAsx#l}_i= zLJm;>#&|Ee5K{5XA7?Hany9*fMzWi#GpZz~uTmMEzyeyx0jh351KH>hU$|1H$EZqM z8-_8I8AZr-)T3xGEK&tFQBR}2k?f{UrQIO6T%pqGe45B!sq#Fl9d0_(m#YM)iX9i@ zw&XOi`(o$taKmNFsn=N9gpeVQDgp33TY$+<=qudAOXH&S)}4dlY5R(#kvg&F0P z!H7_`y^&l=)dd*j#3lO{93|ILbv`a~dO>+Sc2tsv2I>q}sFK`zu}W|x?M>u5>YjLV z>qROa%fZ&Ch1^Kh`7}tLiIB<;j>6wn1}#*bpo#3Ip3DN=Tm zykvu_v&~(g;u2JCkC5xAy0}Vm%lRyh)o3EuDHTs&>Z}U4&fm8ZE#yY3F06rUP^UA~ z+&q;&Le-reAiJr$vkh{~Tq|AJ&>1C^!DygryO*3hZ{OCmk{dhN17xFvy)Z|mPf%6< zVcaOvP)F4*aFNr2eG6_O2dMgh<0BW&-8Vi*Zldb=M#(7OaMPi$Pz`d+IVvMgsSZUa%Bg5;Vc!Opz8Ptxvqn~lAJzsPeo<> zaXCRl!(NAFuOsKq*ptArr^$^S>6@s!qK*Era=7U@+R7gPkXvT$TW}NE z+rjQ8x1PRld5gUtTFH?P_C~Us8rBIa zX-J={GSUUNkOLj;4P=9=^C_I7(kG}opC+<*Uwhc_(2$#<66%aH$$<`bpT% zlq3hJI^IV%I@t3ks`Lq}j*pVPW%ki>ywuZB_?t?o6XeNh>TvPaB3zNUJA}E&ttaf8 zJVTCju!qQX9qb-*?)ZK4$&#CthWB(>ln!r)1oh;CZ{Ljaa)dfenT-&+k%~uz)+b2zQiss4C6`zC>UnDJ=PJY4FfiooyFMyAGLw%rv|7&Y9lp7z4Lth5?zD6YuE5gsv^2g4zkHcRFd`5 zn2W4>5DWg~E{v}ut6cHGjvS%iPhLU}2WYsSh9LO{awB;uIYhpZ93kICj*@RC$H`H0 zg1k&|*htcF3jgryd^?hmEmCx)uW?W=FX53^wM(W6& znBGg4V@j59_-N3B$WPXTC_wJY41#36m=_}BNx1cilJ)v*6S+J6333mXZzO5x$$%EJ zUdT<8F@LR3E7?iTl6#T!WWBOeAoro)cvdy7uWCQ;QD~@UfSbH$0hp}UWxZs*9_u6b zXL>(bF9-+8dXX?h9%S`D5=Chk%nagWH#teJC8x*-kTYa`49t>;(w`^mV``BcK9B*% zbE-@9B332YL%)kWg6tuWB-fJokKjRy^>L8(Qj3d>ha=XzwPd&&Ax7#XVHm#BGbFbCz0LHJFN2e+{M;0K;Mgd$qh{4BhMiF z$$AkaK-Q}_L9$$ike?7)FS10R533rVuKY$517?vEWIs7cK7*VhpGnS;&mw2ZXOr{f z+2mrFhI42zHmC}nORgjb$Zql+avk|RvX?xU+(4d3_LJw6!$BI(ry)eXfE*aoEVxa0vr)&c5O z#`yEma3up8$XAj5sJAU{S&P3)_2d`GUh<1%ANeJ6gJik? zU#7v&fLF)?@~h+^IZbXPZz6}to5>OKYvd?-3%Lm_%Qs%9A2$V zT$P^~pawvmJEY4I zhpT>za(Tt1I9yRNCoWUPov!0^bQP#Ys`0u?Qb~1F>!|fqFV!d7l@>A8-z@sH)qlva6?h#ma>9f~q7jMa_t=tDWbH#?{UsUi{v++F30MtDSyZ z-G(zBa(1y*d0SOBK57Gg|Jr%n*f=pkO;TH^DQbqA6`LN$!k)2B<>sJPQr*-#s+Zb8 z4N!yBMrw!}rN*fVYLc2#I?~9{kfr9SMXK=uD=1d3!HZ+{V%-{4J3woY+DMI1o2UtD z3pGv6P+O^4YMxr88XvNBs!Qo%hKGiFs*mcY2B<-5BQ+x4dIayY6(4bq?RP_G>j;pe zD^E2r!^b`9JjQIiv9q}RQRmBeqjJP!c-^p49RHYemPkH^N#FXIbGO)*bVe$ccHZ!} z$DQ3PYF(eHy1J35?iP#YMPp%woK zv0>`d&YotKYX^5H)gxv+;~Z1vCkCiNu>|H562um2ikhZosIAl-wLmRWjc>#s&o~dp zJe%~a^{VRC&pKb--}|kqi|<>9IO{p*X(IKU(>)}}0UV*G8I_?n-q2Zmi)b@?W9JRy z);qtq)fzihMh`126o-#+x+gE5|KledYK%Szmf?HdO|^^fX>0$9d(LChIH747r8=O=ROm*@w7t zdW!~qt(+dB3P|Y$~f8{m`&Q9sY8F@^C+W|VqvRs_@&0O*ge#v>hmy%dRhR0=5Ch0=`tK*#kzXQv$=%34 z@(Qwk3Q!%Peko8lD{m6CCsvf^ZvYh|=F+}Z9Re+BH zHnN|*gd8NVCWpvwa+I7P$H~LUNpdH!b?2C(;YJ2z$d8b-!%Ri$S$tYuNbe&H#{^Pzzplj6=Wazda|GV5IIO5LJpB1CP&E!lH=sgL-CVv@{^?D zCI+O)kCHRw;p8m&F>+q}$8(HmKUqJ87(#Y%&Hdpp4K5nS*;NMmF+?x2ehhIZSwDt& zmTWzSKtm29>!%P;ko8lDiR2K=3s=(+r9qJ6y4ewv&ik0tA;5LM(X{V{T0 zaoAW#Ly-X^$OhNcA17Cm#|~9JFs?6Vl-|8W}p3>eE@5+GNR zgX9=FL|#XZl1GsBQ;5gO3Hm44Ip!qG`PYYr6a(%iXUOZxS@LLdp8O=aNS-iM6`-F& z^dVPr&HZk&d-VKZbac+(7>Xw#ZNJL)K3r?k0!mUr*LgAx4wq8+iVI zk_P=4;&8iaK?^hJPfn5VBkRWyFOswL?@!iGA(oR1^dCtsZs7TUFbxi_nLkK&kzXZy z$UVvR@jkmKZ)}$ha}Fjz9PX6P17$sfL5MN_OVrBI`S$ zC|M09JbNSSTdgEn-)g1E`qnH%?#A-*lPRhK`c~}!p#@eI|6d#6VR;T8TUbwnZh?=i zTi_?_76i%Nm>%Dse*xcUsU*hf*83qzcG90B_abM=y~$Z}A05vfr1O)vj`E}L98-$b z-jt5e^D1Dl1biaoK?;p1xgWWStoL}FtoL|=T*LSzc>uY^VwA6kP+|SP6)2K*1q@~| zkQq40M5B_d$E=I2JKRmyJIo_lwqM_E*D*j3sd}=mpqH%ou#c>Jpn>PfgDNljlVVp`8@^EnkLG_Xt|u>J20qQqz^|F zMDCJNeH10TURU{t?@UFmV5^}PrmCb6<;LB$&Qrjfx8ul z4Hpe78Q>u|k?Y9`vX8u)>?c1&4w4@xhsZf{l>C#$7=LjZ{>gwOc^5fF{+XO1|BIX@ zw~_PY9pobU8?s}g>Va=1%kl4`;X4L+$lsIe$veqD@(*M`IZqCfe78nqG?Cv1 zTk|hT!#fN}liww0$y><<@_S^*3#vu$lilP^}7^Wdl!$)M}B~`>)eJ^^)cMtD(Wi02kR$ z?n(}l9pn&se{z((A308rtWXt9YF?{21-9mYWQ{Up7_fv1vg9WDJ9YTv$=2`Ifs5n@ z`W>&T9`KW06UmOW%5NswMLwJCA?dDA4w4s>Lu3~@ zN_LauWDhw>t|Nz2G}P0OA$!SLvX7i6M>$4{WE=gCO{xcGkX__6$R6?>#bKkKh6@?s zBQGTT$ybwu9OUOa8lN=&nNsf~LL5`FAk(1=`0W_p&7)j2M4KR~=ePkQiul--ElU0!H_(5@qJc1l0k0i&*9&*xRjQ=Vc zQVejCGvrEgmRw8DlMf&l$!@aa4b=lRWEZ&~*&|ubKNk)44CqAmksWWU7Wy@}u?KWK zdn81*ea(A4a%bijCs&nJ`Xtzz|4tfG45%b$bOIKT)yxXy$xixm)(wx%Kv(<7q~R%RlFxmLsLl^yyRQBpwOV13km_U(W>Gb$+oQ8 z=OMClGsgfqvO~qk$yJ{#4ku{%?FN+~MeY<)0U7dXY^?TaFJ(`J>+xA_2di4KJukxKlv(hkQ^q5$UP%rRl_I^)eMM}2a}WJ;p7x~3^_xd zNY0XvB?dDI4wC;t4w1t>Xo%9# zmmDV#A}7fQl2hb^$r?Pau%Bg0(a%wTgzl}?$0Uf}l(;zv{LurV-k{L$H50m5M)#M~O!SpF|lKzZj zIsYD~A$Cg01=A#4c&j0pF-u;n&O_ z36PD~ls~BXpNd18zf~O3{2#?pvYWf8={=tR<18@2fLaD5$v34{1}$VeuL;xS9_`BC zO72F^k#El_e}Q}l*?6Dl|0oTP_f?m!;OWvuzLo4D-^TcQ9Z&Y@c(R{tXO9HQ%jpk= zX*gPsa`G|cIQdv|l6)LFMfQ<1f`tYDs8 zXUzhP{~`@%F+;~T)dT0U#xC+~vWGlh_W=2%o$LYaXMujQm;NAms$@C;LNrWcK$LtG zIZpPGljP&cDe?*A4Eb;5EcvXRJYAD#gRS{rq`}Vwjt^811jsJ(-^m{GMdW(&#bh6O z0ohN!gd8Mas@MNRG|XW@lzbjJPM%9nlIM|AgN6o-voG_)|FH#tr2 zLvAHklXK*5`9K7~{V$4Rs6{MD~&$C9kl;j;!jE z`?=3tcyOK7{NeFO3-1An=n{MAVpQdS2z<%R1fS_h0BwsB6fu(MZFmTU3Gw zxpj+baT9qPIYIuA+(Hg>$tF$CZ&&GC$vd~J{Bz_VEXMdR(C`ft7@w&c?;ux_b7VK! z%L41jCy>45zmXfrCz1o?lO)Ue*GR*321Ljwlbgs5KE+v&_v$K3=-sb$t~o!$!YTYJhHZu-=RMTw&wqPG!z){7TNep^}u)A)v>*jT+l~C z@=xSC@{eRMImq>b2F<)14t&M)|HTYwWWdD?h>#oUZ_-SEf_w%2Et=_1lSA~kYNkK; z70>^R8Bk!rVg?vrs~$L-{z}dCyU9NK>on8vC7(!tgJ${zVHz43(5RUK5%Ns>n>5p( zAp7ZW(M*4ud^Y{9n&}VcXb3Q%pqT+iPW8Y%`YScl?92F=PJHUczU z$bd%8%pgKuK!1~F`V-`Z^tWiHKTTdlf2(H8kMW zAXmJhIH{Sp>n)nOB$Fb$KjZWNG!3<%sf)x6*~WXftY+Tt=QaPP;)~=c?~IIZRgXnj z!Ai}1?&sDV&Z!#LX#+Fxl5ghAW(}Iz!hmKzcx=?n7DqI*#ZBauEH6P0FJpl%G~B}) zr!}+2t(uuZPBYUN$ep<~Yka4A;BLlOlJ8>vadlsSZ}afRz|DXf-agln4f?&B^qs*RcUEatqm`nLSt!w&s5eTjW|zMdQnk$Iq%u zm-0B^BJW(T)(70=e{mLgbbM6#>&YwFAm7hC|F2;I4GdVz06+OnJ?+Tv>uE>+R8Kqd z*W@_)F>;dpG&%J%&;J`}$S~kla+d7SJw&e5Jw)!Rd+1-Phg!)la+d5N=g9S88uB#w z$OW>WTqFm{OUNPevj4BH^N)_Iy7u^;h!`NkBo|30<;M*ICJ1DLGz7&mfdC0VCqWlM zFien2M8yf(68m^&&{|XNj|o(F+PC_g(7t7CU428#D@eO^aP>#*>a!D8*Xo%5c$4^SW1lK}ky zgRozOoq>G}_9*O^VPArM8g}8IBm=L*E`vP;yAt-BV)OI=03&c{gnbTnE9^el9k9n> zcftM}>>k(&*nO}EU=P4fx;D@MlK>~-FbF#ZI|F+V_9*Ny>>TWIu&tbApa`}f_Egvo z>?OuF=U)(DIUGW;ABP=={WRGIoLkf)&?7>`!GI^37j_DEKkPK@W3aQZ zPs7f^9)fNCSu!vJ+YfsTwj*}8)r&6#f^g^^m5hYc#uo@-*cNV|BWj-$|4VoX)xzC# zRCU}v$6)(VKJMB)|9uFMPzMA^;{JUqZl9AH5O=pJweb~9T5a6zX4S^sZVvVY=+;Hf zkU9UZ)vrhl;KPpwIIu0~LA9ZWU?0Kldl>d&=n>dK*iqOMVaM3M-Befz5Qjq?L(-=< zhGal(G$?suY@)riz<2RP)%Er}zJjhQI$iFsEf{_K+4c$3PDH2Jsq1_fsixE}4ft== zw*Z(L<+#S0Y-OmOKp{jtrw!nWQ?GMAN#RmYw&(Xyd zLwZ2HGq_aF{Znqu%kRJRbBg6(NW(MiMS-wK*SZI(Vy0cXcu;>Zg1VCY-h={vDMRF( zfIINM1Wg~0^WK^E8eg1_&9tk1F&g10f!H6f-qcYlp2c!*etsMOk1O%Fs7Qolho^Q4_~6w?B(mDH`!WOHtFiI>Vo-oZ%5k)Z1FEcF|B**E!0wBw-x(q z^Jm6>>UZo}0cX|Ks+nS)q`y_z)d6em)#Vt~&$g>;x~?i;Z$)m&Z>07#P5oRfP`Uo< zQ7_RsBM)x8x}2q&8%?E~@@4bpR5NyX|Ic#?W=<8T41Ub+}VvCp9x&-OVi2Y)B>^n}c%@3LtoVw{@ia33N^L=LWy z;uj!$qh8CWxy;{VCaV87DW;XqgB+(3BPSv2>vmcpr>J z0Qc@B_z3mhWS36pf*hk}HUqjJp){5E=z^T2Lo9deHijBJ137=cL!PPpS{;)M-49Xy zE5W_{Cboda?5R*(0;DzLL)<-OEvB^KwZed-r_&4Y=+J zss7{mB}K+RPW>D%pnFNGybyAhhD>d`1*InJJY?@ymDBjmMJB3lWvTwl!DCcY#kJ`U zm@1!voThe`yLIDCl{@%-MkcCvgU#o`JFwBF`kw)hdN$;|0)7&lht)l1^9!6zeC+2* z?^K!m!%1J2v=~k~s+e!`kG(-vjzRw5CZZ;mKi5^ zM^arWzj(})_UVC`WG?hDN8lf9A>l}OqTsLl3|F2?Lcn&V&45qPt zv&#GUIZ^HBYN!2jc>j+%p7;KI@Nx>ptwf;<(3q7^f7~*Kmq- z|8|wrDCXVgecp{yjqU@l{$1b+>NnwX*bZLh&tp=0x0&CCNvYe=tAFbKMZ~w*oC4UL zUS%H|pQ9R*a+N7AutC0T?xQ;J@$36aL zF9>(4)0hco?aU8nUJ-9(2VBEdfk(l4&bvn~IA8kT!nw#o)=%M=Am`{1%T0}uac(L7 zKy&6wZ4vN|hSLe^J+9)@gvT&mI5{R}(| zuKtBp5-tjkJ49<8c+%tF1D+O6H`Ut3RsMUWG7UOzK877!$0ydv8+3JvLw1;yRNVpKVR=*280OMer50K5qP{|la?Lnd6=J_)A_SL-6oVDJ_c zdltOM<6i*IbI^pd9+GgnW*mU*2iHw|kAp`&{%?TucO|!)McgBgua?&3sFUTUa8zp3 z)9)bUD0n>@e+oS1@xKVpx4s;X%5Jm$%Q}KmMWj<=Z$XUz08fGIS@Rok{?_a^Zc=c+ z6jS-G8VMH$*CzFWCp`WoS`GDbILeqNJp~qeSYm4ue*m5UchJ-`h@GM_(uO zCU*#Y6^f05$36a!>*S{9H#r zRHLoi3myYk|8j)mFW+uAXEhyHL#e7pdkp@cY3d z;OakdiR36j%`41@9Av$U_zYz0poHVf-Q!2#A#hzH3O*{~BH(m zyMo8p`d6t;$Llhj9B^&Kt+lAk${Fj4gh0~sTbD0p6 z%5+$cYh~bUy2l0Z7`SG90srfRxj9JC>3Y*Ak9;FiVI7icG~7L!I&cTokPei`{}-A% zkN=;+Q^INMN;4}S&mX61wA}&MM$~~vz(Z)ncW_!K=-5g#D!v7kN;}$v~YT= z(M+AsOJy2#HhLBW4emaDI%T(d69|ZZG646*uw87yN?Mwg#nNg4_iz zs%4F6RPfdCFXBF${0>s5373Yf>rgvn=Zg|ZhwB;e5V-pPJ9rNbakxMnasg^P1-XxW z>sU^BhOAR=6J}(V+F9wbjbe(-6i^bg=ca0k2@JPbY^yc;|U z&Zc`5@V5`{vL~G0S;tc@4W|&CroqYID~;2j4tNk;{pW#4!OIZG{ByrM?>+vt;A!FX z)Os`T;j|KkH^8axury){_*U>RxMr>mJmTT^f=9s}#Ca1LiVLUG4ZMCNJWhL2n7?-3 zzz_ALA%_s-Q;_|5zF|E06X4DfdU}JssGuxFr}%F`HwK2A)$0DwBx{s>8+kH})?VX+ z<(O*U;xOjfjLK!gA3?cS!4u%;!PDUJTg5*E{^p19--CDD=K9aK3bAaoMmv>t` z(5_EI$TmrVF7Q6^*7d@tgC7O&+93Q_mK?{yTQ>^V#J&dJxJmd9*PT!FUqBe3kxhKE zUkZzU+|~I%^^&h76>m06MT^KqXh!Y(a=nowcqZ&1Nva?lq z0>xegPkH$Fz$2~VUx_$B0q@x+{3Y-Vc%6CX%ChELn$=g`imtc(<{^#`9A{C0SH3WJ zr>srlr4erupV?+M^W$MgKG`nv`Em(S%d)#zP%q2f$-S~-W^gsq3ORD-I@dqkC&hMy zhn^KalRqQO@d86v={! z($)&NWvIS|pQ}qzXA8H@kNt7gO9w4R{VenIg)g_*2Ye@~W(z-p7B0yTsm@_)zQex3 zo?>-u*XwMFca-Y4*t58<(_6S@k-KSl3%6{rJU`42(Xtp-++kODhySZsTjT!KT0(!# z=f6fVw$@Ik6?<;jyQ;>ywQ8QL*O*2XSr=yuM{liZ-YEQ$BZ0BRL#Ia$XOa;xhD7z37$dlZ$b{EkDAKYz*AJU-L5VO zT}O9q=M%W`tQ6O$YS(a1Oq&O(e>+!R$c8yI`X?agXlT2AU{`jEwCWC2{yUaSxO9A` z@ZI2-!S%V=O7IDMS8V*dHsp`jRPeHO^oCz%=@&?PA%{@=k7*|q$X=Z*8cCc&`V>Qt12>%YCkD4Q9LjE{^ zO8GZR6#kH7xhbUZ;(0kvhY8 zgkG1^x4`|Vr3hIW&*!HZA^zpX$GH&+B+Y@mkYzJV2B@9oUGa}dPIp6o9i@Xfsds>9 znHTdtxPPAbhrq|+uaDMiD<<73t*D$z!ymWTG*wQPayplz&<766N00MG3HZ2{^R(+( z^{4yp<#9{f60Q}^_%+L>SA%ryUb}Q%8CtKIAHP*v(}P@vQEVD`24}mjd<(%Nv#4Yb zFEXtqauz&-a-V|UN1c0kz7Ei5_i&@4IA7<$>rHr#(hz&qq!FYK@@2?fo+YJ-J0&Yv zpo3@XAhq+KK$2+ zJ^PQ{=bn!v{HMFs(}dTyNfRPi@03b|_? zeft4!#7i{7ZZ$Fd4n(6o#%^ZH>JP3S!NC3y#RsVBLA$z1f6~Gqs_tqB-M<1at-fnW1D2r||tb?AM@_rc!ywhH^E`dDjS-1^ug*eCca%3NP9TKMgkAauX zqQe}IPwvy5_D=rzsMybg9bYNw)d~B2yEMYzKrQ?2FSPry&XrkmRO~`(Jhj(?_jo=> zSAnNIt=bIESKtqGGm>ix-1tjSO#-sB_Qd{&?Z4i8&GD`RT2VW(lpY_pr%ljH>WkDr zY%eX=9~SE0K{_{VS5MH(`V3Y4(q1}2e_xoOb~Z~a{V^W?-r=J+u1uKu!r(9MYyKY} Cje?Z` diff --git a/src/native/packet/MoeHoo.linux.x64.node b/src/native/packet/MoeHoo.linux.x64.node index 851dd577543004c6c03786e37208ff7fcad776e6..121dde27f2694f069349957287b2a458051888e8 100644 GIT binary patch delta 15032 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 delta 15204 zcmch83w%u1_wU)qOfrecOh}LyAwj$%K}aGYi6l;9LcCRjRK1@;q8`x+Nz@q8u+^be z4OOqAG)g?GQ6Z?ds4A^jJkK-;nxd^b_q)$IgZB1+fBk>%|K9WY>{Ye}63t!Yd8BUbD7m#itYdp*6cB%FGM#F3O zg|u^T9^G-%*2lJ?B%RN9wwQXV+^uyg-0jS9O*uC%V}N?!Rh7rxtIctBflt$ByW*sd zx2mJ!_rI&&-&6rt1IXmW_Er(wH2f>zWBB6!3L>8SLK`S>(Iy_GB3|KD*rt|>zpn|} zpeb|+f|x=aUF+H)`P5jIx`ig~vc{F$S4DKwxP0`gw6cCG{-Q=72|*s5J6B9e?RKP$ zhShH1T{cD?4A5vEx~eml(bq7#BSJ;nw9#ge!1TFFm)34TGU?{p?Y#f4l_#`fG^gl; z+6|I(AF8Y-O@dC75IR~#EYfsdqphX5kBa|JqyJKKNg3_q)*yLDq>46aTtpk?#;N#M zAcbA$HGF2edVfW;GxImoErafKYmgGFNgJgSag8+Z6c1Dp4zI-`Y?M_;srUd*nhjd0 z?k}lZXPAkk(W(9oyiJ`|siLUi;$6s|RIpd$y&~kP^#|c(vY3nmt{>9kn zcfocbs0ftF)^Z`TI!iB=Je6g^mJ^gFL|(z|dfb|=x246P|AL8>`u@QP!aGC~F6@k8 ztq=`=i@IYF3S(AnCY%(F5y2Mobp+vrLa)hP7znqpk!9)%^Vog4>Y|{nV!{FnhxKftCVaHi=-D9b@pZ4u4klXaVuAPnJL2Ap!QhsD3Ikd8?r^Wdp zGy8y0!Im8itWanUij^KdV1$BD*gr^Mr13S#W80*`LSasj$=rHUnoyXXmP+nQ-U>H- zZnplcai>YUz|9gF8Yct=Ad8VvJAPp}MTbSd6fN!6qz=V^l8`W03BA=VnfysZW7{V5#=K@50!k?KtOb9Wtrb$$eP(n_QaChN zsQ3~lLSiQdrxx7Ea$_s=1y6FJr_OA>C0MUW2k6?^7}ASgiS?;__yfZ2W7dQv1#9YH zX#}ku7cgWM&_!nJH6HFJqG^wYVIBRhv>+~xY^3Mn!pU0d7C*GrFZbAjvVt-s`(0Vy$95w{&%-vr#}&%9 zfdq1s##0*Kp7fwcmWxeYz+~G zUXNJeDGYymHO8&}3l&g-HAIbh0HkJX+gE8h_bkU?5JPPFhf{b z)qZ1RrtYlg_-a@g_zzWl^mF_VD&D5xW6l9D1u;v$Jh`6gLX15x z*Or*hZ1fIfC0MV0p(JM+cselbil6^UTo4;-{al<2#7T>pM+##OZoyC{jLz)I`u!mn z{SB-?SjE4~`q98EDPls7?1$Eld^t^9CN;7&gdQ)|;QSy15MgD4%}KBYKT70?F@G73 z3xaJDayUIG!(nS{I(GJgyT*d~Y!t;H4Y?szuw`KBgN3{&&NJc!n;G~#$sp{@nwI%` z$dnEtRUQt5dC#h_T>P zOqHB>lzhSVeW?u=S%D7o_z|ISCUQNtAu<}!t0Pt}6i$<+&Wc?VBg}KnZY=B@3HQO?& zrH8??#E!&-T{D&HElZab(`E(DR1QY_oW~g}r121Jwt0Qrf^C$^*0N+maZ|PxTmES{AA4E4#Oo!-Z$pQz~OK&jv05eJlQbYFz#EJoXFEz zmk{%)G-hkH?9~Q~Qf6m|ycZ`k)bzfJa?cNY-IZH4mYyFGj0J>+%Di$Ga%St*SBJ)> z#|@1e7B~FGk%k3W-Vq{L(=9BZs-<_aLhLZ8J>vWaUVh%OcR+WvIzmuva;@W*f|GS2YI(v(N}IqbxTxBV9~_ z6-O!Q0%m4LG%%l-3d-0v)sQ7hfEgd~l-HGJgfm+5dthSw7-h~_Y~%J1F{x=cX<)s#syoHbP%v) z58D8PwGWP#ns95Hp=ztNKyho#?G4BVR~W>x@x2N@wcn!LZhL-HZeROS|1I>NpPlLO zlqBLzH>51!cif^OJsSi(zNH#iJLXH;t#-`6aErzXUUYWP){QG}Fv0{l#@0V5E!BEe z$wS10P$&?|o0j(s@O^SqJ#i)|ftCeNv6KuuBTczM<(_{0p_|m-+?X%ENxPc;i3d$L z2k;p;>6_+I|9jUFIOCMrV}>+k8yjjxe$XkHSZYtdGB0$oD+=iMHKFOL{``kG>73N2 zX+N%Geyo<>x~9&Y2e+GTBZGqNIZC|Y5d;Np#aeAIOANaqEryczB`=~8^(U-}GNCl@ zI=!3fOLWww*Jz)%n9ouD=V(?(?X=IkO|89xU2Ra9&760g?(gN-U=+Kx&2=2ZvX8N` zwCnUNA5KQ~FNy99${OIFYebFjzuZ^<8j< zmiBE=n$oJizD_&d2SXF;)-T&{|K-1^ha$9@VW8vM%k=$z-^Sg)#BPTo1`}aWlx-yC zEol+M+U5c?)NoYSm}6DwFbZ?jYDo5HgM~3ay@&q1i*#H6?j93?!iknW_b5jgGbICZ z`TZAZ-hikMAN=SrXod6(`btr^b`O?zgG;lt)Jjt;9&mIKz27e>(eb^$?q2{e*{VQh1PlOvzPwzGl9ogq1r zJ$+APcc320s6Tlw@rV?t%wH{a0d%b2sNq@w8ma3m1NoCHOGdo1jpzMWlz60{;bgx zn3*Y$kK_5IyXPUPR^HWac~3ge=(BGoC|Z8WUM)DY1Lzeg?--8E24KzX_JY z6?F6XKoU#89`C~ssG#=o;|A!yOaEiIbto3>WP%w`yUIU_#8PBg0pYbAVl5RzGDODUS1X_(QT!}KUc&+!1ptPt0q zJzeC{KPLNj`ZW`LS%DCsJbQ#c!z5v4k_9hEa4JDHc(Ioi>g~A*p~CPjdDJ|mHUCZ~ zoi(L5|9U1pF{K+nY(A}>nNk13d=^-@&4m-ZA*P<Uh`@o6{f>oB&5}Im0gU2g$3d&ynDX(2dQ5IYZQ0G+)tQT++5quptNn%TtEGPX z@IKE~al}2TzA9Y$<^a8#-MUj;j^a?C@o?WqOtLjki8R%VrS@sCM-e9XR_Pv&1Kr#M zG;W4Z#OpvwPa#g74oWKCmNxHYV(uw3N)r{C)l&I>7`G2It}CT8w)5}Lq21reZJ#`r zrT>@HuT*_GnoV8#vV{>d|7n;UqBu)m5WXeUx@&lw=xolVPfH}Si&>G*k# zd}^{mDC4w*XWD}}Hiwm&trtMGHJh%Rw}mg-NqfzI)N=4Af7QmmXX|sRN(E8g4C)U} zq?7V|d~QyKMz*>_VU|f29-rTbCnZj3a#VVM2VI-z-{sym<{$l-iG-`#{L=eU_PW$- zsluyI!JuGkFOZ`UAmrU6jDOTN`di)r_chbmf@4+zNF%n>^!yIS_b0HU4BR%JnZlW_ z$@k}{PN1LX7kF<0nKC5BvI8ZHM&-ZW@; z6eqi|GCOXDc{2*d@0+H>?WpM z&U3a{m90uag!gywd33QybTpa;=FDAy6^KY^@R+4QC zt+y~lS2aePiNYqBX}HwtpJsZ8A#HWGgZkx}7EGl@3p)gi1N!Be5~e6KeTsu=)m~}; zW_len`D!zDI=n@jX~>3uSkn=PwAHyh`mZxN(c#vP0jq$0d7`zM%0$<$D-%_1q9xWa zg8-rgTZ{+2W9?S=5DXY+J&N~I`A1MRY>pp@D3-!O^Yo@BU&vypJy3Exk zX&wj?3m8rDBo@0~C&th3rEskU9C*8)O+3v?e z>Fx%))0WWjF`NJwy(%sF@E;8K8$;T9;+d@8^GGP1LR&8G7T~A)!yf{xK9`!q!dSAl z5eYVZI9<57h>x2j0p9!3+_ zm+~JJmdNWn6Mpn!8nGdW7Z%ZB8!Y^{wvsCwE)tgq$Ca{nqE$)xrb5EMdaR`1mScJn zR^qo~FliKV2&2|7jrpJahGMeEfJ2||L~3E16GCB~r%mXxoig#I%RU{&fA$6a?bC52 zg}z?0iZ41ypOx(8Z_cHAcXi{JpQOL?GcDI?-qqBE6=kJ`L z>vj*pQ^udW^Lg7Nnzv`E?~`BIqIB3=y$bieJl}9%+OG61{@gKITH1%yDskQGM)-7Z z+HhYW-=~7c>^nj9)Uba(KSDveru6}1Nwtasy@0Q$H znP&$=WhlPwG46>l?v8$jyLNQg0q;hiF}5%NKuqJfRv)iU_HfF>F!a*@RG+?cAk_FO zBgp~@I|t~!OU@psMZCiAt77eApRp-pF{c-ycRr8gZ&%Y62PcsL`p&^_ctJ|Izvxg= z^0E%AJYieiLEf030WtPyco0+6!v5`G>WGb5x1$QLDD@|Cu3{Fm-%`~*;JB{=FUGfO z_r~36I(s$KcQozyg(q>LW4~z5KRZN=zG&&&?;g|Jvo8~L_~io(Ti6%t2w#6Xoq4Ed zLu);hz@xRC;}*t;+jMzxF7bYt;*)9gr$fv6OLa@8epyNQ@snx)@+HKbUN2AOS5Btw zkEHP@j5Pm9Ykt<`lATA+5&lS>5^Kdh!VhpOnRVQm@F!jA{1Z9&W<)-5mjB3=e*aY~ zlDh0FpPSVT_gHXvx_h;2W?Cyj}KS zRHqE|%aa}Xfd=~IghM%4k9gR^HY)hT^)VxRBt{*Pd`01n8efCrx);Zbd;X{fcVf3XU6h7dHVjDr+f*a z?|rwCxYF)tJM(8ansatAKa(ptcXkFMr6l!SD9?ZUlv>V*^DCdy-RCzFgy{u=-|z?B zbRm%+{s*nT(2t~)bpP>)o?qO*#Pw>D@zeVq2#tL(fW|+lOSe22NHZP^G~i(@-TKf_ zQufeL+Y(J>nYBOORUzxweovNt&=@@N68|eD1Njl5F5%zCsP{X+8 zNY`Sd+d?$f&(t96vo=_}kJX^XG2no~e`9dq|1HeLB&S!&vI+2CG>by?-(dJRLjNPp zi}~Pxhn6pp{~vLB#aw&hYmv#JmR}Hk#b~?GLQsu9L7Rb=j@BHl4;rIkt2W#>Z&w_B*o7+7|F{6J?9sYNafT zXqTZ?eYDwVnQ-Q2w8LnZ(9U5z5b!<%WeVzb8eluX@qi*)3Hmi?=J!$0(H5btLMuW0 z8m$$SD2GA=(e|Tl$NhD*qs10%1khw9G@k`H5378PHXH3M^78@US7;314lAGb(!B%E z=#8Lt@Us3a&@$e9KpAitpby%N<+A(^8k5D^0alBzz0?|L1dQkaBS1?;pS79jzuZLJ ze}vW#W2~|J<}I4H2n=l2ta*!Ofg+x5&!e3}WBp?qWPR4y`v8mM=AU5c-x&Uh=KqA- z0e<3JtBVN_cCVpO^#A>t+y?#r@-w+V;7IwIMb;A+5=fI7TWs0KU$ z*nyMfHh3?08SofjFp=dQ_~tJG@G9rPq?28ox>iR)}x>x~V1mODq@G*k}ArNpRevjf-55e?`EN20h11<+V3%ChT zHw4)OxE}C6VD(724qv#O9fcSGOc;Y0@U(ycoy9=ZOo3p)ps6sS7Zd?(1DFpO3+Opb zmiq&)N6b8BqF2YY<+-d0apXwSOQl8X5ody$OfPXoC#P1xEQc}3oHnTsW?t- z7D;^hfX8BdBx&ybgpoyb_x zJBqX>TgAjE(xKHtGYXAfLg%J(I&BKvxM5;cA2ChCDdcKx`jPLipT< zVykYXt5_UObgrv0>zkNKH&omnP5Kb~iWm~mwBX4z8LQ`X)l54)0-+rP)k1bFU@`_l*$lXBh2NK#8bh$|V z)hy*(n#3+$NhTlDQQX#*1O~PSLjq%1k0{0!jW!cYDXlNdU729fDE`rtc#Ce`h#x5x zUyCN)j88$(v7s!ppNi|+8O6qNq`p|#jkK%1+)0)nv3VL8#aDZfrm?5^TE)DpdqjeJ zXqKlQ7K_S6OC1pw}IAXUl3T7Q~Xqp3EKWdP!)Q=od?Z!rdP|lT$FF z8=}f-i2f-QxOCv>GZw+!#AmxJ!54trI~cn!Rzj$c3CJAOH^rVPPnJ^sPPIO8jO`RgpAK6X}Ngzp1tX>PD;_L*{%4rw+rJ>@M1QO*` zgZ|9+;?JPb$6^h4#PCGY*(nFzv~Y1+BI)E*ivIF&aeE?ZuD^l)6Y)YK>8FoIrM@qQ zC6O+c9CSlbyuV|r_J^}xhoZ@~hu|}*_B3|`i~3^F+yM=$opLeUF5sR3hl=?e$2I_6 zG^&?|V{W<#90yzkLZ3sNF6QIh8!o67=N^!!>)~E3RwWVtUJVgEI&2t@TEe2J4GSpX zCIBc=WQIx!wUzS5HkSSvLtraoVhXNU)ABlyX z7hg#xz9ISO1}Dif_GIN^OJ0eOAmBnYTqxjH;9`@+b;%^e=_>kLlf-k$q?c1i)VUAS z#8xT9C!|06WBbVRC}tvDAmhdYSB@QPpn}070ds&e^%JM1ASRBX@A;~DFokqVV!N3k z{Y7p2p9jc`k*%iPxV+|A~0qOy-32N46N=mgOcIsj@8Kf`Cia za4bS{fXjGWoR&&D=}XbC*|RN`@T6P2kudJJM1RzUt05gPyWsSt|JjB6s8%X4_jISo z85iz1gA;BJxv&A83Ecwp&A2qMW$T;mxzmgEcc)j0yGI(E2AAVc8z!;OP-5YOEBBlk zN;Z&MS6v7tEedvLkR4Nj6+b;qLc$#XJ5pKI&swnIRV9*N#b?`iIo^^`LV`58r7cX+_){BR78q~U!&on=ULK&ujwSd zdzOTF7kAdiHSk0uJ0(`0B@Kv4{0-D3O^o{g5Ao!D!K|I8$0>lUBFm;9) z`2(iT{7jtx14;5OE>n0oc2Z_neK>|O#fp_bK;LNbH&ByJV%&Ms&O6|3m1wjIxIrLh zdX|Y+4EyYuui{w{v5RWMMQ@8|&cj=#_f@8aKc$`Yc zy`_!EP8OqngoiV=RU(O$>##OnCeHg&G4oD<@AO5Uv4t^?OB6vG+yd!RJmF zM_eQ`_~I$zj~7XZk4ZB@vC7L$1e4;(IbzdGB&mI7kvh;5yDqzqY2&7R^bRrqJ$1+}6t7{NFPbmby^O5cA;w)MJ(6)SRxZbW_9i+?(k)W)zi6fw zHT!5ee6dwU zIE2s8@VWWomMdfii4~h%CHT);l-TzwIfz+2DoF!AbhOy2k`7^W{P%y?Ez$6~eZ_qci@IX3B*T6F{@24L*r=IwQ%`ZkHIQ8u zmtG?q!~Xss$FETa*erklYvij2KX9CsZCD-%}%c>n#6o0qZ2DgTfZD>2Mxri*oN zkR(21kT`@vZk)L82IkHXPv1a^I3?O|psw!_FWf{O%8XO(z>fax8dzVQF>Scm^cERL z_KWjwvAVKn)h*JPU>n$bn{4D`dy69^Wz|b1vXPwH6KN;ajqvc((!jTKb>uU4o)HE< wi9eYrZZYs7u8!JuGF-f7;5&IZb{+>jDYkUs+j(qFRRh5Rr|uc&!e8P47bP3dB>(^b From f8e92f7c8d5e75948c6fa335b22caf556bcffeec Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Fri, 21 Mar 2025 11:48:29 +0000 Subject: [PATCH 087/233] release: v4.7.7 --- 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 e49fc469..56bd86ef 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.6", + "version": "4.7.7", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 1a4b0d39..14c86ebd 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.6", + "version": "4.7.7", "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 a35d069b..fd8ca929 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.6'; +export const napCatVersion = '4.7.7'; From aaefa2e83c7a4dba15580c260589c9c292fb2b1e 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, 21 Mar 2025 20:43:41 +0800 Subject: [PATCH 088/233] fix: error --- src/common/worker.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/common/worker.ts b/src/common/worker.ts index f14ea3bb..55e55cd8 100644 --- a/src/common/worker.ts +++ b/src/common/worker.ts @@ -5,6 +5,9 @@ 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)?.error) { + reject(new Error((result as { error: string }).error)); + } resolve(result); }); From 47f594741098fad606b4341384270c8e258bf387 Mon Sep 17 00:00:00 2001 From: Mlikiowa Date: Fri, 21 Mar 2025 12:43:58 +0000 Subject: [PATCH 089/233] release: v4.7.8 --- 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 56bd86ef..6ac5becc 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "NapCatQQ", "slug": "NapCat.Framework", "description": "高性能的 OneBot 11 协议实现", - "version": "4.7.7", + "version": "4.7.8", "icon": "./logo.png", "authors": [ { diff --git a/package.json b/package.json index 14c86ebd..7570c1a4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "napcat", "private": true, "type": "module", - "version": "4.7.7", + "version": "4.7.8", "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 fd8ca929..4a8b1eff 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1 +1 @@ -export const napCatVersion = '4.7.7'; +export const napCatVersion = '4.7.8'; From 030f0551fda537703a2ffdb7a0f1aa68a75c0ea1 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, 21 Mar 2025 20:47:38 +0800 Subject: [PATCH 090/233] =?UTF-8?q?feat:=20=E7=A7=BB=E9=99=A4=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=B7=98=E6=B1=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 4 +- src/core/packet/client/nativeClient.ts | 6 +- src/core/packet/client/wsClient.ts | 113 ------------------------- 3 files changed, 6 insertions(+), 117 deletions(-) delete mode 100644 src/core/packet/client/wsClient.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index ca143742..48eac328 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,5 +6,7 @@ "tsconfig.json": "tsconfig.*.json, env.d.ts, vite.config.ts", "package.json": "package-lock.json, eslint*, .prettier*, .editorconfig, manifest.json, logo.png, .gitignore, LICENSE" }, - "css.customData": [".vscode/tailwindcss.json"], + "css.customData": [ + ".vscode/tailwindcss.json" + ], } \ No newline at end of file diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index 356734b5..bb0ec2e2 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -38,12 +38,12 @@ export class NativePacketClient extends IPacketClient { return true; } - async init(pid: number, recv: string, send: string): Promise { + async init(_pid: number, recv: string, send: string): Promise { const platform = process.platform + '.' + process.arch; const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/MoeHoo.' + platform + '.node'); process.dlopen(this.MoeHooExport, moehoo_path, constants.dlopen.RTLD_LAZY); - - this.MoeHooExport.exports.InitHook?.(send, recv, (type: number, uin: string, cmd: string, seq: number, hex_data: string) => { + + this.MoeHooExport.exports.InitHook?.(send, recv, (type: number, _uin: string, cmd: string, seq: number, hex_data: string) => { const trace_id = createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex'); if (type === 0 && this.cb.get(trace_id + 'recv')) { //此时为send 提取seq diff --git a/src/core/packet/client/wsClient.ts b/src/core/packet/client/wsClient.ts deleted file mode 100644 index dc4d9929..00000000 --- a/src/core/packet/client/wsClient.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Data, WebSocket, ErrorEvent } from 'ws'; -import { IPacketClient, RecvPacket } from '@/core/packet/client/baseClient'; -import { LogStack } from '@/core/packet/context/clientContext'; -import { NapCoreContext } from '@/core/packet/context/napCoreContext'; -import { PacketLogger } from '@/core/packet/context/loggerContext'; - -export class WsPacketClient extends IPacketClient { - private websocket: WebSocket | null = null; - private reconnectAttempts: number = 0; - private readonly maxReconnectAttempts: number = 60; // 现在暂时不可配置 - private readonly clientUrl: string; - private readonly clientUrlWrap: (url: string) => string = (url: string) => `ws://${url}/ws`; - - private isInitialized: boolean = false; - private initPayload: { pid: number, recv: string, send: string } | null = null; - - constructor(napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) { - super(napCore, logger, logStack); - this.clientUrl = this.napcore.config.packetServer - ? this.clientUrlWrap(this.napcore.config.packetServer) - : this.clientUrlWrap('127.0.0.1:8083'); - } - - check(): boolean { - if (!this.napcore.config.packetServer) { - this.logStack.pushLogWarn('wsPacketClient 未配置服务器地址'); - return false; - } - return true; - } - - async init(pid: number, recv: string, send: string): Promise { - this.initPayload = { pid, recv, send }; - await this.connectWithRetry(); - } - - sendCommandImpl(cmd: string, data: string, trace_id: string): void { - if (this.websocket && this.websocket.readyState === WebSocket.OPEN) { - this.websocket.send(JSON.stringify({ - action: 'send', - cmd, - data, - trace_id - })); - } else { - this.logStack.pushLogWarn(`WebSocket 未连接,无法发送命令: ${cmd}`); - } - } - - private async connectWithRetry(): Promise { - while (this.reconnectAttempts < this.maxReconnectAttempts) { - try { - await this.connect(); - return; - } catch { - this.reconnectAttempts++; - this.logStack.pushLogWarn(`第 ${this.reconnectAttempts}/${this.maxReconnectAttempts} 次尝试重连失败!`); - await this.delay(5000); - } - } - this.logStack.pushLogError(`wsPacketClient 在 ${this.clientUrl} 达到最大重连次数 (${this.maxReconnectAttempts})!`); - throw new Error(`无法连接到 WebSocket 服务器:${this.clientUrl}`); - } - - private connect(): Promise { - return new Promise((resolve, reject) => { - this.websocket = new WebSocket(this.clientUrl); - this.websocket.onopen = () => { - this.available = true; - this.reconnectAttempts = 0; - this.logger.info(`wsPacketClient 已连接到 ${this.clientUrl}`); - if (!this.isInitialized && this.initPayload) { - this.websocket!.send(JSON.stringify({ - action: 'init', - ...this.initPayload - })); - this.isInitialized = true; - } - resolve(); - }; - this.websocket.onclose = () => { - this.available = false; - this.logger.warn('WebSocket 连接关闭,尝试重连...'); - reject(new Error('WebSocket 连接关闭')); - }; - this.websocket.onmessage = (event) => this.handleMessage(event.data).catch(err => { - this.logger.error(`处理消息时出错: ${err}`); - }); - this.websocket.onerror = (event: ErrorEvent) => { - this.available = false; - this.logger.error(`WebSocket 出错: ${event.message}`); - this.websocket?.close(); - reject(new Error(`WebSocket 出错: ${event.message}`)); - }; - }); - } - - private delay(ms: number): Promise { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - private async handleMessage(message: Data): Promise { - try { - const json: RecvPacket = JSON.parse(message.toString()); - const trace_id_md5 = json.trace_id_md5; - const action = json?.type ?? 'init'; - const event = this.cb.get(`${trace_id_md5}${action}`); - if (event) await event(json.data); - } catch (error) { - this.logger.error(`解析ws消息时出错: ${(error as Error).message}`); - } - } -} From 12eacd353033e6aece24286434d906260bd204fa 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, 21 Mar 2025 20:54:59 +0800 Subject: [PATCH 091/233] =?UTF-8?q?feat:=20=E7=A7=BB=E9=99=A4ws?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/packet/context/clientContext.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/core/packet/context/clientContext.ts b/src/core/packet/context/clientContext.ts index 9e77bd7e..e4419139 100644 --- a/src/core/packet/context/clientContext.ts +++ b/src/core/packet/context/clientContext.ts @@ -1,6 +1,5 @@ import { IPacketClient } from '@/core/packet/client/baseClient'; import { NativePacketClient } from '@/core/packet/client/nativeClient'; -import { WsPacketClient } from '@/core/packet/client/wsClient'; import { OidbPacket } from '@/core/packet/transformer/base'; import { PacketLogger } from '@/core/packet/context/loggerContext'; import { NapCoreContext } from '@/core/packet/context/napCoreContext'; @@ -10,8 +9,7 @@ type clientPriorityType = { } const clientPriority: clientPriorityType = { - 10: (napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) => new NativePacketClient(napCore, logger, logStack), - 1: (napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) => new WsPacketClient(napCore, logger, logStack), + 10: (napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) => new NativePacketClient(napCore, logger, logStack) }; export class LogStack { @@ -88,10 +86,6 @@ export class PacketClientContext { this.logger.info('使用指定的 NativePacketClient 作为后端'); client = new NativePacketClient(this.napCore, this.logger, this.logStack); break; - case 'frida': - this.logger.info('[Core] [Packet] 使用指定的 FridaPacketClient 作为后端'); - client = new WsPacketClient(this.napCore, this.logger, this.logStack); - break; case 'auto': case undefined: client = this.judgeClient(); 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 092/233] =?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 093/233] =?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 094/233] 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 095/233] =?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 096/233] 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 097/233] 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 098/233] =?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 099/233] 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 100/233] 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 101/233] =?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 102/233] 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 103/233] =?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 104/233] 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 105/233] =?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 106/233] 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 107/233] 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 108/233] 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 109/233] 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 110/233] =?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 111/233] 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 112/233] 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 113/233] 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 114/233] 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 115/233] =?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 116/233] =?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 117/233] 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 118/233] 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 119/233] 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 120/233] =?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 121/233] 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 122/233] =?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 123/233] =?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 124/233] =?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 125/233] 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 126/233] =?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 127/233] 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 128/233] =?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 129/233] 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 130/233] =?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 131/233] 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 132/233] 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 133/233] =?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 134/233] 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 135/233] 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 136/233] =?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 137/233] =?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 138/233] 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 139/233] 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 140/233] 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 141/233] 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 142/233] =?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 143/233] 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 144/233] =?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 145/233] 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 146/233] =?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 147/233] 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 148/233] =?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 149/233] =?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 150/233] 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 151/233] 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 152/233] 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 153/233] 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 154/233] 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 155/233] 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 156/233] 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 157/233] 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 158/233] =?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 159/233] 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 160/233] =?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 161/233] 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 162/233] 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 163/233] 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 164/233] 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 165/233] 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 166/233] 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 167/233] =?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 168/233] 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 169/233] 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 170/233] 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 171/233] 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 172/233] 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 173/233] 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 174/233] 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 175/233] =?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 176/233] 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 177/233] =?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 178/233] 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 179/233] =?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 180/233] 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 181/233] 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 182/233] 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 183/233] 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 184/233] 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 185/233] 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 186/233] 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 187/233] 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 188/233] 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 189/233] 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 190/233] 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 191/233] =?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 192/233] 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 193/233] 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 194/233] 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 195/233] =?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 196/233] =?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 197/233] 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 198/233] 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 199/233] =?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 200/233] 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 201/233] 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 202/233] 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 203/233] =?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 204/233] =?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 205/233] =?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 206/233] =?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 207/233] =?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 208/233] 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 209/233] 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 210/233] 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 211/233] =?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 212/233] 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 213/233] =?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 214/233] 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 215/233] 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 216/233] 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 217/233] =?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 218/233] 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 219/233] 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 220/233] 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 221/233] =?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 222/233] =?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 223/233] 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 224/233] 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 225/233] 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 226/233] 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 227/233] 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 228/233] 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 229/233] =?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 230/233] 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 231/233] 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 232/233] 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 233/233] 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';