群成员管理
更新时间: 2024/08/16 17:53:39
网易云信 NIM SDK 支持用户查询、添加、移除群组成员,管理成员角色等功能,拥有完善的成员权限体系及管理功能,群组内所有用户根据权限分为群主、管理员、以及普通成员。
技术原理
网易云信 NIM SDK 的 nim::Team
提供管理群组成员的相关方法,帮助您快速实现和使用群组的成员权限体系及管理功能。
群组中有三种角色,群主(kNIMTeamUserTypeCreator
),群组管理员(kNIMTeamUserTypeManager
)以及群组普通成员(kNIMTeamUserTypeNomal
),具体请参见NIMTeamUserType
。
- 群主默认为群组创建者,后续可通过
TransferTeamAsync
转让群主身份。 - 群组管理员由群主分配,群主通过
AddManagersAsync
添加群组管理员。 - 用户进入群组后,默认为群组的普通成员,后续可联系群主修改角色。
NIMTeamUserType
中还包含kNIMTeamUserTypeApply
和kNIMTeamUserTypeLocalWaitAccept
类型,表示待审核的申请加入用户和本地记录等待入群的用户。
前提条件
管理群组管理员
添加群组管理员
群主添加管理员后,所有群成员会收到群组通知消息(消息类型为 kNIMMessageTypeNotification
),触发事件为kNIMNotificationIdTeamAddManager
。
只有群主才拥有添加群组管理员的权限。
通过调用AddManagersAsync
方法添加群组管理员。
参数说明:
参数 | 说明 |
---|---|
tid | 群ID |
ids | 添加的群管理员账号列表 |
json_extension | 自定义扩展字段 |
cb | 添加管理员的回调函数 |
示例代码:
void OnTeamEventCallback(const nim::TeamEvent& result)
{
···
}
foo()
{
std::list<std::string> uids_list;
uids_list.push_back("user_id");
nim::Team::AddManagersAsync("tid_", uids_list, &OnTeamEventCallback);
}
错误码:
状态码 | 说明 |
---|---|
200 | 成功 |
802 | 没有权限 |
803 | 群组不存在 |
805 | 群类型错误 |
移除群组管理员
群主移除群管理员后, 所有群成员会收到群组通知消息(消息类型为 kNIMMessageTypeNotification
),触发事件为kNIMNotificationIdTeamRemoveManager
。
只有群主拥有移除群组管理员的权限。
通过调用 RemoveManagersAsync
方法来移除群组管理员。
参数说明:
参数 | 说明 |
---|---|
tid | 群ID |
ids | 移除的群管理员账号列表 |
json_extension | 自定义扩展字段 |
cb | 移除管理员的回调函数 |
示例代码:
void OnTeamEventCallback(const nim::TeamEvent& result)
{
···
}
foo()
{
std::list<std::string> uids_list;
uids_list.push_back("user_id");
nim::Team::RemoveManagersAsync("tid_", uids_list, &OnTeamEventCallback);
}
错误码:
状态码 | 说明 |
---|---|
200 | 成功 |
802 | 没有权限 |
803 | 群组不存在 |
805 | 群类型错误 |
修改群成员信息
修改群组成员的昵称
群主和群管理员修改群成员昵称后,所有群成员会收到群组通知消息(消息类型为 kNIMMessageTypeNotification
),触发事件为kNIMNotificationIdTeamSyncUpdateMemberProperty
。
只有群主有修改群组成员的群昵称的权限。
通过调用 UpdateOtherNickAsync
来修改群组成员的群昵称。
参数说明:
参数 | 说明 |
---|---|
prop | 群成员属性,具体请参见TeamMemberProperty |
json_extension | 自定义扩展字段 |
cb | 修改群成员信息的回调函数 |
示例代码:
TeamMemberProperty property;
property.member_info_json_value_ = params;
Team::UpdateOtherNickAsync(property, [this](const TeamEvent& team_event) {
// process team event
});
错误码:
状态码 | 说明 |
---|---|
200 | 成功 |
802 | 没有权限 |
803 | 群组不存在 |
804 | 用户不在群组中 |
805 | 群类型错误 |
修改自己在群组中信息
修改自己的群成员属性后,所有群成员会收到群组通知消息(消息类型为 kNIMMessageTypeNotification
),触发事件为kNIMNotificationIdTeamSyncUpdateMemberProperty
。
通过调用 UpdateMyPropertyAsync
来修改自己在群组中的信息。
参数说明:
参数 | 说明 |
---|---|
prop | 群成员属性,具体请参见TeamMemberProperty |
json_extension | 自定义扩展字段 |
cb | 修改群成员信息的回调函数 |
示例代码:
TeamMemberProperty property;
property.member_info_json_value_ = params;
Team::UpdateMyPropertyAsync(property, [this](const TeamEvent& team_event) {
// process team event
});
错误码:
状态码 | 说明 |
---|---|
200 | 成功 |
803 | 群组不存在 |
804 | 用户不在群组中 |
805 | 群类型错误 |
禁言群组成员
群组全体禁言
只有群主才有禁言全体成员或取消全员禁言的权限。
群组全员禁言分为两种模式。
- 若群组的禁言模式
NIMTeamMuteType
为kNIMTeamMuteTypeAllMute
,那么调用该接口禁言的对象是包含群主和管理员的所有成员。 - 若群组的禁言模式
NIMTeamMuteType
为kNIMTeamMuteTypeNomalMute
,那么调用该接口禁言的对象是全体普通成员,不包括群主和管理员。
通过调用 MuteAsync
方法来禁言群组全体成员或解除全体成员的禁言。
参数说明:
参数 | 说明 |
---|---|
tid | 群ID |
set_mute | 是否禁言全体成员。 true:表示禁言 false:表示解除禁言 |
json_extension | 自定义扩展字段 |
cb | 禁言的回调函数 |
示例代码:
Team::MuteAsync("tid", true, [this](const TeamEvent& team_event) {
// process team event
});
错误码:
状态码 | 说明 |
---|---|
200 | 成功 |
414 | 参数错误 |
禁言指定群成员
修改群成员禁言状态后, 禁言或解除禁言后,所有群成员会收到群组通知消息(消息类型为 kNIMMessageTypeNotification
),触发事件为kNIMNotificationIdTeamMuteMember
。
仅群主和管理员能禁言指定群成员。
通过调用 MuteMemberAsync
来修改群成员的的禁言状态。
参数说明:
参数 | 说明 |
---|---|
tid | 群ID |
member_id | 操作对象账号 |
set_mute | 是否禁言。 true:表示禁言 false:表示解除禁言 |
json_extension | 自定义扩展字段 |
cb | 禁言的回调函数 |
示例代码:
void CallbackMuteMember(const TeamEvent& team_event)
{
//自定义实现
char log[128];
sprintf_s(log, "id: %s, rescode: %d, tid: %s", GetTeamEventCommandText((nim::NIMNotificationId)team_event.notification_id_).c_str(), team_event.res_code_, team_event.team_id_.c_str());
MessageBoxA(nullptr, log, "team_event", 0);
}
void foo(const std::string& team_id, const std::string& account_id, bool mute)
{
Team::MuteMemberAsync(team_id, account_id, bool, &CallbackMuteMember);
}
错误码:
状态码 | 说明 |
---|---|
200 | 成功 |
414 | 参数错误 |
404 | 禁言对象不存在 |
803 | 群组不存在 |
802 | 没有权限 |
查询群组成员
查询操作有可能只是从本地数据库读取缓存数据,也有可能会从服务器同步新的数据, 因此耗时可能会比较长。
查询群组成员信息
通过调用 QueryTeamMembersAsync
方法来查询群组成员。
参数说明:
参数 | 说明 |
---|---|
tid | 群ID |
json_extension | 自定义扩展字段 |
cb | 查询群成员的回调函数 |
示例代码:
void OnGetTeamMembers(const std::string& team_id, int count, const std::list<nim::TeamMemberProperty>& team_member_list)
{
for (const auto& member : team_member_list)
{
···
}
}
foo()
{
nim::Team::QueryTeamMembersAsync("tid_", &OnGetTeamMembers);
}
错误码:
状态码 | 说明 |
---|---|
200 | 成功 |
406 | 没有变化 |
802 | 没有权限 |
查询指定群组成员信息
通过异步调用 QueryTeamMemberAsync
或同步调用QueryTeamMemberBlock
方法根据群组 ID 和成员账号来查询指定群组成员信息。
参数说明:
参数 | 说明 |
---|---|
tid | 群ID |
id | 群成员id |
json_extension | 自定义扩展字段 |
cb | 查询群成员的回调函数 |
示例代码:
//异步
void OnQueryMyTeamMemberInfo(const std::string& tid, const nim::TeamMemberProperty& team_member_info)
{
...
}
foo()
{
nim::Team::QueryTeamMemberAsync("tid_","accid_", OnQueryMyTeamMemberInfo);
}
查询所有群中关于自己的信息
通过调用 QueryMyAllMemberInfosAsync
方法来查询所有群组中关于自己的成员信息。
参数说明:
参数 | 说明 |
---|---|
json_extension | 自定义扩展字段 |
cb | 查询群成员的回调函数 |
示例代码:
Team::QueryMyAllMemberInfosAsync([this](int count, const std::list<TeamMemberProperty>& props) {
// process props
});
获取所有群列表后,需要查询自己在每个群中自己的成员信息,使用成员信息中的 bits
字段,可以判断当某个群发来消息后,是否做消息通知。
查询群成员的邀请者
群成员入群邀请人为空表示主动入群,没有邀请人。
通过调用 QueryTeamMembersInvitor
来查询群组成员的邀请者。
参数说明:
参数 | 说明 |
---|---|
tid | 群ID |
members | 需要查询邀请者的群成员账号列表,一次最多查200个 当群成员数量小于等于 200 时为可选参数,不填默认查全部成员; 群成员数量大于 200 时,需要将成员列表分批多次调用查询。 |
cb | 查询群成员的回调函数 |
示例代码:
Team::QueryTeamMembersInvitor("tid", {"member1", "member2"},
[this](NIMResCode res_code, const std::string& tid, const std::map<std::string, std::string>& invitor_map) {
// process result
});
查询被禁言的群成员
通过调用 QueryMuteListOnlineAsync
方法来查询被禁言的群成员。
示例代码:
void CallbackQueryMembersInfoOnline(NIMResCode error_code, const std::string& tid, const std::list<TeamMemberProperty>& team_member_propertys)
{
//自定义实现
std::string ids;
for (auto iter = team_member_propertys.begin(); iter != team_member_propertys.end(); ++iter)
{
ids.append(iter->GetAccountID());
ids.append(",");
}
char log[1024];
sprintf_s(log, 1024, "tid: %s, member_count: %d\r\nids: %s", tid.c_str(), team_member_propertys.size(),ids.c_str());
MessageBoxA(nullptr, log, "CallbackQueryMembersInfoOnline", 0);
}
void foo(const std::string& team_id)
{
Team::QueryMuteListOnlineAsync(team_id, &CallbackQueryMembersInfoOnline);
}
错误码:
状态码 | 说明 |
---|---|
200 | 成功 |
803 | 群组不存在 |
802 | 没有权限 |
根据成员类型检索群组成员
调用 getTeamMemberList
方法在指定群组中根据成员类型检索高级群成员。调用成功后会返回匹配到的高级群成员信息列表。
参数说明:
参数名称 | 类型 | 是否必填 | 描述 |
---|---|---|---|
teamId | String | 是 | 高级群 ID。 |
- option | NIMTeamMemberRoleTypeSearchOption | 是 | 检索配置项。 |
roleTypes | List<NIMTeamUserType> | 否 | 群成员类型。 |
offset | Integer | 否 | 查询偏移,首次传 0,下一次调用传入上一次返回的 offset 。 |
order | Integer | 否 | 查询方向,即返回结果按照 joinTime(进群时间)正序或逆序排序,默认为逆序。 |
limit | Integer | 否 | 本次查询的最大数量,默认 10。 |