From cd21776b1fad282e2b656da6693c4d7b245ed2af Mon Sep 17 00:00:00 2001 From: SXP-Simon Date: Fri, 10 Jul 2026 14:59:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(OneBotAdapter):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=BE=A4=E8=A7=92=E8=89=B2=E7=BC=93=E5=AD=98=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=20get=5Fgroup=5Fmember=5Finfo=20=E8=B6=85=E6=97=B6=E9=99=8D?= =?UTF-8?q?=E7=BA=A7=EF=BC=8C=E5=87=8F=E5=B0=91=E5=85=A8=E7=BE=A4=E7=A6=81?= =?UTF-8?q?=E8=A8=80=E6=83=85=E5=86=B5=E4=B8=8B=E8=8E=B7=E5=8F=96=20info?= =?UTF-8?q?=20=E8=B6=85=E6=97=B6=E6=83=85=E5=86=B5=E4=B8=8B=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E8=BA=AB=E4=BB=BD=E8=A2=AB=E9=94=99=E5=88=A4?= =?UTF-8?q?=E8=80=8C=E8=B7=B3=E8=BF=87=E5=88=86=E6=9E=90=E5=92=8C=E5=8F=91?= =?UTF-8?q?=E9=80=81=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/adapters/onebot_adapter.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/infrastructure/platform/adapters/onebot_adapter.py b/src/infrastructure/platform/adapters/onebot_adapter.py index 1bb23d1..826b165 100644 --- a/src/infrastructure/platform/adapters/onebot_adapter.py +++ b/src/infrastructure/platform/adapters/onebot_adapter.py @@ -73,6 +73,8 @@ class OneBotAdapter(PlatformAdapter): # 禁言状态缓存 (group_id -> timestamp) self._muted_groups_cache = {} + # 群角色缓存 (group_id -> (role, timestamp)),用于 get_group_member_info 超时降级 + self._group_role_cache: dict[str, tuple[str, float]] = {} def _init_capabilities(self) -> PlatformCapabilities: """返回预定义的 OneBot v11 能力集。""" @@ -921,6 +923,8 @@ class OneBotAdapter(PlatformAdapter): ) if member_info: role = member_info.get("role", "member") + # Cache the role for timeout fallback + self._group_role_cache[group_id_str] = (role, time.time()) shut_up_time = member_info.get("shut_up_time", 0) if shut_up_time > 0: # 如果 shut_up_time 是 Unix 时间戳 @@ -931,9 +935,17 @@ class OneBotAdapter(PlatformAdapter): # 否则认为是相对禁言剩余时间(秒) is_individually_muted = True except asyncio.TimeoutError: - logger.warning( - f"[OneBot] 获取群成员信息超时 (group_id={group_id}, user_id={bot_user_id})" - ) + # Fall back to cached role if available (roles rarely change) + cached_role = self._group_role_cache.get(group_id_str) + if cached_role: + role = cached_role[0] + logger.warning( + f"[OneBot] 获取群成员信息超时,使用缓存角色: {role} (group_id={group_id}, user_id={bot_user_id})" + ) + else: + logger.warning( + f"[OneBot] 获取群成员信息超时且无角色缓存,将按 member 处理 (group_id={group_id}, user_id={bot_user_id})" + ) except Exception as e: if self._is_mute_exception(e): self._record_mute_status(group_id, True)