From a8ee63b199ccaa96359a39a48d4b48322021d726 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Tue, 30 Sep 2025 15:54:21 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20=E4=BF=AE=E5=A4=8D=E5=92=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E8=B0=83=E6=95=B4=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=EF=BC=8C=E9=87=8D=E6=9E=84=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 `chkdsk_hook.py` 中重构 `check` 方法,提取公共逻辑 - 更新 `CacheManager` 中的超时设置,使用新的 `CACHE_TIMEOUT` - 在 `utils.py` 中添加缓存逻辑,记录数据库操作的执行情况 --- zhenxun/builtin_plugins/hooks/chkdsk_hook.py | 90 ++++++++++---------- zhenxun/services/cache/__init__.py | 4 +- zhenxun/services/cache/config.py | 3 + zhenxun/services/db_context/utils.py | 15 +++- 4 files changed, 64 insertions(+), 48 deletions(-) diff --git a/zhenxun/builtin_plugins/hooks/chkdsk_hook.py b/zhenxun/builtin_plugins/hooks/chkdsk_hook.py index 30080281..c657e3ed 100644 --- a/zhenxun/builtin_plugins/hooks/chkdsk_hook.py +++ b/zhenxun/builtin_plugins/hooks/chkdsk_hook.py @@ -43,18 +43,20 @@ class BanCheckLimiter: def check(self, key: str | float) -> bool: if time.time() - self.mtime[key] > self.default_check_time: - self.mtime[key] = time.time() - self.mint[key] = 0 - return False + return self._extracted_from_check_3(key, False) if ( self.mint[key] >= self.default_count and time.time() - self.mtime[key] < self.default_check_time ): - self.mtime[key] = time.time() - self.mint[key] = 0 - return True + return self._extracted_from_check_3(key, True) return False + # TODO Rename this here and in `check` + def _extracted_from_check_3(self, key, arg1): + self.mtime[key] = time.time() + self.mint[key] = 0 + return arg1 + _blmt = BanCheckLimiter( malicious_check_time, @@ -70,16 +72,15 @@ async def _( module = None if plugin := matcher.plugin: module = plugin.module_name - if metadata := plugin.metadata: - extra = metadata.extra - if extra.get("plugin_type") in [ - PluginType.HIDDEN, - PluginType.DEPENDANT, - PluginType.ADMIN, - PluginType.SUPERUSER, - ]: - return - else: + if not (metadata := plugin.metadata): + return + extra = metadata.extra + if extra.get("plugin_type") in [ + PluginType.HIDDEN, + PluginType.DEPENDANT, + PluginType.ADMIN, + PluginType.SUPERUSER, + ]: return if matcher.type == "notice": return @@ -88,32 +89,31 @@ async def _( malicious_ban_time = Config.get_config("hook", "MALICIOUS_BAN_TIME") if not malicious_ban_time: raise ValueError("模块: [hook], 配置项: [MALICIOUS_BAN_TIME] 为空或小于0") - if user_id: - if module: - if _blmt.check(f"{user_id}__{module}"): - await BanConsole.ban( - user_id, - group_id, - 9, - "恶意触发命令检测", - malicious_ban_time * 60, - bot.self_id, - ) - logger.info( - f"触发了恶意触发检测: {matcher.plugin_name}", - "HOOK", - session=session, - ) - await MessageUtils.build_message( - [ - At(flag="user", target=user_id), - "检测到恶意触发命令,您将被封禁 30 分钟", - ] - ).send() - logger.debug( - f"触发了恶意触发检测: {matcher.plugin_name}", - "HOOK", - session=session, - ) - raise IgnoredException("检测到恶意触发命令") - _blmt.add(f"{user_id}__{module}") + if user_id and module: + if _blmt.check(f"{user_id}__{module}"): + await BanConsole.ban( + user_id, + group_id, + 9, + "恶意触发命令检测", + malicious_ban_time * 60, + bot.self_id, + ) + logger.info( + f"触发了恶意触发检测: {matcher.plugin_name}", + "HOOK", + session=session, + ) + await MessageUtils.build_message( + [ + At(flag="user", target=user_id), + "检测到恶意触发命令,您将被封禁 30 分钟", + ] + ).send() + logger.debug( + f"触发了恶意触发检测: {matcher.plugin_name}", + "HOOK", + session=session, + ) + raise IgnoredException("检测到恶意触发命令") + _blmt.add(f"{user_id}__{module}") diff --git a/zhenxun/services/cache/__init__.py b/zhenxun/services/cache/__init__.py index ee19a4ce..9e222a44 100644 --- a/zhenxun/services/cache/__init__.py +++ b/zhenxun/services/cache/__init__.py @@ -98,6 +98,7 @@ from .cache_containers import CacheDict, CacheList from .config import ( CACHE_KEY_PREFIX, CACHE_KEY_SEPARATOR, + CACHE_TIMEOUT, DEFAULT_EXPIRE, LOG_COMMAND, SPECIAL_KEY_FORMATS, @@ -551,7 +552,6 @@ class CacheManager: 返回: Any: 缓存数据,如果不存在返回默认值 """ - from zhenxun.services.db_context import DB_TIMEOUT_SECONDS # 如果缓存被禁用或缓存模式为NONE,直接返回默认值 if not self.enabled or cache_config.cache_mode == CacheMode.NONE: @@ -561,7 +561,7 @@ class CacheManager: cache_key = self._build_key(cache_type, key) data = await asyncio.wait_for( self.cache_backend.get(cache_key), # type: ignore - timeout=DB_TIMEOUT_SECONDS, + timeout=CACHE_TIMEOUT, ) if data is None: diff --git a/zhenxun/services/cache/config.py b/zhenxun/services/cache/config.py index b974787b..f699657c 100644 --- a/zhenxun/services/cache/config.py +++ b/zhenxun/services/cache/config.py @@ -5,6 +5,9 @@ # 日志标识 LOG_COMMAND = "CacheRoot" +# 缓存获取超时时间(秒) +CACHE_TIMEOUT = 10 + # 默认缓存过期时间(秒) DEFAULT_EXPIRE = 600 diff --git a/zhenxun/services/db_context/utils.py b/zhenxun/services/db_context/utils.py index d0f58a1e..3271ebf5 100644 --- a/zhenxun/services/db_context/utils.py +++ b/zhenxun/services/db_context/utils.py @@ -1,14 +1,18 @@ import asyncio +import random import time from zhenxun.services.log import logger +from ..cache import CacheRoot from .config import ( DB_TIMEOUT_SECONDS, LOG_COMMAND, SLOW_QUERY_THRESHOLD, ) +aaa = CacheRoot.cache_dict("AAA", 10, int) + async def with_db_timeout( coro, @@ -21,11 +25,20 @@ async def with_db_timeout( try: logger.debug(f"开始执行数据库操作: {operation} 来源: {source}") result = await asyncio.wait_for(coro, timeout=timeout) + aaa[str(random.randint(0, 100000))] = 1 elapsed = time.time() - start_time if elapsed > SLOW_QUERY_THRESHOLD and operation: logger.warning(f"慢查询: {operation} 耗时 {elapsed:.3f}s", LOG_COMMAND) + logger.debug( + f"10s内数据库查询次数: {len(aaa)}, 开始执行数据库操作: {operation} " + f"来源: {source}, 当次返回数据ID: {getattr(result, 'id', None)}", + LOG_COMMAND, + ) return result except asyncio.TimeoutError: if operation: - logger.error(f"数据库操作超时: {operation} (>{timeout}s)", LOG_COMMAND) + logger.error( + f"数据库操作超时: {operation} (>{timeout}s) 来源: {source}", + LOG_COMMAND, + ) raise