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