首页 > 代码库 > 即时通讯 好友列表业务逻辑详解

即时通讯 好友列表业务逻辑详解

在IM通讯中,通常需要管理自己的小伙伴,经常联系的,重要的用户需要标识在同一用户列表里,方便自己快速联系以及查看好友动态。那么如何可以做到类似QQ的好友列表功能呢,如

大厅好友解决方案包括:
1
、业务服务器可以设置用户的好友列表,客户端可以获得好友列表,不需要进入房间;
2、客户端可以获得好友上线、下线的状态通知;
3、业务服务器可以自定义设置用户的任意属性(如名称、签名、性别、备注等)并能同步到客户端,客户端可以获取业务服务器自定义的用户属性;

下面以一款在市面(佰锐上科技)功能强大的SDK为例做功能实现说明,

客户端API接口:

1.    #define WM_GV_USERINFOUPDATE   WM_GV + 16               ///<用户信息更新通知,wParamINT)表示用户ID号,lParamINT)表示更新类别

2.    #define WM_GV_FRIENDSTATUS     WM_GV + 17               ///<好友在线状态变化,wParamINT)表示好友用户ID号,lParamINT)表示用户的当前活动状态: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.    //用户信息控制类型定义(APIBRAS_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为分组IdlpStrValue为分组名称

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为分组IdlParam为好友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=http://www.mamicode.com/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);

复制代码

即时通讯 好友列表业务逻辑详解