用户关系托管

SDK 提供了用户好友关系管理,以及对用户会话的消息设置。在网易云通信中,不是好友也允许聊天。好友关系如果不托管给网易云通信,开发者需要自己在应用服务器维护。

好友关系

获取好友列表

获取我的好友帐号集合,可以根据帐号来获取对应的用户资料,见用户资料托管。好友列表有本地缓存,缓存会在手动/自动登录后与服务器自动进行同步更新。在函数的回调函数中可以获取到 nim::FriendProfile 对象的列表。

/** @fn static void GetList(const GetFriendsListCallback& cb, const std::string& json_extension = "")
* 获取好友列表
* @param[in] cb    获取好友列表回调函数
* @param[in] json_extension json扩展参数(备用,目前不需要)
* @return void 无返回值
* @note 错误码    200:成功
*/
static void GetList(const GetFriendsListCallback& cb, const std::string& json_extension = "");
void OnGetFriendList(nim::NIMResCode res_code, const std::list<nim::FriendProfile>& user_profile_list)
{
    //处理好友列表
}

void foo()
{
    nim::Friend::GetList(&OnGetFriendList);
}

添加好友

目前添加好友有两种验证类型:直接添加为好友和发起好友验证请求,两种方式的区别在于是否需要对方验证才能完成好友添加。

/** @fn static bool Request(const std::string &accid, NIMVerifyType verify_type, const std::string &msg, const FriendOptCallback &cb, const std::string& json_extension = "")
* 添加、验证好友
* @param[in] accid    对方帐号
* @param[in] verify_type 好友验证类型
* @param[in] msg 验证附言
* @param[in] cb    好友请求回调函数
* @param[in] json_extension json扩展参数(备用,目前不需要)
* @return bool 检查参数如果不符合要求则返回失败
* @note 错误码    200:成功
*        404:用户不存在
*        500:未知错误
*/
static bool Request(const std::string &accid, NIMVerifyType verify_type, const std::string &msg, const FriendOptCallback &cb, const std::string& json_extension = "");
void OnFriendRequest(int res_code)
{
    //根据res_code 处理添加好友结果
}

void foo()
{
    //直接添加好友
    nim::Friend::Request("id", nim::kNIMVerifyTypeAdd, "", &OnFriendRequest);
    //请求添加好友,
    nim::Friend::Request("id", nim::kNIMVerifyTypeAsk, "来自xx的好友请求", &OnFriendRequest);
}

通过/拒绝添加好友请求

收到好友的验证请求的系统通知后,可以通过或者拒绝,API与添加好友相同,verify_type填kNIMVerifyTypeAgree(同意)或者kNIMVerifyTypeReject(拒绝)。

删除好友

删除好友后,将自动解除双方的好友关系,双方的好友列表中均不存在对方。删除好友后,双方依然可以聊天。

/** @fn static bool Delete(const std::string &accid, const FriendOptCallback &cb, const std::string& json_extension = "")
* 删除好友
* @param[in] accid    对方帐号
* @param[in] cb    删除好友回调函数
* @param[in] json_extension json扩展参数(备用,目前不需要)
* @return bool 检查参数如果不符合要求则返回失败
* @note 错误码    200:成功
*        404:用户不存在
*        500:未知错误
*/
static bool Delete(const std::string &accid, const FriendOptCallback &cb, const std::string& json_extension = "");
void OnDeleteFriend(int res_code)
{
    if (res_code == kNIMResSuccess)
        //删除成功
    else
        //删除失败
}

void foo()
{
    nim::Friend::Delete("id", &OnDeleteFriend);
}

好友关系变更通知

通过nim::Friend::RegChangeCb注册好友信息变更回调,在好友关系发生变化时会收到通知。好友关系变化包括以下类型:

