This commit is contained in:
手瓜一十雪
2025-04-19 11:03:03 +08:00
parent d921dcddf1
commit cd8698b157
100 changed files with 931 additions and 937 deletions

View File

@@ -26,6 +26,7 @@
"@napneko/nap-proto-core": "^0.0.4", "@napneko/nap-proto-core": "^0.0.4",
"@rollup/plugin-node-resolve": "^16.0.0", "@rollup/plugin-node-resolve": "^16.0.0",
"@rollup/plugin-typescript": "^12.1.2", "@rollup/plugin-typescript": "^12.1.2",
"@sinclair/typebox": "^0.34.9",
"@types/cors": "^2.8.17", "@types/cors": "^2.8.17",
"@types/express": "^5.0.0", "@types/express": "^5.0.0",
"@types/multer": "^1.4.12", "@types/multer": "^1.4.12",
@@ -37,9 +38,9 @@
"@types/ws": "^8.5.12", "@types/ws": "^8.5.12",
"@typescript-eslint/eslint-plugin": "^8.3.0", "@typescript-eslint/eslint-plugin": "^8.3.0",
"@typescript-eslint/parser": "^8.3.0", "@typescript-eslint/parser": "^8.3.0",
"ajv": "^8.13.0",
"async-mutex": "^0.5.0", "async-mutex": "^0.5.0",
"commander": "^13.0.0", "commander": "^13.0.0",
"compressing": "^1.10.1",
"cors": "^2.8.5", "cors": "^2.8.5",
"esbuild": "0.25.0", "esbuild": "0.25.0",
"eslint": "^9.14.0", "eslint": "^9.14.0",
@@ -52,18 +53,18 @@
"image-size": "^1.1.1", "image-size": "^1.1.1",
"json5": "^2.2.3", "json5": "^2.2.3",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"napcat.protobuf": "^1.1.4",
"typescript": "^5.3.3", "typescript": "^5.3.3",
"typescript-eslint": "^8.13.0", "typescript-eslint": "^8.13.0",
"vite": "^6.0.1", "vite": "^6.0.1",
"vite-plugin-cp": "^6.0.0", "vite-plugin-cp": "^6.0.0",
"vite-tsconfig-paths": "^5.1.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": { "dependencies": {
"express": "^5.0.0", "express": "^5.0.0",
"silk-wasm": "^3.6.1", "silk-wasm": "^3.6.1",
"ws": "^8.18.0", "ws": "^8.18.0"
"zod": "^3.24.2"
} }
} }

View File

