跳到主要内容

👮‍♂️ 权限组

一个于v1.3.4.2加入的新内容,可以方便插件设置指定条件下用户的权限,并提供简单的继承和权限计算功能

权限组结构​

配置文件
permission.json
{
"default": {
"description": "Serein内置权限组", // 介绍
"conditions": [ // 匹配条件
{
"type": "group", // 类型
"onlyListened": true // 仅监听的群聊
},
{
"type": "private"
}
],
"permissions": { // 权限内容
"permission1": { // 权限对象
"object": {
"bool": true
},
"array": [
1,
2,
3
],
"string": "text",
"number": 114514,
"null": null
}
},
"priority": 0, // 优先级
"parents": [] // 父权限组
}
}

description string|null​

权限组的描述

conditions Condition[]​

匹配条件

type 'group'|'private'|'temp'|'unknown'​

匹配类型(分别对应群聊、私聊、临时会话和未知)

onlyListened bool|null​

仅监听的群聊

  • 仅当type为group或temp有效

groups Int64[]?​

触发来源群聊

  • 仅当type为group或temp有效
  • 为null时代表匹配全体

requireAdmin bool?​

需要管理权限

onlyListened bool?​

仅监听的群聊

  • 仅当type为group或temp有效

permissions any​

权限内容

警告

使用JS设置权限组时,在permissions内填入函数将导致无法正确保存

priority number​

优先级,数值越高的权限组的优先级越高

parents string[]​

父权限组(用于权限继承)

逻辑​

继承​

你可以通过指定父权限组来选择要继承的权限组

  • 继承时仅继承权限内容,并未判断父权限组的条件是否满足
  • 继承后权限内容优先级
    • 根权限组最高
    • 继承的权限组中按照父权限组中的顺序,越前面优先级越高
  • 继承有最大深度:3
    • 无论是否出现重复继承或继承自己,继承均最多传三代

权限优先级​

由priority和权限组顺序决定,具体逻辑请看下面的例子

优先级主导
{
"test1": {
"description": "测试权限组1",
"conditions": [
// ...
],
"permissions": {
"example.perm": "1"
},
"priority": 999,
"parents": []
},
"test2": {
"description": "测试权限组2",
"conditions": [
// ...
],
"permissions": {
"example.perm": "2"
},
"priority": 0,
"parents": []
}
}

以上两个权限组,有不同的优先级,但都有相同的权限key

因为测试权限组1的优先级999大于测试权限组2,故获取到的example.perm权限为"1"

权限组顺序主导
{
"test1": {
"description": "测试权限组1",
"conditions": [
// ...
],
"permissions": {
"example.perm": "1"
},
"priority": 0,
"parents": []
},
"test2": {
"description": "测试权限组2",
"conditions": [
// ...
],
"permissions": {
"example.perm": "2"
},
"priority": 0,
"parents": []
}
}

以上两个权限组,有相同的优先级和相同的权限key

因为测试权限组1的顺序先于测试权限组2,故获取到的example.perm权限为"1"

函数​

获取所有权限组​

serein.getPermissionGroups()

  • 参数
    • 空
  • 返回
    • object<string, PermissionGroup>

添加权限组​

serein.addPermissionGroup(group_name: string, permission_group: PermissionGroup, overwrite?: boolean)

  • 参数
    • group_name 权限组名称
      • 不允许为null、undefined、''(空字符串)或纯空格字符串
    • permission_group 权限组对象
      • 未声明的属性将保持默认值
    • overwrite 允许覆盖
      • 若此项为空或false时,添加一个已经存在的权限组会返回false
  • 返回
    • boolean
      • 成功为true,否则为false

删除指定权限组​

serein.removePermissionGroup(group_name: string)

  • 参数
    • group_name 权限组名称
  • 返回
    • boolean
      • 成功为true,否则为false

是否存在指定权限组​

serein.existPermissionGroup(group_name: string)

  • 参数
    • group_name 权限组名称
  • 返回
    • boolean
      • 存在为true,否则为false

设置权限内容​

serein.setPermission(group_name: string, permission_key: string, permission: any)

  • 参数
    • group_name 权限组名称
    • permission_key 权限key
    • permission 权限内容
  • 返回
    • boolean
      • 成功为true,否则为false

根据所给的条件计算权限内容​

serein.calculatePermission(type: 'group'|'private'|'temp'|'unknown', user_id: number, group_id?: number)

  • 参数
  • 返回
    • object<string, any>