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

View File

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