关于在线人数显示的一些细节
在实现群成员在线状态显示的时候,我偶然注意到标题栏显示的在线人数不太对劲,好像明显大于群成员列表里观察到在线群成员数。在进行了一番调查之后,发现 64Gram 确实对计算逻辑做了一些修改:
在
0e55720 中,64Gram 将计算方式从遍历群成员手动计数改为了直接调用
messages.getOnlines 来获取在线成员数量。没有任何问题,官方既然有这个接口那为什么不用呢?但是,为什么总感觉这个从接口获取到的在线人数不太对?
先把这个问题放一边,让我们看看这个接口在官方 tdesktop 里面是怎么用的吧,或许是我们的调用方式不太对呢?然而,令我感到奇怪的是,截止官方目前的最新提交,messages.getOnlines 这个接口在 tdesktop 中
没有在任何地方被调用。难道是曾经用了但后来删掉了?但我翻遍了 tdesktop 的所有历史提交,似乎它真的从来没有用过这个接口。
那其他平台客户端呢?安卓和 ios 也没有使用吗?这里我让 codex 去找了一下,它给出的结果是
安卓和
ios 客户端都是使用这个接口的,就连
tdlib 的实现也是使用了的,只不过不同客户端对使用这个接口的人数条件不太一样。那为什么就 tdesktop 没有使用这个接口呢?小编也很好奇,如果你是 tdesktop 的开发人员,欢迎在私聊中告诉我原因 :)
话再说回来这个接口本身,它返回的在线人数真的是准确的吗?这里根据我的测试,对于小于 200 人的群聊,它返回的数量似乎总是远大于逐个遍历成员得到的结果。具体来说,一个 89 人的群聊中,API 返回结果为在线 33 人,本地遍历结果为在线 9 人;在另一个 25 人的群聊中,API 返回在线 10 人,本地遍历得到在线 4 人。大于 200 人的群聊未实际测试。
所以这可能可以解释为什么在不同的官方客户端实现中,开发者总是优先选择本地遍历一遍群成员来获取在线数量,而不是直接调用 messages.getOnlines 来获取了。或许开发人员本来就知道这个接口的结果不准?或者说,至少它返回的结果不是一个 "完全实时" 的结果,可能是最近一段时间里的累计在线成员数量。
总而言之,最后我决定直接改成官方客户端的类似实现,对小于 200 人的群进行逐个计算,大于的话仍然调用接口来显示数量。哦对了,这里反复提到的 200 人实际上是服务端下发的
chat_size_max 云控值,根据定义,它的含义是
normal group (也就是非 supergroup) 的最大限制人数。