功能描述
权限组可以根据用户实际使用需求自定义群组的使用权限,通过在不同的权限组配置不同的权限以及成员,来实现分组分权限管理群组。社群可使用权限组来管理,相比于职责固定的 管理员 的管理,权限组的管理则更加灵活,能够适用于社群成员较多、话题较多的场景。


权限组
V2TIMPermissionGroupInfo 包含三要素:社群权限 groupPermission、话题权限 topicPermission、拥有该权限的群成员。如上图所示,不同的权限组可以配置不同的社群权限 groupPermission 和话题权限 topicPermission,并通过添加不同的群成员来实现差异化权限管理。在社群资料 V2TIMGroupInfo 和话题资料 V2TIMTopicInfo 中还可分别设置社群的默认权限和话题的默认权限 defaultPermissions,并且所有群成员都拥有该默认权限。权限组管理规则如下:开启权限组功能 需要设置
enablePermissionGroup 为 true,此时 管理员 的能力就失效了,相当于普通群成员;相反设置为 false后,权限组管理功能失效,恢复 管理员 的能力。在社群资料
V2TIMGroupInfo 和话题资料 V2TIMTopicInfo 中会自动创建默认的社群权限 defaultPermissions 和话题权限 defaultPermissions,针对所有群成员 everyone 生效(群主除外)。权限组
V2TIMPermissionGroupInfo 中的社群权限 groupPermission 可以在 创建权限组 时设置,也可以后续再修改。权限组中的话题权限 topicPermission 需要通过接口 addTopicPermissionToPermissionGroup 添加到权限组中。权限组的社群权限和话题权限只对权限组中的成员有效。权限是用 64 位的值来表示,每一位代表一个权限。某一位的值为 0 代表该权限是关闭的,值为 1 代表该权限是打开的。社群和话题权限位对照表如下,例如设置权限组的社群权限值为 5(二进制的 101),那么在权限组中的成员就拥有修改群资料权限和管理权限组资料权限。
某群成员拥有的权限为默认的 everyone 权限和所在多个权限组中的权限取并集,即只要在一个地方该权限是打开的就有该权限。
群主始终拥有所有的权限。
社群和话题的权限位对照表如下:
分类 | 第 几 位 | 名称 | 含义 |
社群权限 | 第 0 位 | V2TIM_COMMUNITY_PERMISSION_MANAGE_GROUP_INFO | 修改群资料权限。 |
| 第 1 位 | V2TIM_COMMUNITY_PERMISSION_MANAGE_GROUP_MEMBER | 群成员管理权限,包含踢人,进群审核、修改成员资料等。拥有该权限的权限组最多支持 20 个人。 |
| 第 2 位 | V2TIM_COMMUNITY_PERMISSION_MANAGE_PERMISSION_GROUP_INFO | 管理权限组资料权限。 |
| 第 3 位 | V2TIM_COMMUNITY_PERMISSION_MANAGE_PERMISSION_GROUP_MEMBER | 权限组成员管理权限。 |
| 第 4 位 | V2TIM_COMMUNITY_PERMISSION_MANAGE_TOPIC_IN_COMMUNITY | 话题管理权限,包含创建、修改、删除话题等。 |
| 第 5 位 | V2TIM_COMMUNITY_PERMISSION_MUTE_MEMBER | 对某群成员在社群下所有话题的禁言权限。 |
| 第 6 位 | V2TIM_COMMUNITY_PERMISSION_SEND_MESSAGE | 群成员在社群下所有话题的发消息权限。 |
| 第 7 位 | V2TIM_COMMUNITY_PERMISSION_AT_ALL | 在社群下所有话题发 at all 消息权限。 |
| 第 8 位 | V2TIM_COMMUNITY_PERMISSION_GET_HISTORY_MESSAGE | 在社群下所有话题拉取入群前的历史消息权限。 |
| 第 9 位 | V2TIM_COMMUNITY_PERMISSION_REVOKE_OTHER_MEMBER_MESSAGE | 在社群下所有话题撤回他人消息权限。 |
| 第 10 位 | V2TIM_COMMUNITY_PERMISSION_BAN_MEMBER | 封禁社群成员权限。 |
话题权限 | 第 0 位 | V2TIM_TOPIC_PERMISSION_MANAGE_TOPIC | 管理当前话题的权限,包括修改当前话题的资料、删除当前话题。 |
| 第 1 位 | V2TIM_TOPIC_PERMISSION_MANAGE_TOPIC_PERMISSION | 在当前话题中管理话题权限,包括添加、修改、移除话题权限。 |
| 第 2 位 | V2TIM_TOPIC_PERMISSION_MUTE_MEMBER | 在当前话题中禁言成员权限。 |
| 第 3 位 | V2TIM_TOPIC_PERMISSION_SEND_MESSAGE | 在当前话题中发消息权限。 |
| 第 4 位 | V2TIM_TOPIC_PERMISSION_GET_HISTORY_MESSAGE | 在当前话题中拉取入群前的历史消息权限。 |
| 第 5 位 | V2TIM_TOPIC_PERMISSION_REVOKE_OTHER_MEMBER_MESSAGE | 在当前话题中撤回他人消息权限。 |
| 第 6 位 | V2TIM_TOPIC_PERMISSION_AT_ALL | 在当前话题中发消息时有 at all 权限。 |
场景示例
用一个场景来介绍一下权限组的使用流程。一个运动类的社群下有 3 个话题分别是【重要通知】、【篮球】、【足球】。所有成员拥有在【重要通知】话题中拉取加入社群前的历史消息权限,在【篮球】、【足球】话题中发消息的权限。成员 a 拥有修改社群资料、管理群成员、在【重要通知】话题中发送消息的权限;成员 b 和 c 拥有在【篮球】、【足球】话题下禁言成员的权限。
使用流程如下:
1. 这一点非常重要:在社群中开启权限组功能,设置
enablePermissionGroup 为 true,也可以放到最后一步操作。2. 把社群的 everyone 权限全部关闭即
defaultPermissions 设置为 0,所有成员都没有社群维度的任何权限。3. 把【重要通知】话题的 everyone 权限
defaultPermissions 设置为 16(二进制的 10000)即V2TIM_TOPIC_PERMISSION_GET_HISTORY_MESSAGE ,把【篮球】、【足球】话题的 everyone 权限 defaultPermissions 设置为 8(二进制的 1000)即 V2TIM_TOPIC_PERMISSION_SEND_MESSAGE ,所有成员都可以在【重要通知】话题中拉取加入社群前的历史消息,在【篮球】、【足球】话题中发消息。4. 创建名为“社群管理”的权限组,设置社群权限
groupPermission 为 3(二进制值 11),即权限“或”运算的值V2TIM_COMMUNITY_PERMISSION_MANAGE_GROUP_INFO | V2TIM_COMMUNITY_PERMISSION_MANAGE_GROUP_MEMBER ,并添加【重要通知】话题的发消息权限 topicPermission 为 8(二进制的1000)V2TIM_TOPIC_PERMISSION_SEND_MESSAGE,群成员 a 被 添加到该权限组 后就拥有了修改社群资料、管理群成员、在【重要通知】话题中发送消息的权限。5. 创建名为“话题管理”的权限组,关闭所有社群权限,设置
groupPermission 为 0,并添加【篮球】、【足球】话题禁言成员的权限 topicPermission 为 4(二进制的100)V2TIM_TOPIC_PERMISSION_MUTE_MEMBER,群成员 b 和群成员 c 被 添加到该权限组 后就拥有了在【篮球】、【足球】话题禁言成员的权限。社群权限管理
开启/关闭权限组功能
群组可以通过管理员或者权限组来管理,两种方式选其一。开启了权限组功能后,管理员的角色就失效了,相当于普通群成员;关闭了权限组功能后,管理员的能力恢复。
示例代码如下:
final groupInfo = V2TimGroupInfo(groupID: '需要开启权限组功能的社群 ID',isEnablePermissionGroup: true,groupType: GroupType.Community);final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().setGroupInfo(info: groupInfo);if (result.code == 0) {// 开启权限组功能成功} else {// 开启权限组功能失败}// 群事件监听TencentImSDKPlugin.v2TIMManager.addGroupListener(listener: V2TimGroupListener(onGroupInfoChanged: (String groupID, List<V2TimGroupChangeInfo> changeInfos) {// 群资料更新回调},));
社群默认权限
示例代码如下:
// 假如需求是设置所有群成员默认在所有话题下可以发消息以及可以拉取加入社群前的历史消息,其他权限关闭var communityPermission = V2TIMPermissionGroupInfo.V2TIM_COMMUNITY_PERMISSION_SEND_MESSAGE | V2TIMPermissionGroupInfo.V2TIM_COMMUNITY_PERMISSION_GET_HISTORY_MESSAGE;final groupInfo = V2TimGroupInfo(groupID: '需要修改的社群 ID',groupType: GroupType.Community,defaultPermissions: communityPermission);final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().setGroupInfo(info: groupInfo);if (result.code == 0) {// 设置默认权限成功} else {// 设置默认权限失败}// 群事件监听TencentImSDKPlugin.v2TIMManager.addGroupListener(listener: V2TimGroupListener(onGroupInfoChanged: (String groupID, List<V2TimGroupChangeInfo> changeInfos) {// 群资料更新回调},));
创建权限组
示例代码如下:
// 该权限组的成员具有【修改群资料权限】和【群成员管理权限】var communityPermission = V2TimPermissionGroupInfo.V2TIM_COMMUNITY_PERMISSION_MANAGE_GROUP_INFO | V2TimPermissionGroupInfo.V2TIM_COMMUNITY_PERMISSION_MANAGE_GROUP_MEMBER;V2TimPermissionGroupInfo permissionGroupInfo = V2TimPermissionGroupInfo(groupID: '需要创建权限组的社群 ID',permissionGroupID: '权限组 ID,可不填或者自定义',permissionGroupName: '权限组名称',groupPermission: communityPermission,);final result = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().createPermissionGroupInCommunity(info: permissionGroupInfo);if (result.code == 0) {// 创建权限组成功} else {// 创建权限组失败}// 社群群事件监听TencentImSDKPlugin.v2TIMManager.getCommunityManager().addCommunityListener(listener: V2TimCommunityListener(onCreatePermissionGroup: (String groupID, V2TimPermissionGroupInfo permissionGroupInfo) {// 权限组创建通知}));
删除权限组
示例代码如下:
List<String> deleteList = [];deleteList.add('权限组 ID1');deleteList.add('权限组 ID2');final deleteResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().deletePermissionGroupFromCommunity(groupID: '需要删除权限组的社群 ID', permissionGroupIDList: deleteList);if (deleteResult.code == 0) {// 删除成功} else {// 删除失败}// 社群群事件监听TencentImSDKPlugin.v2TIMManager.getCommunityManager().addCommunityListener(listener: V2TimCommunityListener(onDeletePermissionGroup: (String groupID, List<String> permissionGroupIDList) {// 权限组删除通知}));
修改权限组
示例代码如下:
// 该权限组的成员具有【管理权限组资料权限】和【权限组成员管理权限】var communityPermission = V2TimPermissionGroupInfo.V2TIM_COMMUNITY_PERMISSION_MANAGE_PERMISSION_GROUP_INFO | V2TimPermissionGroupInfo.V2TIM_COMMUNITY_PERMISSION_MANAGE_PERMISSION_GROUP_MEMBER;V2TimPermissionGroupInfo permissionGroupInfo = V2TimPermissionGroupInfo(groupID: '需要修改权限组的社群 ID', // 必填permissionGroupID: '需要修改的权限组 ID', // 必填permissionGroupName: '需要修改的权限组名称',groupPermission: communityPermission,);final modifyResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().modifyPermissionGroupInfoInCommunity(info: permissionGroupInfo);if (modifyResult.code == 0) {// 修改权限组资料成功} else {// 修改权限组资料失败}// 社群群事件监听TencentImSDKPlugin.v2TIMManager.getCommunityManager().addCommunityListener(listener: V2TimCommunityListener(onChangePermissionGroupInfo: (String groupID, V2TimPermissionGroupInfo permissionGroupInfo) {// 权限组更新通知}));
获取权限组列表
获取权限组列表
群成员可以调用 getPermissionGroupListInCommunity 获取权限组列表。当参数
permissionGroupIDList 非空时,表示获取指定的权限组列表;当 permissionGroupIDList 为空时,表示获取所有的权限组列表。示例代码如下:
List<String> permissionGroupIDList = [];// permissionGroupIDList 列表有值,表示获取指定的权限组列表;permissionGroupIDList 为空,表示获取所有的权限组列表permissionGroupIDList.add('需要获取的权限组 ID');final getResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().getPermissionGroupListInCommunity(groupID: '需要获取权限组列表的社群 ID', permissionGroupIDList: permissionGroupIDList);if (getResult.code == 0) {// 获取权限组列表成功} else {// 获取权限组列表失败}
获取已加入的权限组列表
示例代码如下:
final getJoinedResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().getJoinedPermissionGroupListInCommunity(groupID: '需要获取权限组列表的社群 ID');if (getJoinedResult.code == 0) {// 获取已加入的权限组成功} else {// 获取已加入的权限组失败}
添加权限组成员
示例代码如下:
List<String> memberList= [];memberList.add('添加群成员1的 userID');memberList.add('添加群成员2的 userID');final addResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().addCommunityMembersToPermissionGroup(groupID: '需要添加权限组群成员的社群 ID', permissionGroupID: '需要添加权限组群成员的权限组 ID', memberList: memberList);if (addResult.code == 0) {// 添加权限组群成员成功} else {// 添加权限组群成员失败}// 社群群事件监听TencentImSDKPlugin.v2TIMManager.getCommunityManager().addCommunityListener(listener: V2TimCommunityListener(onAddMembersToPermissionGroup: (String groupID, String permissionGroupID, List<String> memberIDList) {// 权限组成员添加通知}));
移除权限组成员
示例代码如下:
List<String> memberList= [];memberList.add('移除群成员1的 userID');memberList.add('移除群成员2的 userID');final removeResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().removeCommunityMembersFromPermissionGroup(groupID: '需要移除权限组群成员的社群 ID', permissionGroupID: '需要移除权限组群成员的权限组 ID', memberList: memberList);if (removeResult.code == 0) {// 移除权限组群成员成功} else {// 移除权限组群成员失败}// 社群群事件监听TencentImSDKPlugin.v2TIMManager.getCommunityManager().addCommunityListener(listener: V2TimCommunityListener(onRemoveMembersFromPermissionGroup: (String groupID, String permissionGroupID, List<String> memberIDList) {// 权限组成员移除通知}});
获取权限组成员列表
调用 getCommunityMemberListInPermissionGroup 获取权限组中的成员列表,其中参数
nextCursor 为续拉游标,首次拉取时填空字符串,续拉时填上一次调用结果中的返回值。示例代码如下:
final getMemberListResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().getCommunityMemberListInPermissionGroup(groupID: '需要获取权限组成员的社群 ID', permissionGroupID: '需要获取权限组成员的权限组 ID', nextCursor: '');if (getMemberListResult.code == 0) {// 获取权限组中的成员列表成功,其中 result.getNextCursor() 返回续拉游标,再次调用该接口续拉时填入该返回值} else {// 获取权限组中的成员列表失败}
话题权限管理
话题默认权限
示例代码如下:
// 假设需求为所有社群成员都有在当前话题发消息的权限和拉取加入社群前的在该话题的历史消息权限var topicPermission = V2TimPermissionGroupInfo.V2TIM_TOPIC_PERMISSION_SEND_MESSAGE | V2TimPermissionGroupInfo.V2TIM_TOPIC_PERMISSION_GET_HISTORY_MESSAGE;V2TimTopicInfo topicInfo = V2TimTopicInfo(topicID: '需要设置话题默认权限的话题 ID', defaultPermissions: topicPermission);final setTopicPermissionResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().setTopicInfo(topicInfo: topicInfo);if (setTopicPermissionResult.code == 0) {// 设置话题默认权限成功} else {// 设置话题默认权限失败}// 社群群事件监听TencentImSDKPlugin.v2TIMManager.getCommunityManager().addCommunityListener(listener: V2TimCommunityListener(onChangeTopicInfo: (String groupID, V2TimTopicInfo topicInfo) {// 话题信息更新通知}});
添加权限组的话题权限
示例代码如下:
// 假设需求是在权限组中的成员具有【管理话题1的权限】和【在话题1中禁言成员的权限】,以及【管理话题2的权限】和【在话题2中撤回他人消息的权限】var topicPermission1 = V2TimPermissionGroupInfo.V2TIM_TOPIC_PERMISSION_MANAGE_TOPIC | V2TimPermissionGroupInfo.V2TIM_TOPIC_PERMISSION_MUTE_MEMBER;var topicPermission2 = V2TimPermissionGroupInfo.V2TIM_TOPIC_PERMISSION_MANAGE_TOPIC | V2TimPermissionGroupInfo.V2TIM_TOPIC_PERMISSION_REVOKE_OTHER_MEMBER_MESSAGE;Map<String, int> topicPermissionMap = {};topicPermissionMap['话题1 ID'] = topicPermission1;topicPermissionMap['话题2 ID'] = topicPermission2;final addTopicPermissionResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().addTopicPermissionToPermissionGroup(groupID: '需要添加话题权限的社群 ID', permissionGroupID: '需要添加话题权限的权限组 ID', topicPermissionMap: topicPermissionMap);if (addTopicPermissionResult.code == 0) {// 添加话题权限成功} else {// 添加话题权限失败}// 社群群事件监听TencentImSDKPlugin.v2TIMManager.getCommunityManager().addCommunityListener(listener: V2TimCommunityListener(onAddTopicPermission: (String groupID, String permissionGroupID, Map<String, int> topicPermissionMap) {// 添加话题权限通知}});
删除权限组的话题权限
示例代码如下:
List<String> topicIDList = [];topicIDList.add('话题1 ID');topicIDList.add('话题2 ID');final deleteTopicPermissionResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().deleteTopicPermissionFromPermissionGroup(groupID: '需要删除话题权限的社群 ID', permissionGroupID: '需要删除话题权限的权限组 ID', topicIDList: topicIDList);if (deleteTopicPermissionResult.code == 0) {// 删除话题权限成功} else {// 删除话题权限失败}// 社群群事件监听TencentImSDKPlugin.v2TIMManager.getCommunityManager().addCommunityListener(listener: V2TimCommunityListener(onDeleteTopicPermission: (String groupID, String permissionGroupID, List<String> topicIDList) {// 删除话题权限通知}});
修改权限组的话题权限
示例代码如下:
// 假设需求是在权限组中的成员具有话题1和话题2相同的两个权限,【管理话题的权限】和【在话题中禁言成员的权限】var topicPermission = V2TimPermissionGroupInfo.V2TIM_TOPIC_PERMISSION_MANAGE_TOPIC | V2TimPermissionGroupInfo.V2TIM_TOPIC_PERMISSION_MUTE_MEMBER;Map<String, int> topicPermissionMap = {};topicPermissionMap['话题1 ID'] = topicPermission;topicPermissionMap['话题2 ID'] = topicPermission;final modifyTopicPermissionResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().modifyTopicPermissionInPermissionGroup(groupID: '需要修改话题权限的社群 ID', permissionGroupID: '需要修改话题权限的权限组 ID', topicPermissionMap: topicPermissionMap);if (modifyTopicPermissionResult.code == 0) {// 修改权限组中的话题权限成功} else {// 修改权限组中的话题权限失败}// 社群群事件监听TencentImSDKPlugin.v2TIMManager.getCommunityManager().addCommunityListener(listener: V2TimCommunityListener(onModifyTopicPermission: (String groupID, String permissionGroupID, Map<String, int> topicPermissionMap) {// 修改话题权限通知}});
获取权限组的话题权限
群成员可以调用 getTopicPermissionInPermissionGroup 获取权限组中的话题权限列表。其中
topicIDList 有值时为获取权限组中指定话题权限;topicIDList 为空时为获取权限组中的所有话题权限。示例代码如下:
List<String> topicIDList = [];topicIDList.add('话题1 ID');topicIDList.add('话题2 ID');final getTopicPermissionResult = await TencentImSDKPlugin.v2TIMManager.getCommunityManager().getTopicPermissionInPermissionGroup(groupID: '需要获取话题权限的社群 ID', permissionGroupID: '需要获取话题权限的权限组 ID', topicIDList: topicIDList);if (getTopicPermissionResult.code == 0) {// 获取权限组中的话题权限成功} else {// 获取权限组中的话题权限失败}