新增 plugin.awaitContext() 方法

This commit is contained in:
🌌 2024-05-30 01:17:01 +08:00
parent 37241496ac
commit ff5a711390
1 changed files with 23 additions and 14 deletions

View File

@ -1,6 +1,8 @@
import { Common } from '#miao' import { Common } from "#miao"
const stateArr = {} const stateArr = {}
const SymbolTimeout = Symbol("Timeout")
const SymbolResolve = Symbol("Resolve")
export default class plugin { export default class plugin {
/** /**
@ -73,28 +75,30 @@ export default class plugin {
conKey(isGroup = false) { conKey(isGroup = false) {
if (isGroup) { if (isGroup) {
return `${this.name}.${this.e.group_id}` return `${this.name}.${this.group_id || this.groupId || this.e.group_id}`
} else { } else {
return `${this.name}.${this.userId || this.e.user_id}` return `${this.name}.${this.user_id || this.userId || this.e.user_id}`
} }
} }
/** /**
* @param type 执行方法 * @param type 执行方法
* @param isGroup 是否群聊 * @param isGroup 是否群聊
* @param time 操作时间默认120秒 * @param time 操作时间
* @param reply 超时时回复的内容false则不回复 * @param timeout 操作超时回复
*/ */
setContext(type, isGroup, time = 120, reply = "操作超时已取消") { setContext(type, isGroup, time = 120, timeout = "操作超时已取消") {
const key = this.conKey(isGroup) const key = this.conKey(isGroup)
if (!stateArr[key]) stateArr[key] = {} if (!stateArr[key]) stateArr[key] = {}
stateArr[key][type] = this.e stateArr[key][type] = this.e
if (time) stateArr[key][type].timeout = setTimeout(() => { if (time) stateArr[key][type][SymbolTimeout] = setTimeout(() => {
if (stateArr[key][type]) { if (stateArr[key][type]) {
const resolve = stateArr[key][type][SymbolResolve]
delete stateArr[key][type] delete stateArr[key][type]
this.reply(reply, true) resolve ? resolve(false) : this.reply(timeout, true)
} }
}, time * 1000) }, time * 1000)
return stateArr[key][type]
} }
getContext(type, isGroup) { getContext(type, isGroup) {
@ -102,18 +106,23 @@ export default class plugin {
return stateArr[this.conKey(isGroup)] return stateArr[this.conKey(isGroup)]
} }
/**
* @param type 执行方法
* @param isGroup 是否群聊
*/
finish(type, isGroup) { finish(type, isGroup) {
const key = this.conKey(isGroup) const key = this.conKey(isGroup)
if (stateArr[key] && stateArr[key][type]) { if (stateArr[key]?.[type]) {
clearTimeout(stateArr[key][type].timeout) clearTimeout(stateArr[key][type][SymbolTimeout])
delete stateArr[key][type] delete stateArr[key][type]
} }
} }
awaitContext(...args) {
return new Promise(resolve => this.setContext("resolveContext", ...args)[SymbolResolve] = resolve)
}
resolveContext(context) {
this.finish("resolveContext")
context[SymbolResolve](this.e)
}
async renderImg(plugin, tpl, data, cfg) { async renderImg(plugin, tpl, data, cfg) {
return Common.render(plugin, tpl, data, { ...cfg, e: this.e }) return Common.render(plugin, tpl, data, { ...cfg, e: this.e })
} }