From f0e3e5ae9797791bc47f05d9d12f6c09a2940bc7 Mon Sep 17 00:00:00 2001 From: liuwei Date: Mon, 27 Apr 2026 11:58:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DDashboard=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E6=97=B6message=5Fstorage=E5=B1=9E=E6=80=A7=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E9=97=AE=E9=A2=98\n\n-=20=E5=9C=A8Robot=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E9=98=B6=E6=AE=B5=E6=8F=90=E5=89=8D=E5=88=9B=E5=BB=BA?= =?UTF-8?q?message=5Fstorage=EF=BC=8C=E9=81=BF=E5=85=8D=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E6=97=A9=E4=BA=8EiPad=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=97=B6=E7=BC=BA=E5=B0=91=E5=B1=9E=E6=80=A7\n-=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4DashboardServer=E8=AF=BB=E5=8F=96=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=85=88=E5=A4=8D=E7=94=A8Robot=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=AD=98=E5=82=A8=E5=B9=B6=E5=A2=9E=E5=8A=A0=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/dashboard/server.py | 8 ++++++-- robot.py | 5 +++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/admin/dashboard/server.py b/admin/dashboard/server.py index d8521f8..58190ad 100644 --- a/admin/dashboard/server.py +++ b/admin/dashboard/server.py @@ -46,8 +46,12 @@ class DashboardServer: if robot_instance: self.db_manager = robot_instance.db_manager self.stats_db = StatsDBOperator(self.db_manager) - self.message_storage = MessageStorageDB(self.db_manager) - self.emoji_asset_db = getattr(robot_instance.message_storage, "emoji_asset_db", None) or EmojiAssetDB(self.db_manager) + # Dashboard 启动可能早于 iPad 登录完成: + # 1. 此时 Robot 上的 message_storage 还没来得及绑定真实 bot; + # 2. 但后台很多页面仍然依赖消息存储与表情资产库; + # 3. 因此这里优先复用 Robot 已初始化的 message_storage,没有则再安全回退到 DB 层对象。 + self.message_storage = getattr(robot_instance, "message_storage", None) or MessageStorageDB(self.db_manager) + self.emoji_asset_db = getattr(self.message_storage, "emoji_asset_db", None) or EmojiAssetDB(self.db_manager) self.contact_db: ContactsDBOperator = ContactsDBOperator(self.db_manager) self.member_context_db = MemberContextDBOperator(self.db_manager) self.task_db: TaskDBOperator = TaskDBOperator(self.db_manager) diff --git a/robot.py b/robot.py index 5451373..4ed5d59 100644 --- a/robot.py +++ b/robot.py @@ -86,6 +86,11 @@ class Robot: # 初始化联系人管理器 self.contact_manager = ContactManager.get_instance() self.allContacts = {} # 将在登录后填充 + # 提前初始化消息存储: + # 1. DashboardServer 会在主线程里较早启动,并直接读取 robot.message_storage; + # 2. 旧逻辑要等 iPad 登录成功后才赋值,导致后台在启动竞态下拿不到这个属性; + # 3. 这里先给一个可用的默认实例,后续登录成功后再注入真实 bot 覆盖即可。 + self.message_storage = MessageStorage() self.groups = {} # 存储按group_id分组的消息列表,每个group_id最多保留10条消息