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