diff --git a/src/chat/message_receive/chat_stream.py b/src/chat/message_receive/chat_stream.py index 53ebd502..18682502 100644 --- a/src/chat/message_receive/chat_stream.py +++ b/src/chat/message_receive/chat_stream.py @@ -142,46 +142,98 @@ class ChatManager: Returns: ChatStream: 聊天流对象 """ - # 生成stream_id - try: - stream_id = self._generate_stream_id(platform, user_info, group_info) + stream_id = self._generate_stream_id(platform, user_info, group_info) - # 检查内存中是否存在 - if stream_id in self.streams: - stream = self.streams[stream_id] - # 更新用户信息和群组信息 - stream.update_active_time() - stream = copy.deepcopy(stream) - stream.user_info = user_info - if group_info: - stream.group_info = group_info - return stream + # mes_name: 当前调用此函数时,根据传入参数确定的最新聊天名称 + current_mes_name = None + if group_info and group_info.group_name: + current_mes_name = group_info.group_name + elif user_info and user_info.user_nickname: # private chat + current_mes_name = f"{user_info.user_nickname}的私聊" - # 检查数据库中是否存在 - data = db.chat_streams.find_one({"stream_id": stream_id}) - if data: - stream = ChatStream.from_dict(data) - # 更新用户信息和群组信息 - stream.user_info = user_info + # 检查内存中是否存在 + if stream_id in self.streams: + stream_instance = self.streams[stream_id] # 获取内存中的实际stream对象 + + # stream_name: 从内存中获取的、可能存在的旧名称,用于比较 + # 这个名称是 get_stream_name() 在此函数更新stream_instance前会返回的名称 + old_effective_stream_name = None + if stream_instance.group_info and stream_instance.group_info.group_name: + old_effective_stream_name = stream_instance.group_info.group_name + elif stream_instance.user_info and stream_instance.user_info.user_nickname: + old_effective_stream_name = f"{stream_instance.user_info.user_nickname}的私聊" + + # 判断名称是否发生变化 + if current_mes_name is not None and old_effective_stream_name != current_mes_name: + logger.info(f"聊天流名称变更 (来自内存): ID '{stream_id}' 从 '{old_effective_stream_name}' 变为 '{current_mes_name}'. 更新数据库.") + # 更新内存中的stream_instance对象的 用户信息和群组信息(这将包含新的名称) + stream_instance.user_info = user_info if group_info: - stream.group_info = group_info - stream.update_active_time() + stream_instance.group_info = group_info + else: # 处理从群聊变私聊或群信息消失的情况 + stream_instance.group_info = None + stream_instance.update_active_time() # 更新活跃时间也会将saved标记为False + await self._save_stream(stream_instance) # 保存更新到数据库 else: - # 创建新的聊天流 - stream = ChatStream( - stream_id=stream_id, - platform=platform, - user_info=user_info, - group_info=group_info, - ) - except Exception as e: - logger.error(f"创建聊天流失败: {e}") - raise e + # 名称未变或无法确定当前新名称,仅更新活动时间和确保信息最新 + stream_instance.user_info = user_info + if group_info: + stream_instance.group_info = group_info + else: + stream_instance.group_info = None + stream_instance.update_active_time() - # 保存到内存和数据库 - self.streams[stream_id] = stream - await self._save_stream(stream) - return copy.deepcopy(stream) + # self.streams[stream_id] 已经是更新后的 stream_instance + return copy.deepcopy(self.streams[stream_id]) # 返回一个副本,避免外部直接修改缓存 + + # 检查数据库中是否存在 + data = db.chat_streams.find_one({"stream_id": stream_id}) + if data: + stream_from_db = ChatStream.from_dict(data) + + # stream_name: 从数据库加载的、可能存在的旧名称,用于比较 + db_stream_name = None + if stream_from_db.group_info and stream_from_db.group_info.group_name: + db_stream_name = stream_from_db.group_info.group_name + elif stream_from_db.user_info and stream_from_db.user_info.user_nickname: + db_stream_name = f"{stream_from_db.user_info.user_nickname}的私聊" + + # 判断名称是否发生变化 + if current_mes_name is not None and db_stream_name != current_mes_name: + logger.info(f"聊天流名称变更 (来自数据库): ID '{stream_id}' 从 '{db_stream_name}' 变为 '{current_mes_name}'. 更新数据库.") + # 更新从数据库加载的stream对象的 用户信息和群组信息 + stream_from_db.user_info = user_info + if group_info: + stream_from_db.group_info = group_info + else: + stream_from_db.group_info = None + # stream_from_db.update_active_time() # 将在下面统一处理 + # stream_from_db.saved = False # update_active_time会处理 + + # 统一更新信息和活跃时间 + stream_from_db.user_info = user_info + if group_info: + stream_from_db.group_info = group_info + else: + stream_from_db.group_info = None + stream_from_db.update_active_time() + + self.streams[stream_id] = stream_from_db # 存入内存缓存 + await self._save_stream(stream_from_db) # 保存到数据库(如果名称变化或活跃时间更新) + return copy.deepcopy(stream_from_db) + + # 创建新的聊天流 + # 此时,新流的名称自然就是 current_mes_name + new_stream = ChatStream( + stream_id=stream_id, + platform=platform, + user_info=user_info, + group_info=group_info, + ) + self.streams[stream_id] = new_stream + await self._save_stream(new_stream) + logger.info(f"创建了新的聊天流: ID '{stream_id}', 名称 '{current_mes_name if current_mes_name else '未知'}'") + return copy.deepcopy(new_stream) def get_stream(self, stream_id: str) -> Optional[ChatStream]: """通过stream_id获取聊天流""" @@ -229,4 +281,4 @@ class ChatManager: # 创建全局单例 -chat_manager = ChatManager() +chat_manager = ChatManager() \ No newline at end of file diff --git a/src/experimental/Legacy_HFC/heartflow_processor.py b/src/experimental/Legacy_HFC/heartflow_processor.py index 9e27a24b..6589642f 100644 --- a/src/experimental/Legacy_HFC/heartflow_processor.py +++ b/src/experimental/Legacy_HFC/heartflow_processor.py @@ -210,7 +210,7 @@ class HeartFCProcessor: # 7. 日志记录 mes_name = chat.group_info.group_name if chat.group_info else "私聊" - current_time = time.strftime("%H点%M分%S秒", time.localtime(message.message_info.time)) + current_time = time.strftime("%H:%M:%S", time.localtime(message.message_info.time)) logger.info( f"[{current_time}][{mes_name}]" f"{userinfo.user_nickname}:"