/** @fn static void RegChangeCb(const FriendChangeCallback &cb, const std::string& json_extension = "")
* (全局回调)统一注册好友变更通知回调函数(多端同步添加、删除、更新,好友列表同步)
* @param[in] cb    好友变更通知回调函数
* @param[in] json_extension json扩展参数(备用,目前不需要)
* @return void 无返回值
*/
static void RegChangeCb(const FriendChangeCallback &cb, const std::string& json_extension = "");
void OnFriendListChange(const nim::FriendChangeEvent& change_event)
{
    switch (change_event.type_)
    {
    case nim::kNIMFriendChangeTypeDel:
    {
        break;
    }
    case nim::kNIMFriendChangeTypeRequest:
    {
        break;
    }
    case nim::kNIMFriendChangeTypeSyncList:
    {
        break;
    }
    case nim::kNIMFriendChangeTypeUpdate:
    {
        break;
    }
    default:
        break;
    }
}

void foo()
{
    //向SDK注册监听好友列表变化
    nim::Friend::RegChangeCb(&OnFriendListChange);
}

根据用户账号获取好友关系

/** @fn static void GetFriendProfile(const std::string &accid, const GetFriendProfileCallback& cb, const std::string& json_extension = "")
* 获取好友信息
* @param[in] accid    对方帐号
* @param[in] cb    获取好友信息回调函数
* @param[in] json_extension json扩展参数(备用,目前不需要)
* @return void 无返回值
*/
static void GetFriendProfile(const std::string &accid, const GetFriendProfileCallback& cb, const std::string& json_extension = "");

更新好友关系

目前支持更新好友的备注名

/** @fn static bool Update(const std::string &friend_json, const FriendOptCallback &cb, const std::string& json_extension = "")
* 更新好友资料
* @param[in] friend_profile 好友资料
* @param[in] cb    更新好友资料回调函数
* @param[in] json_extension json扩展参数(备用,目前不需要)
* @return bool 检查参数如果不符合要求则返回失败
* @note 错误码    200:成功
*        404:用户不存在
*        500:未知错误
*/
static bool Update(const FriendProfile &friend_profile, const FriendOptCallback &cb, const std::string& json_extension = "");
void foo()
{
    nim::FriendProfile profile;
    profile.SetAccId("FRIEND ID");
    profile.SetAlias("ALIAS");
    nim::Friend::Update(profile, nullptr);
}

黑名单

网易云通信中,黑名单和用户关系是互相独立的,即修改用户关系不会影响黑名单关系,同时,修改黑名单也不会对用户关系进行操作。将用户加入黑名单后,将不在收到对方发来的任何消息或者请求。例如:A用户将B用户加入黑名单,B用户发送的消息,A用户将收不到。A用户发送的消息,B用户依然可以看到。

加入/移出黑名单

/** @fn static bool SetBlack(const std::string& accid, bool set_black, const SetBlackCallback& cb, const std::string& json_extension = "")
* 设置、取消设置黑名单
* @param[in] accid 好友id
* @param[in] set_black 取消或设置
* @param[in] json_extension json扩展参数(备用,目前不需要)
* @param[in] cb
* @return bool 检查参数如果不符合要求则返回失败
* @note 错误码    200:成功
*        419:黑名单数量超过上限 
*/
static bool SetBlack(const std::string& accid, bool set_black, const SetBlackCallback& cb, const std::string& json_extension = "");
void OnSetBlackCb(int res_code, const std::string& accid, bool opt)
{
    //res_code:操作结果
    //accid:用户ID
    //opt:true-加入黑名单操作,false-移出黑名单操作
}

void foo()
{
    nim::User::SetBlack("accid", true, &OnSetBlackCb);
}

获取黑名单列表

/** @fn static void GetBlacklist(const GetBlackListCallback& cb, const std::string& json_extension = "")
* 获得黑名单名单
* @param[in] json_extension json扩展参数(备用,目前不需要)
* @param[in] cb
* @return void 无返回值
*/
static void GetBlacklist(const GetBlackListCallback& cb, const std::string& json_extension = "");
void OnGetBlackListCallback(nim::NIMResCode res_code, const std::list<nim::BlackListInfo>& lists)
{
    if (res_code == nim::kNIMResSuccess)
    {
        for (auto& info : lists)
        {
            //从列表中获取黑名单中的好友
        }
    }
}