@@ -2,20 +2,22 @@ import path from 'node:path';
import fs from 'node:fs'; import fs from 'node:fs';
import type { NapCatCore } from '@/core'; import type { NapCatCore } from '@/core';
import json5 from 'json5'; import json5 from 'json5';
import { z } from 'zod'; import Ajv, { AnySchema, ValidateFunction } from 'ajv';
export abstract class ConfigBase<T> { export abstract class ConfigBase<T> {
name: string; name: string;
core: NapCatCore; core: NapCatCore;
configPath: string; configPath: string;
configData: T = {} as T; configData: T = {} as T;
schema: z.ZodType<T>; ajv: Ajv;
validate: ValidateFunction<T>;
protected constructor(name: string, core: NapCatCore, configPath: string, schema: z.ZodType<T>) { protected constructor(name: string, core: NapCatCore, configPath: string, ConfigSchema: AnySchema) {
this.name = name; this.name = name;
this.core = core; this.core = core;
this.configPath = configPath; this.configPath = configPath;
this.schema = schema; this.ajv = new Ajv({ useDefaults: true, coerceTypes: true });
this.validate = this.ajv.compile<T>(ConfigSchema);
fs.mkdirSync(this.configPath, { recursive: true }); fs.mkdirSync(this.configPath, { recursive: true });
this.read(); this.read();
} }
@@ -40,16 +42,11 @@ export abstract class ConfigBase<T> {
private loadConfig(configPath: string): T { private loadConfig(configPath: string): T {
try { try {
let configData = json5.parse(fs.readFileSync(configPath, 'utf-8')); let newConfigData = json5.parse(fs.readFileSync(configPath, 'utf-8'));
const result = this.schema.safeParse(configData); this.validate(newConfigData);
this.configData = newConfigData;
if (result.success) {
this.configData = result.data;
this.core.context.logger.logDebug(`[Core] [Config] 配置文件${configPath}加载`, this.configData); this.core.context.logger.logDebug(`[Core] [Config] 配置文件${configPath}加载`, this.configData);
return this.configData; return this.configData;
} else {
throw new Error(`配置文件验证失败: ${result.error.message}`);
}
} catch (e: unknown) { } catch (e: unknown) {
this.handleError(e, '读取配置文件时发生错误'); this.handleError(e, '读取配置文件时发生错误');
return {} as T; return {} as T;
@@ -58,14 +55,10 @@ export abstract class ConfigBase<T> {
save(newConfigData: T = this.configData): void { save(newConfigData: T = this.configData): void {
const configPath = this.getConfigPath(this.core.selfInfo.uin); const configPath = this.getConfigPath(this.core.selfInfo.uin);
this.validate(newConfigData);
this.configData = newConfigData;
try { try {
const result = this.schema.safeParse(newConfigData);
if (result.success) {
this.configData = result.data;
fs.writeFileSync(configPath, JSON.stringify(this.configData, null, 2)); fs.writeFileSync(configPath, JSON.stringify(this.configData, null, 2));
} else {
throw new Error(`配置文件验证失败: ${result.error.message}`);
}
} catch (e: unknown) { } catch (e: unknown) {
this.handleError(e, `保存配置文件 ${configPath} 时发生错误:`); this.handleError(e, `保存配置文件 ${configPath} 时发生错误:`);
} }
@@ -74,8 +67,6 @@ export abstract class ConfigBase<T> {
private handleError(e: unknown, message: string): void { private handleError(e: unknown, message: string): void {
if (e instanceof SyntaxError) { if (e instanceof SyntaxError) {
this.core.context.logger.logError('[Core] [Config] 操作配置文件格式错误,请检查配置文件:', e.message); 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 { } else {
this.core.context.logger.logError(`[Core] [Config] ${message}:`, (e as Error).message); this.core.context.logger.logError(`[Core] [Config] ${message}:`, (e as Error).message);
} }

View File

@@ -9,7 +9,7 @@ export async function runTask<T, R>(workerScript: string, taskData: T): Promise<
console.error('Worker Log--->:', (result as { log: string }).log); console.error('Worker Log--->:', (result as { log: string }).log);
} }
if ((result as any)?.error) { 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); resolve(result);
}); });

View File

@@ -1,21 +1,22 @@
import { ConfigBase } from '@/common/config-base'; import { ConfigBase } from '@/common/config-base';
import { NapCatCore } from '@/core'; import { NapCatCore } from '@/core';
import { z } from 'zod'; import { Type, Static } from '@sinclair/typebox';
import { AnySchema } from 'ajv';
export const NapcatConfigSchema = z.object({ export const NapcatConfigSchema = Type.Object({
fileLog: z.boolean().default(false), fileLog: Type.Boolean({ default: false }),
consoleLog: z.boolean().default(true), consoleLog: Type.Boolean({ default: true }),
fileLogLevel: z.string().default('debug'), fileLogLevel: Type.String({ default: 'debug' }),
consoleLogLevel: z.string().default('info'), consoleLogLevel: Type.String({ default: 'info' }),
packetBackend: z.string().default('auto'), packetBackend: Type.String({ default: 'auto' }),
packetServer: z.string().default(''), packetServer: Type.String({ default: '' }),
o3HookMode: z.number().default(0), o3HookMode: Type.Number({ default: 0 }),
}); });
export type NapcatConfig = z.infer<typeof NapcatConfigSchema>; export type NapcatConfig = Static<typeof NapcatConfigSchema>;
export class NapCatConfigLoader extends ConfigBase<NapcatConfig> { export class NapCatConfigLoader extends ConfigBase<NapcatConfig> {
constructor(core: NapCatCore, configPath: string, schema: z.ZodType<any>) { constructor(core: NapCatCore, configPath: string, schema: AnySchema) {
super('napcat', core, configPath, schema); super('napcat', core, configPath, schema);
} }
} }

View File

@@ -115,7 +115,7 @@ export interface GroupEssenceMsg {
add_digest_uin: string; add_digest_uin: string;
add_digest_nick: string; add_digest_nick: string;
add_digest_time: number; add_digest_time: number;
msg_content: { msg_type: number, text?: string, image_url?: string }[]; msg_content: unknown[];
can_be_removed: true; can_be_removed: true;
} }

View File

@@ -1,8 +1,9 @@
import { ActionName, BaseCheckResult } from './router'; import { ActionName, BaseCheckResult } from './router';
import Ajv, { ErrorObject, ValidateFunction } from 'ajv';
import { NapCatCore } from '@/core'; import { NapCatCore } from '@/core';
import { NapCatOneBot11Adapter, OB11Return } from '@/onebot'; import { NapCatOneBot11Adapter, OB11Return } from '@/onebot';
import { NetworkAdapterConfig } from '../config/config'; import { NetworkAdapterConfig } from '../config/config';
import { z } from 'zod'; import { TSchema } from '@sinclair/typebox';
export class OB11Response { export class OB11Response {
private static createResponse<T>(data: T, status: string, retcode: number, message: string = '', echo: unknown = null): OB11Return<T> { private static createResponse<T>(data: T, status: string, retcode: number, message: string = '', echo: unknown = null): OB11Return<T> {
@@ -32,7 +33,8 @@ export class OB11Response {
export abstract class OneBotAction<PayloadType, ReturnDataType> { export abstract class OneBotAction<PayloadType, ReturnDataType> {
actionName: typeof ActionName[keyof typeof ActionName] = ActionName.Unknown; actionName: typeof ActionName[keyof typeof ActionName] = ActionName.Unknown;
core: NapCatCore; core: NapCatCore;
payloadSchema?: z.ZodType<unknown> = undefined; private validate?: ValidateFunction<unknown> = undefined;
payloadSchema?: TSchema = undefined;
obContext: NapCatOneBot11Adapter; obContext: NapCatOneBot11Adapter;
constructor(obContext: NapCatOneBot11Adapter, core: NapCatCore) { constructor(obContext: NapCatOneBot11Adapter, core: NapCatCore) {
@@ -40,30 +42,19 @@ export abstract class OneBotAction<PayloadType, ReturnDataType> {
this.core = core; this.core = core;
} }
protected async check(payload: unknown): Promise<BaseCheckResult> { protected async check(payload: PayloadType): Promise<BaseCheckResult> {
if (!this.payloadSchema) { if (this.payloadSchema) {
return { valid: true }; this.validate = new Ajv({ allowUnionTypes: true, useDefaults: true, coerceTypes: true }).compile(this.payloadSchema);
} }
if (this.validate && !this.validate(payload)) {
try { const errors = this.validate.errors as ErrorObject[];
// 使用 zod 验证并转换数据 const errorMessages = errors.map(e => `Key: ${e.instancePath.split('/').slice(1).join('.')}, Message: ${e.message}`);
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 { return {
valid: false, valid: false,
message: errorMessages.join('\n') || '未知错误', message: errorMessages.join('\n') ?? '未知错误',
};
}
return {
valid: false,
message: '验证过程中发生未知错误'
}; };
} }
return { valid: true };
} }
public async handle(payload: PayloadType, adaptername: string, config: NetworkAdapterConfig): Promise<OB11Return<ReturnDataType | null>> { public async handle(payload: PayloadType, adaptername: string, config: NetworkAdapterConfig): Promise<OB11Return<ReturnDataType | null>> {

View File

@@ -1,15 +1,16 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { OneBotAction } from '../OneBotAction'; import { OneBotAction } from '../OneBotAction';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.string(), group_id: Type.Union([Type.Number(), Type.String()]),
bot_appid: z.string(), bot_appid: Type.String(),
button_id: z.string().default(''), button_id: Type.String({ default: '' }),
callback_data: z.string().default(''), callback_data: Type.String({ default: '' }),
msg_seq: z.string().default('10086'), msg_seq: Type.String({ default: '10086' }),
}); });
type Payload = z.infer<typeof SchemaData>;
type Payload = Static<typeof SchemaData>;
export class ClickInlineKeyboardButton extends OneBotAction<Payload, unknown> { export class ClickInlineKeyboardButton extends OneBotAction<Payload, unknown> {
override actionName = ActionName.ClickInlineKeyboardButton; override actionName = ActionName.ClickInlineKeyboardButton;
@@ -24,6 +25,6 @@ export class ClickInlineKeyboardButton extends OneBotAction<Payload, unknown> {
callback_data: payload.callback_data, callback_data: payload.callback_data,
dmFlag: 0, dmFlag: 0,
chatType: 2 chatType: 2
}); })
} }
} }

View File

@@ -1,13 +1,13 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Type, Static } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
rawData: z.string(), rawData: Type.String(),
brief: z.string(), brief: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class CreateCollection extends OneBotAction<Payload, unknown> { export class CreateCollection extends OneBotAction<Payload, unknown> {
override actionName = ActionName.CreateCollection; override actionName = ActionName.CreateCollection;

View File

@@ -1,12 +1,12 @@
import { z } from 'zod'; import { Type, Static } from '@sinclair/typebox';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
const SchemaData = z.object({ const SchemaData = Type.Object({
count: z.number().default(48), count: Type.Union([Type.Number(), Type.String()], { default: 48 }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class FetchCustomFace extends OneBotAction<Payload, string[]> { export class FetchCustomFace extends OneBotAction<Payload, string[]> {
override actionName = ActionName.FetchCustomFace; override actionName = ActionName.FetchCustomFace;

View File

@@ -1,17 +1,17 @@
import { z } from 'zod'; import { Type, Static } from '@sinclair/typebox';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import { type NTQQMsgApi } from '@/core/apis'; import { type NTQQMsgApi } from '@/core/apis';
const SchemaData = z.object({ const SchemaData = Type.Object({
message_id: z.string(), message_id: Type.Union([Type.Number(), Type.String()]),
emojiId: z.string(), emojiId: Type.Union([Type.Number(), Type.String()]),
emojiType: z.string(), emojiType: Type.Union([Type.Number(), Type.String()]),
count: z.number().default(20), count: Type.Union([Type.Number(), Type.String()], { default: 20 }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class FetchEmojiLike extends OneBotAction<Payload, Awaited<ReturnType<NTQQMsgApi['getMsgEmojiLikesList']>>> { export class FetchEmojiLike extends OneBotAction<Payload, Awaited<ReturnType<NTQQMsgApi['getMsgEmojiLikesList']>>> {
override actionName = ActionName.FetchEmojiLike; override actionName = ActionName.FetchEmojiLike;
@@ -23,7 +23,7 @@ export class FetchEmojiLike extends OneBotAction<Payload, Awaited<ReturnType<NTQ
const msg = (await this.core.apis.MsgApi.getMsgsByMsgId(msgIdPeer.Peer, [msgIdPeer.MsgId])).msgList[0]; const msg = (await this.core.apis.MsgApi.getMsgsByMsgId(msgIdPeer.Peer, [msgIdPeer.MsgId])).msgList[0];
if (!msg) throw new Error('消息不存在'); if (!msg) throw new Error('消息不存在');
return await this.core.apis.MsgApi.getMsgEmojiLikesList( return await this.core.apis.MsgApi.getMsgEmojiLikesList(
msgIdPeer.Peer, msg.msgSeq, payload.emojiId, payload.emojiType, +payload.count msgIdPeer.Peer, msg.msgSeq, payload.emojiId.toString(), payload.emojiType.toString(), +payload.count
); );
} }
} }

View File

@@ -1,14 +1,14 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat';
import { z } from 'zod'; import { Type, Static } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.string(), group_id: Type.Union([Type.Number(), Type.String()]),
chat_type: z.number().default(1), chat_type: Type.Union([Type.Union([Type.Number(), Type.String()])], { default: 1 }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
interface GetAiCharactersResponse { interface GetAiCharactersResponse {
type: string; type: string;

View File

@@ -1,14 +1,14 @@
import { type NTQQCollectionApi } from '@/core/apis/collection'; import { type NTQQCollectionApi } from '@/core/apis/collection';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Type, Static } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
category: z.number(), category: Type.Union([Type.Number(), Type.String()]),
count: z.number().default(1), count: Type.Union([Type.Union([Type.Number(), Type.String()])], { default: 1 }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetCollectionList extends OneBotAction<Payload, Awaited<ReturnType<NTQQCollectionApi['getAllCollection']>>> { export class GetCollectionList extends OneBotAction<Payload, Awaited<ReturnType<NTQQCollectionApi['getAllCollection']>>> {
override actionName = ActionName.GetCollectionList; override actionName = ActionName.GetCollectionList;

View File

@@ -1,17 +1,17 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Type, Static } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.string(), group_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetGroupInfoEx extends OneBotAction<Payload, unknown> { export class GetGroupInfoEx extends OneBotAction<Payload, unknown> {
override actionName = ActionName.GetGroupInfoEx; override actionName = ActionName.GetGroupInfoEx;
override payloadSchema = SchemaData; override payloadSchema = SchemaData;
async _handle(payload: Payload) { 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());
} }
} }

View File

@@ -2,38 +2,38 @@ import { ActionName } from '@/onebot/action/router';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { MiniAppInfo, MiniAppInfoHelper } from '@/core/packet/utils/helper/miniAppHelper'; import { MiniAppInfo, MiniAppInfoHelper } from '@/core/packet/utils/helper/miniAppHelper';
import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from '@/core/packet/entities/miniApp'; import { MiniAppData, MiniAppRawData, MiniAppReqCustomParams, MiniAppReqParams } from '@/core/packet/entities/miniApp';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.union([ const SchemaData = Type.Union([
z.object({ Type.Object({
type: z.union([z.literal('bili'), z.literal('weibo')]), type: Type.Union([Type.Literal('bili'), Type.Literal('weibo')]),
title: z.string(), title: Type.String(),
desc: z.string(), desc: Type.String(),
picUrl: z.string(), picUrl: Type.String(),
jumpUrl: z.string(), jumpUrl: Type.String(),
webUrl: z.string().optional(), webUrl: Type.Optional(Type.String()),
rawArkData: z.string().optional() rawArkData: Type.Optional(Type.Union([Type.String()]))
}), }),
z.object({ Type.Object({
title: z.string(), title: Type.String(),
desc: z.string(), desc: Type.String(),
picUrl: z.string(), picUrl: Type.String(),
jumpUrl: z.string(), jumpUrl: Type.String(),
iconUrl: z.string(), iconUrl: Type.String(),
webUrl: z.string().optional(), webUrl: Type.Optional(Type.String()),
appId: z.string(), appId: Type.String(),
scene: z.union([z.number(), z.string()]), scene: Type.Union([Type.Number(), Type.String()]),
templateType: z.union([z.number(), z.string()]), templateType: Type.Union([Type.Number(), Type.String()]),
businessType: z.union([z.number(), z.string()]), businessType: Type.Union([Type.Number(), Type.String()]),
verType: z.union([z.number(), z.string()]), verType: Type.Union([Type.Number(), Type.String()]),
shareType: z.union([z.number(), z.string()]), shareType: Type.Union([Type.Number(), Type.String()]),
versionId: z.string(), versionId: Type.String(),
sdkId: z.string(), sdkId: Type.String(),
withShareTicket: z.union([z.number(), z.string()]), withShareTicket: Type.Union([Type.Number(), Type.String()]),
rawArkData: z.string().optional() rawArkData: Type.Optional(Type.Union([Type.String()]))
}) })
]); ]);
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetMiniAppArk extends GetPacketStatusDepends<Payload, { export class GetMiniAppArk extends GetPacketStatusDepends<Payload, {
data: MiniAppData | MiniAppRawData data: MiniAppData | MiniAppRawData

View File

@@ -1,15 +1,15 @@
import { NTVoteInfo } from '@/core'; import { NTVoteInfo } from '@/core';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Type, Static } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
user_id: z.string().optional(), user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])),
start: z.number().default(0), start: Type.Union([Type.Number(), Type.String()], { default: 0 }),
count: z.number().default(10), count: Type.Union([Type.Number(), Type.String()], { default: 10 })
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetProfileLike extends OneBotAction<Payload, { export class GetProfileLike extends OneBotAction<Payload, {
uid: string; uid: string;

View File

@@ -36,7 +36,7 @@ export class GetUnidirectionalFriendList extends OneBotAction<void, Friend[]> {
uint64_uin: self_id, uint64_uin: self_id,
uint64_top: 0, uint64_top: 0,
uint32_req_num: 99, uint32_req_num: 99,
bytes_cookies: '' bytes_cookies: ""
}; };
const packed_data = await this.pack_data(JSON.stringify(req_json)); const packed_data = await this.pack_data(JSON.stringify(req_json));
const data = Buffer.from(packed_data).toString('hex'); const data = Buffer.from(packed_data).toString('hex');

View File

@@ -1,18 +1,18 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
user_id: z.number(), user_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetUserStatus extends GetPacketStatusDepends<Payload, { status: number; ext_status: number; } | undefined> { export class GetUserStatus extends GetPacketStatusDepends<Payload, { status: number; ext_status: number; } | undefined> {
override actionName = ActionName.GetUserStatus; override actionName = ActionName.GetUserStatus;
override payloadSchema = SchemaData; override payloadSchema = SchemaData;
async _handle(payload: Payload) { 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);
} }
} }

View File

@@ -1,16 +1,16 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { FileNapCatOneBotUUID } from '@/common/file-uuid';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
file_id: z.string(), file_id: Type.String(),
current_parent_directory: z.string(), current_parent_directory: Type.String(),
target_parent_directory: z.string(), target_parent_directory: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
interface MoveGroupFileResponse { interface MoveGroupFileResponse {
ok: boolean; ok: boolean;

View File

@@ -2,14 +2,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { checkFileExist, uriToLocalFile } from '@/common/file'; import { checkFileExist, uriToLocalFile } from '@/common/file';
import fs from 'fs'; import fs from 'fs';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
import { GeneralCallResultStatus } from '@/core'; import { GeneralCallResultStatus } from '@/core';
const SchemaData = z.object({ const SchemaData = Type.Object({
image: z.string(), image: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
class OCRImageBase extends OneBotAction<Payload, GeneralCallResultStatus> { class OCRImageBase extends OneBotAction<Payload, GeneralCallResultStatus> {
override payloadSchema = SchemaData; override payloadSchema = SchemaData;

View File

@@ -1,16 +1,16 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { FileNapCatOneBotUUID } from '@/common/file-uuid';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
file_id: z.string(), file_id: Type.String(),
current_parent_directory: z.string(), current_parent_directory: Type.String(),
new_name: z.string(), new_name: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
interface RenameGroupFileResponse { interface RenameGroupFileResponse {
ok: boolean; ok: boolean;

View File

@@ -1,21 +1,22 @@
import { PacketHexStr } from '@/core/packet/transformer/base'; import { PacketHexStr } from '@/core/packet/transformer/base';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
cmd: z.string(), cmd: Type.String(),
data: z.string(), data: Type.String(),
rsp: z.boolean().default(true), rsp: Type.Union([Type.String(), Type.Boolean()], { default: true }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SendPacket extends GetPacketStatusDepends<Payload, string | undefined> { export class SendPacket extends GetPacketStatusDepends<Payload, string | undefined> {
override payloadSchema = SchemaData; override payloadSchema = SchemaData;
override actionName = ActionName.SendPacket; override actionName = ActionName.SendPacket;
async _handle(payload: Payload) { 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; return typeof data === 'object' ? data.toString('hex') : undefined;
} }
} }

View File

@@ -1,14 +1,14 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
face_id: z.union([z.number(), z.string()]),// 参考 face_config.json 的 QSid face_id: Type.Union([Type.Number(), Type.String()]),// 参考 face_config.json 的 QSid
face_type: z.union([z.number(), z.string()]).default('1'), face_type: Type.Union([Type.Number(), Type.String()], { default: '1' }),
wording: z.string().default(' '), wording: Type.String({ default: ' ' }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SetDiyOnlineStatus extends OneBotAction<Payload, string> { export class SetDiyOnlineStatus extends OneBotAction<Payload, string> {
override actionName = ActionName.SetDiyOnlineStatus; override actionName = ActionName.SetDiyOnlineStatus;

View File

@@ -1,13 +1,13 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.string(), group_id: Type.String(),
remark: z.string(), remark: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetGroupRemark extends OneBotAction<Payload, null> { export default class SetGroupRemark extends OneBotAction<Payload, null> {
override actionName = ActionName.SetGroupRemark; override actionName = ActionName.SetGroupRemark;

View File

@@ -1,12 +1,12 @@
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
class SetGroupSignBase extends GetPacketStatusDepends<Payload, void> { class SetGroupSignBase extends GetPacketStatusDepends<Payload, void> {
override payloadSchema = SchemaData; override payloadSchema = SchemaData;

View File

@@ -1,14 +1,14 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { ChatType } from '@/core'; import { ChatType } from '@/core';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
event_type: z.number(), event_type: Type.Number(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SetInputStatus extends OneBotAction<Payload, unknown> { export class SetInputStatus extends OneBotAction<Payload, unknown> {
override actionName = ActionName.SetInputStatus; override actionName = ActionName.SetInputStatus;

View File

@@ -1,12 +1,12 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
longNick: z.string(), longNick: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SetLongNick extends OneBotAction<Payload, unknown> { export class SetLongNick extends OneBotAction<Payload, unknown> {
override actionName = ActionName.SetLongNick; override actionName = ActionName.SetLongNick;

View File

@@ -1,14 +1,14 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
status: z.union([z.number(), z.string()]), status: Type.Union([Type.Number(), Type.String()]),
ext_status: z.union([z.number(), z.string()]), ext_status: Type.Union([Type.Number(), Type.String()]),
battery_status: z.union([z.number(), z.string()]), battery_status: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SetOnlineStatus extends OneBotAction<Payload, null> { export class SetOnlineStatus extends OneBotAction<Payload, null> {
override actionName = ActionName.SetOnlineStatus; override actionName = ActionName.SetOnlineStatus;

View File

@@ -2,13 +2,13 @@ import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import fs from 'node:fs/promises'; import fs from 'node:fs/promises';
import { checkFileExist, uriToLocalFile } from '@/common/file'; import { checkFileExist, uriToLocalFile } from '@/common/file';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
file: z.string(), file: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetAvatar extends OneBotAction<Payload, null> { export default class SetAvatar extends OneBotAction<Payload, null> {
override actionName = ActionName.SetQQAvatar; override actionName = ActionName.SetQQAvatar;

View File

@@ -1,14 +1,14 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
special_title: z.string({ default: '' }), special_title: Type.String({ default: '' }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SetSpecialTitle extends GetPacketStatusDepends<Payload, void> { export class SetSpecialTitle extends GetPacketStatusDepends<Payload, void> {
override actionName = ActionName.SetSpecialTitle; override actionName = ActionName.SetSpecialTitle;

View File

@@ -1,15 +1,15 @@
import { GeneralCallResult } from '@/core'; import { GeneralCallResult } from '@/core';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
user_id: z.union([z.number(), z.string()]).optional(), user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])),
group_id: z.union([z.number(), z.string()]).optional(), group_id: Type.Optional(Type.Union([Type.Number(), Type.String()])),
phoneNumber: z.string().default(''), phoneNumber: Type.String({ default: '' }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SharePeer extends OneBotAction<Payload, GeneralCallResult & { export class SharePeer extends OneBotAction<Payload, GeneralCallResult & {
arkMsg?: string; arkMsg?: string;
@@ -28,11 +28,11 @@ export class SharePeer extends OneBotAction<Payload, GeneralCallResult & {
} }
} }
const SchemaDataGroupEx = z.object({ const SchemaDataGroupEx = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
}); });
type PayloadGroupEx = z.infer<typeof SchemaDataGroupEx>; type PayloadGroupEx = Static<typeof SchemaDataGroupEx>;
export class ShareGroupEx extends OneBotAction<PayloadGroupEx, string> { export class ShareGroupEx extends OneBotAction<PayloadGroupEx, string> {
override actionName = ActionName.ShareGroupEx; override actionName = ActionName.ShareGroupEx;

View File

@@ -1,14 +1,14 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { FileNapCatOneBotUUID } from '@/common/file-uuid';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
file_id: z.string(), file_id: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
interface TransGroupFileResponse { interface TransGroupFileResponse {
ok: boolean; ok: boolean;

View File

@@ -1,12 +1,12 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
words: Type.Array(z.string()), words: Type.Array(Type.String()),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class TranslateEnWordToZn extends OneBotAction<Payload, Array<unknown> | null> { export class TranslateEnWordToZn extends OneBotAction<Payload, Array<unknown> | null> {
override actionName = ActionName.TranslateEnWordToZn; override actionName = ActionName.TranslateEnWordToZn;

View File

@@ -3,7 +3,7 @@ import fs from 'fs/promises';
import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { FileNapCatOneBotUUID } from '@/common/file-uuid';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { OB11MessageImage, OB11MessageVideo } from '@/onebot/types'; import { OB11MessageImage, OB11MessageVideo } from '@/onebot/types';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
export interface GetFileResponse { export interface GetFileResponse {
file?: string; // path file?: string; // path
@@ -13,13 +13,13 @@ export interface GetFileResponse {
base64?: string; base64?: string;
} }
const GetFileBase_PayloadSchema = z.object({ const GetFileBase_PayloadSchema = Type.Object({
file: z.string().optional(), file: Type.Optional(Type.String()),
file_id: z.string().optional(), file_id: Type.Optional(Type.String())
}); });
export type GetFilePayload = z.infer<typeof GetFileBase_PayloadSchema>; export type GetFilePayload = Static<typeof GetFileBase_PayloadSchema>;
export class GetFileBase extends OneBotAction<GetFilePayload, GetFileResponse> { export class GetFileBase extends OneBotAction<GetFilePayload, GetFileResponse> {
override payloadSchema = GetFileBase_PayloadSchema; override payloadSchema = GetFileBase_PayloadSchema;

View File

@@ -1,14 +1,14 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { FileNapCatOneBotUUID } from '@/common/file-uuid';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
file_id: z.string(), file_id: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
interface GetGroupFileUrlResponse { interface GetGroupFileUrlResponse {
url?: string; url?: string;

View File

@@ -1,13 +1,13 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { FileNapCatOneBotUUID } from '@/common/file-uuid';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
file_id: z.string(), file_id: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
interface GetPrivateFileUrlResponse { interface GetPrivateFileUrlResponse {
url?: string; url?: string;

View File

@@ -1,13 +1,13 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
folder_name: z.string(), folder_name: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
interface ResponseType{ interface ResponseType{
result:unknown; result:unknown;
groupItem:unknown; groupItem:unknown;

View File

@@ -2,15 +2,15 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { FileNapCatOneBotUUID } from '@/common/file-uuid';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
import { NTQQGroupApi } from '@/core/apis'; import { NTQQGroupApi } from '@/core/apis';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
file_id: z.string(), file_id: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class DeleteGroupFile extends OneBotAction<Payload, Awaited<ReturnType<NTQQGroupApi['delGroupFile']>>> { export class DeleteGroupFile extends OneBotAction<Payload, Awaited<ReturnType<NTQQGroupApi['delGroupFile']>>> {
override actionName = ActionName.GOCQHTTP_DeleteGroupFile; override actionName = ActionName.GOCQHTTP_DeleteGroupFile;

View File

@@ -1,15 +1,15 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
import { NTQQGroupApi } from '@/core/apis'; import { NTQQGroupApi } from '@/core/apis';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
folder_id: z.string().optional(), folder_id: Type.Optional(Type.String()),
folder: z.string().optional(), folder: Type.Optional(Type.String()),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class DeleteGroupFileFolder extends OneBotAction<Payload, Awaited<ReturnType<NTQQGroupApi['delGroupFileFolder']>>['groupFileCommonResult']> { export class DeleteGroupFileFolder extends OneBotAction<Payload, Awaited<ReturnType<NTQQGroupApi['delGroupFileFolder']>>['groupFileCommonResult']> {
override actionName = ActionName.GoCQHTTP_DeleteGroupFileFolder; override actionName = ActionName.GoCQHTTP_DeleteGroupFileFolder;

View File

@@ -4,20 +4,20 @@ import fs from 'fs';
import { join as joinPath } from 'node:path'; import { join as joinPath } from 'node:path';
import { calculateFileMD5, uriToLocalFile } from '@/common/file'; import { calculateFileMD5, uriToLocalFile } from '@/common/file';
import { randomUUID } from 'crypto'; import { randomUUID } from 'crypto';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
interface FileResponse { interface FileResponse {
file: string; file: string;
} }
const SchemaData = z.object({ const SchemaData = Type.Object({
url: z.string().optional(), url: Type.Optional(Type.String()),
base64: z.string().optional(), base64: Type.Optional(Type.String()),
name: z.string().optional(), name: Type.Optional(Type.String()),
headers: z.union([z.string(), z.array(z.string())]).optional(), headers: Type.Optional(Type.Union([Type.String(), Type.Array(Type.String())])),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class GoCQHTTPDownloadFile extends OneBotAction<Payload, FileResponse> { export default class GoCQHTTPDownloadFile extends OneBotAction<Payload, FileResponse> {
override actionName = ActionName.GoCQHTTP_DownloadFile; override actionName = ActionName.GoCQHTTP_DownloadFile;

View File

@@ -2,14 +2,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction';
import { OB11Message, OB11MessageData, OB11MessageDataType, OB11MessageForward, OB11MessageNodePlain as OB11MessageNode } from '@/onebot'; import { OB11Message, OB11MessageData, OB11MessageDataType, OB11MessageForward, OB11MessageNodePlain as OB11MessageNode } from '@/onebot';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import { Static, Type } from '@sinclair/typebox';
import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core'; import { ChatType, ElementType, MsgSourceType, NTMsgType, RawMessage } from '@/core';
import { z } from 'zod';
const SchemaData = z.object({ const SchemaData = Type.Object({
message_id: z.union([z.number(), z.string()]).optional(), message_id: Type.Optional(Type.Union([Type.Number(), Type.String()])),
id: z.union([z.number(), z.string()]).optional(), id: Type.Optional(Type.Union([Type.Number(), Type.String()])),
}); });
type Payload = z.infer<typeof SchemaData>;
type Payload = Static<typeof SchemaData>;
export class GoCQHTTPGetForwardMsgAction extends OneBotAction<Payload, { export class GoCQHTTPGetForwardMsgAction extends OneBotAction<Payload, {
messages: OB11Message[] | undefined; messages: OB11Message[] | undefined;

View File

@@ -3,21 +3,22 @@ import { OB11Message } from '@/onebot';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { ChatType } from '@/core/types'; import { ChatType } from '@/core/types';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import { z } from 'zod';
import { Static, Type } from '@sinclair/typebox';
import { NetworkAdapterConfig } from '@/onebot/config/config'; import { NetworkAdapterConfig } from '@/onebot/config/config';
interface Response { interface Response {
messages: OB11Message[]; messages: OB11Message[];
} }
const SchemaData = z.object({ const SchemaData = Type.Object({
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
message_seq: z.union([z.number(), z.string()]).optional(), message_seq: Type.Optional(Type.Union([Type.Number(), Type.String()])),
count: z.union([z.number(), z.string()]).default(20), count: Type.Union([Type.Number(), Type.String()], { default: 20 }),
reverseOrder: z.union([z.boolean(), z.string()]).optional() reverseOrder: Type.Optional(Type.Union([Type.Boolean(), Type.String()]))
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class GetFriendMsgHistory extends OneBotAction<Payload, Response> { export default class GetFriendMsgHistory extends OneBotAction<Payload, Response> {
override actionName = ActionName.GetFriendMsgHistory; override actionName = ActionName.GetFriendMsgHistory;

View File

@@ -1,12 +1,12 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]) group_id: Type.Union([Type.Number(), Type.String()])
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
interface ResponseType { interface ResponseType {
can_at_all: boolean; can_at_all: boolean;
remain_at_all_count_for_group: number; remain_at_all_count_for_group: number;

View File

@@ -1,12 +1,12 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]) group_id: Type.Union([Type.Number(), Type.String()])
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetGroupFileSystemInfo extends OneBotAction<Payload, { export class GetGroupFileSystemInfo extends OneBotAction<Payload, {
file_count: number, file_count: number,

View File

@@ -2,16 +2,16 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { OB11Construct } from '@/onebot/helper/data'; import { OB11Construct } from '@/onebot/helper/data';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
folder_id: z.string().optional(), folder_id: Type.Optional(Type.String()),
folder: z.string().optional(), folder: Type.Optional(Type.String()),
file_count: z.union([z.number(), z.string()]).default(50), file_count: Type.Union([Type.Number(), Type.String()], { default: 50 }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetGroupFilesByFolder extends OneBotAction<Payload, { export class GetGroupFilesByFolder extends OneBotAction<Payload, {
files: ReturnType<typeof OB11Construct.file>[], files: ReturnType<typeof OB11Construct.file>[],

View File

@@ -1,16 +1,16 @@
import { WebHonorType } from '@/core';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; 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({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
type: z.nativeEnum(WebHonorType).optional() type: Type.Optional(Type.Enum(WebHonorType))
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetGroupHonorInfo extends OneBotAction<Payload, unknown> { export class GetGroupHonorInfo extends OneBotAction<Payload, Array<unknown>> {
override actionName = ActionName.GetGroupHonorInfo; override actionName = ActionName.GetGroupHonorInfo;
override payloadSchema = SchemaData; override payloadSchema = SchemaData;

View File

@@ -3,22 +3,22 @@ import { OB11Message } from '@/onebot';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { ChatType, Peer } from '@/core/types'; import { ChatType, Peer } from '@/core/types';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
import { NetworkAdapterConfig } from '@/onebot/config/config'; import { NetworkAdapterConfig } from '@/onebot/config/config';
interface Response { interface Response {
messages: OB11Message[]; messages: OB11Message[];
} }
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
message_seq: z.union([z.number(), z.string()]).optional(), message_seq: Type.Optional(Type.Union([Type.Number(), Type.String()])),
count: z.union([z.number(), z.string()]).default(20), count: Type.Union([Type.Number(), Type.String()], { default: 20 }),
reverseOrder: z.union([z.boolean(), z.string()]).optional() reverseOrder: Type.Optional(Type.Union([Type.Boolean(), Type.String()]))
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction<Payload, Response> { export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction<Payload, Response> {

View File

@@ -3,14 +3,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { OB11GroupFile, OB11GroupFileFolder } from '@/onebot'; import { OB11GroupFile, OB11GroupFileFolder } from '@/onebot';
import { OB11Construct } from '@/onebot/helper/data'; import { OB11Construct } from '@/onebot/helper/data';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
file_count: z.union([z.number(), z.string()]).default(50), file_count: Type.Union([Type.Number(), Type.String()], { default: 50 }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetGroupRootFiles extends OneBotAction<Payload, { export class GetGroupRootFiles extends OneBotAction<Payload, {
files: OB11GroupFile[], files: OB11GroupFile[],

View File

@@ -3,14 +3,14 @@ import { OB11User, OB11UserSex } from '@/onebot';
import { OB11Construct } from '@/onebot/helper/data'; import { OB11Construct } from '@/onebot/helper/data';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { calcQQLevel } from '@/common/helper'; import { calcQQLevel } from '@/common/helper';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
no_cache: z.boolean().default(false), no_cache: Type.Union([Type.Boolean(), Type.String()], { default: false }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class GoCQHTTPGetStrangerInfo extends OneBotAction<Payload, OB11User & { uid: string }> { export default class GoCQHTTPGetStrangerInfo extends OneBotAction<Payload, OB11User & { uid: string }> {
override actionName = ActionName.GoCQHTTP_GetStrangerInfo; override actionName = ActionName.GoCQHTTP_GetStrangerInfo;

View File

@@ -1,12 +1,12 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
url: z.string(), url: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GoCQHTTPCheckUrlSafely extends OneBotAction<Payload, { level: number }> { export class GoCQHTTPCheckUrlSafely extends OneBotAction<Payload, { level: number }> {
override actionName = ActionName.GoCQHTTP_CheckUrlSafely; override actionName = ActionName.GoCQHTTP_CheckUrlSafely;

View File

@@ -1,15 +1,15 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
friend_id: z.union([z.string(), z.number()]).optional(), friend_id: Type.Optional(Type.Union([Type.String(), Type.Number()])),
user_id: z.union([z.string(), z.number()]).optional(), user_id: Type.Optional(Type.Union([Type.String(), Type.Number()])),
temp_block: z.boolean().optional(), temp_block: Type.Optional(Type.Boolean()),
temp_both_del: z.boolean().optional(), temp_both_del: Type.Optional(Type.Boolean()),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GoCQHTTPDeleteFriend extends OneBotAction<Payload, unknown> { export class GoCQHTTPDeleteFriend extends OneBotAction<Payload, unknown> {
override actionName = ActionName.GoCQHTTP_DeleteFriend; override actionName = ActionName.GoCQHTTP_DeleteFriend;

View File

@@ -1,12 +1,12 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
model: z.string(), model: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GoCQHTTPGetModelShow extends OneBotAction<Payload, Array<{ export class GoCQHTTPGetModelShow extends OneBotAction<Payload, Array<{
variants: { variants: {

View File

@@ -2,20 +2,20 @@ import { checkFileExist, uriToLocalFile } from '@/common/file';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { unlink } from 'node:fs/promises'; import { unlink } from 'node:fs/promises';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
content: z.string(), content: Type.String(),
image: z.string().optional(), image: Type.Optional(Type.String()),
pinned: z.union([z.number(), z.string()]).default(0), pinned: Type.Union([Type.Number(), Type.String()], { default: 0 }),
type: z.union([z.number(), z.string()]).default(1), type: Type.Union([Type.Number(), Type.String()], { default: 1 }),
confirm_required: z.union([z.number(), z.string()]).default(1), confirm_required: Type.Union([Type.Number(), Type.String()], { default: 1 }),
is_show_edit_card: z.union([z.number(), z.string()]).default(0), is_show_edit_card: Type.Union([Type.Number(), Type.String()], { default: 0 }),
tip_window_type: z.union([z.number(), z.string()]).default(0), tip_window_type: Type.Union([Type.Number(), Type.String()], { default: 0 })
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SendGroupNotice extends OneBotAction<Payload, null> { export class SendGroupNotice extends OneBotAction<Payload, null> {
override actionName = ActionName.GoCQHTTP_SendGroupNotice; override actionName = ActionName.GoCQHTTP_SendGroupNotice;

View File

@@ -1,15 +1,15 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { checkFileExistV2, uriToLocalFile } from '@/common/file'; import { checkFileExistV2, uriToLocalFile } from '@/common/file';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
import fs from 'node:fs/promises'; import fs from 'node:fs/promises';
import { GeneralCallResult } from '@/core'; import { GeneralCallResult } from '@/core';
const SchemaData = z.object({ const SchemaData = Type.Object({
file: z.string(), file: Type.String(),
group_id: z.union([z.number(), z.string()]) group_id: Type.Union([Type.Number(), Type.String()])
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetGroupPortrait extends OneBotAction<Payload, GeneralCallResult> { export default class SetGroupPortrait extends OneBotAction<Payload, GeneralCallResult> {
override actionName = ActionName.SetGroupPortrait; override actionName = ActionName.SetGroupPortrait;

View File

@@ -1,15 +1,15 @@
import { NTQQUserApi } from '@/core/apis'; import { NTQQUserApi } from '@/core/apis';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
nickname: z.string(), nickname: Type.String(),
personal_note: z.string().optional(), personal_note: Type.Optional(Type.String()),
sex: z.union([z.number(), z.string()]).optional(), // 传Sex值建议传0 sex: Type.Optional(Type.Union([Type.Number(), Type.String()])), // 传Sex值建议传0
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SetQQProfile extends OneBotAction<Payload, Awaited<ReturnType<NTQQUserApi['modifySelfProfile']>> | null> { export class SetQQProfile extends OneBotAction<Payload, Awaited<ReturnType<NTQQUserApi['modifySelfProfile']>> | null> {
override actionName = ActionName.SetQQProfile; override actionName = ActionName.SetQQProfile;
override payloadSchema = SchemaData; override payloadSchema = SchemaData;

View File

@@ -4,17 +4,17 @@ import { ChatType, Peer } from '@/core/types';
import fs from 'fs'; import fs from 'fs';
import { uriToLocalFile } from '@/common/file'; import { uriToLocalFile } from '@/common/file';
import { SendMessageContext } from '@/onebot/api'; import { SendMessageContext } from '@/onebot/api';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
file: z.string(), file: Type.String(),
name: z.string(), name: Type.String(),
folder: z.string().optional(), folder: Type.Optional(Type.String()),
folder_id: z.string().optional(),//临时扩展 folder_id: Type.Optional(Type.String()),//临时扩展
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class GoCQHTTPUploadGroupFile extends OneBotAction<Payload, null> { export default class GoCQHTTPUploadGroupFile extends OneBotAction<Payload, null> {
override actionName = ActionName.GoCQHTTP_UploadGroupFile; override actionName = ActionName.GoCQHTTP_UploadGroupFile;

View File

@@ -5,15 +5,15 @@ import fs from 'fs';
import { uriToLocalFile } from '@/common/file'; import { uriToLocalFile } from '@/common/file';
import { SendMessageContext } from '@/onebot/api'; import { SendMessageContext } from '@/onebot/api';
import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg'; import { ContextMode, createContext } from '@/onebot/action/msg/SendMsg';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
file: z.string(), file: Type.String(),
name: z.string(), name: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class GoCQHTTPUploadPrivateFile extends OneBotAction<Payload, null> { export default class GoCQHTTPUploadPrivateFile extends OneBotAction<Payload, null> {
override actionName = ActionName.GOCQHTTP_UploadPrivateFile; override actionName = ActionName.GOCQHTTP_UploadPrivateFile;

View File

@@ -1,13 +1,13 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
message_id: z.union([z.number(), z.string()]), message_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class DelEssenceMsg extends OneBotAction<Payload, unknown> { export default class DelEssenceMsg extends OneBotAction<Payload, unknown> {
override actionName = ActionName.DelEssenceMsg; override actionName = ActionName.DelEssenceMsg;
override payloadSchema = SchemaData; override payloadSchema = SchemaData;

View File

@@ -1,13 +1,13 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
notice_id: z.string() notice_id: Type.String()
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class DelGroupNotice extends OneBotAction<Payload, void> { export class DelGroupNotice extends OneBotAction<Payload, void> {
override actionName = ActionName.DelGroupNotice; override actionName = ActionName.DelGroupNotice;

View File

@@ -1,15 +1,15 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
character: z.string(), character: Type.String(),
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
text: z.string(), text: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetAiRecord extends GetPacketStatusDepends<Payload, string> { export class GetAiRecord extends GetPacketStatusDepends<Payload, string> {
override actionName = ActionName.GetAiRecord; override actionName = ActionName.GetAiRecord;

View File

@@ -3,14 +3,14 @@ import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import crypto from 'crypto'; import crypto from 'crypto';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
import { NetworkAdapterConfig } from '@/onebot/config/config'; import { NetworkAdapterConfig } from '@/onebot/config/config';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetGroupEssence extends OneBotAction<Payload, unknown> { export class GetGroupEssence extends OneBotAction<Payload, unknown> {
override actionName = ActionName.GoCQHTTP_GetEssenceMsg; override actionName = ActionName.GoCQHTTP_GetEssenceMsg;

View File

@@ -2,13 +2,13 @@ import { OB11Group } from '@/onebot';
import { OB11Construct } from '@/onebot/helper/data'; import { OB11Construct } from '@/onebot/helper/data';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
class GetGroupInfo extends OneBotAction<Payload, OB11Group> { class GetGroupInfo extends OneBotAction<Payload, OB11Group> {
override actionName = ActionName.GetGroupInfo; override actionName = ActionName.GetGroupInfo;

View File

@@ -2,13 +2,13 @@ import { OB11Group } from '@/onebot';
import { OB11Construct } from '@/onebot/helper/data'; import { OB11Construct } from '@/onebot/helper/data';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
no_cache: z.boolean().default(false), no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
class GetGroupList extends OneBotAction<Payload, OB11Group[]> { class GetGroupList extends OneBotAction<Payload, OB11Group[]> {
override actionName = ActionName.GetGroupList; override actionName = ActionName.GetGroupList;

View File

@@ -2,15 +2,15 @@ import { OB11GroupMember } from '@/onebot';
import { OB11Construct } from '@/onebot/helper/data'; import { OB11Construct } from '@/onebot/helper/data';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
no_cache: z.boolean().default(false), no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
class GetGroupMemberInfo extends OneBotAction<Payload, OB11GroupMember> { class GetGroupMemberInfo extends OneBotAction<Payload, OB11GroupMember> {
override actionName = ActionName.GetGroupMemberInfo; override actionName = ActionName.GetGroupMemberInfo;

View File

@@ -2,15 +2,15 @@ import { OB11GroupMember } from '@/onebot';
import { OB11Construct } from '@/onebot/helper/data'; import { OB11Construct } from '@/onebot/helper/data';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
import { GroupMember } from '@/core'; import { GroupMember } from '@/core';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
no_cache: z.boolean().default(false) no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()]))
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetGroupMemberList extends OneBotAction<Payload, OB11GroupMember[]> { export class GetGroupMemberList extends OneBotAction<Payload, OB11GroupMember[]> {
override actionName = ActionName.GetGroupMemberList; override actionName = ActionName.GetGroupMemberList;

View File

@@ -1,7 +1,7 @@
import { WebApiGroupNoticeFeed } from '@/core'; import { WebApiGroupNoticeFeed } from '@/core';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
interface GroupNotice { interface GroupNotice {
sender_id: number; sender_id: number;
publish_time: number; publish_time: number;
@@ -16,11 +16,11 @@ interface GroupNotice {
}; };
} }
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
type ApiGroupNotice = GroupNotice & WebApiGroupNoticeFeed; type ApiGroupNotice = GroupNotice & WebApiGroupNoticeFeed;

View File

@@ -1,13 +1,13 @@
import { ShutUpGroupMember } from '@/core'; import { ShutUpGroupMember } from '@/core';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetGroupShutList extends OneBotAction<Payload, ShutUpGroupMember[]> { export class GetGroupShutList extends OneBotAction<Payload, ShutUpGroupMember[]> {
override actionName = ActionName.GetGroupShutList; override actionName = ActionName.GetGroupShutList;

View File

@@ -1,13 +1,13 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GroupPoke extends GetPacketStatusDepends<Payload, void> { export class GroupPoke extends GetPacketStatusDepends<Payload, void> {
override actionName = ActionName.GroupPoke; override actionName = ActionName.GroupPoke;

View File

@@ -1,15 +1,15 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
character: z.string(), character: Type.String(),
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
text: z.string(), text: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SendGroupAiRecord extends GetPacketStatusDepends<Payload, { export class SendGroupAiRecord extends GetPacketStatusDepends<Payload, {

View File

@@ -1,13 +1,13 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
message_id: z.union([z.number(), z.string()]), message_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetEssenceMsg extends OneBotAction<Payload, unknown> { export default class SetEssenceMsg extends OneBotAction<Payload, unknown> {
override actionName = ActionName.SetEssenceMsg; override actionName = ActionName.SetEssenceMsg;

View File

@@ -1,15 +1,15 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { NTGroupRequestOperateTypes } from '@/core/types'; import { NTGroupRequestOperateTypes } from '@/core/types';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
flag: z.union([z.string(), z.number()]), flag: Type.Union([Type.String(), Type.Number()]),
approve: z.boolean().default(true), approve: Type.Optional(Type.Union([Type.Boolean(), Type.String()])),
reason: z.union([z.string(), z.null()]).default(' '), reason: Type.Optional(Type.Union([Type.String({ default: ' ' }), Type.Null()])),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetGroupAddRequest extends OneBotAction<Payload, null> { export default class SetGroupAddRequest extends OneBotAction<Payload, null> {
override actionName = ActionName.SetGroupAddRequest; override actionName = ActionName.SetGroupAddRequest;

View File

@@ -1,15 +1,15 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { NTGroupMemberRole } from '@/core/types'; import { NTGroupMemberRole } from '@/core/types';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
enable: z.boolean().default(false), enable: Type.Optional(Type.Union([Type.Boolean(), Type.String()])),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetGroupAdmin extends OneBotAction<Payload, null> { export default class SetGroupAdmin extends OneBotAction<Payload, null> {
override actionName = ActionName.SetGroupAdmin; override actionName = ActionName.SetGroupAdmin;

View File

@@ -1,14 +1,14 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
duration: z.union([z.number(), z.string()]).default(0), duration: Type.Union([Type.Number(), Type.String()], { default: 0 }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetGroupBan extends OneBotAction<Payload, null> { export default class SetGroupBan extends OneBotAction<Payload, null> {
override actionName = ActionName.SetGroupBan; override actionName = ActionName.SetGroupBan;

View File

@@ -1,14 +1,14 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
card: z.string().optional(), card: Type.Optional(Type.String())
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetGroupCard extends OneBotAction<Payload, null> { export default class SetGroupCard extends OneBotAction<Payload, null> {
override actionName = ActionName.SetGroupCard; override actionName = ActionName.SetGroupCard;

View File

@@ -1,14 +1,14 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
reject_add_request: z.union([z.boolean(), z.string()]).optional(), reject_add_request: Type.Optional(Type.Union([Type.Boolean(), Type.String()])),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetGroupKick extends OneBotAction<Payload, null> { export default class SetGroupKick extends OneBotAction<Payload, null> {
override actionName = ActionName.SetGroupKick; override actionName = ActionName.SetGroupKick;

View File

@@ -1,13 +1,13 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
is_dismiss: z.boolean().optional(), is_dismiss: Type.Optional(Type.Union([Type.Boolean(), Type.String()])),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetGroupLeave extends OneBotAction<Payload, void> { export default class SetGroupLeave extends OneBotAction<Payload, void> {
override actionName = ActionName.SetGroupLeave; override actionName = ActionName.SetGroupLeave;

View File

@@ -1,14 +1,14 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
group_name: z.string(), group_name: Type.String(),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetGroupName extends OneBotAction<Payload, null> { export default class SetGroupName extends OneBotAction<Payload, null> {
override actionName = ActionName.SetGroupName; override actionName = ActionName.SetGroupName;

View File

@@ -1,13 +1,13 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]), group_id: Type.Union([Type.Number(), Type.String()]),
enable: z.union([z.boolean(), z.string()]).optional(), enable: Type.Optional(Type.Union([Type.Boolean(), Type.String()])),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetGroupWholeBan extends OneBotAction<Payload, null> { export default class SetGroupWholeBan extends OneBotAction<Payload, null> {
override actionName = ActionName.SetGroupWholeBan; override actionName = ActionName.SetGroupWholeBan;

View File

@@ -1,13 +1,13 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
message_id: z.union([z.number(), z.string()]), message_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
class DeleteMsg extends OneBotAction<Payload, void> { class DeleteMsg extends OneBotAction<Payload, void> {
override actionName = ActionName.DeleteMsg; override actionName = ActionName.DeleteMsg;

View File

@@ -2,15 +2,15 @@ import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ChatType, Peer } from '@/core/types'; import { ChatType, Peer } from '@/core/types';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
message_id: z.union([z.number(), z.string()]), message_id: Type.Union([Type.Number(), Type.String()]),
group_id: z.string().optional(), group_id: Type.Optional(Type.Union([Type.Number(), Type.String()])),
user_id: z.string().optional(), user_id: Type.Optional(Type.Union([Type.Number(), Type.String()])),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
class ForwardSingleMsg extends OneBotAction<Payload, null> { class ForwardSingleMsg extends OneBotAction<Payload, null> {
protected async getTargetPeer(payload: Payload): Promise<Peer> { protected async getTargetPeer(payload: Payload): Promise<Peer> {

View File

@@ -3,16 +3,16 @@ import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import { RawMessage } from '@/core'; import { RawMessage } from '@/core';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
import { NetworkAdapterConfig } from '@/onebot/config/config'; import { NetworkAdapterConfig } from '@/onebot/config/config';
export type ReturnDataType = OB11Message export type ReturnDataType = OB11Message
const SchemaData = z.object({ const SchemaData = Type.Object({
message_id: z.union([z.number(), z.string()]), message_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
class GetMsg extends OneBotAction<Payload, OB11Message> { class GetMsg extends OneBotAction<Payload, OB11Message> {
override actionName = ActionName.GetMsg; override actionName = ActionName.GetMsg;

View File

@@ -2,15 +2,15 @@ import { ChatType, Peer } from '@/core/types';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
user_id: z.union([z.string(), z.number()]).optional(), user_id: Type.Optional(Type.Union([Type.String(), Type.Number()])),
group_id: z.union([z.string(), z.number()]).optional(), group_id: Type.Optional(Type.Union([Type.String(), Type.Number()])),
message_id: z.union([z.string(), z.number()]).optional(), message_id: Type.Optional(Type.Union([Type.String(), Type.Number()])),
}); });
type PlayloadType = z.infer<typeof SchemaData>; type PlayloadType = Static<typeof SchemaData>;
class MarkMsgAsRead extends OneBotAction<PlayloadType, null> { class MarkMsgAsRead extends OneBotAction<PlayloadType, null> {
async getPeer(payload: PlayloadType): Promise<Peer> { async getPeer(payload: PlayloadType): Promise<Peer> {

View File

@@ -1,15 +1,15 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { MessageUnique } from '@/common/message-unique'; import { MessageUnique } from '@/common/message-unique';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
message_id: z.union([z.number(), z.string()]), message_id: Type.Union([Type.Number(), Type.String()]),
emoji_id: z.union([z.number(), z.string()]), emoji_id: Type.Union([Type.Number(), Type.String()]),
set: z.boolean().optional(), set: Type.Optional(Type.Union([Type.Boolean(), Type.String()]))
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SetMsgEmojiLike extends OneBotAction<Payload, unknown> { export class SetMsgEmojiLike extends OneBotAction<Payload, unknown> {
override actionName = ActionName.SetMsgEmojiLike; override actionName = ActionName.SetMsgEmojiLike;

View File

@@ -8,7 +8,7 @@ export class GetRkeyEx extends GetPacketStatusDepends<void, unknown> {
let rkeys = await this.core.apis.PacketApi.pkt.operation.FetchRkey(); let rkeys = await this.core.apis.PacketApi.pkt.operation.FetchRkey();
return rkeys.map(rkey => { return rkeys.map(rkey => {
return { return {
type: rkey.type === 10 ? 'private' : 'group', type: rkey.type === 10 ? "private" : "group",
rkey: rkey.rkey, rkey: rkey.rkey,
created_at: rkey.time, created_at: rkey.time,
ttl: rkey.ttl, ttl: rkey.ttl,

View File

@@ -30,7 +30,7 @@ export class GetRkeyServer extends GetPacketStatusDepends<void, { private_rkey?:
private_rkey: privateRkeyItem ? privateRkeyItem.rkey : undefined, private_rkey: privateRkeyItem ? privateRkeyItem.rkey : undefined,
group_rkey: groupRkeyItem ? groupRkeyItem.rkey : undefined, group_rkey: groupRkeyItem ? groupRkeyItem.rkey : undefined,
expired_time: this.expiryTime, expired_time: this.expiryTime,
name: 'NapCat 4' name: "NapCat 4"
}; };
return this.rkeyCache; return this.rkeyCache;

View File

@@ -1,13 +1,13 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
group_id: z.union([z.number(), z.string()]).optional(), group_id: Type.Optional(Type.Union([Type.Number(), Type.String()])),
user_id: z.union([z.number(), z.string()]), user_id: Type.Union([Type.Number(), Type.String()]),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class SendPoke extends GetPacketStatusDepends<Payload, void> { export class SendPoke extends GetPacketStatusDepends<Payload, void> {
override actionName = ActionName.SendPoke; override actionName = ActionName.SendPoke;

View File

@@ -1,17 +1,17 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
interface Response { interface Response {
cookies: string, cookies: string,
token: number token: number
} }
const SchemaData = z.object({ const SchemaData = Type.Object({
domain: z.string() domain: Type.String()
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetCredentials extends OneBotAction<Payload, Response> { export class GetCredentials extends OneBotAction<Payload, Response> {

View File

@@ -1,12 +1,12 @@
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
user_id: z.union([z.number(), z.string()]) user_id: Type.Union([Type.Number(), Type.String()])
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class FriendPoke extends GetPacketStatusDepends<Payload, void> { export class FriendPoke extends GetPacketStatusDepends<Payload, void> {
override actionName = ActionName.FriendPoke; override actionName = ActionName.FriendPoke;

View File

@@ -1,16 +1,16 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
interface Response { interface Response {
cookies: string, cookies: string,
bkn: string bkn: string
} }
const SchemaData = z.object({ const SchemaData = Type.Object({
domain: z.string() domain: Type.String()
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export class GetCookies extends OneBotAction<Payload, Response> { export class GetCookies extends OneBotAction<Payload, Response> {
override actionName = ActionName.GetCookies; override actionName = ActionName.GetCookies;

View File

@@ -2,13 +2,13 @@ import { OB11User } from '@/onebot';
import { OB11Construct } from '@/onebot/helper/data'; import { OB11Construct } from '@/onebot/helper/data';
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
no_cache: z.boolean().optional(), no_cache: Type.Optional(Type.Union([Type.Boolean(), Type.String()])),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class GetFriendList extends OneBotAction<Payload, OB11User[]> { export default class GetFriendList extends OneBotAction<Payload, OB11User[]> {
override actionName = ActionName.GetFriendList; override actionName = ActionName.GetFriendList;

View File

@@ -2,13 +2,13 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { NetworkAdapterConfig } from '@/onebot/config/config'; import { NetworkAdapterConfig } from '@/onebot/config/config';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
count: z.number().default(10), count: Type.Union([Type.Number(), Type.String()], { default: 10 }),
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class GetRecentContact extends OneBotAction<Payload, unknown> { export default class GetRecentContact extends OneBotAction<Payload, unknown> {
override actionName = ActionName.GetRecentContact; override actionName = ActionName.GetRecentContact;

View File

@@ -1,13 +1,13 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
times: z.union([z.number(), z.string()]).default(1), times: Type.Union([Type.Number(), Type.String()], { default: 1 }),
user_id: z.union([z.number(), z.string()]) user_id: Type.Union([Type.Number(), Type.String()])
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SendLike extends OneBotAction<Payload, null> { export default class SendLike extends OneBotAction<Payload, null> {
override actionName = ActionName.SendLike; override actionName = ActionName.SendLike;

View File

@@ -1,14 +1,14 @@
import { OneBotAction } from '@/onebot/action/OneBotAction'; import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router'; import { ActionName } from '@/onebot/action/router';
import { z } from 'zod'; import { Static, Type } from '@sinclair/typebox';
const SchemaData = z.object({ const SchemaData = Type.Object({
flag: z.union([z.string(), z.number()]), flag: Type.Union([Type.String(), Type.Number()]),
approve: z.union([z.string(), z.boolean()]).default(true), approve: Type.Optional(Type.Union([Type.String(), Type.Boolean()])),
remark: z.union([z.string(), z.null()]).nullable().optional() remark: Type.Optional(Type.String())
}); });
type Payload = z.infer<typeof SchemaData>; type Payload = Static<typeof SchemaData>;
export default class SetFriendAddRequest extends OneBotAction<Payload, null> { export default class SetFriendAddRequest extends OneBotAction<Payload, null> {
override actionName = ActionName.SetFriendAddRequest; override actionName = ActionName.SetFriendAddRequest;

View File

@@ -1,107 +1,108 @@
import { z } from 'zod'; import { Type, Static } from '@sinclair/typebox';
import Ajv from 'ajv';
const HttpServerConfigSchema = z.object({ const HttpServerConfigSchema = Type.Object({
name: z.string().default('http-server'), name: Type.String({ default: 'http-server' }),
enable: z.boolean().default(false), enable: Type.Boolean({ default: false }),
port: z.number().default(3000), port: Type.Number({ default: 3000 }),
host: z.string().default('0.0.0.0'), host: Type.String({ default: '0.0.0.0' }),
enableCors: z.boolean().default(true), enableCors: Type.Boolean({ default: true }),
enableWebsocket: z.boolean().default(true), enableWebsocket: Type.Boolean({ default: true }),
messagePostFormat: z.string().default('array'), messagePostFormat: Type.String({ default: 'array' }),
token: z.string().default(''), token: Type.String({ default: '' }),
debug: z.boolean().default(false) debug: Type.Boolean({ default: false })
}); });
const HttpSseServerConfigSchema = z.object({ const HttpSseServerConfigSchema = Type.Object({
name: z.string().default('http-sse-server'), name: Type.String({ default: 'http-sse-server' }),
enable: z.boolean().default(false), enable: Type.Boolean({ default: false }),
port: z.number().default(3000), port: Type.Number({ default: 3000 }),
host: z.string().default('0.0.0.0'), host: Type.String({ default: '0.0.0.0' }),
enableCors: z.boolean().default(true), enableCors: Type.Boolean({ default: true }),
enableWebsocket: z.boolean().default(true), enableWebsocket: Type.Boolean({ default: true }),
messagePostFormat: z.string().default('array'), messagePostFormat: Type.String({ default: 'array' }),
token: z.string().default(''), token: Type.String({ default: '' }),
debug: z.boolean().default(false), debug: Type.Boolean({ default: false }),
reportSelfMessage: z.boolean().default(false) reportSelfMessage: Type.Boolean({ default: false })
}); });
const HttpClientConfigSchema = z.object({ const HttpClientConfigSchema = Type.Object({
name: z.string().default('http-client'), name: Type.String({ default: 'http-client' }),
enable: z.boolean().default(false), enable: Type.Boolean({ default: false }),
url: z.string().default('http://localhost:8080'), url: Type.String({ default: 'http://localhost:8080' }),
messagePostFormat: z.string().default('array'), messagePostFormat: Type.String({ default: 'array' }),
reportSelfMessage: z.boolean().default(false), reportSelfMessage: Type.Boolean({ default: false }),
token: z.string().default(''), token: Type.String({ default: '' }),
debug: z.boolean().default(false) debug: Type.Boolean({ default: false })
}); });
const WebsocketServerConfigSchema = z.object({ const WebsocketServerConfigSchema = Type.Object({
name: z.string().default('websocket-server'), name: Type.String({ default: 'websocket-server' }),
enable: z.boolean().default(false), enable: Type.Boolean({ default: false }),
host: z.string().default('0.0.0.0'), host: Type.String({ default: '0.0.0.0' }),
port: z.number().default(3001), port: Type.Number({ default: 3001 }),
messagePostFormat: z.string().default('array'), messagePostFormat: Type.String({ default: 'array' }),
reportSelfMessage: z.boolean().default(false), reportSelfMessage: Type.Boolean({ default: false }),
token: z.string().default(''), token: Type.String({ default: '' }),
enableForcePushEvent: z.boolean().default(true), enableForcePushEvent: Type.Boolean({ default: true }),
debug: z.boolean().default(false), debug: Type.Boolean({ default: false }),
heartInterval: z.number().default(30000) heartInterval: Type.Number({ default: 30000 })
}); });
const WebsocketClientConfigSchema = z.object({ const WebsocketClientConfigSchema = Type.Object({
name: z.string().default('websocket-client'), name: Type.String({ default: 'websocket-client' }),
enable: z.boolean().default(false), enable: Type.Boolean({ default: false }),
url: z.string().default('ws://localhost:8082'), url: Type.String({ default: 'ws://localhost:8082' }),
messagePostFormat: z.string().default('array'), messagePostFormat: Type.String({ default: 'array' }),
reportSelfMessage: z.boolean().default(false), reportSelfMessage: Type.Boolean({ default: false }),
reconnectInterval: z.number().default(5000), reconnectInterval: Type.Number({ default: 5000 }),
token: z.string().default(''), token: Type.String({ default: '' }),
debug: z.boolean().default(false), debug: Type.Boolean({ default: false }),
heartInterval: z.number().default(30000) heartInterval: Type.Number({ default: 30000 })
}); });
const PluginConfigSchema = z.object({ const PluginConfigSchema = Type.Object({
name: z.string().default('plugin'), name: Type.String({ default: 'plugin' }),
enable: z.boolean().default(false), enable: Type.Boolean({ default: false }),
messagePostFormat: z.string().default('array'), messagePostFormat: Type.String({ default: 'array' }),
reportSelfMessage: z.boolean().default(false), reportSelfMessage: Type.Boolean({ default: false }),
debug: z.boolean().default(false), debug: Type.Boolean({ default: false }),
}); });
const NetworkConfigSchema = z.object({ const NetworkConfigSchema = Type.Object({
httpServers: z.array(HttpServerConfigSchema).default([]), httpServers: Type.Array(HttpServerConfigSchema, { default: [] }),
httpSseServers: z.array(HttpSseServerConfigSchema).default([]), httpSseServers: Type.Array(HttpSseServerConfigSchema, { default: [] }),
httpClients: z.array(HttpClientConfigSchema).default([]), httpClients: Type.Array(HttpClientConfigSchema, { default: [] }),
websocketServers: z.array(WebsocketServerConfigSchema).default([]), websocketServers: Type.Array(WebsocketServerConfigSchema, { default: [] }),
websocketClients: z.array(WebsocketClientConfigSchema).default([]), websocketClients: Type.Array(WebsocketClientConfigSchema, { default: [] }),
plugins: z.array(PluginConfigSchema).default([]) plugins: Type.Array(PluginConfigSchema, { default: [] })
}).default({}); }, { default: {} });
export const OneBotConfigSchema = z.object({ export const OneBotConfigSchema = Type.Object({
network: NetworkConfigSchema, network: NetworkConfigSchema,
musicSignUrl: z.string().default(''), musicSignUrl: Type.String({ default: '' }),
enableLocalFile2Url: z.boolean().default(false), enableLocalFile2Url: Type.Boolean({ default: false }),
parseMultMsg: z.boolean().default(false) parseMultMsg: Type.Boolean({ default: false })
}); });
export type OneBotConfig = z.infer<typeof OneBotConfigSchema>; export type OneBotConfig = Static<typeof OneBotConfigSchema>;
export type HttpServerConfig = z.infer<typeof HttpServerConfigSchema>; export type HttpServerConfig = Static<typeof HttpServerConfigSchema>;
export type HttpSseServerConfig = z.infer<typeof HttpSseServerConfigSchema>; export type HttpSseServerConfig = Static<typeof HttpSseServerConfigSchema>;
export type HttpClientConfig = z.infer<typeof HttpClientConfigSchema>; export type HttpClientConfig = Static<typeof HttpClientConfigSchema>;
export type WebsocketServerConfig = z.infer<typeof WebsocketServerConfigSchema>; export type WebsocketServerConfig = Static<typeof WebsocketServerConfigSchema>;
export type WebsocketClientConfig = z.infer<typeof WebsocketClientConfigSchema>; export type WebsocketClientConfig = Static<typeof WebsocketClientConfigSchema>;
export type PluginConfig = z.infer<typeof PluginConfigSchema>; export type PluginConfig = Static<typeof PluginConfigSchema>;
export type NetworkAdapterConfig = HttpServerConfig | HttpSseServerConfig | HttpClientConfig | WebsocketServerConfig | WebsocketClientConfig | PluginConfig; export type NetworkAdapterConfig = HttpServerConfig | HttpSseServerConfig | HttpClientConfig | WebsocketServerConfig | WebsocketClientConfig | PluginConfig;
export type NetworkConfigKey = keyof OneBotConfig['network']; export type NetworkConfigKey = keyof OneBotConfig['network'];
export function loadConfig(config: Partial<OneBotConfig>): OneBotConfig { export function loadConfig(config: Partial<OneBotConfig>): OneBotConfig {
try { const ajv = new Ajv({ useDefaults: true, coerceTypes: true });
return OneBotConfigSchema.parse(config); const validate = ajv.compile(OneBotConfigSchema);
} catch (error) { const valid = validate(config);
if (error instanceof z.ZodError) { if (!valid) {
throw new Error(error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ')); throw new Error(ajv.errorsText(validate.errors));
}
throw error;
} }
return config as OneBotConfig;
} }

View File

@@ -1,11 +1,10 @@
import { ConfigBase } from '@/common/config-base'; import { ConfigBase } from '@/common/config-base';
import type { NapCatCore } from '@/core'; import type { NapCatCore } from '@/core';
import { OneBotConfig } from './config'; import { OneBotConfig } from './config';
import { z } from 'zod'; import { AnySchema } from 'ajv';
export class OB11ConfigLoader extends ConfigBase<OneBotConfig> { export class OB11ConfigLoader extends ConfigBase<OneBotConfig> {
constructor(core: NapCatCore, configPath: string, schema: z.ZodType<OneBotConfig>) { constructor(core: NapCatCore, configPath: string, schema: AnySchema) {
super('onebot11', core, configPath, schema); super('onebot11', core, configPath, schema);
} }
} }

View File

@@ -143,7 +143,7 @@ async function handleLogin(
handleLoginInner(context, logger, loginService, quickLoginUin, historyLoginList).then().catch(e => logger.logError(e)); handleLoginInner(context, logger, loginService, quickLoginUin, historyLoginList).then().catch(e => logger.logError(e));
loginListener.onLoginConnected = () => { }; loginListener.onLoginConnected = () => { };
}); });
}; }
loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => { loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => {
WebUiDataRuntime.setQQLoginQrcodeURL(qrcodeUrl); WebUiDataRuntime.setQQLoginQrcodeURL(qrcodeUrl);

View File

@@ -1,27 +1,33 @@
import { webUiPathWrapper } from '@/webui'; import { webUiPathWrapper } from '@/webui';
import { Type, Static } from '@sinclair/typebox';
import Ajv from 'ajv';
import fs, { constants } from 'node:fs/promises'; import fs, { constants } from 'node:fs/promises';
import { resolve } from 'node:path'; import { resolve } from 'node:path';
import { deepMerge } from '../utils/object'; import { deepMerge } from '../utils/object';
import { themeType } from '../types/theme'; import { themeType } from '../types/theme';
import { z } from 'zod';
// 限制尝试端口的次数,避免死循环
// 定义配置的类型 // 定义配置的类型
const WebUiConfigSchema = z.object({ const WebUiConfigSchema = Type.Object({
host: z.string().default('0.0.0.0'), host: Type.String({ default: '0.0.0.0' }),
port: z.number().default(6099), port: Type.Number({ default: 6099 }),
token: z.string().default('napcat'), token: Type.String({ default: 'napcat' }),
loginRate: z.number().default(10), loginRate: Type.Number({ default: 10 }),
autoLoginAccount: z.string().default(''), autoLoginAccount: Type.String({ default: '' }),
theme: themeType, theme: themeType,
}); });
export type WebUiConfigType = z.infer<typeof WebUiConfigSchema>; export type WebUiConfigType = Static<typeof WebUiConfigSchema>;
// 读取当前目录下名为 webui.json 的配置文件,如果不存在则创建初始化配置文件 // 读取当前目录下名为 webui.json 的配置文件,如果不存在则创建初始化配置文件
export class WebUiConfigWrapper { export class WebUiConfigWrapper {
WebUiConfigData: WebUiConfigType | undefined = undefined; WebUiConfigData: WebUiConfigType | undefined = undefined;
private validateAndApplyDefaults(config: Partial<WebUiConfigType>): WebUiConfigType { private validateAndApplyDefaults(config: Partial<WebUiConfigType>): WebUiConfigType {
config = WebUiConfigSchema.parse(config); new Ajv({ coerceTypes: true, useDefaults: true }).compile(WebUiConfigSchema)(config);
return config as WebUiConfigType; return config as WebUiConfigType;
} }

View File

@@ -1,13 +1,12 @@
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()), dark: Type.Record(Type.String(), Type.String()),
// light: 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: {
).default({
dark: { dark: {
'--heroui-background': '0 0% 0%', '--heroui-background': '0 0% 0%',
'--heroui-foreground-50': '240 5.88% 10%', '--heroui-foreground-50': '240 5.88% 10%',
@@ -256,5 +255,6 @@ export const themeType = z.object(
'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)', '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', '--heroui-hover-opacity': '.8',
}, },
},
}) }
);