import nonebot from arclet.alconna import Args, Option from nonebot.permission import SUPERUSER from nonebot.plugin import PluginMetadata from nonebot_plugin_alconna import Alconna, Arparma, on_alconna from nonebot_plugin_alconna.matcher import AlconnaMatcher from nonebot_plugin_saa import Image, Text from nonebot_plugin_session import EventSession from zhenxun.configs.config import Config from zhenxun.configs.path_config import DATA_PATH, IMAGE_PATH from zhenxun.configs.utils import PluginExtraData, RegisterConfig from zhenxun.models.plugin_info import PluginInfo from zhenxun.models.task_info import TaskInfo from zhenxun.services.log import logger from zhenxun.utils.enum import PluginType from zhenxun.utils.exception import EmptyError from zhenxun.utils.image_utils import ( BuildImage, build_sort_image, group_image, text2image, ) from zhenxun.utils.rules import admin_check, ensure_group __plugin_meta__ = PluginMetadata( name="超级用户帮助", description="超级用户帮助", usage=""" 超级用户帮助 """.strip(), extra=PluginExtraData( author="HibiKier", version="0.1", plugin_type=PluginType.SUPERUSER, ).dict(), ) _matcher = on_alconna( Alconna("超级用户帮助"), permission=SUPERUSER, priority=5, block=True, ) SUPERUSER_HELP_IMAGE = IMAGE_PATH / "SUPERUSER_HELP.png" if SUPERUSER_HELP_IMAGE.exists(): SUPERUSER_HELP_IMAGE.unlink() async def build_help() -> BuildImage: """构造超级用户帮助图片 异常: EmptyError: 超级用户帮助为空 返回: BuildImage: 超级用户帮助图片 """ plugin_list = await PluginInfo.filter(plugin_type=PluginType.SUPERUSER).all() data_list = [] for plugin in plugin_list: if _plugin := nonebot.get_plugin_by_module_name(plugin.module_path): if _plugin.metadata: data_list.append({"plugin": plugin, "metadata": _plugin.metadata}) font = BuildImage.load_font("HYWenHei-85W.ttf", 20) image_list = [] for data in data_list: plugin = data["plugin"] metadata = data["metadata"] try: usage = None description = None if metadata.usage: usage = await text2image( metadata.usage, padding=5, color=(255, 255, 255), font_color=(0, 0, 0), ) if metadata.description: description = await text2image( metadata.description, padding=5, color=(255, 255, 255), font_color=(0, 0, 0), ) width = 0 height = 100 if usage: width = usage.width height += usage.height if description and description.width > width: width = description.width height += description.height font_width, font_height = BuildImage.get_text_size( plugin.name + f"[{plugin.level}]", font ) if font_width > width: width = font_width A = BuildImage(width + 30, height + 120, "#EAEDF2") await A.text((15, 10), plugin.name + f"[{plugin.level}]") await A.text((15, 70), "简介:") if not description: description = BuildImage(A.width - 30, 30, (255, 255, 255)) await description.circle_corner(10) await A.paste(description, (15, 100)) if not usage: usage = BuildImage(A.width - 30, 30, (255, 255, 255)) await usage.circle_corner(10) await A.text((15, description.height + 115), "用法:") await A.paste(usage, (15, description.height + 145)) await A.circle_corner(10) image_list.append(A) except Exception as e: logger.warning( f"获取超级用户管理员插件 {plugin.module}: {plugin.name} 设置失败...", "超级用户帮助", e=e, ) if task_list := await TaskInfo.all(): task_str = "\n".join([task.name for task in task_list]) task_str = "通过 开启/关闭群被动 来控制群被动\n----------\n" + task_str task_image = await text2image(task_str, padding=5, color=(255, 255, 255)) await task_image.circle_corner(10) A = BuildImage(task_image.width + 50, task_image.height + 85, "#EAEDF2") await A.text((25, 10), "被动技能") await A.paste(task_image, (25, 50)) await A.circle_corner(10) image_list.append(A) if not image_list: raise EmptyError() image_group, _ = group_image(image_list) A = await build_sort_image(image_group, color=(255, 255, 255), padding_top=160) text = await BuildImage.build_text_image( "超级用户帮助", size=40, ) tip = await BuildImage.build_text_image( "注: ‘*’ 代表可有多个相同参数 ‘?’ 代表可省略该参数", size=25, font_color="red" ) await A.paste(text, (50, 30)) await A.paste(tip, (50, 90)) await A.save(SUPERUSER_HELP_IMAGE) return BuildImage(1, 1) @_matcher.handle() async def _( session: EventSession, matcher: AlconnaMatcher, arparma: Arparma, ): if not SUPERUSER_HELP_IMAGE.exists(): try: await build_help() except EmptyError: await Text("超级用户帮助为空").finish(reply=True) await Image(SUPERUSER_HELP_IMAGE).send() logger.info("查看超级用户帮助", arparma.header_result, session=session)