Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev
This commit is contained in:
@@ -435,6 +435,13 @@ class HeartFChatting:
|
|||||||
# Messages should be processed
|
# Messages should be processed
|
||||||
action_type = await self.cycle_processor.observe(interest_value=interest_value)
|
action_type = await self.cycle_processor.observe(interest_value=interest_value)
|
||||||
|
|
||||||
|
# 尝试触发表达学习
|
||||||
|
if self.context.expression_learner:
|
||||||
|
try:
|
||||||
|
await self.context.expression_learner.trigger_learning_for_chat()
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"{self.context.log_prefix} 表达学习触发失败: {e}")
|
||||||
|
|
||||||
# 管理no_reply计数器
|
# 管理no_reply计数器
|
||||||
if action_type != "no_reply":
|
if action_type != "no_reply":
|
||||||
self.recent_interest_records.clear()
|
self.recent_interest_records.clear()
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ class ExpressionLearner:
|
|||||||
Returns:
|
Returns:
|
||||||
bool: 是否成功触发学习
|
bool: 是否成功触发学习
|
||||||
"""
|
"""
|
||||||
if not self.should_trigger_learning():
|
if not await self.should_trigger_learning():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ def replace_user_references_sync(
|
|||||||
if replace_bot_name and user_id == global_config.bot.qq_account:
|
if replace_bot_name and user_id == global_config.bot.qq_account:
|
||||||
return f"{global_config.bot.nickname}(你)"
|
return f"{global_config.bot.nickname}(你)"
|
||||||
person_id = PersonInfoManager.get_person_id(platform, user_id)
|
person_id = PersonInfoManager.get_person_id(platform, user_id)
|
||||||
return person_info_manager.get_value_sync(person_id, "person_name") or user_id # type: ignore
|
return person_info_manager.get_value(person_id, "person_name") or user_id # type: ignore
|
||||||
|
|
||||||
name_resolver = default_resolver
|
name_resolver = default_resolver
|
||||||
|
|
||||||
@@ -1232,7 +1232,7 @@ async def build_anonymous_messages(messages: List[Dict[str, Any]]) -> str:
|
|||||||
|
|
||||||
# 在最前面添加图片映射信息
|
# 在最前面添加图片映射信息
|
||||||
final_output_lines = []
|
final_output_lines = []
|
||||||
pic_mapping_info = build_pic_mapping_info(pic_id_mapping)
|
pic_mapping_info = await build_pic_mapping_info(pic_id_mapping)
|
||||||
if pic_mapping_info:
|
if pic_mapping_info:
|
||||||
final_output_lines.append(pic_mapping_info)
|
final_output_lines.append(pic_mapping_info)
|
||||||
final_output_lines.append("\n\n")
|
final_output_lines.append("\n\n")
|
||||||
|
|||||||
@@ -965,7 +965,7 @@ class Prompt:
|
|||||||
person_info_manager = get_person_info_manager()
|
person_info_manager = get_person_info_manager()
|
||||||
person_id = person_info_manager.get_person_id_by_person_name(sender)
|
person_id = person_info_manager.get_person_id_by_person_name(sender)
|
||||||
if person_id:
|
if person_id:
|
||||||
user_id = person_info_manager.get_value_sync(person_id, "user_id")
|
user_id = person_info_manager.get_value(person_id, "user_id")
|
||||||
return str(user_id) if user_id else ""
|
return str(user_id) if user_id else ""
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
|||||||
@@ -663,7 +663,7 @@ def get_chat_type_and_target_info(chat_id: str) -> Tuple[bool, Optional[Dict]]:
|
|||||||
if person_id:
|
if person_id:
|
||||||
# get_value is async, so await it directly
|
# get_value is async, so await it directly
|
||||||
person_info_manager = get_person_info_manager()
|
person_info_manager = get_person_info_manager()
|
||||||
person_name = person_info_manager.get_value_sync(person_id, "person_name")
|
person_name = person_info_manager.get_value(person_id, "person_name")
|
||||||
|
|
||||||
target_info["person_id"] = person_id
|
target_info["person_id"] = person_id
|
||||||
target_info["person_name"] = person_name
|
target_info["person_name"] = person_name
|
||||||
|
|||||||
@@ -512,6 +512,45 @@ class PersonInfoManager:
|
|||||||
logger.debug(f"删除失败:未找到 person_id={person_id} 或删除未影响行")
|
logger.debug(f"删除失败:未找到 person_id={person_id} 或删除未影响行")
|
||||||
|
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_value(person_id: str, field_name: str) -> Any:
|
||||||
|
"""获取单个字段值(同步版本)"""
|
||||||
|
if not person_id:
|
||||||
|
logger.debug("get_value获取失败:person_id不能为空")
|
||||||
|
return None
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
async def _get_record_sync():
|
||||||
|
async with get_db_session() as session:
|
||||||
|
return (await session.execute(select(PersonInfo).where(PersonInfo.person_id == person_id))).scalar()
|
||||||
|
|
||||||
|
try:
|
||||||
|
record = asyncio.run(_get_record_sync())
|
||||||
|
except RuntimeError:
|
||||||
|
# 如果当前线程已经有事件循环在运行,则使用现有的循环
|
||||||
|
loop = asyncio.get_running_loop()
|
||||||
|
record = loop.run_until_complete(_get_record_sync())
|
||||||
|
|
||||||
|
model_fields = [column.name for column in PersonInfo.__table__.columns]
|
||||||
|
|
||||||
|
if field_name not in model_fields:
|
||||||
|
if field_name in person_info_default:
|
||||||
|
logger.debug(f"字段'{field_name}'不在SQLAlchemy模型中,使用默认配置值。")
|
||||||
|
return copy.deepcopy(person_info_default[field_name])
|
||||||
|
else:
|
||||||
|
logger.debug(f"get_value查询失败:字段'{field_name}'未在SQLAlchemy模型和默认配置中定义。")
|
||||||
|
return None
|
||||||
|
|
||||||
|
if record:
|
||||||
|
value = getattr(record, field_name)
|
||||||
|
if value is not None:
|
||||||
|
return value
|
||||||
|
else:
|
||||||
|
return copy.deepcopy(person_info_default.get(field_name))
|
||||||
|
else:
|
||||||
|
return copy.deepcopy(person_info_default.get(field_name))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def get_values(person_id: str, field_names: list) -> dict:
|
async def get_values(person_id: str, field_names: list) -> dict:
|
||||||
"""获取指定person_id文档的多个字段值,若不存在该字段,则返回该字段的全局默认值"""
|
"""获取指定person_id文档的多个字段值,若不存在该字段,则返回该字段的全局默认值"""
|
||||||
@@ -550,7 +589,6 @@ class PersonInfoManager:
|
|||||||
result[field_name] = copy.deepcopy(person_info_default.get(field_name))
|
result[field_name] = copy.deepcopy(person_info_default.get(field_name))
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def get_specific_value_list(
|
async def get_specific_value_list(
|
||||||
field_name: str,
|
field_name: str,
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ class RelationshipBuilder:
|
|||||||
"message_count": await self._count_messages_in_timerange(potential_start_time, message_time),
|
"message_count": await self._count_messages_in_timerange(potential_start_time, message_time),
|
||||||
}
|
}
|
||||||
segments.append(new_segment)
|
segments.append(new_segment)
|
||||||
person_name = get_person_info_manager().get_value_sync(person_id, "person_name") or person_id
|
person_name = get_person_info_manager().get_value(person_id, "person_name") or person_id
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"{self.log_prefix} 眼熟用户 {person_name} 在 {time.strftime('%H:%M:%S', time.localtime(potential_start_time))} - {time.strftime('%H:%M:%S', time.localtime(message_time))} 之间有 {new_segment['message_count']} 条消息"
|
f"{self.log_prefix} 眼熟用户 {person_name} 在 {time.strftime('%H:%M:%S', time.localtime(potential_start_time))} - {time.strftime('%H:%M:%S', time.localtime(message_time))} 之间有 {new_segment['message_count']} 条消息"
|
||||||
)
|
)
|
||||||
@@ -178,7 +178,7 @@ class RelationshipBuilder:
|
|||||||
}
|
}
|
||||||
segments.append(new_segment)
|
segments.append(new_segment)
|
||||||
person_info_manager = get_person_info_manager()
|
person_info_manager = get_person_info_manager()
|
||||||
person_name = person_info_manager.get_value_sync(person_id, "person_name") or person_id
|
person_name = person_info_manager.get_value(person_id, "person_name") or person_id
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"{self.log_prefix} 重新眼熟用户 {person_name} 创建新消息段(超过10条消息间隔): {new_segment}"
|
f"{self.log_prefix} 重新眼熟用户 {person_name} 创建新消息段(超过10条消息间隔): {new_segment}"
|
||||||
)
|
)
|
||||||
@@ -368,7 +368,7 @@ class RelationshipBuilder:
|
|||||||
users_to_build_relationship = []
|
users_to_build_relationship = []
|
||||||
for person_id, segments in self.person_engaged_cache.items():
|
for person_id, segments in self.person_engaged_cache.items():
|
||||||
total_message_count = self._get_total_message_count(person_id)
|
total_message_count = self._get_total_message_count(person_id)
|
||||||
person_name = get_person_info_manager().get_value_sync(person_id, "person_name") or person_id
|
person_name = get_person_info_manager().get_value(person_id, "person_name") or person_id
|
||||||
|
|
||||||
if total_message_count >= max_build_threshold or (
|
if total_message_count >= max_build_threshold or (
|
||||||
total_message_count >= 5 and (immediate_build == person_id or immediate_build == "all")
|
total_message_count >= 5 and (immediate_build == person_id or immediate_build == "all")
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ class EmojiAction(BaseAction):
|
|||||||
emoji_base64, emoji_description = random.choice(all_emojis_data)
|
emoji_base64, emoji_description = random.choice(all_emojis_data)
|
||||||
else:
|
else:
|
||||||
# 获取最近的5条消息内容用于判断
|
# 获取最近的5条消息内容用于判断
|
||||||
recent_messages = message_api.get_recent_messages(chat_id=self.chat_id, limit=5)
|
recent_messages = await message_api.get_recent_messages(chat_id=self.chat_id, limit=5)
|
||||||
messages_text = ""
|
messages_text = ""
|
||||||
if recent_messages:
|
if recent_messages:
|
||||||
messages_text = await message_api.build_readable_messages(
|
messages_text = await message_api.build_readable_messages(
|
||||||
@@ -181,7 +181,7 @@ class EmojiAction(BaseAction):
|
|||||||
elif global_config.emoji.emoji_selection_mode == "description":
|
elif global_config.emoji.emoji_selection_mode == "description":
|
||||||
# --- 详细描述选择模式 ---
|
# --- 详细描述选择模式 ---
|
||||||
# 获取最近的5条消息内容用于判断
|
# 获取最近的5条消息内容用于判断
|
||||||
recent_messages = message_api.get_recent_messages(chat_id=self.chat_id, limit=5)
|
recent_messages = await message_api.get_recent_messages(chat_id=self.chat_id, limit=5)
|
||||||
messages_text = ""
|
messages_text = ""
|
||||||
if recent_messages:
|
if recent_messages:
|
||||||
messages_text = await message_api.build_readable_messages(
|
messages_text = await message_api.build_readable_messages(
|
||||||
|
|||||||
Reference in New Issue
Block a user