# 权限相关说明



## 权限说明 
|bit 位|值|权限|说明|
|---|---|---|---|
|0|1|管理员|拥有除删除服务器之外的所有权限。|
|1|2|查看频道|允许成员查看频道（私密频道除外）。|
|2|4|管理频道|允许成员创建、编辑、删除频道。|
|3|8|查看审核日志|允许成员在此房间内查看用户在房间内的操作。|
|4|16|管理角色权限|允许成员创建新的权限，可以编辑或删除比自身最高身份组限低的身份组。同时允许成员编辑自身可访问的频道的权限。|
|5|32|管理房间|允许成员编辑房间名称，查看所有邀请。|
|6|64|创建邀请|允许成员邀请新人加入服务器。|
|7|128|管理邀请|允许成员管理邀请。|
|8|256|修改昵称|允许用户修改自己在房间的昵称。|
|9|512|管理昵称|允许用户修改别人在房间的昵称。|
|10|1024|将某人踢出房间|允许成员将其他成员从此房间踢出。被踢出的成员如果获得新的邀请，可再次加入此房间。|
|11|2048|将某人踢出频道|允许成员将某人踢出频道。|
|12|4096|将某人加入房间黑名单|允许用户将其他用户加入房间黑名单，被加入黑名单的用户将永远无法加入此房间，直至被移出黑名单。|
|13|8192|禁言某人|允许用户对其他用户禁言，被禁言的用户无法在文字频道或语音频道中发言。|
|14|16384|发送消息|允许成员发送消息。|
|15|32768|上传文件|允许成员上传文件。|
|16|65536|@全体、@在线和所有权限组|允许成员@全体成员或@在线成员，或@不同权限组的成员。|
|17|131072|添加表情回应|允许成员添加表情回应。|
|18|262144|管理消息|允许成员删除其他成员发出的消息或设置精华消息。|
|19|524288|接收离线消息|允许成员接收离线时房间内的消息。如果关闭此权限，成员只能接收在线时房间内的消息。|
|20|1048576|创建开黑邀约|允许成员创建开黑邀约。|
|21|2097152|管理开黑邀约|允许成员管理开黑邀约。|
|22|4194304|加入语音频道|允许成员加入语音频道，并听到其他成员发言。|
|23|8388608|语音频道内说话|允许成员在语音频道内说话。如果该权限未开启，则成员默认处于已静音状态，直至具备"静音成员"权限者解除其静音状态为止。|
|24|16777216|允许直接讲话|允许成员通过直接讲话的方式在语音频道内发言。如果该权限未开启，则成员需要使用按键说话的方式进行发言。|
|25|33554432|频道静音|静音频道中所有用户。|
|26|67108864|静音成员|被静音的成员说话将无法被他人听到。|
|27|134217728|移动成员|允许成员断开连接或在语音频道之间移动其他成员。|
|28|268435456|管理语句|管理语句。|
|29|536870912|修改频道内其他人的邀约|管理频道内其他人的邀约。|
|30|1073741824|管理表情|允许成员在此房间内上传、编辑、移除 emoji 和大表情。|
|31|2147483648|管理语音包|允许成员在此房间内上传、编辑、移除语音包。|
|32|4294967296|播放语音包|允许成员在房间播放语音包。|
|33|8589934592|播放伴奏|允许成员在房间共享伴奏。|
|34|17179869184|共享屏幕|允许成员在此房间内进行屏幕共享。|
|35|34359738368|发布组队|允许成员发布组队。|
|36|68719476736|使用 bot 命令|允许成员使用机器人指令，包括直接输入指令或选择输入框中的“使用机器人指令”。|
| 36      | 68719476736   | 使用 bot 命令 | 允许成员使用机器人指令，包括直接输入指令或选择输入框中的“使用机器人指令”。 |
| 37      | 137438953472  | 创建投票      | 允许成员创建投票                                 |
| 38      | 274877906944  | 房间活动管理    | 允许成员管理房间活动                               |
| 39      | 549755813888  | 发送图片      | 允许成员在频道内发送图片或 markdown 格式的图片消息权限           |
| 40      | 1099511627776 | 开启录音      | 允许成员开启录音(相应功能未实装)                                 |



## 角色权限permission 说明
用户的角色的权限是由多个值异或(⊕,xor)计算得到的,比如某个角色既拥有查看频道=2的权限,还有管理频道=4的权限,那么他的permission的值为 2⊕4 =6
如下是一段go语言的demo,permission的值为6
```
var (
	ViewingChannel = 1 << 1 // 查看频道
	EditChannel    = 1 << 2 // 编辑、管理频道
)

func main() {
	permission := ViewingChannel | EditChannel
	println(permission)
}
```

## 根据某个角色的的permission值判断是否拥有某个行为的权限
比如该角色的权限值 permission = 6,我们需要判断该角色是否拥有查看频道的权限,如下是一段go语言的demo

```
func checkHavePermission(permissions int64, requiredPermission int64) bool {
	if (permissions & 1) != 0 {
                // 1是管理员权限什么都能做
		return true
	}
	return (permissions & requiredPermission) != 0
}
```

## 角色Role字段解析

```
 {
                "name": "机器人",
                "icon": "https://imgheybox.max-c.com/dev/avatar/2023/08/10/be2f127109038a6644c15ab9cf678b9e.png",
                "color_list": [
                    15027858,
                    14985695
                ],
                "id": "3378926863517753344",
                "department_id": "3230476736336502784",
                "permissions": "34359738369",
                "type": 0,
                "color": 0,
                "position": 2,
                "del_tag": 1,
                "hoist": 1,
                "mentionable": 0,
                "creator": "0",
                "create_time": 0
}
```

|字段|类型|示例值|说明|
|----|----|----|----|
|name|string|机器人|角色名称。|
|icon|string|https://imgheybox.max-c.com/dev/avatar/2023/08/10/be2f127109038a6644c15ab9cf678b9e.png|角色的图标，这里为空表示没有特定图标。|
|color_list|array|[15027858,14985695]|渐变色的颜色数组,颜色值10进制|
|id|string|3378926863517753344|角色的唯一标识 ID。|
|department_id|string|3230476736336502784|所属部门的 ID。目前已经弃用|
|room_id|string|3230476736336502784|房间 ID，与部门 ID 相同|
|permissions|string|34359738369|权限值，具体参考 (权限说明)|
|type|int|0|类型标识，用于区分不同类型的角色具体参考(角色类型常量表)|
|color|int|0|颜色值10进制，在界面展示中用于区分不同角色。|
|position|int|2|角色排序|
|hoist|int|1|是否将该角色成员在右侧和普通成员区分显示,1是区分0是不区分|
|mentionable|int|0|目前弃用字段|
|creator|string|0|创建者标识，0 的话则为房间创建者|
|create_time|int64|0|创建时间戳,旧数据为0|


## 角色类型常量表

|值|说明|
|----|----|
|0|默认角色类型|
|1|游戏角色类型|
|2|机器人角色类型|
|3|成员管理员类型|
|4|文本频道管理员类型|
|5|音频频道管理员类型|
|6|社区建设者类型|
|7|高级管理员类型|
|254|访客类型|
|255|所有用户角色类型|