void foo()
{
    nim::User::GetBlacklist(&OnGetBlackListCallback);
}

监听黑名单变化

黑名单列表有本地缓存,缓存会在手动/自动登录后与服务器自动进行同步更新。通过注册用户关系变更通知回调获取当前数据变化。

/** @fn static void RegSpecialRelationshipChangedCb(const SpecialRelationshipChangedCallback& cb, const std::string& json_extension = "")
* (全局回调)统一注册用户属性变更通知回调函数(多端同步黑名单、静音名单变更)
* @param[in] json_extension json扩展参数(备用,目前不需要)
* @param[in] cb
* @return void 无返回值
*/
static void RegSpecialRelationshipChangedCb(const SpecialRelationshipChangedCallback& cb, const std::string& json_extension = "");
void OnMuteBlackEventCallback(const nim::SpecialRelationshipChangeEvent& change_event)
{
    switch (change_event.type_)
    {
    case nim::NIMUserSpecialRelationshipChangeType::kNIMUserSpecialRelationshipChangeTypeMarkBlack:
    {
        //设置或取消黑名单
        break;
    }
    case nim::NIMUserSpecialRelationshipChangeType::kNIMUserSpecialRelationshipChangeTypeMarkMute:
    {
        //设置或关闭消息提醒
        break;
    }
    case nim::NIMUserSpecialRelationshipChangeType::kNIMUserSpecialRelationshipChangeTypeSyncMuteAndBlackList:
    {
        //同步黑名单和静音成员列表
        break;
    }
    }
}

void foo()
{
    nim::User::RegSpecialRelationshipChangedCb(&OnMuteBlackEventCallback);
}

消息提醒

易云通信中,可以单独设置是否开启某个用户的消息提醒,即对某个用户静音。静音关系和用户关系是互相独立的,修改用户关系不会影响静音关系,同时,修改静音关系也不会对用户关系进行操作。

设置/关闭消息提醒

/** @fn static bool SetMute(const std::string& accid, bool set_mute, const SetMuteCallback& cb, const std::string& json_extension = "")
* 设置/关闭消息提醒
* @param[in] accid 好友id
* @param[in] set_mute 取消或设置
* @param[in] json_extension json扩展参数(备用,目前不需要)
* @param[in] cb
* @return bool 检查参数如果不符合要求则返回失败
* @note 错误码    200:成功
*        419:静音列表数量超过上限 
*/
static bool SetMute(const std::string& accid, bool set_mute, const SetMuteCallback& cb, const std::string& json_extension = "");
void OnSetMuteCb(int res_code, const std::string& accid, bool opt)
{
    //res_code:操作结果
    //accid:用户ID
    //opt:true-设置,false-关闭
}

void foo()
{
    nim::User::SetMute("accid", true, &OnSetMuteCb);
}

获取静音账号列表

/** @fn static void GetMutelist(const GetMuteListCallback& cb, const std::string& json_extension = "")
* 获得静音名单列表 
* @param[in] json_extension json扩展参数(备用,目前不需要)
* @param[in] cb
* @return bool 检查参数如果不符合要求则返回失败
* @note 错误码    200:成功
*/
static void GetMutelist(const GetMuteListCallback& cb, const std::string& json_extension = "");
void OnGetMuteListCallback(nim::NIMResCode res_code, const std::list<nim::MuteListInfo>& lists)
{
    if (res_code == nim::kNIMResSuccess)
    {
        for (auto& info : lists)
        {
            //从列表中获取关闭消息提醒的好友
        }
    }
}

void foo()
{
    nim::User::GetMutelist(&OnGetMuteListCallback);
}

监听消息提醒变化

静音名单列表有本地缓存,缓存会在手动/自动登录后与服务器自动进行同步更新。通过nim::User::RegSpecialRelationshipChangedCb注册用户关系变更通知回调获取当前数据变化。参考监听黑名单变化