diff --git a/zhenxun/models/group_member_info.py b/zhenxun/models/group_member_info.py index 2bb3d46f..8248bd71 100644 --- a/zhenxun/models/group_member_info.py +++ b/zhenxun/models/group_member_info.py @@ -26,6 +26,7 @@ class GroupInfoUser(Model): table = "group_info_users" table_description = "群员信息数据表" unique_together = ("user_id", "group_id") + _unicode_safe_fields = ["user_name", "nickname"] # noqa: RUF012 @classmethod async def get_all_uid(cls, group_id: str) -> set[int]: diff --git a/zhenxun/services/db_context.py b/zhenxun/services/db_context.py index 4543b262..3a8e5063 100644 --- a/zhenxun/services/db_context.py +++ b/zhenxun/services/db_context.py @@ -1,6 +1,9 @@ +from collections.abc import Iterable +import re + import nonebot from nonebot.utils import is_coroutine_callable -from tortoise import Tortoise +from tortoise import BaseDBAsyncClient, Tortoise from tortoise.connection import connections from tortoise.models import Model as Model_ @@ -17,12 +20,140 @@ MODELS: list[str] = [] driver = nonebot.get_driver() -class Model(Model_): +def unicode_escape(value: str) -> str: + """ + 将字符串转换为Unicode转义形式(仅处理未转义的特殊字符) + 已经转义过的字符串保持不变 + """ + if not value: + return value + + if re.search(r"\\u[0-9a-fA-F]{4}", value): + return value + + return "".join( + char + if 0x20 <= ord(char) <= 0x7E or char in ("\n", "\r", "\t") + else f"\\u{ord(char):04x}" + for char in value + ) + + +def unicode_unescape(value: str) -> str: + """ + 安全还原字符串中的Unicode转义序列 + 如果不是有效转义序列,保留原样 + """ + if not value: + return value + + # 仅处理有效的 \uXXXX 格式 + return re.sub( + r"(?