From c2f677911da6eeff985fc419eb3c5cf779f545c1 Mon Sep 17 00:00:00 2001 From: passthem Date: Sat, 7 Mar 2026 18:36:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=BA=9B=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=9B=AE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 2 +- konabot/plugins/bilibili_fetch/__init__.py | 14 +++--- konabot/plugins/handle_text/__init__.py | 4 +- konabot/plugins/handle_text/base.py | 4 +- .../handle_text/handlers/ai_handlers.py | 45 ++++++++++++------- konabot/plugins/mc_count_player/__init__.py | 20 ++++++--- 6 files changed, 55 insertions(+), 34 deletions(-) diff --git a/.drone.yml b/.drone.yml index c4d44cd..bdc5658 100644 --- a/.drone.yml +++ b/.drone.yml @@ -39,7 +39,7 @@ steps: commands: - docker run --rm gitea.service.jazzwhom.top/mttu-developers/konabot:nightly-${DRONE_COMMIT_SHA} python scripts/test_plugin_load.py - docker run --rm gitea.service.jazzwhom.top/mttu-developers/konabot:nightly-${DRONE_COMMIT_SHA} python scripts/test_playwright.py - - docker run --rm gitea.service.jazzwhom.top/mttu-developers/konabot:nightly-${DRONE_COMMIT_SHA} python -m pytest --cov=./konabot/ --cov-report term-missing:skip-covered + - docker run -v ./tests:/app/tests:ro --rm gitea.service.jazzwhom.top/mttu-developers/konabot:nightly-${DRONE_COMMIT_SHA} python -m pytest --cov=./konabot/ --cov-report term-missing:skip-covered - name: 发送构建结果到 ntfy image: parrazam/drone-ntfy when: diff --git a/konabot/plugins/bilibili_fetch/__init__.py b/konabot/plugins/bilibili_fetch/__init__.py index 2695403..6598f42 100644 --- a/konabot/plugins/bilibili_fetch/__init__.py +++ b/konabot/plugins/bilibili_fetch/__init__.py @@ -1,12 +1,14 @@ import re from nonebot import get_plugin_config, on_message +from nonebot.rule import Rule from nonebot_plugin_alconna import Reference, Reply, UniMsg from nonebot.adapters import Event -from nonebot.adapters.onebot.v11.event import GroupMessageEvent as OB11GroupEvent from pydantic import BaseModel +from konabot.common.permsys import require_permission + class Config(BaseModel): bilifetch_enabled_groups: list[int] = [] @@ -19,11 +21,7 @@ pattern = ( ) -def _rule(msg: UniMsg, evt: Event) -> bool: - if isinstance(evt, OB11GroupEvent): - if evt.group_id not in config.bilifetch_enabled_groups: - return False - +def _rule(msg: UniMsg) -> bool: to_search = msg.exclude(Reply, Reference).dump(json=True) to_search2 = msg.exclude(Reply, Reference).extract_plain_text() if not re.search(pattern, to_search) and not re.search(pattern, to_search2): @@ -31,11 +29,11 @@ def _rule(msg: UniMsg, evt: Event) -> bool: return True -matcher_fix = on_message(rule=_rule) +matcher_fix = on_message(rule=Rule(_rule) & require_permission("bilifetch")) + @matcher_fix.handle() async def _(event: Event): from nonebot_plugin_analysis_bilibili import handle_analysis await handle_analysis(event) - diff --git a/konabot/plugins/handle_text/__init__.py b/konabot/plugins/handle_text/__init__.py index c8da6d1..3437d3f 100644 --- a/konabot/plugins/handle_text/__init__.py +++ b/konabot/plugins/handle_text/__init__.py @@ -70,8 +70,8 @@ async def _(msg: UniMsg, evt: Event, bot: Bot, target: DepLongTaskTarget): await target.send_message(res) return - env = TextHandlerEnvironment(is_trusted=False) - results = await runner.run_pipeline(res, istream or None, env) + env = TextHandlerEnvironment(is_trusted=False, event=evt) + results = await runner.run_pipeline(res, istream or None, evt, env) # 检查是否有错误 for r in results: diff --git a/konabot/plugins/handle_text/base.py b/konabot/plugins/handle_text/base.py index ede362c..90d144a 100644 --- a/konabot/plugins/handle_text/base.py +++ b/konabot/plugins/handle_text/base.py @@ -7,11 +7,13 @@ from string import whitespace from typing import cast from loguru import logger +from nonebot.adapters import Event @dataclass class TextHandlerEnvironment: is_trusted: bool + event: Event | None = None buffers: dict[str, str] = field(default_factory=dict) @@ -287,7 +289,7 @@ class PipelineRunner: env: TextHandlerEnvironment | None = None, ) -> list[TextHandleResult]: if env is None: - env = TextHandlerEnvironment(is_trusted=False, buffers={}) + env = TextHandlerEnvironment(is_trusted=False, event=None, buffers={}) results: list[TextHandleResult] = [] diff --git a/konabot/plugins/handle_text/handlers/ai_handlers.py b/konabot/plugins/handle_text/handlers/ai_handlers.py index 72ca29a..8a65c22 100644 --- a/konabot/plugins/handle_text/handlers/ai_handlers.py +++ b/konabot/plugins/handle_text/handlers/ai_handlers.py @@ -1,36 +1,51 @@ from typing import Any, cast from konabot.common.llm import get_llm -from konabot.plugins.handle_text.base import TextHandler, TextHandlerEnvironment, TextHandleResult +from konabot.common.permsys import perm_manager +from konabot.plugins.handle_text.base import ( + TextHandler, + TextHandlerEnvironment, + TextHandleResult, +) class THQwen(TextHandler): name = "qwen" - async def handle(self, env: TextHandlerEnvironment, istream: str | None, args: list[str]) -> TextHandleResult: + async def handle( + self, env: TextHandlerEnvironment, istream: str | None, args: list[str] + ) -> TextHandleResult: + pm = perm_manager() + if env.event is None or not pm.check_has_permission(env.event, "textfx.qwen"): + return TextHandleResult( + code=1, + ostream="这里暂未开启 AI 功能", + ) + llm = get_llm() messages = [] if istream is not None: - messages.append({ - "role": "user", - "content": istream - }) + messages.append({"role": "user", "content": istream}) if len(args) > 0: - message = ' '.join(args) - messages.append({ - "role": "user", - "content": message, - }) + message = " ".join(args) + messages.append( + { + "role": "user", + "content": message, + } + ) if len(messages) == 0: return TextHandleResult( code=1, ostream="使用方法:qwen <提示词>", ) - messages = [{ - "role": "system", - "content": "除非用户要求,请尽可能短点回答。另外,当前环境不支持 Markdown 语法,如果可以,请使用纯文本回答" - }] + messages + messages = [ + { + "role": "system", + "content": "除非用户要求,请尽可能短点回答。另外,当前环境不支持 Markdown 语法,如果可以,请使用纯文本回答", + } + ] + messages result = await llm.chat(cast(Any, messages)) content = result.content if content is None: diff --git a/konabot/plugins/mc_count_player/__init__.py b/konabot/plugins/mc_count_player/__init__.py index 433a8c4..178789e 100644 --- a/konabot/plugins/mc_count_player/__init__.py +++ b/konabot/plugins/mc_count_player/__init__.py @@ -4,11 +4,16 @@ import mcstatus from nonebot import on_command from nonebot.adapters import Event from nonebot_plugin_alconna import UniMessage -from konabot.common.nb.is_admin import is_admin from mcstatus.responses import JavaStatusResponse +from konabot.common.permsys import require_permission -cmd = on_command("宾几人", aliases=set(("宾人数", "mcbingo")), rule=is_admin) + +cmd = on_command( + "宾几人", + aliases=set(("宾人数", "mcbingo")), + rule=require_permission("minecraft.bingo.check"), +) def parse_status(motd: str) -> str: @@ -48,10 +53,11 @@ async def _(evt: Event): *map(lambda s: s[0].async_status(), servers), return_exceptions=True, ) - messages = "\n".join(( - dump_server_status(n, r) - for n, r in zip(map(lambda s: s[1], servers), responses) - )) + messages = "\n".join( + ( + dump_server_status(n, r) + for n, r in zip(map(lambda s: s[1], servers), responses) + ) + ) await UniMessage.text(messages).finish(evt, at_sender=False) -