@老虎会游泳,OK
@老虎会游泳,不过确实是有多线程场景的,多个标签页是多线程,同时操作 localStorage 应该会有问题,有什么好方法吗?
@老虎会游泳,嗯,但是@残缘,这个例子来说,应该不是所谓竞态条件导致的(这里并不依赖顺序),收到消息后
document.querySelector('#chat-${msg.byuid}')
选择到左边列表中的某一个DOM
进行操作,并把数据保存在localStorage
里,如果说AI
和老虎会游泳
同时发了消息,那这两条消息都会存在的,由于是单线程,这里数据也是可以正确保存(在单线程里没有同时)。万万不会出现 A 的 消息 显示在 B 的消息列表里。另外,该截图里出现 2 个
老虎会游泳
应该是之前的BUG导致的。之前的 BUG 是:打开多个标签页,产生多个 WebSocket 连接,每个连接都收到消息后,都更新 localStorage,导致同一个消息在 localStorage 里有多条,渲染时就渲染了多个
@老虎会游泳,单线程不会有竟态条件吧?
@老虎会游泳,当前
hu60bot
服务端代码还是轮询@消息
接口。目前看起来WebSocket
还算稳定,我打算内置 2 种方式,默认使用不轮询的方式。
@艾木友尔尔巴,
1. 旧消息。所有连接到 bot 服务器的客户端,都会收到消息,所以你在别的设备处理后,本设备还是提示新消息。这个处理起来可能很耗时,当前建议点击小扫帚清理本设备所有数据(会清理全部的数据,所以仅当需要再清理)
2. 越刷越多。这是个BUG,现在不会了
@老虎会游泳,当前是可以单独运行机器人的,因为 canal 和 websocket 功能是可选的
@旧人,行,有时间的话,我加上新消息提醒
@老虎会游泳,原来如此
@残缘,当前可以和其他机器人对话啦(聊天室方式)
@老虎会游泳,CSS应该都限定在了 `#hu60botChat` 之内(新版),不应该有这样的情况吧?
@TabKey9,
localStorage
的convo.json
键中
@SKSlience,是的。hu60bot
的服务器代码有点问题
@残缘,嗯,可以。有空我来实现下
@艾木友尔尔巴,我把
#floatPluginMenu
的z-index
调整的非常大,不出意外的话,小老虎应该在顶层,也就是会遮盖住你之前的插件。这块比较优雅的解决方案是,大家遵守同一个插件入口规范。
比如,在网站右下角为插件入口的,统一 append 到
#floatPluginMenu
中。示例代码:let floatPluginMenu = document.querySelector('#floatPluginMenu') if (floatPluginMenu == null) { floatPluginMenu = document.createElement("div") floatPluginMenu.id = 'floatPluginMenu' document.querySelector('body').appendChild(floatPluginMenu) } ... floatPluginMenu.appendChild(hu60botPlugin)
@老虎会游泳,嗯,目前的逻辑上不够严谨。我改下
@老虎会游泳,出错这块代码是读取客户端消息出错时服务器主动关闭连接,怀疑是关闭了已经关闭的连接再次关闭会导致 `nil pointer`,改了下关闭的逻辑。同时,打印相关错误的 debug 日志。https://github.com/rkonfj/hu60bot/blob/54087f5d696a8d1260a13a4b5dd43b2b61831700/server/server.go#L106-L109
@旧人,提到的情况应该也是一个问题。手机和电脑多个设备或者多个插件使用 WebSocket 时,对于同一个用户是否允许建立多个 连接?目前是允许多个用户建立连接,但是只有最新的连接会收到站内的新消息。
@老虎会游泳,我在 https://github.com/rkonfj/hu60bot 程序里加入了 WebSocket 服务器的支持,你要试试吗?
@老虎会游泳,怎么审核
@罐子,我现在拿不到所有新的站内消息,所以不能实现推送