diff --git a/ai_chat.db b/ai_chat.db index 365bcc4..44e6bff 100644 Binary files a/ai_chat.db and b/ai_chat.db differ diff --git a/services/__pycache__/matrix_service.cpython-310.pyc b/services/__pycache__/matrix_service.cpython-310.pyc index 90ca3a0..7e6b654 100644 Binary files a/services/__pycache__/matrix_service.cpython-310.pyc and b/services/__pycache__/matrix_service.cpython-310.pyc differ diff --git a/services/matrix_service.py b/services/matrix_service.py index fc13df9..cfc98be 100644 --- a/services/matrix_service.py +++ b/services/matrix_service.py @@ -106,24 +106,54 @@ class MatrixBot: """处理加密消息(MegolmEvent)""" logger.info(f"收到加密消息: [{room.room_id}] event_id={event.event_id}") - # nio 解密 MegolmEvent 后,需要获取解密的内容 + # 打印 event 的所有属性来调试 + logger.info(f"MegolmEvent属性: {dir(event)}") + logger.info(f"event.source: {event.source}") + logger.info(f"event.sender: {event.sender}") + logger.info(f"event.session_id: {event.session_id if hasattr(event, 'session_id') else 'N/A'}") + + # 尝试从不同来源获取消息内容 try: - # 检查是否有解密后的内容 + body = None + sender = event.sender + + # 方法1: 从 source 获取 if hasattr(event, 'source') and event.source: - decrypted_content = event.source.get('content', {}) - msgtype = decrypted_content.get('msgtype', '') - body = decrypted_content.get('body', '') - + content = event.source.get('content', {}) + body = content.get('body', '') sender = event.source.get('sender', event.sender) - - logger.info(f"解密消息: sender={sender}, body={body[:50]}") - - # 如果是文本消息,处理它 - if msgtype == 'm.text' and body: - # 调用消息处理逻辑 - await self._process_message(room, sender, body, event.event_id) + logger.info(f"从source获取: body={body[:50] if body else 'empty'}") + + # 方法2: 直接尝试 event.body (nio可能已解密) + if hasattr(event, 'body') and event.body: + body = event.body + logger.info(f"从event.body获取: {body[:50]}") + + # 方法3: 检查 room 中的最近事件 + if not body: + # 从 room timeline 查找解密后的消息 + for timeline_event in room.timeline: + if hasattr(timeline_event, 'event_id') and timeline_event.event_id == event.event_id: + if hasattr(timeline_event, 'body'): + body = timeline_event.body + logger.info(f"从room.timeline获取: {body[:50] if body else 'empty'}") + + if body: + logger.info(f"解密成功: sender={sender}, body={body[:50]}") + await self._process_message(room, sender, body, event.event_id) else: - logger.warning(f"加密消息无法解密: {event.event_id}") + logger.warning(f"加密消息无法解密,event_id={event.event_id}") + # 尝试手动解密 + try: + decrypted = await self.client.decrypt_event(event) + if decrypted and hasattr(decrypted, 'body'): + body = decrypted.body + sender = decrypted.sender + logger.info(f"手动解密成功: {body[:50]}") + await self._process_message(room, sender, body, event.event_id) + except Exception as de: + logger.error(f"手动解密失败: {de}") + except Exception as e: logger.error(f"处理加密消息失败: {e}") import traceback