优化 插件加载
This commit is contained in:
parent
01110c3c8a
commit
8a17b35e08
|
@ -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'],
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue