refactor(chat): 迁移数据库操作为异步模式并修复相关调用
将同步数据库操作全面迁移为异步模式,主要涉及: - 将 `with get_db_session()` 改为 `async with get_db_session()` - 修复相关异步调用链,确保 await 正确传递 - 优化消息管理器、上下文管理器等核心组件的异步处理 - 移除同步的 person_id 获取方法,避免协程对象传递问题 修复 deepcopy 在 StreamContext 中的序列化问题,跳过不可序列化的 asyncio.Task 对象 删除无用的测试文件和废弃的插件清单文件
This commit is contained in:
@@ -412,7 +412,7 @@ def count_new_messages_for_users(chat_id: str, start_time: float, end_time: floa
|
||||
# =============================================================================
|
||||
|
||||
|
||||
def build_readable_messages_to_str(
|
||||
async def build_readable_messages_to_str(
|
||||
messages: List[Dict[str, Any]],
|
||||
replace_bot_name: bool = True,
|
||||
merge_messages: bool = False,
|
||||
@@ -436,7 +436,7 @@ def build_readable_messages_to_str(
|
||||
Returns:
|
||||
格式化后的可读字符串
|
||||
"""
|
||||
return build_readable_messages(
|
||||
return await build_readable_messages(
|
||||
messages, replace_bot_name, merge_messages, timestamp_mode, read_mark, truncate, show_actions
|
||||
)
|
||||
|
||||
|
||||
@@ -63,7 +63,78 @@ async def get_person_value(person_id: str, field_name: str, default: Any = None)
|
||||
return default
|
||||
|
||||
|
||||
def get_person_id_by_name(person_name: str) -> str:
|
||||
async def get_person_values(person_id: str, field_names: list, default_dict: Optional[dict] = None) -> dict:
|
||||
"""批量获取用户信息字段值
|
||||
|
||||
Args:
|
||||
person_id: 用户的唯一标识ID
|
||||
field_names: 要获取的字段名列表
|
||||
default_dict: 默认值字典,键为字段名,值为默认值
|
||||
|
||||
Returns:
|
||||
dict: 字段名到值的映射字典
|
||||
|
||||
示例:
|
||||
values = await person_api.get_person_values(
|
||||
person_id,
|
||||
["nickname", "impression", "know_times"],
|
||||
{"nickname": "未知用户", "know_times": 0}
|
||||
)
|
||||
"""
|
||||
try:
|
||||
person_info_manager = get_person_info_manager()
|
||||
values = await person_info_manager.get_values(person_id, field_names)
|
||||
|
||||
# 如果获取成功,返回结果
|
||||
if values:
|
||||
return values
|
||||
|
||||
# 如果获取失败,构建默认值字典
|
||||
result = {}
|
||||
if default_dict:
|
||||
for field in field_names:
|
||||
result[field] = default_dict.get(field, None)
|
||||
else:
|
||||
for field in field_names:
|
||||
result[field] = None
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"[PersonAPI] 批量获取用户信息失败: person_id={person_id}, fields={field_names}, error={e}")
|
||||
# 返回默认值字典
|
||||
result = {}
|
||||
if default_dict:
|
||||
for field in field_names:
|
||||
result[field] = default_dict.get(field, None)
|
||||
else:
|
||||
for field in field_names:
|
||||
result[field] = None
|
||||
return result
|
||||
|
||||
|
||||
async def is_person_known(platform: str, user_id: int) -> bool:
|
||||
"""判断是否认识某个用户
|
||||
|
||||
Args:
|
||||
platform: 平台名称
|
||||
user_id: 用户ID
|
||||
|
||||
Returns:
|
||||
bool: 是否认识该用户
|
||||
|
||||
示例:
|
||||
known = await person_api.is_person_known("qq", 123456)
|
||||
"""
|
||||
try:
|
||||
person_info_manager = get_person_info_manager()
|
||||
return await person_info_manager.is_person_known(platform, user_id)
|
||||
except Exception as e:
|
||||
logger.error(f"[PersonAPI] 检查用户是否已知失败: platform={platform}, user_id={user_id}, error={e}")
|
||||
return False
|
||||
|
||||
|
||||
async def get_person_id_by_name(person_name: str) -> str:
|
||||
"""根据用户名获取person_id
|
||||
|
||||
Args:
|
||||
@@ -76,8 +147,8 @@ def get_person_id_by_name(person_name: str) -> str:
|
||||
person_id = person_api.get_person_id_by_name("张三")
|
||||
"""
|
||||
try:
|
||||
person = Person(person_name=person_name)
|
||||
return person.person_id
|
||||
person_info_manager = get_person_info_manager()
|
||||
return await person_info_manager.get_person_id_by_person_name(person_name)
|
||||
except Exception as e:
|
||||
logger.error(f"[PersonAPI] 根据用户名获取person_id失败: person_name={person_name}, error={e}")
|
||||
return ""
|
||||
|
||||
@@ -542,7 +542,22 @@ class PluginManager:
|
||||
plugin_instance.on_unload()
|
||||
|
||||
# 从组件注册表中移除插件的所有组件
|
||||
asyncio.run(component_registry.unregister_plugin(plugin_name))
|
||||
try:
|
||||
loop = asyncio.get_event_loop()
|
||||
if loop.is_running():
|
||||
fut = asyncio.run_coroutine_threadsafe(
|
||||
component_registry.unregister_plugin(plugin_name), loop
|
||||
)
|
||||
fut.result(timeout=5)
|
||||
else:
|
||||
asyncio.run(component_registry.unregister_plugin(plugin_name))
|
||||
except Exception:
|
||||
# 最后兜底:直接同步调用(如果 unregister_plugin 为非协程)或忽略错误
|
||||
try:
|
||||
# 如果 unregister_plugin 是普通函数
|
||||
component_registry.unregister_plugin(plugin_name)
|
||||
except Exception as e:
|
||||
logger.debug(f"卸载插件时调用 component_registry.unregister_plugin 失败: {e}")
|
||||
|
||||
# 从已加载插件中移除
|
||||
del self.loaded_plugins[plugin_name]
|
||||
|
||||
Reference in New Issue
Block a user