🔧 修复和优化:调整超时设置,重构检查逻辑,简化代码结构

- 在 `chkdsk_hook.py` 中重构 `check` 方法,提取公共逻辑
- 更新 `CacheManager` 中的超时设置,使用新的 `CACHE_TIMEOUT`
- 在 `utils.py` 中添加缓存逻辑,记录数据库操作的执行情况
This commit is contained in:
HibiKier 2025-09-30 15:54:21 +08:00
parent 07be73c1b7
commit a8ee63b199
4 changed files with 64 additions and 48 deletions

View File

@ -43,18 +43,20 @@ class BanCheckLimiter:
def check(self, key: str | float) -> bool: def check(self, key: str | float) -> bool:
if time.time() - self.mtime[key] > self.default_check_time: if time.time() - self.mtime[key] > self.default_check_time:
self.mtime[key] = time.time() return self._extracted_from_check_3(key, False)
self.mint[key] = 0
return False
if ( if (
self.mint[key] >= self.default_count self.mint[key] >= self.default_count
and time.time() - self.mtime[key] < self.default_check_time and time.time() - self.mtime[key] < self.default_check_time
): ):
self.mtime[key] = time.time() return self._extracted_from_check_3(key, True)
self.mint[key] = 0
return True
return False 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( _blmt = BanCheckLimiter(
malicious_check_time, malicious_check_time,
@ -70,16 +72,15 @@ async def _(
module = None module = None
if plugin := matcher.plugin: if plugin := matcher.plugin:
module = plugin.module_name module = plugin.module_name
if metadata := plugin.metadata: if not (metadata := plugin.metadata):
extra = metadata.extra return
if extra.get("plugin_type") in [ extra = metadata.extra
PluginType.HIDDEN, if extra.get("plugin_type") in [
PluginType.DEPENDANT, PluginType.HIDDEN,
PluginType.ADMIN, PluginType.DEPENDANT,
PluginType.SUPERUSER, PluginType.ADMIN,
]: PluginType.SUPERUSER,
return ]:
else:
return return
if matcher.type == "notice": if matcher.type == "notice":
return return
@ -88,32 +89,31 @@ async def _(
malicious_ban_time = Config.get_config("hook", "MALICIOUS_BAN_TIME") malicious_ban_time = Config.get_config("hook", "MALICIOUS_BAN_TIME")
if not malicious_ban_time: if not malicious_ban_time:
raise ValueError("模块: [hook], 配置项: [MALICIOUS_BAN_TIME] 为空或小于0") raise ValueError("模块: [hook], 配置项: [MALICIOUS_BAN_TIME] 为空或小于0")
if user_id: if user_id and module:
if module: if _blmt.check(f"{user_id}__{module}"):
if _blmt.check(f"{user_id}__{module}"): await BanConsole.ban(
await BanConsole.ban( user_id,
user_id, group_id,
group_id, 9,
9, "恶意触发命令检测",
"恶意触发命令检测", malicious_ban_time * 60,
malicious_ban_time * 60, bot.self_id,
bot.self_id, )
) logger.info(
logger.info( f"触发了恶意触发检测: {matcher.plugin_name}",
f"触发了恶意触发检测: {matcher.plugin_name}", "HOOK",
"HOOK", session=session,
session=session, )
) await MessageUtils.build_message(
await MessageUtils.build_message( [
[ At(flag="user", target=user_id),
At(flag="user", target=user_id), "检测到恶意触发命令,您将被封禁 30 分钟",
"检测到恶意触发命令,您将被封禁 30 分钟", ]
] ).send()
).send() logger.debug(
logger.debug( f"触发了恶意触发检测: {matcher.plugin_name}",
f"触发了恶意触发检测: {matcher.plugin_name}", "HOOK",
"HOOK", session=session,
session=session, )
) raise IgnoredException("检测到恶意触发命令")
raise IgnoredException("检测到恶意触发命令") _blmt.add(f"{user_id}__{module}")
_blmt.add(f"{user_id}__{module}")

View File

@ -98,6 +98,7 @@ from .cache_containers import CacheDict, CacheList
from .config import ( from .config import (
CACHE_KEY_PREFIX, CACHE_KEY_PREFIX,
CACHE_KEY_SEPARATOR, CACHE_KEY_SEPARATOR,
CACHE_TIMEOUT,
DEFAULT_EXPIRE, DEFAULT_EXPIRE,
LOG_COMMAND, LOG_COMMAND,
SPECIAL_KEY_FORMATS, SPECIAL_KEY_FORMATS,
@ -551,7 +552,6 @@ class CacheManager:
返回: 返回:
Any: 缓存数据如果不存在返回默认值 Any: 缓存数据如果不存在返回默认值
""" """
from zhenxun.services.db_context import DB_TIMEOUT_SECONDS
# 如果缓存被禁用或缓存模式为NONE直接返回默认值 # 如果缓存被禁用或缓存模式为NONE直接返回默认值
if not self.enabled or cache_config.cache_mode == CacheMode.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) cache_key = self._build_key(cache_type, key)
data = await asyncio.wait_for( data = await asyncio.wait_for(
self.cache_backend.get(cache_key), # type: ignore self.cache_backend.get(cache_key), # type: ignore
timeout=DB_TIMEOUT_SECONDS, timeout=CACHE_TIMEOUT,
) )
if data is None: if data is None:

View File

@ -5,6 +5,9 @@
# 日志标识 # 日志标识
LOG_COMMAND = "CacheRoot" LOG_COMMAND = "CacheRoot"
# 缓存获取超时时间(秒)
CACHE_TIMEOUT = 10
# 默认缓存过期时间(秒) # 默认缓存过期时间(秒)
DEFAULT_EXPIRE = 600 DEFAULT_EXPIRE = 600

View File

@ -1,14 +1,18 @@
import asyncio import asyncio
import random
import time import time
from zhenxun.services.log import logger from zhenxun.services.log import logger
from ..cache import CacheRoot
from .config import ( from .config import (
DB_TIMEOUT_SECONDS, DB_TIMEOUT_SECONDS,
LOG_COMMAND, LOG_COMMAND,
SLOW_QUERY_THRESHOLD, SLOW_QUERY_THRESHOLD,
) )
aaa = CacheRoot.cache_dict("AAA", 10, int)
async def with_db_timeout( async def with_db_timeout(
coro, coro,
@ -21,11 +25,20 @@ async def with_db_timeout(
try: try:
logger.debug(f"开始执行数据库操作: {operation} 来源: {source}") logger.debug(f"开始执行数据库操作: {operation} 来源: {source}")
result = await asyncio.wait_for(coro, timeout=timeout) result = await asyncio.wait_for(coro, timeout=timeout)
aaa[str(random.randint(0, 100000))] = 1
elapsed = time.time() - start_time elapsed = time.time() - start_time
if elapsed > SLOW_QUERY_THRESHOLD and operation: if elapsed > SLOW_QUERY_THRESHOLD and operation:
logger.warning(f"慢查询: {operation} 耗时 {elapsed:.3f}s", LOG_COMMAND) 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 return result
except asyncio.TimeoutError: except asyncio.TimeoutError:
if operation: if operation:
logger.error(f"数据库操作超时: {operation} (>{timeout}s)", LOG_COMMAND) logger.error(
f"数据库操作超时: {operation} (>{timeout}s) 来源: {source}",
LOG_COMMAND,
)
raise raise