From d4bf0cb718695db788ef950ba0687a59cc10882e Mon Sep 17 00:00:00 2001 From: ningmengchongshui <916415899@qq.com> Date: Thu, 13 Jun 2024 21:15:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/check.ts | 2 +- src/config/main.ts | 170 ---------------------------------- src/config/qq.ts | 4 +- src/config/redis.ts | 2 +- src/config/utils.ts | 42 +++++++++ src/core/bot.ts | 6 -- src/init.ts | 171 +++++++++++++++++++++++++++++++++++ src/main.ts | 13 ++- src/utils/renderer/loader.ts | 10 +- 9 files changed, 229 insertions(+), 191 deletions(-) delete mode 100644 src/config/main.ts create mode 100644 src/config/utils.ts create mode 100644 src/init.ts diff --git a/src/config/check.ts b/src/config/check.ts index de23787..939094f 100644 --- a/src/config/check.ts +++ b/src/config/check.ts @@ -1,4 +1,4 @@ -import { execAsync, readJSON } from '../utils/index.js' +import { execAsync, readJSON } from "./utils.js" /** * 校验运行 diff --git a/src/config/main.ts b/src/config/main.ts deleted file mode 100644 index e32132c..0000000 --- a/src/config/main.ts +++ /dev/null @@ -1,170 +0,0 @@ -import fs, { promises } from "node:fs" -import yaml from "yaml" -import { BOT_NAME, CONFIG_INIT_PATH } from "./system.js" -import { createQQ } from "./qq.js" -import { setLogger } from "./log.js" -import { redisInit } from "./redis.js" -import { checkRun } from "./check.js" -import { join } from "node:path" - -/** - * - */ -async function UpdateTitle() { - /** - * 添加一些多余的标题内容 - */ - let title = BOT_NAME - - // - const qq = await promises.readFile(`./${CONFIG_INIT_PATH}qq.yaml`, 'utf-8').then(yaml.parse).catch(() => null) - - /** - * - */ - if (qq) { - title += `@${qq.qq || ""}` - switch (qq.platform) { - case 1: { - title += " 安卓手机" - break - } - case 2: { - title += " aPad" - break - } - case 3: { - title += " 安卓手表" - break - } - case 4: { - title += " MacOS" - break - } - case 5: { - title += " iPad" - break - } - case 6: { - title += " Tim" - break - } - default: { - break - } - } - } - - /** - * 设置标题 - */ - process.title = title -} - -/** - * 初始化事件 - */ -export async function checkInit() { - - /** - * 检查node_modules - */ - if (!fs.existsSync(join(process.cwd(), "./node_modules"))) { - console.log("未安装依赖。。。。") - console.log("请先运行命令:pnpm install -P 安装依赖") - process.exit() - } - - /** - * 检查node_modules/icqq - */ - if (!fs.existsSync(join(process.cwd(), "./node_modules/icqq"))) { - console.log("未安装icqq。。。。") - console.log("请先运行命令:pnpm install -P 安装依赖") - process.exit() - } - - /** - * 检查qq.yaml - */ - await createQQ() - - /** - * 日志设置 - */ - setLogger() - - /** - * - */ - logger.mark(`${BOT_NAME} 启动中...`) - - /** - * 初始化客户端 - */ - await redisInit() - - /** - * 检查程序 - */ - await checkRun() - - /** - * 更新标题 - */ - await UpdateTitle() -} - - -/** - * 设置标题 - */ -process.title = BOT_NAME - -/** - * 设置时区 - */ -process.env.TZ = "Asia/Shanghai" - -/** - * - */ -process.on("SIGHUP", () => process.exit()) - -/** - * 捕获未处理的错误 - */ -process.on("uncaughtException", error => { - if (typeof logger == "undefined") console.log(error) - else logger.error(error) -}) - - -/** - * 捕获未处理的Promise错误 - */ -process.on("unhandledRejection", (error) => { - if (typeof logger == "undefined") console.log(error) - else logger.error(error) -}) - -/** - * 退出事件 - */ -process.on("exit", async () => { - if (typeof redis != "undefined") { - await redis.save() - } - if (typeof logger == "undefined") { - console.log(`${BOT_NAME} 已停止运行`) - } - else { - logger.mark(logger.magenta(`${BOT_NAME} 已停止运行`)) - } -}) - - -/** - * 初始化 - */ -await checkInit() \ No newline at end of file diff --git a/src/config/qq.ts b/src/config/qq.ts index 573fbef..b186ce1 100644 --- a/src/config/qq.ts +++ b/src/config/qq.ts @@ -3,14 +3,14 @@ import inquirer from 'inquirer' import chalk from 'chalk' import { BOT_NAME, CONFIG_DEFAULT_PATH, CONFIG_INIT_PATH } from './system.js' import cfg from './config.js' -import { sleep } from '../utils/common.js' +import { sleep } from "./utils.js" /** * 创建qq配置文件 `config/bot/qq.yaml` * Git Bash 运行npm命令会无法选择列表 * @returns */ -export async function createQQ() { +export async function createQQ() { /** 跳过登录ICQQ */ if (cfg.bot.skip_login) return diff --git a/src/config/redis.ts b/src/config/redis.ts index c3639bc..31bf32f 100644 --- a/src/config/redis.ts +++ b/src/config/redis.ts @@ -1,5 +1,5 @@ import cfg from "./config.js" -import { execAsync, sleep } from "../utils/common.js" +import { execAsync, sleep } from "./utils.js" import { createClient } from "redis" /** diff --git a/src/config/utils.ts b/src/config/utils.ts new file mode 100644 index 0000000..cf63909 --- /dev/null +++ b/src/config/utils.ts @@ -0,0 +1,42 @@ +import fs from 'node:fs' +import { exec } from 'child_process' +import { join } from 'path' + +/** + * 休眠函数 + * @param ms 毫秒 + */ +export function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)) +} + +/** + * + * @param cmd + * @returns + */ +export function execAsync(cmd: string): Promise<{ + stdout: string + stderr: string +}> { + return new Promise((resolve, reject) => { + exec(cmd, (error, stdout, stderr) => { + if (error) reject(error) + resolve({ stdout, stderr }) + }) + }) +} + +/** + * + * @param dir + * @returns + */ +export function readJSON(dir: string) { + try { + const cfg = fs.readFileSync(join(process.cwd(), dir), 'utf-8') + return JSON.parse(cfg) + } catch { + return false + } +} diff --git a/src/core/bot.ts b/src/core/bot.ts index 852bb6b..04cc095 100644 --- a/src/core/bot.ts +++ b/src/core/bot.ts @@ -1,9 +1,3 @@ -/** - * ********** - * 配置初始化 - * ********** - */ -import '../config/main.js' /** * ********** * 配置读取工具 diff --git a/src/init.ts b/src/init.ts new file mode 100644 index 0000000..62eade9 --- /dev/null +++ b/src/init.ts @@ -0,0 +1,171 @@ +import fs, { promises } from 'node:fs' +import yaml from 'yaml' +import { join } from 'node:path' +/** + * + */ +import { BOT_NAME, CONFIG_INIT_PATH } from './config/system.js' +import { createQQ } from './config/qq.js' +import { setLogger } from './config/log.js' +import { redisInit } from './config/redis.js' +import { checkRun } from './config/check.js' + +/** + * + */ +async function UpdateTitle() { + /** + * 添加一些多余的标题内容 + */ + let title = BOT_NAME + + // + const qq = await promises + .readFile(`./${CONFIG_INIT_PATH}qq.yaml`, 'utf-8') + .then(yaml.parse) + .catch(() => null) + + /** + * + */ + if (qq) { + title += `@${qq.qq || ''}` + switch (qq.platform) { + case 1: { + title += ' 安卓手机' + break + } + case 2: { + title += ' aPad' + break + } + case 3: { + title += ' 安卓手表' + break + } + case 4: { + title += ' MacOS' + break + } + case 5: { + title += ' iPad' + break + } + case 6: { + title += ' Tim' + break + } + default: { + break + } + } + } + + /** + * 设置标题 + */ + process.title = title +} + +/** + * 初始化事件 + */ +export async function checkInit() { + /** + * 检查node_modules + */ + if (!fs.existsSync(join(process.cwd(), './node_modules'))) { + console.log('未安装依赖。。。。') + console.log('请先运行命令:pnpm install -P 安装依赖') + process.exit() + } + + /** + * 检查node_modules/icqq + */ + if (!fs.existsSync(join(process.cwd(), './node_modules/icqq'))) { + console.log('未安装icqq。。。。') + console.log('请先运行命令:pnpm install -P 安装依赖') + process.exit() + } + + /** + * 检查qq.yaml + */ + await createQQ() + + /** + * 日志设置 + */ + setLogger() + + /** + * + */ + logger.mark(`${BOT_NAME} 启动中...`) + + /** + * 初始化客户端 + */ + await redisInit() + + /** + * 检查程序 + */ + await checkRun() + + /** + * 更新标题 + */ + await UpdateTitle() +} + +/** + * 设置标题 + */ +process.title = BOT_NAME + +/** + * 设置时区 + */ +process.env.TZ = 'Asia/Shanghai' + +/** + * + */ +process.on('SIGHUP', () => process.exit()) + +/** + * 捕获未处理的错误 + */ +process.on('uncaughtException', error => { + if (typeof logger == 'undefined') console.log(error) + else logger.error(error) +}) + +/** + * 捕获未处理的Promise错误 + */ +process.on('unhandledRejection', error => { + if (typeof logger == 'undefined') console.log(error) + else logger.error(error) +}) + +/** + * 退出事件 + */ +process.on('exit', async () => { + if (typeof redis != 'undefined') { + await redis.save() + } + if (typeof logger == 'undefined') { + console.log(`${BOT_NAME} 已停止运行`) + } else { + logger.mark(logger.magenta(`${BOT_NAME} 已停止运行`)) + } +}) + +/** + * 初始化 + */ +await checkInit() diff --git a/src/main.ts b/src/main.ts index 2dcf9a4..f18d4c4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,9 +1,14 @@ /** - * + * ********** + * 配置初始化 + * ********** + */ +import './init.js' +/** + * 引入模块 */ import { plugin, segment, Client } from './core/index.js' import { Renderer } from './utils/index.js' - /** * global.plugin */ @@ -12,12 +17,10 @@ global.plugin = plugin * global.segment */ global.segment = segment - /** - * + * global.Renderer */ global.Renderer = Renderer - /** * run */ diff --git a/src/utils/renderer/loader.ts b/src/utils/renderer/loader.ts index 5c7968c..30d3013 100644 --- a/src/utils/renderer/loader.ts +++ b/src/utils/renderer/loader.ts @@ -54,15 +54,13 @@ class RendererLoader { !renderer.render || !lodash.isFunction(renderer.render) ) { - console.warn( - '渲染后端 ' + (renderer.id || subFolder.name) + ' 不可用' - ) + logger.warn('渲染后端 ' + (renderer.id || subFolder.name) + ' 不可用') } this.renderers.set(renderer.id, renderer) - console.info(`加载渲染后端 ${renderer.id}`) + logger.info(`加载渲染后端 ${renderer.id}`) } catch (err) { - console.error(`渲染后端 ${name} 加载失败`) - console.error(err) + logger.error(`渲染后端 ${name} 加载失败`) + logger.error(err) } } }