miao-plugin/components/App.js
zolay 6e3cfc8be3
新增妮露组队“海妮心二妲·丰穰之核”伤害 (#600)
* 添加顶层`MiaoError`处理,可实现任意代码处回复错误信息。

* 解除xx伤害n,n最多只能到7个的限制;修复xx伤害n,显示的buff列表不正确。

* 新增妮露组队“海妮心二妲·丰穰之核”伤害

* 更新buff名称使其更符合规范

* 妮露组队伤害补充双水共鸣效果
2023-06-12 03:20:56 +08:00

196 lines
4.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import lodash from 'lodash'
import Plugin from './common/Plugin.js'
import { Version, MiaoError } from '#miao'
class App {
constructor (cfg) {
this.id = cfg.id
this.cfg = cfg
this.apps = {}
}
reg (key, fn, cfg = {}) {
if (lodash.isPlainObject(key)) {
lodash.forEach(key, (cfg, k) => {
this.reg(k, cfg.fn, cfg)
})
} else {
this.apps[key] = {
fn,
...cfg
}
}
}
// 获取v3执行方法
v3App () {
let cfg = this.cfg || {}
let rules = []
let check = []
let event = cfg.event
let cls = class extends Plugin {
constructor () {
super({
name: `喵喵:${cfg.name || cfg.id}`,
dsc: cfg.desc || cfg.name || '喵喵插件',
event: event === 'poke' ? 'notice.*.poke' : 'message',
priority: cfg.priority || 50,
rule: rules
})
}
accept (e) {
e.original_msg = e.original_msg || e.msg
for (let idx = 0; idx < check.length; idx++) {
if (check[idx](e, e.original_msg) === true) {
return true
}
}
}
}
for (let key in this.apps) {
let app = this.apps[key]
key = lodash.camelCase(key)
let rule = app.rule || app.reg || 'noCheck'
if (event !== 'poke') {
if (typeof (rule) === 'string') {
if (rule === 'noCheck') {
rule = '.*'
}
} else {
rule = lodash.trim(rule.toString(), '/')
}
} else {
rule = '.*'
}
rules.push({
reg: rule,
fnc: key
})
if (app.check) {
check.push(app.check)
}
cls.prototype[key] = async function () {
let e = this.e
if (event === 'poke') {
if (e.notice_type === 'group') {
if (e.target_id !== Bot.uin && !e.isPoke) {
return false
}
// group状态下戳一戳的发起人是operator
if (e.user_id === Bot.uin) {
e.user_id = e.operator_id
}
}
e.isPoke = true
// 随便指定一个不太常见的msg以触发msg的正则
e.msg = '#poke#'
}
e.original_msg = e.original_msg || e.msg
try {
return await app.fn.call(this, e)
} catch (err) {
if (err?.message && (err instanceof MiaoError)) {
// 处理 MiaoError
return e.reply(err.message)
} else {
// 其他错误抛出
throw err
}
}
}
if (app.yzRule && app.yzCheck) {
let yzKey = `Yz${key}`
let yzRule = lodash.trim(app.yzRule.toString(), '/')
rules.push({
reg: yzRule,
fnc: yzKey
})
cls.prototype[yzKey] = async function () {
if (!Version.isMiao && !app.yzCheck()) {
return false
}
let e = this.e
e.original_msg = e.original_msg || e.msg
return await app.fn.call(this, e)
}
}
}
return cls
}
// 获取v2版rule
v2Rule () {
let cfg = this.cfg
return {
reg: 'noCheck',
describe: cfg.desc || '',
priority: cfg.priority || 50,
hashMark: true
}
}
// v2执行方法
v2App (e) {
let cfg = this.cfg || {}
let event = cfg.event
let apps = this.apps
return async function (e) {
e.original_msg = e.original_msg || e.msg
let msg = e.original_msg || e.msg || ''
for (let key in apps) {
let app = apps[key]
if (app.check && app.check(e, msg) === true) {
break
}
}
msg = e.msg
for (let key in apps) {
let app = apps[key]
let rule = app.rule || app.reg || 'noCheck'
if (app.rule) {
if (typeof (rule) === 'string') {
if (rule === '#poke#') {
continue
} else if (rule === 'noCheck') {
rule = /.*/
}
rule = new RegExp(rule)
}
if (rule.test(msg)) {
let ret = await app.fn(e, {})
if (ret === true) {
return true
}
} else if (app.yzRule && app.yzCheck()) {
rule = new RegExp(app.yzRule)
if (rule.test(msg)) {
let ret = await app.fn(e, {})
if (ret === true) {
return true
}
}
}
} else if (event === 'poke' && msg === '#poke#') {
let ret = await app.fn(e, {})
if (ret === true) {
return true
}
}
}
return false
}
}
}
App.init = function (cfg) {
return new App(cfg)
}
export default App