diff --git a/zhenxun/builtin_plugins/admin/ban/__init__.py b/zhenxun/builtin_plugins/admin/ban/__init__.py index 32e97f2d..7c356bcc 100644 --- a/zhenxun/builtin_plugins/admin/ban/__init__.py +++ b/zhenxun/builtin_plugins/admin/ban/__init__.py @@ -87,13 +87,17 @@ __plugin_meta__ = PluginMetadata( smart_tools=[ AICallableTag( name="call_ban", - description="某人多次(至少三次)辱骂你,调用此方法进行封禁", + description="如果你讨厌某个人(好感度过低并让你感到困扰,或者多次辱骂你),调用此方法进行封禁,调用该方法后要告知用户被封禁和原因", parameters=AICallableParam( type="object", properties={ "user_id": AICallableProperties( type="string", description="用户的id" ), + "duration": AICallableProperties( + type="integer", + description="封禁时长(选择的值只能是1-360),单位为分钟,如果频繁触发,按情况增加", + ), }, required=["user_id"], ), diff --git a/zhenxun/builtin_plugins/admin/ban/_data_source.py b/zhenxun/builtin_plugins/admin/ban/_data_source.py index 60ee8efa..5b67191b 100644 --- a/zhenxun/builtin_plugins/admin/ban/_data_source.py +++ b/zhenxun/builtin_plugins/admin/ban/_data_source.py @@ -9,14 +9,14 @@ from zhenxun.services.log import logger from zhenxun.utils.image_utils import BuildImage, ImageTemplate -async def call_ban(user_id: str): +async def call_ban(user_id: str, duration: int = 1): """调用ban 参数: user_id: 用户id """ - await BanConsole.ban(user_id, None, 9, 60 * 12) - logger.info("辱骂次数过多,已将用户加入黑名单...", "ban", session=user_id) + await BanConsole.ban(user_id, None, 9, duration * 60) + logger.info("被讨厌了,已将用户加入黑名单...", "ban", session=user_id) class BanManage: diff --git a/zhenxun/builtin_plugins/help/zhenxun_help.py b/zhenxun/builtin_plugins/help/zhenxun_help.py index b96d3c59..444a7113 100644 --- a/zhenxun/builtin_plugins/help/zhenxun_help.py +++ b/zhenxun/builtin_plugins/help/zhenxun_help.py @@ -20,6 +20,12 @@ class Item(BaseModel): """插件名称""" commands: list[str] """插件命令""" + id: str + """插件id""" + status: bool + """插件状态""" + has_superuser_help: bool + """插件是否拥有超级用户帮助""" def __handle_item( @@ -39,23 +45,36 @@ def __handle_item( 返回: Item: Item """ + status = True + has_superuser_help = False + nb_plugin = nonebot.get_plugin_by_module_name(plugin.module_path) + if nb_plugin and nb_plugin.metadata and nb_plugin.metadata.extra: + extra_data = PluginExtraData(**nb_plugin.metadata.extra) + if extra_data.superuser_help: + has_superuser_help = True if not plugin.status: if plugin.block_type == BlockType.ALL: - plugin.name = f"{plugin.name}(不可用)" + status = False elif group and plugin.block_type == BlockType.GROUP: - plugin.name = f"{plugin.name}(不可用)" + status = False elif not group and plugin.block_type == BlockType.PRIVATE: - plugin.name = f"{plugin.name}(不可用)" + status = False elif group and f"{plugin.module}," in group.block_plugin: - plugin.name = f"{plugin.name}(不可用)" + status = False elif bot and f"{plugin.module}," in bot.block_plugins: - plugin.name = f"{plugin.name}(不可用)" + status = False commands = [] nb_plugin = nonebot.get_plugin_by_module_name(plugin.module_path) if is_detail and nb_plugin and nb_plugin.metadata and nb_plugin.metadata.extra: extra_data = PluginExtraData(**nb_plugin.metadata.extra) commands = [cmd.command for cmd in extra_data.commands] - return Item(plugin_name=f"{plugin.id}-{plugin.name}", commands=commands) + return Item( + plugin_name=plugin.name, + commands=commands, + id=str(plugin.id), + status=status, + has_superuser_help=has_superuser_help, + ) def build_plugin_data(classify: dict[str, list[Item]]) -> list[dict[str, str]]: @@ -160,6 +179,7 @@ async def build_zhenxun_image( width = int(637 * 1.5) if is_detail else 637 title_font = int(53 * 1.5) if is_detail else 53 tip_font = int(19 * 1.5) if is_detail else 19 + plugin_count = sum(len(plugin["items"]) for plugin in plugin_list) return await template_to_pic( template_path=str((TEMPLATE_PATH / "ss_menu").absolute()), template_name="main.html", @@ -170,6 +190,7 @@ async def build_zhenxun_image( "width": width, "font_size": (title_font, tip_font), "is_detail": is_detail, + "plugin_count": plugin_count, } }, pages={ diff --git a/zhenxun/builtin_plugins/hooks/auth/auth_ban.py b/zhenxun/builtin_plugins/hooks/auth/auth_ban.py index 3b588cf1..76b19370 100644 --- a/zhenxun/builtin_plugins/hooks/auth/auth_ban.py +++ b/zhenxun/builtin_plugins/hooks/auth/auth_ban.py @@ -72,7 +72,9 @@ async def is_ban(user_id: str | None, group_id: str | None) -> int: if user_id and group_id: tasks.append(ban_dao.safe_get_or_none(user_id=user_id, group_id=group_id)) if user_id: - tasks.append(ban_dao.safe_get_or_none(user_id=user_id, group_id="")) + tasks.append( + ban_dao.safe_get_or_none(user_id=user_id, group_id__isnull=True) + ) # 等待所有查询完成,添加超时控制 if tasks: diff --git a/zhenxun/configs/utils/models.py b/zhenxun/configs/utils/models.py index 1872d1ce..bc850cc4 100644 --- a/zhenxun/configs/utils/models.py +++ b/zhenxun/configs/utils/models.py @@ -65,7 +65,7 @@ class RegisterConfig(BaseModel): """配置注解""" default_value: Any | None = None """默认值""" - type: object = str + type: object = None """参数类型""" arg_parser: Callable | None = None """参数解析""" @@ -155,8 +155,6 @@ class AICallableProperties(BaseModel): """参数类型""" description: str """参数描述""" - enums: list[str] | None = None - """参数枚举""" class AICallableParam(BaseModel):