tim实践系列——如何使用TimPresence自定义各种用户状态


前言:tim是去中心化分布式即时通讯引擎。不依赖于任何中心服务器,采用去中心化分布式架构,解决传统中心化通讯方式的问题,去中心化分布式架构的通讯引擎的各个节点之间相互连接,形成一个庞大的分布式网络。可以轻松地扩展服务规模,支持更多的用户和业务需求,提供更加安全、可靠、高效的通讯服务。
Github系列开源文章
《tim实践系列文章》

tim通过TimPresence协议进行用户在线信息通信,主要定义数字属性字段,可以用于用户在线状态信息的通讯。

TimPresence的字段:

数据类型是否必填作用值说明
id64位整型timPresence数据包idid值标识每一个timPrecence包,避免终端重复接收协议包
offline     布尔值是否离线该值由系统通知,表示对方已经下线
subStatus 8位整型订阅状态该值由开发者自定义数值,用于订阅其他账号的状态
比如:1请求订阅 2已订阅并请求订阅3 不允许订阅 等等
该值非既定设定。
fromTidTid对象发送者
toTidTid对象目标对象
toList字符串数组多个目标对象账号
show         16位整型自定义显示类型开发者自定义显示类型,如chating,away,xa,dnd等
status            字符串自定义显示类型开发者自定义显示状态  如:我在打羽毛球
extend   字典扩展字段字典类型,键值对,键字符串  值字符串
extra   字典扩展字段字典类型,键值对,键字符串  值字节数组


使用timPrecence时,需要对timPresence进行赋值,一些字段不需要客户端赋值的,包括 id,offline,fromTid 这些字段是由服务器赋值发送到客户端,所以客户端对这些字段赋值是无效的。

timPrecence所有值都不会影响tim的业务逻辑,所有字段都没有既定的设定值,除了id,offline,fromTid 是由服务器赋值发送之外的字段,tim服务器会将客户端发送的值原样发送给目标用户,所以,如何显示状态需要开发者自定义设定。根据目前主流im的状态功能,timPrecence定义了相应的字段。


字段说明:

subStatus 可用于向其他账号订阅状态,如 tim的java客户端处理subStatus的demo程序片段:

final static byte SUBSTATUS_REQ = 1; //自定义订阅值
final static byte SUBSTATUS_ACK = 2; //自定义回复订阅值
//记录状态订阅者
Map<String, Byte> submap = new ConcurrentHashMap<>();
tc.BroadPresence(SUBSTATUS_REQ, (short) 0, "I am busy😄");//广播并订阅状态
tc.PresenceHandler((TimPresence tp) -> {
            Log.debug(tp.fromTid.node, " presence");
            if (tp.subStatus > 0) {
                if (tp.subStatus == SUBSTATUS_REQ) {  //对方账户订阅我的状态
                    tc.PresenceToUser(tp.fromTid.node, (short) 0, "", SUBSTATUS_ACK, null, null);//发送个人状态给对方
                }
                if ((tp.subStatus == SUBSTATUS_REQ) || (tp.subStatus == SUBSTATUS_ACK)) {
                   //记录订阅我的状态的好友账号
                    if (submap.containsKey(tp.fromTid.node)) {
                        submap.put(tp.fromTid.node, (byte) 0);
                    }
                }
            }
        });


toList 当需要发送状态给多个账号时,可以将账号赋值给toList





有任何问题或建议请Email:donnie4w@gmail.comhttps://tlnet.top/contact  发信给我,谢谢!