diff --git a/zhenxun/builtin_plugins/admin/plugin_switch/__init__.py b/zhenxun/builtin_plugins/admin/plugin_switch/__init__.py index c0af3544..81a7bff8 100644 --- a/zhenxun/builtin_plugins/admin/plugin_switch/__init__.py +++ b/zhenxun/builtin_plugins/admin/plugin_switch/__init__.py @@ -1,24 +1,13 @@ from nonebot.adapters import Bot from nonebot.plugin import PluginMetadata -from nonebot_plugin_alconna import ( - Alconna, - Args, - Arparma, - Match, - Option, - Subcommand, - on_alconna, - store_true, -) +from nonebot_plugin_alconna import Arparma, Match from nonebot_plugin_saa import Image, Text from nonebot_plugin_session import EventSession -from requests import session from zhenxun.configs.config import Config from zhenxun.configs.utils import PluginExtraData, RegisterConfig from zhenxun.services.log import logger from zhenxun.utils.enum import BlockType, PluginType -from zhenxun.utils.rules import admin_check, ensure_group from ._data_source import PluginManage, build_plugin, build_task from .command import _group_status_matcher, _status_matcher @@ -54,44 +43,7 @@ __plugin_meta__ = PluginMetadata( ) -# _status_matcher = on_alconna( -# Alconna( -# "switch", -# Option("-t|--task", action=store_true, help_text="被动技能"), -# Subcommand( -# "open", -# Args["name", str], -# Option( -# "-g|--group", -# Args["group_id", str], -# ), -# ), -# Subcommand( -# "close", -# Args["name", str], -# Option( -# "-t|--type", -# Args["block_type", ["all", "a", "private", "p", "group", "g"]], -# ), -# Option( -# "-g|--group", -# Args["group_id", str], -# ), -# ), -# ), -# rule=admin_check("admin_bot_manage", "CHANGE_GROUP_SWITCH_LEVEL"), -# priority=5, -# block=True, -# ) - -# # TODO: shortcut - -# _group_status_matcher = on_alconna( -# Alconna("group-status", Args["status", ["sleep", "wake"]]), -# rule=admin_check("admin_bot_manage", "CHANGE_GROUP_SWITCH_LEVEL") & ensure_group, -# priority=5, -# block=True, -# ) +# TODO: shortcut @_status_matcher.assign("$main") diff --git a/zhenxun/builtin_plugins/admin/plugin_switch/_data_source.py b/zhenxun/builtin_plugins/admin/plugin_switch/_data_source.py index 8137206f..b88cd607 100644 --- a/zhenxun/builtin_plugins/admin/plugin_switch/_data_source.py +++ b/zhenxun/builtin_plugins/admin/plugin_switch/_data_source.py @@ -249,8 +249,8 @@ class PluginManage: if plugin: if group_id: if group := await GroupConsole.get_or_none(group_id=group_id): - if f"super:{plugin_name}," not in group.block_plugin: - group.block_plugin += f"super:{plugin_name}," + if f"super:{plugin.module}," not in group.block_plugin: + group.block_plugin += f"super:{plugin.module}," await group.save(update_fields=["block_plugin"]) return ( f"已成功关闭群组 {group.group_name} 的 {plugin_name} 功能!" @@ -263,5 +263,10 @@ class PluginManage: if not block_type: return f"已成功将 {plugin.name} 全局启用!" else: - return f"已成功将 {plugin.name} 全局关闭!" + if block_type == BlockType.ALL: + return f"已成功将 {plugin.name} 全局关闭!" + if block_type == BlockType.GROUP: + return f"已成功将 {plugin.name} 全局群组关闭!" + if block_type == BlockType.PRIVATE: + return f"已成功将 {plugin.name} 全局私聊关闭!" return "没有找到这个功能喔..." diff --git a/zhenxun/builtin_plugins/admin/plugin_switch/command.py b/zhenxun/builtin_plugins/admin/plugin_switch/command.py index ec0c8513..0ed95b66 100644 --- a/zhenxun/builtin_plugins/admin/plugin_switch/command.py +++ b/zhenxun/builtin_plugins/admin/plugin_switch/command.py @@ -19,7 +19,7 @@ _status_matcher = on_alconna( Args["name", [str, int]], Option( "-g|--group", - Args["group_id", str], + Args["group", str], ), ), Subcommand( @@ -31,7 +31,7 @@ _status_matcher = on_alconna( ), Option( "-g|--group", - Args["group_id", str], + Args["group", str], ), ), ), diff --git a/zhenxun/builtin_plugins/hooks/_auth_checker.py b/zhenxun/builtin_plugins/hooks/_auth_checker.py index 03a33ebd..2aef17c1 100644 --- a/zhenxun/builtin_plugins/hooks/_auth_checker.py +++ b/zhenxun/builtin_plugins/hooks/_auth_checker.py @@ -145,7 +145,7 @@ class LimitManage: key_type = user_id if group_id and limit.watch_type == LimitWatchType.GROUP: key_type = channel_id or group_id - if is_limit and limiter.check(key_type): + if is_limit and not limiter.check(key_type): if limit.result: await Text(limit.result).send() logger.debug( @@ -153,7 +153,7 @@ class LimitManage: "HOOK", session=session, ) - raise IgnoredException(f"{limit.module} 正在cd中...") + raise IgnoredException(f"{limit.module} 正在限制中...") else: if isinstance(limiter, FreqLimiter): limiter.start_cd(key_type) @@ -207,6 +207,8 @@ class AuthChecker: if user_id and matcher.plugin and (module := matcher.plugin.name): user = await UserConsole.get_user(user_id, session.platform) if plugin := await PluginInfo.get_or_none(module=module): + if plugin.plugin_type == PluginType.HIDDEN: + return try: cost_gold = await self.auth_cost(user, plugin, session) if session.id1 in bot.config.superusers: @@ -277,6 +279,19 @@ class AuthChecker: channel_id = None if user_id: if group_id: + if await GroupConsole.is_super_block_plugin( + group_id, plugin.module, channel_id + ): + """超级用户群组插件状态""" + if self._flmt_s.check(group_id or user_id): + self._flmt_s.start_cd(group_id or user_id) + await Text("超级管理员禁用了该群此功能...").send(reply=True) + logger.debug( + f"{plugin.name}({plugin.module}) 超级管理员禁用了该群此功能...", + "HOOK", + session=session, + ) + raise IgnoredException("超级管理员禁用了该群此功能...") if await GroupConsole.is_block_plugin( group_id, plugin.module, channel_id ): @@ -290,42 +305,33 @@ class AuthChecker: session=session, ) raise IgnoredException("该群未开启此功能...") - if await GroupConsole.is_super_block_plugin( - group_id, plugin.module, channel_id - ): - """群组插件状态""" - if self._flmt_s.check(group_id or user_id): - self._flmt_s.start_cd(group_id or user_id) - await Text("超级管理员禁用了该群此功能...").send(reply=True) - logger.debug( - f"{plugin.name}({plugin.module}) 超级管理员禁用了该群此功能...", - "HOOK", - session=session, - ) - raise IgnoredException("超级管理员禁用了该群此功能...") - # 群聊禁用 if not plugin.status and plugin.block_type == BlockType.GROUP: + """全局群组禁用""" try: if self._flmt_c.check(group_id): self._flmt_c.start_cd(group_id) - await Text("该功能在群聊中已被禁用...").send(reply=True) - except Exception: - pass + await Text("该功能在群组中已被禁用...").send(reply=True) + except Exception as e: + logger.error( + "auth_plugin 发送消息失败", "HOOK", session=session, e=e + ) logger.debug( - f"{plugin.name}({plugin.module}) 该插件在群聊中已被禁用...", + f"{plugin.name}({plugin.module}) 该插件在群组中已被禁用...", "HOOK", session=session, ) - raise IgnoredException("该插件在群聊中已被禁用...") + raise IgnoredException("该插件在群组中已被禁用...") else: - # 私聊禁用 if not plugin.status and plugin.block_type == BlockType.PRIVATE: + """全局私聊禁用""" try: if self._flmt_c.check(user_id): self._flmt_c.start_cd(user_id) await Text("该功能在私聊中已被禁用...").send() - except Exception: - pass + except Exception as e: + logger.error( + "auth_admin 发送消息失败", "HOOK", session=session, e=e + ) logger.debug( f"{plugin.name}({plugin.module}) 该插件在私聊中已被禁用...", "HOOK", @@ -356,9 +362,11 @@ class AuthChecker: """ user_id = session.id1 group_id = session.id3 or session.id2 - if user_id and group_id and plugin.admin_level: + if user_id and plugin.admin_level: if group_id: - if await LevelUser.check_level(user_id, group_id, plugin.admin_level): + if not await LevelUser.check_level( + user_id, group_id, plugin.admin_level + ): try: if self._flmt.check(user_id): self._flmt.start_cd(user_id) @@ -369,9 +377,11 @@ class AuthChecker: f"你的权限不足喔,该功能需要的权限等级: {plugin.admin_level}" ), ] - ).finish(reply=True) - except Exception: - pass + ).send(reply=True) + except Exception as e: + logger.error( + "auth_admin 发送消息失败", "HOOK", session=session, e=e + ) logger.debug( f"{plugin.name}({plugin.module}) 管理员权限不足...", "HOOK", @@ -379,13 +389,15 @@ class AuthChecker: ) raise IgnoredException("管理员权限不足...") else: - if not await LevelUser.check_level(user_id, "", plugin.admin_level): + if not await LevelUser.check_level(user_id, None, plugin.admin_level): try: await Text( f"你的权限不足喔,该功能需要的权限等级: {plugin.admin_level}" - ).finish() - except Exception: - pass + ).send() + except Exception as e: + logger.error( + "auth_admin 发送消息失败", "HOOK", session=session, e=e + ) logger.debug( f"{plugin.name}({plugin.module}) 管理员权限不足...", "HOOK", @@ -406,7 +418,7 @@ class AuthChecker: if group_id := session.id3 or session.id2: text = message.extract_plain_text() group, _ = await GroupConsole.get_or_create(group_id=group_id) - if group.level < -1: + if group.level < 0: """群权限小于0""" logger.debug( f"{plugin.name}({plugin.module}) 群黑名单, 群权限-1...", @@ -441,8 +453,8 @@ class AuthChecker: """插件消耗金币不足""" try: await Text(f"金币不足..该功能需要{plugin.cost_gold}金币..").send() - except Exception: - pass + except Exception as e: + logger.error("auth_cost 发送消息失败", "HOOK", session=session, e=e) logger.debug( f"{plugin.name}({plugin.module}) 金币限制..该功能需要{plugin.cost_gold}金币..", "HOOK", diff --git a/zhenxun/builtin_plugins/superuser/group_manage.py b/zhenxun/builtin_plugins/superuser/group_manage.py index 1e7c9f14..0531962e 100644 --- a/zhenxun/builtin_plugins/superuser/group_manage.py +++ b/zhenxun/builtin_plugins/superuser/group_manage.py @@ -71,6 +71,8 @@ _matcher = on_alconna( block=True, ) +# TODO: shortcut + def CheckGroupId(): """ @@ -92,7 +94,7 @@ def CheckGroupId(): return Depends(dependency) -@_matcher.assign("modify-level", parameterless=[]) +@_matcher.assign("modify-level", parameterless=[CheckGroupId()]) async def _(session: EventSession, arparma: Arparma, state: T_State, level: int): gid = state["group_id"] group, _ = await GroupConsole.get_or_create(group_id=gid) @@ -108,7 +110,7 @@ async def _(session: EventSession, arparma: Arparma, state: T_State, level: int) ) -@_matcher.assign("super-handle") +@_matcher.assign("super-handle", parameterless=[CheckGroupId()]) async def _(session: EventSession, arparma: Arparma, state: T_State): gid = state["group_id"] group = await GroupConsole.get_or_none(group_id=gid) @@ -121,7 +123,7 @@ async def _(session: EventSession, arparma: Arparma, state: T_State): logger.info(f"{s}群白名单", arparma.header_result, session=session, target=gid) -@_matcher.assign("auth-handle") +@_matcher.assign("auth-handle", parameterless=[CheckGroupId()]) async def _(session: EventSession, arparma: Arparma, state: T_State): gid = state["group_id"] await GroupConsole.update_or_create( diff --git a/zhenxun/models/level_user.py b/zhenxun/models/level_user.py index da229216..c2c4fc31 100644 --- a/zhenxun/models/level_user.py +++ b/zhenxun/models/level_user.py @@ -82,7 +82,7 @@ class LevelUser(Model): return False @classmethod - async def check_level(cls, user_id: str, group_id: str, level: int) -> bool: + async def check_level(cls, user_id: str, group_id: str | None, level: int) -> bool: """检查用户权限等级是否大于 level 参数: @@ -97,9 +97,9 @@ class LevelUser(Model): if user := await cls.get_or_none(user_id=user_id, group_id=group_id): return user.user_level >= level else: - user_list = await cls.filter(user_id=user_id).all() - user = max(user_list, key=lambda x: x.user_level) - return user.user_level >= level + if user_list := await cls.filter(user_id=user_id).all(): + user = max(user_list, key=lambda x: x.user_level) + return user.user_level >= level return False @classmethod