群组功能

群组功能概述

网易云通信SDK提供了普通群(kNIMTeamTypeNormal),以及高级群(kNIMTeamTypeAdvanced)两种形式的群聊功能。高级群拥有更多的权限操作,两种群聊形式在共有操作上保持了接口一致。在群组中,当前会话的ID就是群组的ID。

开发手册中所提及的普通群都等同于DEMO中的讨论组。普通群(讨论组)没有权限操作,适用于快速创建多人会话的场景。每个普通群只有一个管理员。管理员可以对群进行增减员操作,普通成员只能对群进行增员操作。在添加新成员的时候,并不需要经过对方同意。

高级群在权限上有更多的限制,权限分为群主、管理员、以及群成员。在添加成员的时候需要对方接受邀请。高级群的群成员资料提供了实时同步功能,并提供了群开关设置字段、第三方扩展字段(仅负责存储和透传)和第三方服务器扩展字段(该配置项只能通过服务器接口设置,对客户端只读)。

群操作 普通群 高级群
邀请成员 任何人 群主、管理员
踢出成员 群主 群主、管理员(管理员之间无法互相踢)
解散群 群主 群主
退群 任何人 管理员、普通成员
处理入群申请 / 群主、管理员
更改自己的群昵称 / 任何人
更改他人群昵称 / 群主、管理员
更改群名称 任何人 群主、管理员
更改群公告 / 群主、管理员
更改群介绍 / 群主、管理员
更新验证方式 / 群主、管理员
添加(删除)管理员 / 群主
移交群主 / 群主
成员禁言 / 群主、管理员
更新群头像 / 群主、管理员

群聊消息

群聊消息收发和管理与双人聊天完全相同,仅在消息类型(kNIMMsgKeyToType)上做了区分。

获取群组

SDK 在程序启动时会对本地群信息进行同步,所以只需要调用本地缓存接口获取群就可以了。SDK 提供了批量获取自己的群接口、以及根据单个群 ID 查询的接口。同样SDK 也提供了远程获取群信息的接口。

创建群组

网易云通信群组分为两类:普通群和高级群,两种群组的消息功能都是相同的,区别在于管理功能。

普通群所有人都可以拉人入群,除群主外,其他人都不能踢人。

固定群则拥有完善的成员权限体系及管理功能。创建群的接口相同,传入不同的类型参数即可。

void nim_team_create_team_async(
const char *team_info, //群信息
const char *jsonlist_uids, //邀请的成员
const char *invitation_postscript, //邀请附言
const char *json_extension, //附加数据
nim_team_opt_cb_func cb,
const void *user_data);

例:

C++

void OnTeamEventCallback(const nim::TeamEvent& result)
{
    ...
}

void foo()
{
    std::list<std::string> id_list;
    id_list.push_back("test1");
    id_list.push_back("test2");

    nim::TeamInfo tinfo;
    tinfo.SetName("test");
    tinfo.SetType(nim::kNIMTeamTypeNormal);
    nim::Team::CreateTeamAsync(tinfo, id_list, "", &OnTeamEventCallback);
}

C#

void foo()
{
    NIM.Team.NIMTeamInfo tinfo = new NIM.Team.NIMTeamInfo();
    tinfo.Name = teamNameBox.Text;
    tinfo.Introduce = teamIntroBox.Text;
    tinfo.TeamType = NIM.Team.NIMTeamType.kNIMTeamTypeAdvanced;
    string[] uids = { "test1", "test2"};
    if (uids.Any())
    {
        NIM.Team.TeamAPI.CreateTeam(tinfo, uids, textBox1.Text, (a) =>
        {

        });
    }
}

C

void CallbackCreateTeam(int error, int team_event, const char *tid, const char* str, const char *json_exten, const void *user_data)
{
    ...
}    

typedef void(*nim_team_create_team_async)(const char *team_info, const char *jsonlist_uids, const char *invitation_postscript, const char *json_extension, nim_team_event_cb_func cb, const void* user_data);

