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,