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] 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,