void foo()
{
    Json::Value team_info;
    team_info[kNIMTeamInfoKeyName] = ; //群名称
    team_info[kNIMTeamInfoKeyType] = ; //群类型
    team_info[kNIMTeamInfoKeyIntro] = ; //群介绍
    team_info[kNIMTeamInfoKeyJoinMode] = ; //群验证方式
    team_info[kNIMTeamInfoKeyAnnouncement] = ; //群公告

    Json::Value team_member;
    team_member.append("litianyi01");    
    team_member.append("litianyi02");

    nim_team_create_team_async func = (nim_team_create_team_async) GetProcAddress(hInst, "nim_team_create_team_async");
    func(team_info.toStyledString().c_str(), team_member.toStyledString().c_str(), "welcome to new team", nullptr, &CallbackCreateTeam, nullptr);
}

加入群组

用户可以通过被动接受邀请和主动加入两种方式进入群组。

踢人出群

普通群仅拥有者可以踢人,高级群拥有者和管理员可以踢人,且管理员不能踢拥有者和其他管理员。

C++

void TeamEventCb(const nim::TeamEvent& team_event)
{
    ···
}

void foo()
{
    std::list<std::string> uids_list;
    uids_list.push_back("test_user");
    nim::Team::RejectJoinApplyAsync("12345", uids_list, &TeamEventCb);
}

C#

NIM.Team.TeamAPI.KickMemberOutFromTeam("12345", new string[] {"test_user"}, (a) =>
{
    if (a.TeamEvent.ResponseCode == NIM.ResponseCode.kNIMResSuccess)
    {
        ···
    }
});

C

void TeamEventCb(int res_code, int notification_id, const char *tid, const char *result, const char *json_extension, const void *user_data)
{
    ···
}

typedef void(*nim_team_kick_async)(const char *tid, const char *jsonlist_uids, const char *json_extension, nim_team_event_cb_func cb, const void* user_data);

void foo()
{
    nim_team_kick_async func = (nim_team_kick_async) GetProcAddress(hInst, "nim_team_kick_async");

    Json::Value json_value;
    json_value.append("litianyi01");    
    json_value.append("litianyi02");

    func("12345", json_value.toStyledString().c_str(), "", &TeamEventCb, nullptr);
}

主动退群

除拥有者外,其他用户均可以主动退群:

C++

void TeamEventCb(const nim::TeamEvent& team_event)
{
    ···
}

void foo()
{
    nim::Team::LeaveAsync("12345", &TeamEventCb);
}

C#

NIM.Team.TeamAPI.LeaveTeam("12345", (ret) =>
{
    if (ret.TeamEvent.ResponseCode == NIM.ResponseCode.kNIMResSuccess)
    {
        ···
    }
});

C

void TeamEventCb(int res_code, int notification_id, const char *tid, const char *result, const char *json_extension, const void *user_data)
{
    ···
}

typedef void(*nim_team_leave_async)(const char *tid, const char *json_extension, nim_team_event_cb_func cb, const void* user_data);

void foo()
{
    nim_team_leave_async func = (nim_team_leave_async) GetProcAddress(hInst, "nim_team_leave_async");

    func("12345", "", &TeamEventCb, nullptr);
}

编辑群组资料

普通群所有人均可以修改群名,高级群仅拥有者和管理员可修改群名及其他群资料。

void nim_team_update_team_info_async(const char *tid, const char *json_info, const char *json_extension, nim_team_opt_cb_func cb, const void *user_data);

例:

C++

void OnUpdateBroadCb(const nim::TeamEvent& team_event)
{
    if (team_event.res_code_ == 200)
    {
        ···
    }
}

void foo()
{
    Json::Value broad;
    broad["title"] = "title";
    broad["content"] = "内容";
    broad["creator"] = "test_user";

    Json::Value broads;
    broads.append(broad);

    Json::FastWriter writer;
    nim::TeamInfo param;
    param.SetAnnouncement(writer.write(broads));
    param.SetTeamID("tid_");

    nim::Team::UpdateTeamInfoAsync("tid_", param, &OnUpdateBroadCb);
}

C#

void foo()
{
    NIM.Team.NIMTeamInfo tinfo = new NIM.Team.NIMTeamInfo();
    tinfo.Announcement = "公告";
    tinfo.TeamId = "tid";

    NIM.Team.TeamAPI.UpdateTeamInfo("tid", tinfo, (ret) =>
    {
        if (ret.TeamEvent.ResponseCode == NIM.ResponseCode.kNIMResSuccess)
        {
            ···
        }
    });
}

