优化 插件加载

This commit is contained in:
🌌 2024-03-10 15:37:43 +08:00
parent 01110c3c8a
commit 8a17b35e08
2 changed files with 75 additions and 108 deletions

View File

@ -45,44 +45,40 @@ 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
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++
/* eslint-disable new-cap */
let plugin = new p()
logger.debug(`载入插件 [${File.name}][${plugin.name}]`)
/** 执行初始化 */
this.runInit(plugin)
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,
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,
ns: plugin.namespace || file.name,
key,
self: plugin,
property: priority || plugin.priority || 500,
@ -93,36 +89,30 @@ class PluginsLoader {
})
} catch (error) {
if (error.stack.includes('Cannot find package')) {
packageErr.push({ error, File })
packageErr.push({ error, file })
} else {
logger.error(`载入插件错误:${logger.red(File.name)}`)
logger.error(`载入插件错误:${logger.red(file.name)}`)
logger.error(decodeURI(error.stack))
}
}
}
this.packageTips(packageErr)
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,55 +238,37 @@ 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 (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)) {
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
try {
let res = plugin[v.fnc] && plugin[v.fnc](e)
let start = Date.now()
if (util.types.isPromise(res)) res = await res
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.info(`${e.logFnc} ${lodash.truncate(e.msg, { length: 80 })} 处理完成 ${Date.now() - start}ms`)
}
if (v.log !== false)
logger.mark(`${e.logFnc} ${lodash.truncate(e.msg, { length: 100 })} 处理完成 ${Date.now() - start}ms`)
break a
}
} catch (error) {
@ -307,14 +279,10 @@ class PluginsLoader {
}
}
}
}
}
/** 过滤事件 */
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'],

View File

@ -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)