在IM通讯中,通常需要管理自己的小伙伴,经常联系的,重要的用户需要标识在同一用户列表里,方便自己快速联系以及查看好友动态。那么如何可以做到类似QQ的好友列表功能呢,如
大厅好友解决方案包括:
1、业务服务器可以设置用户的好友列表,客户端可以获得好友列表,不需要进入房间;
2、客户端可以获得好友上线、下线的状态通知;
3、业务服务器可以自定义设置用户的任意属性(如名称、签名、性别、备注等)并能同步到客户端,客户端可以获取业务服务器自定义的用户属性;
下面以一款在市面(佰锐上科技)功能强大的SDK为例做功能实现说明,
客户端API接口:
1. #define WM_GV_USERINFOUPDATE WM_GV + 16 ///<
用户信息更新通知,wParam(INT)表示用户ID号,lParam(INT)表示更新类别
2. #define WM_GV_FRIENDSTATUS WM_GV + 17 ///<
好友在线状态变化,wParam(INT)表示好友用户ID号,lParam(INT)表示用户的当前活动状态:0
离线, 1
上线
3.
4. //
获取用户好友ID列表
5. BRAC_API DWORD BRAC_GetUserFriends(LPDWORD lpUserIDArray, DWORD&dwUserNum);
6. //
获取好友在线状态
7. BRAC_API DWORD BRAC_GetFriendStatus(DWORD dwFriendUserId, DWORD&dwStatus);
8. //
获取用户分组ID列表
9. BRAC_API DWORD BRAC_GetUserGroups(LPDWORD lpGroupIDArray, DWORD&dwGroupNum);
10. //
获取分组下面的好友列表
11. BRAC_API DWORDBRAC_GetGroupFriends(DWORD dwGroupId, LPDWORD lpUserIDArray, DWORD&dwUserNum);
12. //
获取用户信息
13. BRAC_API DWORDBRAC_GetUserInfo(DWORD dwUserId, DWORD dwInfoId, TCHAR* lpInfoName, DWORDdwLen);
14. //
获取用户分组名称
15. BRAC_API DWORD BRAC_GetGroupName(DWORDdwGroupId, TCHAR* lpGroupName, DWORD dwLen);
服务器端的API接口:
1. //
用户信息控制类型定义(API:BRAS_UserInfoControl
传入参数、OnUserInfoControl回调参数)
2. #define BRAS_USERINFO_CTRLCODE_KICKOUT 1 ///<
将指定用户从系统中踢掉
3. #define BRAS_USERINFO_CTRLCODE_SYNCDATA 2 ///<
将指定用户的数据同步给客户端
4.
5. #define BRAS_USERINFO_CTRLCODE_ADDGROUP 20 ///<
添加用户分组,wParam为分组Id,lpStrValue为分组名称
6. #define BRAS_USERINFO_CTRLCODE_DELGROUP 21 ///<
删除用户分组,wParam为分组Id
7. #define BRAS_USERINFO_CTRLCODE_ADDFRIEND 22 ///<
添加用户好友,wParam为好友Id
8. #define BRAS_USERINFO_CTRLCODE_DELFRIEND 23 ///<
删除用户好友,wParam为好友Id
9. #define BRAS_USERINFO_CTRLCODE_SETGROUPRELATION 24 ///<
设置好友与分组的关联关系,wParam为分组Id,lParam为好友Id,表示好友属于某个分组
10.
11.
12. //
设置用户的详细信息
13. BRAS_API DWORDBRAS_SetUserInfo(DWORD dwUserId, DWORD dwInfoId, LPCTSTR lpInfoValue, DWORDdwFlags=0);
14. //
获取用户的详细信息
15. BRAS_API DWORDBRAS_GetUserInfo(DWORD dwUserId, DWORD dwInfoId, TCHAR* lpInfoValue, DWORDdwSize);
16. //
用户信息控制
17. BRAS_API DWORD BRAS_UserInfoControl(DWORDdwUserId, DWORD dwCtrlCode, DWORD wParam=0, DWORD lParam=0, LPCTSTRlpStrValue=NULL);
服务器端业务逻辑处理流程
在用户登录成功事件中设置用户的好友列表、分组列表、用户属性,并发送数据同步指令: 1. // 2. typedef void (CALLBACK* BRAS_OnUserLoginAction_CallBack)(DWORD dwUserId, LPCTSTR szUserName, DWORD dwLevel, LPCTSTR szIpAddr, LPVOID lpUserValue); 复制代码 一、添加用户分组 1. DWORD dwGroupId = 1; 2. BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_ADDGROUP, dwGroupId, 0, "我的好友"); 3. dwGroupId = 2; 4. BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_ADDGROUP, dwGroupId, 0, "公司同事"); 复制代码 二、添加用户好友 1. DWORD dwFriendUserId = 10010; 2. BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_ADDFRIEND, dwFriendUserId); 3. dwFriendUserId = 10011; 4. BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_ADDFRIEND, dwFriendUserId ); 复制代码 三、设置好友与分组的关系(即好友属于哪一个分组) 1. DWORD dwGroupId = 1; 2. DWORD dwFriendUserId = 10010; 3. BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_SETGROUPRELATION, dwGroupId, dwFriendUserId); 4. dwGroupId = 2; 5. dwFriendUserId = 10011; 6. BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_SETGROUPRELATION, dwGroupId, dwFriendUserId); 复制代码 四、设置用户信息(用户资料) 1. BRAS_SetUserInfo(dwUserId, 1, "我的签名"); 2. BRAS_SetUserInfo(dwUserId, 2, "020-85276986"); 3. …… 复制代码 五、将前面设置的资料同步给客户端 1. BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_SYNCDATA, 0, 0); 复制代码 |