mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-06 04:10:02 +08:00
bugfix:更换数据库初始化超时路径以修复连接超时问题 (#2137)
* bugfix:更换数据库初始化超时路径以修复连接超时问题 * 移除部分观测链路 * 细节修改 * 权限检查细节修改2 * bugfix:修复金币懒加载造成插件金币消耗不了的问题 * bugfix:整理鉴权逻辑 * 完善缓存系统 * 优化官端使用 * bugfix:增加官机和频道的前导统一剥离,新增获取群列表自愈 * bugfix:修复导入问题
This commit is contained in:
@@ -31,8 +31,6 @@ class HandleEventSelectorDependencies:
|
||||
activation_context_from_dispatch: Callable[[EventDispatchContext, Event], Any]
|
||||
new_dispatch_budget: Callable[[], dict[str, int]]
|
||||
dispatch_lane_for_matcher: Callable[[type[Matcher], EventDispatchContext], str]
|
||||
record_activation_result: Callable[[Any], None]
|
||||
debug_activation_shadow: Callable[..., None]
|
||||
merge_dispatch_budget: Callable[[dict[str, int], dict[str, int]], None]
|
||||
build_matcher_state: Callable[[dict], dict]
|
||||
run_selected_matcher: Callable[..., Awaitable[None]]
|
||||
@@ -43,11 +41,81 @@ _ORIGINAL_HANDLE_EVENT: Callable[..., Awaitable[None]] | None = None
|
||||
_ORIGINAL_ADAPTER_HANDLE_EVENTS: dict[object, object] = {}
|
||||
|
||||
|
||||
def _trim_leading_text(message: Any) -> None:
|
||||
if not message:
|
||||
return
|
||||
segment = message[0]
|
||||
if getattr(segment, "type", None) != "text":
|
||||
return
|
||||
data = getattr(segment, "data", None)
|
||||
if not isinstance(data, dict):
|
||||
return
|
||||
data["text"] = str(data.get("text", "")).lstrip("\xa0").lstrip()
|
||||
if not data["text"]:
|
||||
del message[0]
|
||||
|
||||
|
||||
def _is_self_mention_segment(segment: Any, bot: Bot) -> bool:
|
||||
segment_type = getattr(segment, "type", None)
|
||||
if segment_type not in {"mention_user", "group_mention_user"}:
|
||||
return False
|
||||
data = getattr(segment, "data", None)
|
||||
if not isinstance(data, dict):
|
||||
return False
|
||||
if data.get("is_you") or data.get("is_bot"):
|
||||
return True
|
||||
user_id = data.get("user_id")
|
||||
return user_id is not None and str(user_id) == str(bot.self_id)
|
||||
|
||||
|
||||
def _ensure_nonempty_qq_message(message: Any) -> None:
|
||||
if message:
|
||||
return
|
||||
with contextlib.suppress(Exception):
|
||||
message_module = importlib.import_module("nonebot.adapters.qq.message")
|
||||
MessageSegment = getattr(message_module, "MessageSegment")
|
||||
message.append(MessageSegment.text(""))
|
||||
|
||||
|
||||
def _normalize_qq_self_at_message(bot: Bot, event: Event) -> None:
|
||||
"""Remove the leading bot mention left by QQ official @ events.
|
||||
|
||||
nonebot-adapter-qq's @ event branches can mark ``to_me`` but keep the
|
||||
synthetic leading mention segment. Alconna command heads then see
|
||||
``<@bot>命令`` and fail to match, while regular ``event.get_plaintext()``
|
||||
still looks correct. Normalizing here keeps the runtime behavior aligned
|
||||
with OneBot/standard to_me preprocessing without changing plugin code or
|
||||
database state.
|
||||
"""
|
||||
if event.__class__.__name__ not in {
|
||||
"AtMessageCreateEvent",
|
||||
"GroupAtMessageCreateEvent",
|
||||
}:
|
||||
return
|
||||
adapter = getattr(bot, "adapter", None)
|
||||
adapter_name = ""
|
||||
get_name = getattr(adapter, "get_name", None)
|
||||
if callable(get_name):
|
||||
with contextlib.suppress(Exception):
|
||||
adapter_name = str(get_name()).lower()
|
||||
if adapter_name != "qq":
|
||||
return
|
||||
with contextlib.suppress(Exception):
|
||||
message = event.get_message()
|
||||
if not message or not _is_self_mention_segment(message[0], bot):
|
||||
return
|
||||
message.pop(0)
|
||||
setattr(event, "to_me", True)
|
||||
_trim_leading_text(message)
|
||||
_ensure_nonempty_qq_message(message)
|
||||
|
||||
|
||||
async def patched_handle_event(
|
||||
bot: Bot,
|
||||
event: Event,
|
||||
deps: HandleEventSelectorDependencies,
|
||||
) -> None:
|
||||
_normalize_qq_self_at_message(bot, event)
|
||||
show_log = True
|
||||
escape_tag = getattr(nb_message, "escape_tag")
|
||||
logger_ = getattr(nb_message, "logger")
|
||||
@@ -153,12 +221,6 @@ async def patched_handle_event(
|
||||
|
||||
if activation_result is not None:
|
||||
selected_matchers = activation_result.selected
|
||||
deps.record_activation_result(activation_result)
|
||||
deps.debug_activation_shadow(
|
||||
priority=priority,
|
||||
activation_result=activation_result,
|
||||
context=dispatch_context,
|
||||
)
|
||||
if (
|
||||
activation_result.candidate_count
|
||||
> deps.overload_selected_threshold
|
||||
@@ -186,12 +248,6 @@ async def patched_handle_event(
|
||||
except Exception:
|
||||
single_result = None
|
||||
if single_result is not None:
|
||||
deps.record_activation_result(single_result)
|
||||
deps.debug_activation_shadow(
|
||||
priority=priority,
|
||||
activation_result=single_result,
|
||||
context=dispatch_context,
|
||||
)
|
||||
deps.merge_dispatch_budget(
|
||||
priority_budget,
|
||||
single_budget,
|
||||
@@ -238,6 +294,7 @@ def install_handle_event_selector(deps: HandleEventSelectorDependencies) -> None
|
||||
for module_name in (
|
||||
"nonebot.adapters.onebot.v11.bot",
|
||||
"nonebot.adapters.onebot.v12.bot",
|
||||
"nonebot.adapters.qq.bot",
|
||||
"onebug.mixin.process",
|
||||
):
|
||||
with contextlib.suppress(Exception):
|
||||
|
||||
Reference in New Issue
Block a user