From 8a17b35e08fd3c713cfb249273a34a438f185d58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=8C=8C?= Date: Sun, 10 Mar 2024 15:37:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/plugins/loader.js | 178 +++++++++++++------------------- plugins/genshin/model/ledger.js | 5 +- 2 files changed, 75 insertions(+), 108 deletions(-) diff --git a/lib/plugins/loader.js b/lib/plugins/loader.js index 6deb104..37bdd44 100644 --- a/lib/plugins/loader.js +++ b/lib/plugins/loader.js @@ -45,59 +45,54 @@ class PluginsLoader { * 监听事件加载 * @param isRefresh 是否刷新 */ - async load (isRefresh = false) { - this.delCount() + async load(isRefresh = false) { if (!lodash.isEmpty(this.priority) && !isRefresh) return - const files = this.getPlugins() + const files = await this.getPlugins() - logger.info('加载插件中..') + logger.info('-----------') + logger.info('加载插件中...') let pluCount = 0 - let packageErr = [] - for (let File of files) { - try { - let tmp = await import(File.path) - let apps = tmp - if (tmp.apps) { - apps = { ...tmp.apps } - } - lodash.forEach(apps, (p, i) => { - if (!p.prototype) return - pluCount++ - /* eslint-disable new-cap */ - let plugin = new p() - logger.debug(`载入插件 [${File.name}][${plugin.name}]`) - /** 执行初始化 */ - this.runInit(plugin) - /** 初始化定时任务 */ - this.collectTask(plugin.task) - this.priority.push({ - class: p, - key: File.name, - name: plugin.name, - priority: plugin.priority - }) - if (plugin.handler) { - lodash.forEach(plugin.handler, ({ fn, key, priority }) => { - Handler.add({ - ns: plugin.namespace || File.name, - key, - self: plugin, - property: priority || plugin.priority || 500, - fn: plugin[fn] - }) - }) - } + const packageErr = [] + for (const file of files) try { + let apps = await import(file.path) + if (apps.apps) apps = { ...apps.apps } + + lodash.forEach(apps, async (p, i) => { + if (!p?.prototype) return + pluCount++ + const plugin = new p + logger.debug(`载入插件 [${file.name}][${plugin.name}]`) + /** 执行初始化,返回 return 则跳过加载 */ + if (plugin.init && await plugin.init() == 'return') return + /** 初始化定时任务 */ + this.collectTask(plugin.task) + this.priority.push({ + class: p, + key: file.name, + name: plugin.name, + priority: plugin.priority }) - } catch (error) { - if (error.stack.includes('Cannot find package')) { - packageErr.push({ error, File }) - } else { - logger.error(`载入插件错误:${logger.red(File.name)}`) - logger.error(decodeURI(error.stack)) + if (plugin.handler) { + lodash.forEach(plugin.handler, ({ fn, key, priority }) => { + Handler.add({ + ns: plugin.namespace || file.name, + key, + self: plugin, + property: priority || plugin.priority || 500, + fn: plugin[fn] + }) + }) } + }) + } catch (error) { + if (error.stack.includes('Cannot find package')) { + packageErr.push({ error, file }) + } else { + logger.error(`载入插件错误:${logger.red(file.name)}`) + logger.error(decodeURI(error.stack)) } } @@ -105,24 +100,19 @@ class PluginsLoader { this.creatTask() logger.info(`加载定时任务[${this.task.length}个]`) - logger.info(`加载插件完成[${pluCount}个]`) - logger.info('-----------') + logger.info(`加载插件[${pluCount}个]`) /** 优先级排序 */ this.priority = lodash.orderBy(this.priority, ['priority'], ['asc']) } - async runInit (plugin) { - plugin.init && plugin.init() - } - - packageTips (packageErr) { + packageTips(packageErr) { if (!packageErr || packageErr.length <= 0) return logger.mark('--------插件载入错误--------') packageErr.forEach(v => { let pack = v.error.stack.match(/'(.+?)'/g)[0].replace(/'/g, '') - logger.mark(`${v.File.name} 缺少依赖:${logger.red(pack)}`) - logger.mark(`新增插件后请执行安装命令:${logger.red('pnpm install -P')} 安装依赖`) + logger.mark(`${v.file.name} 缺少依赖:${logger.red(pack)}`) + logger.mark(`新增插件后请执行安装命令:${logger.red('pnpm i')} 安装依赖`) logger.mark(`如安装后仍未解决可联系插件作者将 ${logger.red(pack)} 依赖添加至插件的package.json dependencies中,或手工安装依赖`) }) // logger.error('或者使用其他包管理工具安装依赖') @@ -248,73 +238,51 @@ class PluginsLoader { e.msg = e.msg.replace(this.srReg, '#星铁') } - /** accept */ - for (let plugin of priority) { - /** accept hook */ + /** 优先执行 accept */ + for (const plugin of priority) if (plugin.accept) { - let res = plugin.accept(e) - - if (util.types.isPromise(res)) res = await res - - if (res === 'return') return - + const res = await plugin.accept(e) + if (res == 'return') return if (res) break } - } - /* eslint-disable no-labels */ - a: - for (let plugin of priority) { + a: for (const plugin of priority) { /** 正则匹配 */ - if (plugin.rule) { - for (let v of plugin.rule) { - /** 判断事件 */ - if (v.event && !this.filtEvent(e, v)) continue + if (plugin.rule) for (const v of plugin.rule) { + /** 判断事件 */ + if (v.event && !this.filtEvent(e, v)) continue - const regExp = new RegExp(v.reg) - /** 匹配消息或者小程序 */ - const messageOrApplet = e.msg || e.message?.[0]?.data - if (regExp.test(messageOrApplet)) { - e.logFnc = `[${plugin.name}][${v.fnc}]` + if (!new RegExp(v.reg).test(e.msg)) continue + e.logFnc = `[${plugin.name}][${v.fnc}]` - if (v.log !== false) { - logger.mark(`${e.logFnc}${e.logText} ${lodash.truncate(e.msg, { length: 80 })}`) - } + if (v.log !== false) + logger.info(`${e.logFnc}${e.logText} ${lodash.truncate(e.msg, { length: 100 })}`) - /** 判断权限 */ - if (!this.filtPermission(e, v)) break a + /** 判断权限 */ + if (!this.filtPermission(e, v)) break a - try { - let res = plugin[v.fnc] && plugin[v.fnc](e) - - let start = Date.now() - - if (util.types.isPromise(res)) res = await res - - if (res !== false) { - /** 设置冷却cd */ - this.setLimit(e) - if (v.log !== false) { - logger.info(`${e.logFnc} ${lodash.truncate(e.msg, { length: 80 })} 处理完成 ${Date.now() - start}ms`) - } - break a - } - } catch (error) { - logger.error(`${e.logFnc}`) - logger.error(error.stack) - break a - } + try { + const start = Date.now() + const res = plugin[v.fnc] && (await plugin[v.fnc](e)) + if (res !== false) { + /** 设置冷却cd */ + this.setLimit(e) + if (v.log !== false) + logger.mark(`${e.logFnc} ${lodash.truncate(e.msg, { length: 100 })} 处理完成 ${Date.now() - start}ms`) + break a } + } catch (error) { + logger.error(`${e.logFnc}`) + logger.error(error.stack) + break a } } } } /** 过滤事件 */ - filtEvent (e, v) { - if (!v.event) { - return false - } + filtEvent(e, v) { + if (!v.event) return false let event = v.event.split('.') let eventMap = { message: ['post_type', 'message_type', 'sub_type'], diff --git a/plugins/genshin/model/ledger.js b/plugins/genshin/model/ledger.js index f1aebf0..5443455 100644 --- a/plugins/genshin/model/ledger.js +++ b/plugins/genshin/model/ledger.js @@ -245,9 +245,8 @@ export default class Ledger extends base { await this.e.reply(`${this.e?.isSr ? '开拓月历' : '札记'}ck:${uids.length}个\n预计需要:${this.countTime(uids.length)}\n完成时间:${finishTime}`) } - for (let uid of uids) { - let ck = cks[uid] - this.e.user_id = ck.qq + for (const uid of uids) { + const ck = cks[uid] await this.saveLedger(uid, ck, true) await common.sleep(500)