From 380588c11d5f46c81877fcc1fff54cadf8d4e819 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 11 Dec 2022 23:33:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B8=AE=E5=8A=A9=E6=96=B0=E5=A2=9EHTML?= =?UTF-8?q?=E7=94=9F=E6=88=90=EF=BC=88=E6=96=B0=E5=B8=83=E5=B1=80=EF=BC=89?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE`TYPE`=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + basic_plugins/help/__init__.py | 8 +- basic_plugins/help/_config.py | 14 ++ .../help/{data_source.py => _data_source.py} | 154 +++++++++--------- basic_plugins/help/{utils.py => _utils.py} | 100 ++++++++++-- 5 files changed, 185 insertions(+), 92 deletions(-) create mode 100644 basic_plugins/help/_config.py rename basic_plugins/help/{data_source.py => _data_source.py} (92%) mode change 100755 => 100644 rename basic_plugins/help/{utils.py => _utils.py} (70%) diff --git a/README.md b/README.md index eba81007..5ccab673 100644 --- a/README.md +++ b/README.md @@ -299,6 +299,7 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能 ### 2022/12/11 * 词条问题支持真寻的昵称开头与at真寻开头并优化回复 +* 帮助新增HTML生成(新布局),添加配置`TYPE`切换 * 更正私聊时功能管理回复错误 * 修复加入新群聊时初始化功能开关错误 * 添加单例注解 diff --git a/basic_plugins/help/__init__.py b/basic_plugins/help/__init__.py index 82ecd9d5..97798646 100755 --- a/basic_plugins/help/__init__.py +++ b/basic_plugins/help/__init__.py @@ -9,15 +9,15 @@ from nonebot.params import CommandArg from nonebot.rule import to_me from configs.path_config import IMAGE_PATH, DATA_PATH from utils.message_builder import image -from .data_source import create_help_img, get_plugin_help +from ._data_source import create_help_img, get_plugin_help import os __zx_plugin_name__ = "帮助" -# __plugin_configs__ = { -# "TYPE": {"value": "normal", "help": "帮助图片样式 ['normal', 'VV']", "default_value": "normal"} -# } +__plugin_configs__ = { + "TYPE": {"value": "normal", "help": "帮助图片样式 ['normal', 'HTML']", "default_value": "normal"} +} group_help_path = DATA_PATH / "group_help" simple_help_image = IMAGE_PATH / "simple_help.png" diff --git a/basic_plugins/help/_config.py b/basic_plugins/help/_config.py new file mode 100644 index 00000000..90411d42 --- /dev/null +++ b/basic_plugins/help/_config.py @@ -0,0 +1,14 @@ +from typing import Optional, List, Any, Union, Dict +from pydantic import BaseModel + + +class Item(BaseModel): + plugin_name: str + sta: int + + +class PluginList(BaseModel): + plugin_type: str + icon: str + logo: str + items: List[Item] diff --git a/basic_plugins/help/data_source.py b/basic_plugins/help/_data_source.py old mode 100755 new mode 100644 similarity index 92% rename from basic_plugins/help/data_source.py rename to basic_plugins/help/_data_source.py index 6dbe9f52..c67a8fdb --- a/basic_plugins/help/data_source.py +++ b/basic_plugins/help/_data_source.py @@ -1,77 +1,77 @@ -from .utils import HelpImageBuild -from utils.image_utils import BuildImage -from configs.path_config import IMAGE_PATH -from utils.manager import ( - plugins2settings_manager, - admin_manager, -) -from typing import Optional -from pathlib import Path -import nonebot - - -random_bk_path = IMAGE_PATH / "background" / "help" / "simple_help" - -background = IMAGE_PATH / "background" / "0.png" - - -async def create_help_img(group_id: Optional[int], help_image: Path): - """ - 生成帮助图片 - :param group_id: 群号 - :param help_image: 图片路径 - """ - return await _create_help_img(group_id, help_image) - - -async def _create_help_img(group_id: Optional[int], help_image: Path): - """ - 生成帮助图片 - :param group_id: 群号 - :param help_image: 图片路径 - """ - (await HelpImageBuild().build_image(group_id)).save(help_image) - - -def get_plugin_help(msg: str, is_super: bool = False) -> Optional[str]: - """ - 获取功能的帮助信息 - :param msg: 功能cmd - :param is_super: 是否为超级用户 - """ - module = plugins2settings_manager.get_plugin_module( - msg - ) or admin_manager.get_plugin_module(msg) - if module: - try: - plugin = nonebot.plugin.get_plugin(module) - metadata = plugin.metadata - if plugin: - if is_super: - result = plugin.module.__getattribute__( - "__plugin_superuser_usage__" - ) - else: - result = ( - metadata.usage - if metadata - else plugin.module.__getattribute__("__plugin_usage__") - ) - if result: - width = 0 - for x in result.split("\n"): - _width = len(x) * 24 - width = width if width > _width else _width - height = len(result.split("\n")) * 45 - A = BuildImage(width, height, font_size=24) - bk = BuildImage( - width, - height, - background=IMAGE_PATH / "background" / "1.png", - ) - A.paste(bk, alpha=True) - A.text((int(width * 0.048), int(height * 0.21)), result) - return A.pic2bs4() - except AttributeError: - pass - return None +from ._utils import HelpImageBuild +from utils.image_utils import BuildImage +from configs.path_config import IMAGE_PATH +from utils.manager import ( + plugins2settings_manager, + admin_manager, +) +from typing import Optional +from pathlib import Path +import nonebot + + +random_bk_path = IMAGE_PATH / "background" / "help" / "simple_help" + +background = IMAGE_PATH / "background" / "0.png" + + +async def create_help_img(group_id: Optional[int], help_image: Path): + """ + 生成帮助图片 + :param group_id: 群号 + :param help_image: 图片路径 + """ + return await _create_help_img(group_id, help_image) + + +async def _create_help_img(group_id: Optional[int], help_image: Path): + """ + 生成帮助图片 + :param group_id: 群号 + :param help_image: 图片路径 + """ + await HelpImageBuild().build_image(group_id, help_image) + + +def get_plugin_help(msg: str, is_super: bool = False) -> Optional[str]: + """ + 获取功能的帮助信息 + :param msg: 功能cmd + :param is_super: 是否为超级用户 + """ + module = plugins2settings_manager.get_plugin_module( + msg + ) or admin_manager.get_plugin_module(msg) + if module: + try: + plugin = nonebot.plugin.get_plugin(module) + metadata = plugin.metadata + if plugin: + if is_super: + result = plugin.module.__getattribute__( + "__plugin_superuser_usage__" + ) + else: + result = ( + metadata.usage + if metadata + else plugin.module.__getattribute__("__plugin_usage__") + ) + if result: + width = 0 + for x in result.split("\n"): + _width = len(x) * 24 + width = width if width > _width else _width + height = len(result.split("\n")) * 45 + A = BuildImage(width, height, font_size=24) + bk = BuildImage( + width, + height, + background=IMAGE_PATH / "background" / "1.png", + ) + A.paste(bk, alpha=True) + A.text((int(width * 0.048), int(height * 0.21)), result) + return A.pic2bs4() + except AttributeError: + pass + return None diff --git a/basic_plugins/help/utils.py b/basic_plugins/help/_utils.py similarity index 70% rename from basic_plugins/help/utils.py rename to basic_plugins/help/_utils.py index 301cb379..66728e2e 100644 --- a/basic_plugins/help/utils.py +++ b/basic_plugins/help/_utils.py @@ -1,5 +1,9 @@ +from pathlib import Path from typing import List, Tuple, Dict, Optional -from configs.path_config import IMAGE_PATH +from nonebot_plugin_htmlrender import template_to_pic + +from ._config import Item +from configs.path_config import IMAGE_PATH, TEMPLATE_PATH from utils.decorator import Singleton from utils.image_utils import BuildImage from configs.config import Config @@ -9,8 +13,11 @@ import random from utils.manager import plugin_data_manager, group_manager from utils.manager.models import PluginData, PluginType + background_path = IMAGE_PATH / "background" / "help" / "simple_help" +logo_path = TEMPLATE_PATH / 'menu' / 'res' / 'logo' + async def build_help_image(image_group: List[List[BuildImage]], h: int): bk = None @@ -114,22 +121,35 @@ def group_image(image_list: List[BuildImage]) -> Tuple[List[List[BuildImage]], i class HelpImageBuild: def __init__(self): - print('初始化咯') self._data: Dict[str, PluginData] = plugin_data_manager.get_data() self._sort_data: Dict[str, List[PluginData]] = {} self._image_list = [] + self.icon2str = { + 'normal': 'fa fa-cog', + '原神相关': 'fa fa-circle-o', + '常规插件': 'fa fa-cubes', + '联系管理员': 'fa fa-envelope-o', + '抽卡相关': 'fa fa-credit-card-alt', + '来点好康的': 'fa fa-picture-o', + '数据统计': 'fa fa-bar-chart', + '一些工具': 'fa fa-shopping-cart', + '商店': 'fa fa-shopping-cart', + '其它': 'fa fa-tags', + '群内小游戏': 'fa fa-gamepad', + } def sort_type(self): """ 说明: 对插件按照菜单类型分类 """ - for key in self._data.keys(): - plugin_data = self._data[key] - if plugin_data.plugin_type == PluginType.NORMAL: - if not self._sort_data.get(plugin_data.menu_type[0]): - self._sort_data[plugin_data.menu_type[0]] = [] - self._sort_data[plugin_data.menu_type[0]].append(self._data[key]) + if not self._sort_data.keys(): + for key in self._data.keys(): + plugin_data = self._data[key] + if plugin_data.plugin_type == PluginType.NORMAL: + if not self._sort_data.get(plugin_data.menu_type[0]): + self._sort_data[plugin_data.menu_type[0]] = [] + self._sort_data[plugin_data.menu_type[0]].append(self._data[key]) async def build_name_image( self, @@ -144,7 +164,66 @@ class HelpImageBuild: await image.atext((0, 0), name, text_color, center_type="center") return image - async def build_image(self, group_id: Optional[int]) -> BuildImage: + async def build_image(self, group_id: Optional[int], help_image: Path): + build_type = Config.get_config("help", "TYPE") + if build_type == 'HTML': + byt = await self.build_html_image(group_id) + with open(help_image, 'wb') as f: + f.write(byt) + else: + img = await self.build_pil_image(group_id) + img.save(help_image) + + async def build_html_image(self, group_id: Optional[int]) -> bytes: + self.sort_type() + classify = {} + for menu in self._sort_data: + for plugin in self._sort_data[menu]: + sta = 0 + if not plugin.plugin_status.status and plugin.plugin_status.block_type: + if plugin.plugin_status.block_type in ['all', 'group']: + sta = 2 + if not group_manager.get_plugin_super_status(plugin.model, group_id): + sta = 2 + if not group_manager.get_plugin_status(plugin.model, group_id): + sta = 1 + if classify.get(menu): + classify[menu].append(Item(plugin_name=plugin.name, sta=sta)) + else: + classify[menu] = [Item(plugin_name=plugin.name, sta=sta)] + max_len = 0 + flag_index = -1 + max_data = None + plugin_list = [] + for index, plu in enumerate(classify.keys()): + if plu in self.icon2str.keys(): + icon = self.icon2str[plu] + else: + icon = 'fa fa-pencil-square-o' + logo = logo_path / random.choice(os.listdir(logo_path)) + # print(str(logo.absolute())) + data = {'name': plu if plu != 'normal' else '功能', 'items': classify[plu], 'icon': icon, + 'logo': str(logo.absolute())} + if len(classify[plu]) > max_len: + max_len = len(classify[plu]) + flag_index = index + max_data = data + plugin_list.append(data) + del plugin_list[flag_index] + plugin_list.insert(0, max_data) + pic = await template_to_pic( + template_path=str((TEMPLATE_PATH / 'menu').absolute()), + template_name='zhenxun_menu.html', + templates={"plugin_list": plugin_list}, + pages={ + "viewport": {"width": 1903, "height": 975}, + "base_url": f"file://{TEMPLATE_PATH}", + }, + wait=2, + ) + return pic + + async def build_pil_image(self, group_id: Optional[int]) -> BuildImage: """ 说明: 构造帮助图片 @@ -152,8 +231,7 @@ class HelpImageBuild: :param group_id: 群号 """ self._image_list = [] - if not self._sort_data.keys(): - self.sort_type() + self.sort_type() font_size = 24 build_type = Config.get_config("help", "TYPE") _image = BuildImage(0, 0, plain_text="1", font_size=font_size)