From ac234544a36a9c8434c456ef6322f2d520c779fb Mon Sep 17 00:00:00 2001 From: snowy Date: Tue, 26 Mar 2024 22:33:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8F=92=E4=BB=B6=E5=90=AF=E7=94=A8?= =?UTF-8?q?=E5=81=9C=E7=94=A8=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- liteyuki/liteyuki_main/loader.py | 2 +- liteyuki/plugins/liteyuki_npm/common.py | 7 +++-- liteyuki/plugins/liteyuki_npm/manager.py | 35 +++++++++++++++++------- liteyuki/utils/data_manager.py | 5 ++-- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/liteyuki/liteyuki_main/loader.py b/liteyuki/liteyuki_main/loader.py index 20c3e36..6d3cac1 100644 --- a/liteyuki/liteyuki_main/loader.py +++ b/liteyuki/liteyuki_main/loader.py @@ -19,7 +19,7 @@ init_log() installed_plugins: list[InstalledPlugin] = plugin_db.all(InstalledPlugin()) if installed_plugins: for installed_plugin in installed_plugins: - if not installed_plugin.liteyuki and not check_for_package(installed_plugin.module_name): + if not check_for_package(installed_plugin.module_name): nonebot.logger.error(f"{installed_plugin.module_name} not installed, but in loading database. please run `npm fixup` in chat to reinstall it.") else: nonebot.load_plugin(installed_plugin.module_name) diff --git a/liteyuki/plugins/liteyuki_npm/common.py b/liteyuki/plugins/liteyuki_npm/common.py index 51e7da7..27559a5 100644 --- a/liteyuki/plugins/liteyuki_npm/common.py +++ b/liteyuki/plugins/liteyuki_npm/common.py @@ -5,7 +5,7 @@ import aiofiles import nonebot.plugin from liteyuki.utils.data import Database, LiteModel -from liteyuki.utils.data_manager import Group, InstalledPlugin, User, group_db, plugin_db, user_db +from liteyuki.utils.data_manager import GlobalPlugin, Group, InstalledPlugin, User, group_db, plugin_db, user_db from liteyuki.utils.ly_typing import T_MessageEvent LNPM_COMMAND_START = "lnpm" @@ -90,11 +90,12 @@ def get_plugin_session_enable(event: T_MessageEvent, plugin_module_name: str) -> def get_plugin_global_enable(plugin_module_name: str) -> bool: + loaded_plugin = nonebot.plugin.get_plugin_by_module_name(plugin_module_name) return plugin_db.first( - InstalledPlugin(), + GlobalPlugin(), "module_name = ?", plugin_module_name, - default=InstalledPlugin(module_name=plugin_module_name, enabled=True)).enabled + default=GlobalPlugin(module_name=plugin_module_name, enabled=True)).enabled def get_plugin_can_be_toggle(plugin_module_name: str) -> bool: diff --git a/liteyuki/plugins/liteyuki_npm/manager.py b/liteyuki/plugins/liteyuki_npm/manager.py index 843c331..ff2ceef 100644 --- a/liteyuki/plugins/liteyuki_npm/manager.py +++ b/liteyuki/plugins/liteyuki_npm/manager.py @@ -1,18 +1,21 @@ import os import nonebot.plugin -from nonebot import on_command, require -from nonebot.exception import FinishedException +from nonebot import require +from nonebot.exception import FinishedException, IgnoredException +from nonebot.internal.adapter import Event from nonebot.internal.matcher import Matcher +from nonebot.adapters import Bot from nonebot.message import run_preprocessor from nonebot.permission import SUPERUSER +from nonebot.plugin import Plugin -from liteyuki.utils.data_manager import Group, InstalledPlugin, User, group_db, plugin_db, user_db +from liteyuki.utils.data_manager import GlobalPlugin, Group, InstalledPlugin, User, group_db, plugin_db, user_db +from liteyuki.utils.language import get_user_lang +from liteyuki.utils.ly_typing import T_Bot, T_MessageEvent from liteyuki.utils.message import Markdown as md, send_markdown from liteyuki.utils.permission import GROUP_ADMIN, GROUP_OWNER -from liteyuki.utils.ly_typing import T_Bot, T_MessageEvent -from liteyuki.utils.language import get_user_lang -from .common import get_plugin_can_be_toggle, get_plugin_global_enable, get_plugin_session_enable, get_plugin_default_enable +from .common import get_plugin_can_be_toggle, get_plugin_default_enable, get_plugin_global_enable, get_plugin_session_enable from .installer import get_store_plugin, npm_update require("nonebot_plugin_alconna") @@ -197,7 +200,7 @@ async def _(result: Arparma, event: T_MessageEvent, bot: T_Bot): ulang.get("npm.plugin_already", NAME=plugin_module_name, STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable"))) try: - plugin = plugin_db.first(InstalledPlugin(), "module_name = ?", plugin_module_name, default=InstalledPlugin(module_name=plugin_module_name)) + plugin = plugin_db.first(GlobalPlugin(), "module_name = ?", plugin_module_name, default=GlobalPlugin(module_name=plugin_module_name)) if toggle: plugin.enabled = True else: @@ -220,8 +223,20 @@ async def _(result: Arparma, event: T_MessageEvent, bot: T_Bot): STATUS=ulang.get("npm.enable") if toggle else ulang.get("npm.disable")) ) + @run_preprocessor -async def _(event: T_MessageEvent, matcher: Matcher): - plugin = matcher.plugin +async def pre_handle(event: Event, matcher: Matcher): + plugin: Plugin = matcher.plugin + plugin_global_enable = get_plugin_global_enable(plugin.module_name) + if not plugin_global_enable: + raise IgnoredException("Plugin disabled globally") + if event.get_type() == "message": + plugin_session_enable = get_plugin_session_enable(event, plugin.module_name) + if not plugin_session_enable: + raise IgnoredException("Plugin disabled in session") + + +@Bot.on_calling_api +async def _(bot: Bot, api: str, data: dict[str, any]): # TODO 插件启用/停用检查hook - nonebot.logger.info(f"Plugin Callapi: {plugin.module_name}") + nonebot.logger.info(f"Plugin Callapi: {api}: {data}") diff --git a/liteyuki/utils/data_manager.py b/liteyuki/utils/data_manager.py index 14fa0a0..71d1ec4 100644 --- a/liteyuki/utils/data_manager.py +++ b/liteyuki/utils/data_manager.py @@ -31,8 +31,6 @@ class Group(LiteModel): class InstalledPlugin(LiteModel): - liteyuki: bool = Field(True, alias="liteyuki") # 是否为LiteYuki插件 - enabled: bool = Field(True, alias="enabled") # 全局启用 TABLE_NAME = "installed_plugin" module_name: str = Field(str(), alias="module_name") version: str = Field(str(), alias="version") @@ -40,6 +38,7 @@ class InstalledPlugin(LiteModel): class GlobalPlugin(LiteModel): TABLE_NAME = "global_plugin" + liteyuki: bool = Field(True, alias="liteyuki") # 是否为LiteYuki插件 module_name: str = Field(str(), alias="module_name") enabled: bool = Field(True, alias="enabled") @@ -48,5 +47,5 @@ def auto_migrate(): print("Migrating databases...") user_db.auto_migrate(User()) group_db.auto_migrate(Group()) - plugin_db.auto_migrate(InstalledPlugin()) + plugin_db.auto_migrate(InstalledPlugin(), GlobalPlugin()) common_db.auto_migrate(GlobalPlugin())