xinc
Version:
基于napcat,node-napcat-ts的bot框架
225 lines • 8.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadConfig = void 0;
const toml_1 = require("@iarna/toml");
const fs_1 = require("fs");
const path_1 = require("path");
const readline_1 = require("readline");
// 默认配置
const defaultConfig = {
host: '',
port: 0,
prefix: '/',
root: [],
admins: [],
plugins: [],
logger: 'info'
};
// 创建命令行交互接口
const readline = (0, readline_1.createInterface)({
input: process.stdin,
output: process.stdout
});
// 提问函数
const question = (query) => {
return new Promise((resolve) => {
readline.question(query, (answer) => {
resolve(answer);
});
});
};
// 验证IP或域名
const isValidHost = (host) => {
// 简单验证,允许IP或域名格式
return /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$|^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(host);
};
// 验证端口
const isValidPort = (port) => {
return Number.isInteger(port) && port > 0 && port < 65536;
};
// 验证数字列表
const isValidNumberArray = (arr) => {
if (!Array.isArray(arr))
return false;
return arr.every(item => Number.isInteger(item) && item > 0);
};
// 验证字符串列表
const isValidStringArray = (arr) => {
if (!Array.isArray(arr))
return false;
return arr.every(item => typeof item === 'string');
};
// 验证日志级别
const isValidLogLevel = (level) => {
return ['debug', 'info', 'warn', 'error', 'silent'].includes(level);
};
// 验证配置
const validateConfig = async (config) => {
const validatedConfig = { ...defaultConfig };
// 验证并获取 host
if (!config.host || !isValidHost(config.host)) {
console.log('Host 不合法或为空');
let host = await question('请输入有效的主机地址 (IP或域名): ');
while (!isValidHost(host)) {
host = await question('输入无效,请重新输入有效的主机地址: ');
}
validatedConfig.host = host;
}
else {
validatedConfig.host = config.host;
}
// 验证并获取 port
if (!config.port || !isValidPort(config.port)) {
console.log('Port 不合法或为空');
let portStr = await question('请输入有效的端口 (1-65535): ');
let port = parseInt(portStr);
while (!isValidPort(port)) {
portStr = await question('输入无效,请重新输入有效的端口: ');
port = parseInt(portStr);
}
validatedConfig.port = port;
}
else {
validatedConfig.port = config.port;
}
// 验证并获取 prefix
if (!config.prefix) {
console.log('Prefix 为空');
validatedConfig.prefix = await question('请输入命令前缀 (默认为 /): ') || '/';
}
else {
validatedConfig.prefix = config.prefix;
}
// 验证并获取 root
if (!config.root || !isValidNumberArray(config.root) || config.root.length === 0) {
console.log('Root 不合法或为空');
let rootStr = await question('请输入框架主人QQ号 (多个用逗号分隔): ');
let root = rootStr.split(',').map(item => parseInt(item.trim())).filter(item => !isNaN(item));
while (!isValidNumberArray(root) || root.length === 0) {
rootStr = await question('输入无效,请重新输入框架主人QQ号: ');
root = rootStr.split(',').map(item => parseInt(item.trim())).filter(item => !isNaN(item));
}
validatedConfig.root = root;
}
else {
validatedConfig.root = config.root;
}
// 验证并获取 admins (可选)
if (config.admins && !isValidNumberArray(config.admins)) {
console.log('Admins 不合法');
let adminsStr = await question('请输入框架管理员QQ号 (多个用逗号分隔,可留空): ');
if (adminsStr.trim()) {
let admins = adminsStr.split(',').map(item => parseInt(item.trim())).filter(item => !isNaN(item));
while (!isValidNumberArray(admins)) {
adminsStr = await question('输入无效,请重新输入框架管理员QQ号: ');
admins = adminsStr.split(',').map(item => parseInt(item.trim())).filter(item => !isNaN(item));
}
validatedConfig.admins = admins;
}
}
else {
validatedConfig.admins = config.admins || [];
}
// 验证并获取 plugins (可选)
if (config.plugins && !isValidStringArray(config.plugins)) {
console.log('Plugins 不合法');
let pluginsStr = await question('请输入插件名称 (多个用逗号分隔,可留空): ');
if (pluginsStr.trim()) {
validatedConfig.plugins = pluginsStr.split(',').map(item => item.trim());
}
}
else {
validatedConfig.plugins = config.plugins || [];
}
// 验证并获取 logger
if (!config.logger || !isValidLogLevel(config.logger)) {
console.log('Logger 不合法或为空');
let logger = await question('请输入日志级别 (debug/info/warn/error/silent,默认为 info): ') || 'info';
while (!isValidLogLevel(logger)) {
logger = await question('输入无效,请重新输入日志级别: ') || 'info';
}
validatedConfig.logger = logger;
}
else {
validatedConfig.logger = config.logger;
}
return validatedConfig;
};
// 格式化配置文件
const formatConfig = (config) => {
// 确保数字值正确格式化
return {
host: `"${config.host}"`, // 字符串需要引号
port: config.port, // 数字不需要引号
prefix: `"${config.prefix}"`,
root: config.root,
admins: config.admins,
plugins: config.plugins.map(p => `"${p}"`), // 字符串数组中的每个元素需要引号
logger: `"${config.logger}"`
};
};
// 在 loadConfig 函数开始处添加
const checkAndFixConfig = (path) => {
if (!(0, fs_1.existsSync)(path))
return false;
try {
// 尝试解析配置文件
const content = (0, fs_1.readFileSync)(path, 'utf-8');
(0, toml_1.parse)(content);
return true;
}
catch (error) {
console.error('配置文件格式错误,将重新创建');
return false;
}
};
// 加载配置
const loadConfig = async (configPath = 'xinc.config.toml') => {
const fullPath = (0, path_1.join)(process.cwd(), configPath);
// 检查配置文件
if (!checkAndFixConfig(fullPath)) {
console.log(`配置文件 ${configPath} 不存在或格式错误,将创建默认配置`);
const validatedConfig = await validateConfig({});
// 手动创建 TOML 内容
const tomlContent = `host = "${validatedConfig.host}"
port = ${validatedConfig.port}
prefix = "${validatedConfig.prefix}"
root = [${validatedConfig.root.join(', ')}]
admins = [${validatedConfig.admins.join(', ')}]
plugins = [${validatedConfig.plugins.map(p => `"${p}"`).join(', ')}]
logger = "${validatedConfig.logger}"
`;
(0, fs_1.writeFileSync)(fullPath, tomlContent);
console.log(`已创建配置文件: ${fullPath}`);
readline.close();
return validatedConfig;
}
try {
// 读取并解析配置文件
const configFile = (0, fs_1.readFileSync)(fullPath, 'utf-8');
const parsedConfig = (0, toml_1.parse)(configFile);
// 验证配置
const validatedConfig = await validateConfig(parsedConfig);
// 如果配置有更新,写回文件
if (JSON.stringify(parsedConfig) !== JSON.stringify(validatedConfig)) {
const tomlContent = `host = "${validatedConfig.host}"
port = ${validatedConfig.port}
prefix = "${validatedConfig.prefix}"
root = [${validatedConfig.root.join(', ')}]
admins = [${validatedConfig.admins.join(', ')}]
plugins = [${validatedConfig.plugins.map(p => `"${p}"`).join(', ')}]
logger = "${validatedConfig.logger}"
`;
(0, fs_1.writeFileSync)(fullPath, tomlContent);
console.log(`配置已更新并保存至: ${fullPath}`);
}
readline.close();
return validatedConfig;
}
catch (error) {
console.error('加载配置文件失败:', error);
process.exit(1);
}
};
exports.loadConfig = loadConfig;
//# sourceMappingURL=config.js.map