AnyChat技术支持论坛

标题: 不在一个房间内能否获取指定用户的在线状态 [打印本页]

作者: 淡竹叶    时间: 2015-10-19 19:20
标题: 不在一个房间内能否获取指定用户的在线状态
您好,BRAC_GetFriendStatus获取好友在线状态好像是要求在同一房间内,不进入房间如何获取指定userId的用户在线状态?

作者: 佰锐科技-邵光清    时间: 2015-10-19 19:45
您好,BRAC_GetFriendStatus获取好友在线状态,无需进入房间调用,登录成功即可调用的。
作者: 淡竹叶    时间: 2015-10-19 19:59
佰锐科技-邵光清 发表于 2015-10-19 19:45
您好,BRAC_GetFriendStatus获取好友在线状态,无需进入房间调用,登录成功即可调用的。

没有好友关系,怎么才算好友,,知道对方的userId就能查?
作者: 佰锐科技-邵光清    时间: 2015-10-19 20:09
淡竹叶 发表于 2015-10-19 19:59
没有好友关系,怎么才算好友,,知道对方的userId就能查?

您好,登录系统成功就建立了好友关系,调用BRAC_GetFriendStatus传入userid就能获取该用户的在线状态的。
作者: 淡竹叶    时间: 2015-10-20 09:38
佰锐科技-邵光清 发表于 2015-10-19 20:09
您好,登录系统成功就建立了好友关系,调用BRAC_GetFriendStatus传入userid就能获取该用户的在线状态的。

您好,
function getFriendStatus(dwFriendUserId){
        alert(dwFriendUserId);
        var errorcode = BRAC_GetFriendStatus(dwFriendUserId);
        alert(errorcode+"============="+dwFriendUserId);
        return errorcode==1?true:false;
}
我现在获取的状态errorcode一直是0,无论在不在线
作者: 佰锐科技-邵光清    时间: 2015-10-20 09:42
佰锐科技-邵光清 发表于 2015-10-19 20:09
您好,登录系统成功就建立了好友关系,调用BRAC_GetFriendStatus传入userid就能获取该用户的在线状态的。

您好,这个回复有误,建立好友关系需要使用好友接口,目前callcenterserver业务服务器有集成了好友接口,在callcenter业务服务器里面建立好友关系,并同步到客户端,可参考:如何实现任意两用户之间的音视频交互

AnyChat大厅好友业务逻辑详解
作者: 淡竹叶    时间: 2015-10-20 10:09
佰锐科技-邵光清 发表于 2015-10-20 09:42
您好,这个回复有误,建立好友关系需要使用好友接口,目前callcenterserver业务服务器有集成了好友接口, ...

您好,我这边服务端代码
// 用户信息控制
        public static native int UserInfoControl(int dwUserId, int dwCtrlCode, int wParam, int lParam, String lpStrValue);
