Go-CQHTTP是一个开源的机器人框架,它支持大部分的跨语言插件、多种数据源及事件驱动的机器人开发方案。其中,权限系统是Go-CQHTTP中的一个非常重要的组成部分,这个系统决定了每个用户在机器人中的权限等级及可执行的操作。
权限管理系统的实现代码
Go-CQHTTP使用bolt
作为数据源存储权限数据,权限数据存储在bolt的文件中。在Go-CQHTTP启动的时候,会将存储在bolt文件中的权限数据读取到内存中进行缓存,这样可以提高权限执行效率。
权限数据的结构大致如下:
type Permission struct {
ID int64 `json:"id"`
Title string `json:"title"`
Level int `json:"level"`
Parent int64 `json:"parent"`
Children []int64 `json:"children"`
Actions map[string]bool `json:"actions"`
AddTime int64 `json:"add_time"`
UpdateTime int64 `json:"update_time"`
DeleteTime int64 `json:"delete_time"`
}
在权限数据中,Actions
是一个map[string]bool类型的字段,存储了当前权限下可执行的操作名称以及其对应的可执行状态。
Go-CQHTTP会在用户发送消息时首先检查用户是否具有发送消息的权限,如果检测到用户没有发送消息的权限,那么这条消息将被机器人忽略。
在实现权限管理系统的代码中,permission
包提供了一系列的函数,用于对权限数据进行各种操作,例如:
// UseCache 用缓存进行存储
func UseCache(b bool)
// Add 添加权限节点
func Add(p *Permission) error
// Update 更新权限节点
func Update(id int64, p *Permission) error
// Delete 删除权限节点
func Delete(id int64) error
// GetByID 根据ID获取权限内容
func GetByID(id int64) (*Permission, error)
// GetByTitle 根据Title获取权限内容
func GetByTitle(title string) (*Permission, error)
// List 获取指定父级权限下的子权限列表
// 如果 parentID 为 -1,则会返回获取 ROOT 节点的子列表
func List(parentID int64) ([]*Permission, error)
// ListAll 获取一个包含所有权限的列表
func ListAll() ([]*Permission, error)
// GetParentIDs 获取一个权限的所有父级 ID(包含自己)
func GetParentIDs(id int64) []int64
// GetChildrenIDs 获取一个权限的所有子级 ID(包含自己)
func GetChildrenIDs(id int64) []int64
// CheckPermission 检查用户是否有执行当前操作的权限
func CheckPermission(uid int64, action string, data interface{}) (bool, error)
这些函数提供了权限数据的获取、更新、删除等各种操作,同时,其中的CheckPermission
函数还提供了对用户权限的检查功能。
示例
示例一:给用户添加权限
我们可以通过以下代码来给已经加入机器人的用户添加‘test_permission’这个权限,用户的UID
是10086。
package main
import (
"github.com/Mrs4s/go-cqhttp-sdk/cqp"
"github.com/Mrs4s/go-cqhttp-sdk/cqpapi"
"github.com/Mrs4s/go-cqhttp-sdk/extension/permission"
)
func init() {
// 打开权限管理器的缓存
permission.UseCache(true)
}
func main() {
// 获取权限对象
p, err := permission.GetByTitle("test_permission")
if err != nil || p == nil {
// 如果权限不存在,则直接退出
return
}
// 给用户添加权限
err = permission.AddPermission(10086, p.ID)
if err != nil {
// 添加权限出现异常
return
}
}
执行完上述代码后,UID为10086的用户就拥有了test_permission
这个权限,可以执行这个权限下面可执行的操作了。
示例二:检查用户权限
我们可以通过以下代码来检查UID为10086的用户是否拥有test_permission
这个权限,并尝试执行这个权限下面可执行的操作。
package main
import (
"fmt"
"github.com/Mrs4s/go-cqhttp-sdk/cqp"
"github.com/Mrs4s/go-cqhttp-sdk/cqpapi"
"github.com/Mrs4s/go-cqhttp-sdk/extension/permission"
)
func init() {
// 打开权限管理器的缓存
permission.UseCache(true)
}
func main() {
// 获取权限对象
p, err := permission.GetByTitle("test_permission")
if err != nil || p == nil {
// 如果权限不存在,则直接退出
return
}
// 检查用户是否拥有这个权限
ok, err := permission.CheckPermission(10086, "test_permission:exec_action", nil)
if err != nil || !ok {
// 用户没有此权限
return
}
// 执行权限下面的操作
fmt.Println("执行了test_permission的操作!")
}
执行完上述代码后,如果UID为10086的用户拥有test_permission
这个权限,那么程序会输出“执行了test_permission的操作!”这个信息。如果用户没有这个权限,那么程序不会有任何输出。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:go-cqhttp权限管理系统的实现代码 - Python技术站