消息点赞和评论推荐实现方案
常见的一些社交或者企业办公软件有个有意思的功能,可以对任意一条消息或者某一条特定的消息发表表情以及作为一个话题进行讨论。他们的实现有共同部分,也有不同的地方,我们先了解一下他们的情况,再讲一下如何在野火系统中实现。
1. 现有的实现
我们以常见的钉钉、飞书和电报为例,企微上我没有找到,但这不重要了,这3个软件就已经具有代表性了。首先共同点是,在消息上长按,弹出菜单中展示有常见的表情符号,点击会附加到消息上。不同点在于评论或者回复的不同。
1.1. 钉钉
在钉钉上,长按消息,在弹出的菜单中选择回复,在当前界面只能输入文字回复(其他形式的消息没有作为回复处理),点击发送后,会新发出来一条回复的消息,同时被回复的消息上回复会计数加1。点击计数图片,会弹出话题窗口,在话题窗口的最上方展示原消息,下面展示话题内的消息,可以继续发送文本进行回复。
1.2. 飞书
在飞书上,长按消息,在弹出的菜单中选择创建话题或者查看话题,会新打开一个话题页面,在话题页面,原始消息展示在最上方,下面是话题的回复,可以回复任意格式的内容。当发送之后,原始消息会展示最后5条回复。另外在会话列表中,会多出一个话题会话。
和钉钉的明显区别是,飞书会展示一个话题会话,钉钉没有展示这个话题会话。
1.3. 电报
由于没有办法下载和登录电报,只是听说,在群组或频道中可以点开创建话题/回复话题。进入话题可以聊天。没有像飞书那样有话题会话,也没有像钉钉那样在会话内同步发送消息。
2. 如何在野火上实现
这些都可以基于野火进行二开实现。首先讲一下,野火专业版IM服务有个更新消息的Server API,当调用这个接口更新消息时,更新过的消息会重新发送到客户端,可以基于这个接口来实现这些功能。
2.1. 发布表情
发布表情是最简单的,也是上述3个软件最接近的地方。实现方法就是当用户点击发布某个表情时,先在本地消息修改,在消息内容的extra中添加自己的表情(这样给用户立即响应的感觉),然后调用业务服务,业务服务获取到最新消息内容,然后修改extra,加上当前这个用户的表情内容。server api更新消息会重新发送消息到会话中的各方,这样各方更新消息界面就可以看到表情了。同样加上取消表情的功能。
有一点需要注意的是,业务服务需要做好并发的处理,防止同时多个人点击导致出错。
2.2. 电报话题类似的实现
在用户点击回复或者评论时,进入一个这条消息UID同名的聊天室,在这个聊天室发送消息时,可以调用业务服务,业务服务做2件事情,一个是更新原消息,加上计数或者头像信息,另外一件事是在会话中发送这条消息。
可能存在的问题就是聊天室消息在本地不存储,每次进入聊天室都是从服务器上实时拉取,如果没有网络时,就无法加载消息,另外就是没有办法删除里面的消息,删除之后,退出再进入又回出现。还有就是消息是业务服务发送,需要处理好发送失败的情况,也可以改成本地发送,发送成功后调用业务服务修改原消息。
2.3. 钉钉类似的实现
在用户点击回复或者评论时,在当前窗口回复,消息发送成功后,调用业务服务提交新发送的消息的UID。业务服务更新这条消息里的回复计数,并保存好这个话题所有的回复消息id。当用户点击原消息的回复计数时,打开话题窗口,调用业务服务获取回复列表,然后从本地逐条加载,回复的消息同样上报到业务服务。当收到小时时,检查是否时回复当前的消息,如果是则加入当前的话题消息列表中。
2.4. 飞书类似的实现
飞书方式的实现是最麻烦的,话题会话同时与一个普通会话和一条消息UID保持关系,目前没有合适的会话可以做到这点。我们稍后会新加一种会话类型叫做话题,用于解决这个问题。