C

void CallbackTeamOperate(int error, int team_operate, const char *tid, const char* str, const char *json_exten, const void *user_data)
{
    if (error == kNIMResSuccess)
    {
        ...
    }
    else
    {
        ...
    }
}

typedef void(*nim_team_update_team_info_async)(const char *tid, const char *json_info, const char *json_extension, nim_team_event_cb_func cb_func, const void* user_data);

void foo()
{
    Json::Value values;
    values[kNIMTeamInfoKeyID] = "tid";    
    values[kNIMTeamInfoKeyAnnouncement] = "123"; //修改群公告,同样的,目前可以修改群名称,群简介,具体参阅api文档

    nim_team_update_team_info_async func = (nim_team_update_team_info_async) GetProcAddress(hInst, "nim_team_update_team_info_async");
    func("tid", values.toStyledString().c_str(), nullptr, &CallbackTeamOperate, nullptr);
}

管理群组权限

高级群群主可以对群进行权限管理,权限管理包括:

群组成员

解散群

群主可以调用接口解散所拥有的群:

C++

void OnTeamEventCallback(const nim::TeamEvent& result)
{
    ···
}

foo()
{
    nim::Team::DismissAsync("tid_", &OnTeamEventCallback);
}

C#

NIM.Team.TeamAPI.DismissTeam("_teamId", (ret) =>
{
    ···
});

C

void CallbackTeamOperate(int error, int team_operate, const char *tid, const char* str, const char *json_exten, const void *user_data)
{
    if (error == kNIMResSuccess)
    {
        ...
    }
    else
    {
        ...
    }
}

typedef void(*nim_team_dismiss_async)(const char *tid, const char *json_extension, nim_team_event_cb_func cb, const void* user_data);

void foo()
{
    nim_team_dismiss_async func = (nim_team_dismiss_async) GetProcAddress(hInst, "nim_team_dismiss_async");
    func("tid", nullptr, &CallbackTeamOperate, nullptr);
}

群组通知

用户在创建群或者进入群成功之后,任何关于群的变动(群组资料变动,群成员变动等),网易云通信服务器都会下发一条群通知消息。APP 可以通过注册全局回调函数接受群组通知。

void nim_team_reg_team_event_cb(const char *json_extension, nim_team_event_cb_func cb, const void *user_data);

例:

C++

void OnTeamEventCallback(const nim::TeamEvent& result)
{
    ···
}

foo()
{
    nim::Team::RegTeamEventCb(&OnTeamEventCallback);
}

C#

void OnTeamEventNotify(object sender, NIMTeamEventArgs e)
{
    if (e.Data.TeamEvent.NotificationType == NIMNotificationType.kNIMNotificationIdLocalGetTeamList)
    {
        ···
    }
}

void foo()
{
    NIM.Team.TeamAPI.TeamEventNotificationHandler += OnTeamEventNotify;
}

C

void CallbackTeamEvent(int error, int team_event, const char *tid, const char* str, const char *json_exten, const void *user_data)
{
    switch (team_event)
    {
    case kNIMNotificationIdLocalCreateTeam:
        ...
    ...    
    }
}

typedef void(*nim_team_reg_team_event_cb)(const char *json_extension, nim_team_event_cb_func cb, const void *user_data);

void foo()
{
    nim_team_reg_team_event_cb func = (nim_team_reg_team_event_cb) GetProcAddress(hInst, "nim_team_reg_team_event_cb");
    func(nullptr, &CallbackTeamEvent, nullptr);
}

自定义拓展

SDK 提供了群信息的拓展接口,开发者可以通过维护群信息的两个属性来自行定义内容。

群成员禁言

设置消息提醒

可以对某个高级群设置消息提醒类型,群消息提醒分为全部提醒、仅管理员消息提醒、全部不提醒等三种,默认为全部提醒,普通群不支持设置消息提醒。 PC SDK可以通过修改自己的群属性来设置消息提醒:

参数 类型 必须 说明
prop(C++) struct 群组成员信息
cb function 回调函数
json_extension std::string 扩展参数