AnyChatServerSDK.UserInfoControl(house.getAcUserId(), AnyChatServerSDK.BRAS_USERINFO_CTRLCODE_ADDFRIEND, chgUser.getAcUserId(), chgUser.getAcUserId(), "");
并没有两个用户id可以传入。
另外,我问一下,如果我在登录的时候给其和某一位用户添加好友关系,那么某一用户不在线或退出的时候好友关系还存在么??这种好友关系什么时候会消失?
作者: 佰锐科技-邵光清    时间: 2015-10-20 10:30
淡竹叶 发表于 2015-10-20 10:09
您好,我这边服务端代码
// 用户信息控制
        public static native int UserInfoControl(int dwUserId, i ...

您好,不是将两个用户的id传入,而是通过for循环的方式,将在线用户一一添加为好友,我们服务端的源码有这样的操作,可以参考一下噢!
如果添加了好友信息并保存之后,即使退出或者离线,这种好友信息还存在;如果不保存好友信息,退出之后,好友关系就消失了,或者手动来解除好友关系。
作者: 淡竹叶    时间: 2015-10-20 11:03
佰锐科技-邵光清 发表于 2015-10-20 10:30
您好,不是将两个用户的id传入,而是通过for循环的方式,将在线用户一一添加为好友,我们服务端的源码有 ...

int err = AnyChatServerSDK.UserInfoControl(chgUser.getAcUserId(), AnyChatServerSDK.BRAS_USERINFO_CTRLCODE_ADDFRIEND, house.getAcUserId(), 0, "");

登录成功之后指定与某一用户添加好友这样和源码是一个意思啊,这里面chgUser.getAcUserId()是1001,house.getAcUserId()是1,,,页面上,用户为1,调用var errorcode =BRAC_GetFriendStatus(dwFriendUserId);
其中dwFriendUserId为1001,,返回值一直是0
作者: 陈文仲    时间: 2015-10-20 14:25
本帖最后由 陈文仲 于 2015-10-20 14:26 编辑
淡竹叶 发表于 2015-10-20 11:03
int err = AnyChatServerSDK.UserInfoControl(chgUser.getAcUserId(), AnyChatServerSDK.BRAS_USERINFO_C ...

您好,互相加为好友时,有没有将信息同步给指定的客户端呢?
作者: 淡竹叶    时间: 2015-10-20 15:57
陈文仲 发表于 2015-10-20 14:25
您好,互相加为好友时,有没有将信息同步给指定的客户端呢?

您好,什么意思?服务端加好友操作后,还需要客户端进行什么操作才可以正常查询好友状态?
作者: 佰锐科技-李友勤    时间: 2015-10-20 16:01
淡竹叶 发表于 2015-10-20 15:57
您好,什么意思?服务端加好友操作后,还需要客户端进行什么操作才可以正常查询好友状态?

您好,服务器还需要将好友信息同步给客户端。
方法如下:
  1. BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_SYNCDATA,  0, 0);
复制代码
服务端将信息同步给客户端时,会同时触发客户端两个回调:
  1. // 用户信息更新通知,dwUserId表示用户ID号,dwType表示更新类别
  2. function OnAnyChatUserInfoUpdate(dwUserId, dwType) {
  3.         AddLog("OnAnyChatUserInfoUpdate(dwUserId=" + dwUserId + ", dwType=" + dwType + ")", LOG_TYPE_EVENT);
  4. }

  5. // 好友在线状态变化,dwUserId表示好友用户ID号,dwStatus表示用户的当前活动状态:0 离线, 1 上线
  6. function OnAnyChatFriendStatus(dwUserId, dwStatus) {
  7.         AddLog("OnAnyChatFriendStatus(dwUserId=" + dwUserId + ", dwStatus=" + dwStatus + ")", LOG_TYPE_EVENT);
  8.        
  9. }
复制代码

作者: 淡竹叶    时间: 2015-10-20 16:25
佰锐科技-李友勤 发表于 2015-10-20 16:01
您好,服务器还需要将好友信息同步给客户端。
方法如下:服务端将信息同步给客户端时,会同时触发客户端 ...

您这两个回调函数只做了打日志的操作,并不会影响我获取指定用户的在线状态,为什么我在不在线获取的状态都是0呢
作者: 淡竹叶    时间: 2015-10-20 16:27
佰锐科技-李友勤 发表于 2015-10-20 16:01
您好,服务器还需要将好友信息同步给客户端。
方法如下:服务端将信息同步给客户端时,会同时触发客户端 ...

您的意思是BRAS_UserInfoControl(dwUserId, BRAS_USERINFO_CTRLCODE_SYNCDATA,  0, 0);这个会对获取在线状态有影响??
作者: 陈文仲    时间: 2015-10-20 16:36
淡竹叶 发表于 2015-10-20 16:25
您这两个回调函数只做了打日志的操作,并不会影响我获取指定用户的在线状态,为什么我在不在线获取的状态 ...

触发OnAnyChatUserInfoUpdate 这个回调,且dwType为0才表示数据更新成功,您那边先用BRAC_GetUserFriends获取一下好友列表看看是否有对方的id。
作者: 淡竹叶    时间: 2015-10-21 08:42
陈文仲 发表于 2015-10-20 16:36
触发OnAnyChatUserInfoUpdate 这个回调,且dwType为0才表示数据更新成功,您那边先用BRAC_GetUserFriends ...

同步之后,能拿到好友列表了,但是用户注销后,取其在线状态还是1(在线)。而且用户注销的时候也同步给web端了
作者: 佰锐科技-邵光清    时间: 2015-10-21 08:59
淡竹叶 发表于 2015-10-21 08:42
同步之后,能拿到好友列表了,但是用户注销后,取其在线状态还是1(在线)。而且用户注销的时候也同步给w ...

您好,请将用户注销的日志发过来看看;其在线状态是在web端获取不?
作者: 淡竹叶    时间: 2015-10-21 10:00
佰锐科技-邵光清 发表于 2015-10-21 08:59
您好,请将用户注销的日志发过来看看;其在线状态是在web端获取不?

是web端获取,你要的是核心服务的日志还是业务服务的日志。我的注销是退出app不是手动注销
作者: 佰锐科技-李友勤    时间: 2015-10-21 10:03
本帖最后由 佰锐科技-李友勤 于 2015-10-21 10:07 编辑
淡竹叶 发表于 2015-10-21 08:42
同步之后,能拿到好友列表了,但是用户注销后,取其在线状态还是1(在线)。而且用户注销的时候也同步给w ...

您好,注销后会触发其他用户的以下回调
  1. // 好友在线状态变化,dwUserId表示好友用户ID号,dwStatus表示用户的当前活动状态:0 离线, 1 上线
  2. function OnAnyChatFriendStatus(dwUserId, dwStatus) {
  3.         AddLog("OnAnyChatFriendStatus(dwUserId=" + dwUserId + ", dwStatus=" + dwStatus + ")", LOG_TYPE_EVENT);
  4.       
  5. }
复制代码

作者: 淡竹叶    时间: 2015-10-21 11:21
佰锐科技-李友勤 发表于 2015-10-21 10:03
您好,注销后会触发其他用户的以下回调

这个会是实时的状态,我要随时调用查询状态
作者: 佰锐科技-李友勤    时间: 2015-10-21 11:37
淡竹叶 发表于 2015-10-21 11:21
这个会是实时的状态,我要随时调用查询状态

您好,主动调用可以使用以下接口
  1. // 获取好友在线状态
  2. BRAC_API DWORD BRAC_GetFriendStatus(DWORD dwFriendUserId, DWORD& dwStatus);
复制代码

作者: 佰锐科技-李永星    时间: 2015-10-21 11:59
淡竹叶 发表于 2015-10-21 11:21
这个会是实时的状态,我要随时调用查询状态

您好,请将你的调用代码段,贴出,我们来分析一下。
作者: 淡竹叶    时间: 2015-10-21 12:22
佰锐科技-李永星 发表于 2015-10-21 11:59
您好,请将你的调用代码段,贴出,我们来分析一下。

function getFriendStatus(dwFriendUserId){
        var list =BRAC_GetUserFriends();
        var errorcode = BRAC_GetFriendStatus(dwFriendUserId);
        return errorcode==1?true:false;
}

下面是服务器的同步加好友实现(web登录成功全给web加好友并同步给web)
for(OnlineUser u : list){
                AnyChatServerSDK.UserInfoControl(house.getAcUserId(), AnyChatServerSDK.BRAS_USERINFO_CTRLCODE_ADDFRIEND, u.getAcUserId(), 0, "");
           }
           AnyChatServerSDK.UserInfoControl(house.getAcUserId(), AnyChatServerSDK.BRAS_USERINFO_CTRLCODE_SYNCDATA, 0, 0, "");

app注销时,同步给web
int err2 = AnyChatServerSDK.UserInfoControl(house.getAcUserId(), AnyChatServerSDK.BRAS_USERINFO_CTRLCODE_SYNCDATA, 0, 0, "");
作者: 淡竹叶    时间: 2015-10-21 12:25
佰锐科技-李永星 发表于 2015-10-21 11:59
您好,请将你的调用代码段,贴出,我们来分析一下。

还有一块,app登录成功时给其加上web端好友,并同步给web
int err = AnyChatServerSDK.UserInfoControl(house.getAcUserId(), AnyChatServerSDK.BRAS_USERINFO_CTRLCODE_ADDFRIEND, chgUser.getAcUserId(), 0, "");
            int err2 = AnyChatServerSDK.UserInfoControl(house.getAcUserId(), AnyChatServerSDK.BRAS_USERINFO_CTRLCODE_SYNCDATA, 0, 0, "");
作者: 佰锐科技-李永星    时间: 2015-10-21 12:53
淡竹叶 发表于 2015-10-21 12:25
还有一块,app登录成功时给其加上web端好友,并同步给web
int err = AnyChatServerSDK.UserInfoControl( ...

您好,我们上午通过demo测试,启动AnyChatCallCenterServer业务服务器,通过web客户端调用BRAC_GetFriendStatus方法,在退出,进入,以及关闭浏览器,都可以得到准确状态。你也可以实测一下这个场景测试一下。具体方式:启动核心服务器,callCenter业务服务器;然后修改Web项目AnyChatCallCenter源码,在界面上随便添加一个按钮,或是在
  1. // 好友在线状态变化,dwUserId表示好友用户ID号,dwStatus表示用户的当前活动状态:0 离线, 1 上线
  2. function OnAnyChatFriendStatus(dwUserId, dwStatus) {

  3. //        AddLog("OnAnyChatFriendStatus(dwUserId=" + dwUserId + ", dwStatus=" + dwStatus + ")", LOG_TYPE_EVENT);
  4.         if (dwStatus == USER_OFFLINE_STATUS) {                                // 下线
  5.                 removeOfflineUser(dwUserId);
  6.         }
  7. //添加一个获取好友状态方法
  8. alert(BRAC_GetFriendStatus(dwUserId));
  9. }
复制代码

作者: ehomeud    时间: 2015-10-30 10:20
佰锐科技-邵光清 发表于 2015-10-20 09:42
您好,这个回复有误,建立好友关系需要使用好友接口,目前callcenterserver业务服务器有集成了好友接口, ...

你好,贵司跟我说 存在 GetFriendUser、GetOnlineUser 两个接口获取在线用户 我这边是做业务服务开发,请问
服务端好像没有GetFriendUser 接口吧?
作者: 佰锐科技-李友勤    时间: 2015-10-30 10:38
ehomeud 发表于 2015-10-30 10:20
你好,贵司跟我说 存在 GetFriendUser、GetOnlineUser 两个接口获取在线用户 我这边是做业务服务开发,请 ...

您好,好友接口是相对来说的,只有在客户端登录后,才存在好友的说法,不知道您说的服务器获取好友是想实现什么样的需求呢?

anychat大厅好友解决方案可参考说明:AnyChat将提供完整的大厅好友解决方案




欢迎光临 AnyChat技术支持论坛 (http://bbs.anychat.cn/) Powered by Discuz! X3