mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
🔧 修复和优化:调整超时设置,重构检查逻辑,简化代码结构
- 在 `chkdsk_hook.py` 中重构 `check` 方法,提取公共逻辑 - 更新 `CacheManager` 中的超时设置,使用新的 `CACHE_TIMEOUT` - 在 `utils.py` 中添加缓存逻辑,记录数据库操作的执行情况
This commit is contained in:
parent
07be73c1b7
commit
a8ee63b199
@ -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}")
|
|
||||||
|
|||||||
4
zhenxun/services/cache/__init__.py
vendored
4
zhenxun/services/cache/__init__.py
vendored
@ -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:
|
||||||
|
|||||||
3
zhenxun/services/cache/config.py
vendored
3
zhenxun/services/cache/config.py
vendored
@ -5,6 +5,9 @@
|
|||||||
# 日志标识
|
# 日志标识
|
||||||
LOG_COMMAND = "CacheRoot"
|
LOG_COMMAND = "CacheRoot"
|
||||||
|
|
||||||
|
# 缓存获取超时时间(秒)
|
||||||
|
CACHE_TIMEOUT = 10
|
||||||
|
|
||||||
# 默认缓存过期时间(秒)
|
# 默认缓存过期时间(秒)
|
||||||
DEFAULT_EXPIRE = 600
|
DEFAULT_EXPIRE = 600
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user