forked from ProjectWIND/ProjectWIND
2.0 KiB
2.0 KiB
Selector设计思路与使用说明
问题背景
在骰子执行指令时,我们经常遇到这样一些问题:
- 不同的插件可能使用相同的指令(很多跑团对应规则都有同名的指令),但是参数和功能完全不同,导致指令无法正常执行。并且当其中有系统级指令时,可能会导致其他严重问题,此时需要一个机制来区分指令。
- 当我们在进行trpg时日志开启后,可能需要屏蔽某些无关的指令和自定义回复,此时需要一个机制来过滤指令和回复(即权限控制)。
- 在不同的群聊中,各种插件的开启情况各不相同,此时需要一个机制来管理不同组群插件的开启和关闭情况(包括前两条中的权限控制问题)。
为解决上述问题,我们设计了一个指令选择器,用于管理和选择指令。
设计思路
选择器的设计思路如下:
- 每个组群有一个独立的总选择器(Agent Selector),用于管理该组群的指令和回复。
- 每个选择器有若干个层级(Level),在查找可用指令(Cmd)时,从最高层级(0)开始查找,直到找到可用指令为止。
- 每个层级有若干个选择器(Selector),每个选择器中包含若干个选项(Option),每个选项对应一个指令集(CmdSet)。每个选择器只能同时选择一个选项,选择后其余选项中的指令集将被屏蔽。
- 指令集是由若干个应用(App)中的指令组成的,一个应用只能归属于一个指令集,一个指令集可以包含多个应用的指令。
数据结构如下:
type AgentSelector struct {
Session wba.Session
Selectors []Selector
}
type Selector struct {
Level int
Name string
Options []*Option
}
type Option struct {
Name string
CmdSets map[string]CmdSet
}
type CmdSet struct {
map[string]wba.Command
}
type Cmmand struct {
Name string
Desc string
App AppKey
Solve func(*wba.Context)
}