From f35d52401b94df42dbe12bef71f069f3aa7f6061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=85=E8=AF=BA=E7=8B=90?= <212194964+foxcyber907@users.noreply.github.com> Date: Tue, 19 Aug 2025 20:17:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=B8=93=E6=B3=A8?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated logic in heartFC_chat.py and relationship_manager.py to prioritize 'chat_info_platform', then 'user_platform', and finally a default when determining platform information. Added a fallback to 'unknown' in get_person_id if platform is None, improving robustness when platform data is missing. Co-Authored-By: tt-P607 <68868379+tt-P607@users.noreply.github.com> --- src/chat/chat_loop/heartFC_chat.py | 32 ++++++----- src/person_info/person_info.py | 4 ++ src/person_info/relationship_manager.py | 72 +++++++++++++++++++++++-- 3 files changed, 93 insertions(+), 15 deletions(-) diff --git a/src/chat/chat_loop/heartFC_chat.py b/src/chat/chat_loop/heartFC_chat.py index ec973fdc6..ba9962164 100644 --- a/src/chat/chat_loop/heartFC_chat.py +++ b/src/chat/chat_loop/heartFC_chat.py @@ -469,7 +469,17 @@ class HeartFChatting: # Normal模式:消息数量不足,等待 await asyncio.sleep(0.5) return True - return True + + async def build_reply_to_str(self, message_data: dict): + person_info_manager = get_person_info_manager() + + # 获取平台信息,优先使用chat_info_platform,如果为None则使用user_platform + platform = message_data.get("chat_info_platform") or message_data.get("user_platform") or self.chat_stream.platform + user_id = message_data.get("user_id") + + person_id = person_info_manager.get_person_id(platform, user_id) + person_name = await person_info_manager.get_value(person_id, "person_name") + return f"{person_name}:{message_data.get('processed_plain_text')}" async def _send_and_store_reply( self, @@ -482,19 +492,17 @@ class HeartFChatting: ) -> Tuple[Dict[str, Any], str, Dict[str, float]]: with Timer("回复发送", cycle_timers): - reply_text = await self._send_response( - reply_set=response_set, - message_data=action_message, - selected_expressions=selected_expressions, - ) + reply_text = await self._send_response(response_set, reply_to_str, loop_start_time, action_message) + + # 存储reply action信息 + person_info_manager = get_person_info_manager() - # 获取 platform,如果不存在则从 chat_stream 获取,如果还是 None 则使用默认值 - platform = action_message.get("chat_info_platform") - if platform is None: - platform = getattr(self.chat_stream, "platform", "unknown") + # 获取平台信息,优先使用chat_info_platform,如果为空则使用user_platform + platform = action_message.get("chat_info_platform") or action_message.get("user_platform") or self.chat_stream.platform + user_id = action_message.get("user_id", "") - person = Person(platform = platform ,user_id = action_message.get("user_id", "")) - person_name = person.person_name + person_id = person_info_manager.get_person_id(platform, user_id) + person_name = await person_info_manager.get_value(person_id, "person_name") action_prompt_display = f"你对{person_name}进行了回复:{reply_text}" await database_api.store_action_info( diff --git a/src/person_info/person_info.py b/src/person_info/person_info.py index ce388bee9..23560383d 100644 --- a/src/person_info/person_info.py +++ b/src/person_info/person_info.py @@ -415,6 +415,10 @@ class PersonInfoManager: @staticmethod def get_person_id(platform: str, user_id: Union[int, str]) -> str: """获取唯一id""" + # 检查platform是否为None或空 + if platform is None: + platform = "unknown" + if "-" in platform: platform = platform.split("-")[1] diff --git a/src/person_info/relationship_manager.py b/src/person_info/relationship_manager.py index 8469ebeee..b9c5178d1 100644 --- a/src/person_info/relationship_manager.py +++ b/src/person_info/relationship_manager.py @@ -16,9 +16,75 @@ logger = get_logger("relation") def init_prompt(): Prompt( """ -你的名字是{bot_name},{bot_name}的别名是{alias_str}。 -请不要混淆你自己和{bot_name}和{person_name}。 -请你基于用户 {person_name}(昵称:{nickname}) 的最近发言,总结出其中是否有有关{person_name}的内容引起了你的兴趣,或者有什么值得记忆的点。 + person_info_manager = get_person_info_manager() + person_name = await person_info_manager.get_value(person_id, "person_name") + nickname = await person_info_manager.get_value(person_id, "nickname") + know_times: float = await person_info_manager.get_value(person_id, "know_times") or 0 # type: ignore + + alias_str = ", ".join(global_config.bot.alias_names) + # personality_block =get_individuality().get_personality_prompt(x_person=2, level=2) + # identity_block =get_individuality().get_identity_prompt(x_person=2, level=2) + + user_messages = bot_engaged_messages + + current_time = datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S") + + # 匿名化消息 + # 创建用户名称映射 + name_mapping = {} + current_user = "A" + user_count = 1 + + # 遍历消息,构建映射 + for msg in user_messages: + # 获取平台信息,优先使用chat_info_platform,如果为None则使用user_platform + platform = msg.get("chat_info_platform") or msg.get("user_platform", "unknown") + user_id = msg.get("user_id") + + await person_info_manager.get_or_create_person( + platform=platform, # type: ignore + user_id=user_id, # type: ignore + nickname=msg.get("user_nickname"), # type: ignore + user_cardname=msg.get("user_cardname"), # type: ignore + ) + replace_user_id: str = msg.get("user_id") # type: ignore + replace_platform: str = platform # type: ignore + replace_person_id = PersonInfoManager.get_person_id(replace_platform, replace_user_id) + replace_person_name = await person_info_manager.get_value(replace_person_id, "person_name") + + # 跳过机器人自己 + if replace_user_id == global_config.bot.qq_account: + name_mapping[f"{global_config.bot.nickname}"] = f"{global_config.bot.nickname}" + continue + + # 跳过目标用户 + if replace_person_name == person_name: + name_mapping[replace_person_name] = f"{person_name}" + continue + + # 其他用户映射 + if replace_person_name not in name_mapping: + if current_user > "Z": + current_user = "A" + user_count += 1 + name_mapping[replace_person_name] = f"用户{current_user}{user_count if user_count > 1 else ''}" + current_user = chr(ord(current_user) + 1) + + readable_messages = build_readable_messages( + messages=user_messages, replace_bot_name=True, timestamp_mode="normal_no_YMD", truncate=True + ) + + if not readable_messages: + return + + for original_name, mapped_name in name_mapping.items(): + # print(f"original_name: {original_name}, mapped_name: {mapped_name}") + readable_messages = readable_messages.replace(f"{original_name}", f"{mapped_name}") + + prompt = f""" +你的名字是{global_config.bot.nickname},{global_config.bot.nickname}的别名是{alias_str}。 +请不要混淆你自己和{global_config.bot.nickname}和{person_name}。 +请你基于用户 {person_name}(昵称:{nickname}) 的最近发言,总结出其中是否有有关{person_name}的内容引起了你的兴趣,或者有什么需要你记忆的点,或者对你友好或者不友好的点。 如果没有,就输出none {current_time}的聊天内容: