更新封禁功能,增加封禁时长参数和描述,优化插件信息返回结构

This commit is contained in:
HibiKier 2025-07-14 13:39:42 +08:00
parent defe99e66c
commit ec16457555
5 changed files with 39 additions and 14 deletions

View File

@ -87,13 +87,17 @@ __plugin_meta__ = PluginMetadata(
smart_tools=[ smart_tools=[
AICallableTag( AICallableTag(
name="call_ban", name="call_ban",
description="某人多次(至少三次)辱骂你,调用此方法进行封禁", description="如果你讨厌(好感度过低并让你感到困扰,或者多次辱骂你,调用此方法进行封禁,调用该方法后要告知用户被封禁和原因",
parameters=AICallableParam( parameters=AICallableParam(
type="object", type="object",
properties={ properties={
"user_id": AICallableProperties( "user_id": AICallableProperties(
type="string", description="用户的id" type="string", description="用户的id"
), ),
"duration": AICallableProperties(
type="integer",
description="封禁时长选择的值只能是1-360单位为分钟如果频繁触发按情况增加",
),
}, },
required=["user_id"], required=["user_id"],
), ),

View File

@ -9,14 +9,14 @@ from zhenxun.services.log import logger
from zhenxun.utils.image_utils import BuildImage, ImageTemplate 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 """调用ban
参数: 参数:
user_id: 用户id user_id: 用户id
""" """
await BanConsole.ban(user_id, None, 9, 60 * 12) await BanConsole.ban(user_id, None, 9, duration * 60)
logger.info("辱骂次数过多,已将用户加入黑名单...", "ban", session=user_id) logger.info("被讨厌了,已将用户加入黑名单...", "ban", session=user_id)
class BanManage: class BanManage:

View File

@ -20,6 +20,12 @@ class Item(BaseModel):
"""插件名称""" """插件名称"""
commands: list[str] commands: list[str]
"""插件命令""" """插件命令"""
id: str
"""插件id"""
status: bool
"""插件状态"""
has_superuser_help: bool
"""插件是否拥有超级用户帮助"""
def __handle_item( def __handle_item(
@ -39,23 +45,36 @@ def __handle_item(
返回: 返回:
Item: 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 not plugin.status:
if plugin.block_type == BlockType.ALL: if plugin.block_type == BlockType.ALL:
plugin.name = f"{plugin.name}(不可用)" status = False
elif group and plugin.block_type == BlockType.GROUP: elif group and plugin.block_type == BlockType.GROUP:
plugin.name = f"{plugin.name}(不可用)" status = False
elif not group and plugin.block_type == BlockType.PRIVATE: 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: 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: elif bot and f"{plugin.module}," in bot.block_plugins:
plugin.name = f"{plugin.name}(不可用)" status = False
commands = [] commands = []
nb_plugin = nonebot.get_plugin_by_module_name(plugin.module_path) 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: if is_detail and nb_plugin and nb_plugin.metadata and nb_plugin.metadata.extra:
extra_data = PluginExtraData(**nb_plugin.metadata.extra) extra_data = PluginExtraData(**nb_plugin.metadata.extra)
commands = [cmd.command for cmd in extra_data.commands] 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]]: 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 width = int(637 * 1.5) if is_detail else 637
title_font = int(53 * 1.5) if is_detail else 53 title_font = int(53 * 1.5) if is_detail else 53
tip_font = int(19 * 1.5) if is_detail else 19 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( return await template_to_pic(
template_path=str((TEMPLATE_PATH / "ss_menu").absolute()), template_path=str((TEMPLATE_PATH / "ss_menu").absolute()),
template_name="main.html", template_name="main.html",
@ -170,6 +190,7 @@ async def build_zhenxun_image(
"width": width, "width": width,
"font_size": (title_font, tip_font), "font_size": (title_font, tip_font),
"is_detail": is_detail, "is_detail": is_detail,
"plugin_count": plugin_count,
} }
}, },
pages={ pages={

View File

@ -72,7 +72,9 @@ async def is_ban(user_id: str | None, group_id: str | None) -> int:
if user_id and group_id: if user_id and group_id:
tasks.append(ban_dao.safe_get_or_none(user_id=user_id, group_id=group_id)) tasks.append(ban_dao.safe_get_or_none(user_id=user_id, group_id=group_id))
if user_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: if tasks:

View File

@ -65,7 +65,7 @@ class RegisterConfig(BaseModel):
"""配置注解""" """配置注解"""
default_value: Any | None = None default_value: Any | None = None
"""默认值""" """默认值"""
type: object = str type: object = None
"""参数类型""" """参数类型"""
arg_parser: Callable | None = None arg_parser: Callable | None = None
"""参数解析""" """参数解析"""
@ -155,8 +155,6 @@ class AICallableProperties(BaseModel):
"""参数类型""" """参数类型"""
description: str description: str
"""参数描述""" """参数描述"""
enums: list[str] | None = None
"""参数枚举"""
class AICallableParam(BaseModel): class AICallableParam(BaseModel):