pupbot-plugin-bkw2
Version:
152 lines (135 loc) • 6.95 kB
JavaScript
const { PluginDataDir, axios, plugin, config, defaultConfig, BotConf, enablePlugin, updateMdImg } = require('./lib/static/constants')
const { tools, MounteFunctions } = require('./lib/static/tools')
const { commands } = require('./lib/commands/commands')
const { languagesMgr } = require('./lib/mgr/mgr')
const { languages } = require('./lib/languages/languages')
const { changes } = require('./lib/changes/changes')
const { listener } = require('./lib/api/listener')
const { updatePlugin } = require('./lib/static/updater')
const { dirname } = require('./dirname') // 加载dirname以保证dirname是插件根目录
const { app } = require('./lib/api/server')
const { name, version } = require('./package.json')
var { lang } = require('./lib/static/constants');
var _bot = undefined
var server = undefined
var serverError = undefined
var admins = []
function updateLang(name) {
let [status, _lang] = languagesMgr.find(name, languages, languages[defaultConfig.config.lang])
if (!status) { // 如果不成功
plugin.logger.warn(`load language warn: lang ${name} is not found`)
}
lang = _lang // 更新语言
}
async function hooker(event, parmas, plugin, lang, callback, _config, _defaultConfig, errorCallback) {
_config = _config ? _config : config
_defaultConfig = _defaultConfig ? _defaultConfig : defaultConfig
plugin.mainAdmin = BotConf.admins[0] // 更新主管理员
plugin.admins = BotConf.admins // 更新管理员列表
let funcname = '[Unknown]'
try {
tools.reloadConfig(plugin, _config, _defaultConfig) // 重加载配置
let result = await callback(event, parmas, plugin, lang, _config)
tools.saveConfig(plugin, _config, _defaultConfig)
} catch (error) {
try {
funcname = callback.name
} catch (error) {}
await errorCallback(event ? event : undefined, event ? event.sender.user_id : undefined, funcname, error, lang)
}
}
async function msgSender(event, parmas, plugin, lang, callback, errorCallback, _config, _defaultConfig, ) {
_config = _config ? _config : config
_defaultConfig = _defaultConfig ? _defaultConfig : defaultConfig
plugin.mainAdmin = BotConf.admins[0] // 更新主管理员
plugin.admins = BotConf.admins // 更新管理员列表
let funcname = '[Unknown]'
try {
tools.reloadConfig(plugin, _config, _defaultConfig) // 重加载配置
let result = await callback(event, parmas, plugin, lang)
if (result !== undefined) {
if (result) { // 不为空
if (typeof result == 'string') {
event.reply(result)
} else {
let msg, reply
msg = result[0]
reply = result[1]
event.reply(msg, reply)
}
} else {
plugin.logger.warn(`empty message`)
}
}
tools.saveConfig(plugin, _config, _defaultConfig)
} catch (error) {
try {
funcname = callback.name
} catch (error) {}
await errorCallback(event, event.sender.user_id, funcname, error, lang)
}
}
async function onMounted() {
tools.reloadConfig(plugin, config, defaultConfig) // 重加载配置
updateLang(config.config.lang)
let updateStatus = MounteFunctions.getUpdateStatus(config, lang, plugin.version, config.config.updated.latest)
plugin.bot.sendPrivateMsg(plugin.mainAdmin, tools.fromatString(lang.mounted, lang.header, [(await MounteFunctions.getTotleDownloads(name, ' - ')), updateStatus ? `\n\n${updateStatus}` : ''], plugin)) // 提示消息
config.config.updated.status = false
tools.saveConfig(plugin, config, defaultConfig)
updateMdImg()
plugin.onMessage((event, parmas) => hooker(event, parmas, plugin, lang, listener.main, config, defaultConfig, commands.report))
plugin.onCmd(config.commands.bkw2.value, (event, parmas) => msgSender(event, parmas, plugin, lang, commands.bkw2, commands.report))
plugin.onCmd(config.commands.update.value, (event, parmas) => msgSender(event, parmas, plugin, lang, updatePlugin, commands.report))
plugin.cron('*/10 * * * *', () => hooker(undefined, [], plugin, lang, updatePlugin, undefined, undefined, commands.report))
setTimeout(() => hooker(undefined, [], plugin, lang, updatePlugin, undefined, undefined, commands.report), 100) // 启用时延时后检查更新
}
plugin.onMounted(async() => {
_bot = plugin.bot
admins = plugin.admins
try {
await onMounted()
} catch (error) {
plugin.logger.error(`${plugin.name}: onMounted error: ${error.stack}`)
commands.report(null, null, 'onMounted', error, lang)
throw error // throw 到框架
}
let port = config.config.server.port
let host = config.config.server.host
server = await app.listen(port, host)
server.on('error', (error) => { // 监听错误内容
plugin.logger.warn(`${plugin.name}: failed to start httpapi: ${error}`)
plugin.bot.sendPrivateMsg(plugin.mainAdmin, tools.fromatString(lang.bkw2.plugin.serverstartfailed, lang.header, error.message, plugin))
server = undefined // 设置为未定义代表没有启动成功
serverError = error // 设置错误内容
})
server.on('listening', () => { // 监听server启动
let localhost = `(http://${ host.includes('0.0.0.0') ? host.replaceAll('0.0.0.0', '127.0.0.1') : undefined}:${port})`
let serverStartedMsg = `http://${host}:${port} ${localhost.includes('undefined') ? '' : localhost}`.trimEnd()
plugin.bot.sendPrivateMsg(plugin.mainAdmin, tools.fromatString(lang.bkw2.plugin.serverstartsuccess, lang.header, serverStartedMsg, plugin))
plugin.logger.info(`${plugin.name}: httpapi run at ${serverStartedMsg}`)
})
})
plugin.onUnmounted(() => {
if (server) { // 尝试关闭httpapi
server.close((error) => {
if (error) {
plugin.logger.warn(`${plugin.name}: close httpapi error: ${error.stack}`)
} else {
plugin.logger.debug(`${plugin.name}: close httpapi successed`)
}
})
} else { // 服务器为undefined
plugin.logger.warn(`${plugin.name}: httpapi server is undefined(starting failed): ${serverError}`)
}
return
// 在插件禁用时调用框架的启用api我真是个天才(
try {
_bot.sendPrivateMsg(admins[0], 'Operations that are not allowed!')
setTimeout(() => {
enablePlugin(_bot, BotConf, dirname)
}, 0) // 走全局的异步避免比框架禁用的慢
} catch (error) {
console.log(`at onUnmount error: ${error.stack}`)
}
})
module.exports = { plugin, updatePlugin }