优化 插件加载

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,59 +45,54 @@ class PluginsLoader {
* 监听事件加载 * 监听事件加载
* @param isRefresh 是否刷新 * @param isRefresh 是否刷新
*/ */
async load (isRefresh = false) { async load(isRefresh = false) {
this.delCount()
if (!lodash.isEmpty(this.priority) && !isRefresh) return 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 pluCount = 0
let packageErr = [] const packageErr = []
for (let File of files) { for (const file of files) try {
try { let apps = await import(file.path)
let tmp = await import(File.path) if (apps.apps) apps = { ...apps.apps }
let apps = tmp
if (tmp.apps) { lodash.forEach(apps, async (p, i) => {
apps = { ...tmp.apps } if (!p?.prototype) return
} pluCount++
lodash.forEach(apps, (p, i) => { const plugin = new p
if (!p.prototype) return logger.debug(`载入插件 [${file.name}][${plugin.name}]`)
pluCount++ /** 执行初始化,返回 return 则跳过加载 */
/* eslint-disable new-cap */ if (plugin.init && await plugin.init() == 'return') return
let plugin = new p() /** 初始化定时任务 */
logger.debug(`载入插件 [${File.name}][${plugin.name}]`) this.collectTask(plugin.task)
/** 执行初始化 */ this.priority.push({
this.runInit(plugin) class: p,
/** 初始化定时任务 */ key: file.name,
this.collectTask(plugin.task) name: plugin.name,
this.priority.push({ priority: plugin.priority
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]
})
})
}
}) })
} catch (error) { if (plugin.handler) {
if (error.stack.includes('Cannot find package')) { lodash.forEach(plugin.handler, ({ fn, key, priority }) => {
packageErr.push({ error, File }) Handler.add({
} else { ns: plugin.namespace || file.name,
logger.error(`载入插件错误:${logger.red(File.name)}`) key,
logger.error(decodeURI(error.stack)) 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() this.creatTask()
logger.info(`加载定时任务[${this.task.length}个]`) logger.info(`加载定时任务[${this.task.length}个]`)
logger.info(`加载插件完成[${pluCount}个]`) logger.info(`加载插件[${pluCount}个]`)
logger.info('-----------')
/** 优先级排序 */ /** 优先级排序 */
this.priority = lodash.orderBy(this.priority, ['priority'], ['asc']) this.priority = lodash.orderBy(this.priority, ['priority'], ['asc'])
} }
async runInit (plugin) { packageTips(packageErr) {
plugin.init && plugin.init()
}
packageTips (packageErr) {
if (!packageErr || packageErr.length <= 0) return if (!packageErr || packageErr.length <= 0) return
logger.mark('--------插件载入错误--------') logger.mark('--------插件载入错误--------')
packageErr.forEach(v => { packageErr.forEach(v => {
let pack = v.error.stack.match(/'(.+?)'/g)[0].replace(/'/g, '') let pack = v.error.stack.match(/'(.+?)'/g)[0].replace(/'/g, '')
logger.mark(`${v.File.name} 缺少依赖:${logger.red(pack)}`) logger.mark(`${v.file.name} 缺少依赖:${logger.red(pack)}`)
logger.mark(`新增插件后请执行安装命令:${logger.red('pnpm install -P')} 安装依赖`) logger.mark(`新增插件后请执行安装命令:${logger.red('pnpm i')} 安装依赖`)
logger.mark(`如安装后仍未解决可联系插件作者将 ${logger.red(pack)} 依赖添加至插件的package.json dependencies中或手工安装依赖`) logger.mark(`如安装后仍未解决可联系插件作者将 ${logger.red(pack)} 依赖添加至插件的package.json dependencies中或手工安装依赖`)
}) })
// logger.error('或者使用其他包管理工具安装依赖') // logger.error('或者使用其他包管理工具安装依赖')
@ -248,73 +238,51 @@ class PluginsLoader {
e.msg = e.msg.replace(this.srReg, '#星铁') e.msg = e.msg.replace(this.srReg, '#星铁')
} }
/** accept */ /** 优先执行 accept */
for (let plugin of priority) { for (const plugin of priority)
/** accept hook */
if (plugin.accept) { if (plugin.accept) {
let res = plugin.accept(e) const res = await plugin.accept(e)
if (res == 'return') return
if (util.types.isPromise(res)) res = await res
if (res === 'return') return
if (res) break if (res) break
} }
}
/* eslint-disable no-labels */ a: for (const plugin of priority) {
a:
for (let plugin of priority) {
/** 正则匹配 */ /** 正则匹配 */
if (plugin.rule) { if (plugin.rule) for (const v of plugin.rule) {
for (let v of plugin.rule) { /** 判断事件 */
/** 判断事件 */ if (v.event && !this.filtEvent(e, v)) continue
if (v.event && !this.filtEvent(e, v)) continue
const regExp = new RegExp(v.reg) if (!new RegExp(v.reg).test(e.msg)) continue
/** 匹配消息或者小程序 */ e.logFnc = `[${plugin.name}][${v.fnc}]`
const messageOrApplet = e.msg || e.message?.[0]?.data
if (regExp.test(messageOrApplet)) {
e.logFnc = `[${plugin.name}][${v.fnc}]`
if (v.log !== false) { if (v.log !== false)
logger.mark(`${e.logFnc}${e.logText} ${lodash.truncate(e.msg, { length: 80 })}`) 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 { try {
let res = plugin[v.fnc] && plugin[v.fnc](e) const start = Date.now()
const res = plugin[v.fnc] && (await plugin[v.fnc](e))
let start = Date.now() if (res !== false) {
/** 设置冷却cd */
if (util.types.isPromise(res)) res = await res this.setLimit(e)
if (v.log !== false)
if (res !== false) { logger.mark(`${e.logFnc} ${lodash.truncate(e.msg, { length: 100 })} 处理完成 ${Date.now() - start}ms`)
/** 设置冷却cd */ break a
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
}
} }
} catch (error) {
logger.error(`${e.logFnc}`)
logger.error(error.stack)
break a
} }
} }
} }
} }
/** 过滤事件 */ /** 过滤事件 */
filtEvent (e, v) { filtEvent(e, v) {
if (!v.event) { if (!v.event) return false
return false
}
let event = v.event.split('.') let event = v.event.split('.')
let eventMap = { let eventMap = {
message: ['post_type', 'message_type', 'sub_type'], 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}`) await this.e.reply(`${this.e?.isSr ? '开拓月历' : '札记'}ck${uids.length}\n预计需要:${this.countTime(uids.length)}\n完成时间:${finishTime}`)
} }
for (let uid of uids) { for (const uid of uids) {
let ck = cks[uid] const ck = cks[uid]
this.e.user_id = ck.qq
await this.saveLedger(uid, ck, true) await this.saveLedger(uid, ck, true)
await common.sleep(500) await common.sleep(500)