mirror of https://github.com/Mai-with-u/MaiBot.git
parent
2080c02f54
commit
09ec1502cd
|
|
@ -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获取聊天流"""
|
||||
|
|
|
|||
|
|
@ -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}:"
|
||||
|
|
|
|||
Loading…
Reference in New Issue