mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
帮助新增HTML生成(新布局),添加配置TYPE切换
This commit is contained in:
parent
5810c28294
commit
380588c11d
@ -299,6 +299,7 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能
|
|||||||
### 2022/12/11
|
### 2022/12/11
|
||||||
|
|
||||||
* 词条问题支持真寻的昵称开头与at真寻开头并优化回复
|
* 词条问题支持真寻的昵称开头与at真寻开头并优化回复
|
||||||
|
* 帮助新增HTML生成(新布局),添加配置`TYPE`切换
|
||||||
* 更正私聊时功能管理回复错误
|
* 更正私聊时功能管理回复错误
|
||||||
* 修复加入新群聊时初始化功能开关错误
|
* 修复加入新群聊时初始化功能开关错误
|
||||||
* 添加单例注解
|
* 添加单例注解
|
||||||
|
|||||||
@ -9,15 +9,15 @@ from nonebot.params import CommandArg
|
|||||||
from nonebot.rule import to_me
|
from nonebot.rule import to_me
|
||||||
from configs.path_config import IMAGE_PATH, DATA_PATH
|
from configs.path_config import IMAGE_PATH, DATA_PATH
|
||||||
from utils.message_builder import image
|
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
|
import os
|
||||||
|
|
||||||
|
|
||||||
__zx_plugin_name__ = "帮助"
|
__zx_plugin_name__ = "帮助"
|
||||||
|
|
||||||
# __plugin_configs__ = {
|
__plugin_configs__ = {
|
||||||
# "TYPE": {"value": "normal", "help": "帮助图片样式 ['normal', 'VV']", "default_value": "normal"}
|
"TYPE": {"value": "normal", "help": "帮助图片样式 ['normal', 'HTML']", "default_value": "normal"}
|
||||||
# }
|
}
|
||||||
|
|
||||||
group_help_path = DATA_PATH / "group_help"
|
group_help_path = DATA_PATH / "group_help"
|
||||||
simple_help_image = IMAGE_PATH / "simple_help.png"
|
simple_help_image = IMAGE_PATH / "simple_help.png"
|
||||||
|
|||||||
14
basic_plugins/help/_config.py
Normal file
14
basic_plugins/help/_config.py
Normal file
@ -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]
|
||||||
154
basic_plugins/help/data_source.py → basic_plugins/help/_data_source.py
Executable file → Normal file
154
basic_plugins/help/data_source.py → basic_plugins/help/_data_source.py
Executable file → Normal file
@ -1,77 +1,77 @@
|
|||||||
from .utils import HelpImageBuild
|
from ._utils import HelpImageBuild
|
||||||
from utils.image_utils import BuildImage
|
from utils.image_utils import BuildImage
|
||||||
from configs.path_config import IMAGE_PATH
|
from configs.path_config import IMAGE_PATH
|
||||||
from utils.manager import (
|
from utils.manager import (
|
||||||
plugins2settings_manager,
|
plugins2settings_manager,
|
||||||
admin_manager,
|
admin_manager,
|
||||||
)
|
)
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import nonebot
|
import nonebot
|
||||||
|
|
||||||
|
|
||||||
random_bk_path = IMAGE_PATH / "background" / "help" / "simple_help"
|
random_bk_path = IMAGE_PATH / "background" / "help" / "simple_help"
|
||||||
|
|
||||||
background = IMAGE_PATH / "background" / "0.png"
|
background = IMAGE_PATH / "background" / "0.png"
|
||||||
|
|
||||||
|
|
||||||
async def create_help_img(group_id: Optional[int], help_image: Path):
|
async def create_help_img(group_id: Optional[int], help_image: Path):
|
||||||
"""
|
"""
|
||||||
生成帮助图片
|
生成帮助图片
|
||||||
:param group_id: 群号
|
:param group_id: 群号
|
||||||
:param help_image: 图片路径
|
:param help_image: 图片路径
|
||||||
"""
|
"""
|
||||||
return await _create_help_img(group_id, help_image)
|
return await _create_help_img(group_id, help_image)
|
||||||
|
|
||||||
|
|
||||||
async def _create_help_img(group_id: Optional[int], help_image: Path):
|
async def _create_help_img(group_id: Optional[int], help_image: Path):
|
||||||
"""
|
"""
|
||||||
生成帮助图片
|
生成帮助图片
|
||||||
:param group_id: 群号
|
:param group_id: 群号
|
||||||
:param help_image: 图片路径
|
:param help_image: 图片路径
|
||||||
"""
|
"""
|
||||||
(await HelpImageBuild().build_image(group_id)).save(help_image)
|
await HelpImageBuild().build_image(group_id, help_image)
|
||||||
|
|
||||||
|
|
||||||
def get_plugin_help(msg: str, is_super: bool = False) -> Optional[str]:
|
def get_plugin_help(msg: str, is_super: bool = False) -> Optional[str]:
|
||||||
"""
|
"""
|
||||||
获取功能的帮助信息
|
获取功能的帮助信息
|
||||||
:param msg: 功能cmd
|
:param msg: 功能cmd
|
||||||
:param is_super: 是否为超级用户
|
:param is_super: 是否为超级用户
|
||||||
"""
|
"""
|
||||||
module = plugins2settings_manager.get_plugin_module(
|
module = plugins2settings_manager.get_plugin_module(
|
||||||
msg
|
msg
|
||||||
) or admin_manager.get_plugin_module(msg)
|
) or admin_manager.get_plugin_module(msg)
|
||||||
if module:
|
if module:
|
||||||
try:
|
try:
|
||||||
plugin = nonebot.plugin.get_plugin(module)
|
plugin = nonebot.plugin.get_plugin(module)
|
||||||
metadata = plugin.metadata
|
metadata = plugin.metadata
|
||||||
if plugin:
|
if plugin:
|
||||||
if is_super:
|
if is_super:
|
||||||
result = plugin.module.__getattribute__(
|
result = plugin.module.__getattribute__(
|
||||||
"__plugin_superuser_usage__"
|
"__plugin_superuser_usage__"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
result = (
|
result = (
|
||||||
metadata.usage
|
metadata.usage
|
||||||
if metadata
|
if metadata
|
||||||
else plugin.module.__getattribute__("__plugin_usage__")
|
else plugin.module.__getattribute__("__plugin_usage__")
|
||||||
)
|
)
|
||||||
if result:
|
if result:
|
||||||
width = 0
|
width = 0
|
||||||
for x in result.split("\n"):
|
for x in result.split("\n"):
|
||||||
_width = len(x) * 24
|
_width = len(x) * 24
|
||||||
width = width if width > _width else _width
|
width = width if width > _width else _width
|
||||||
height = len(result.split("\n")) * 45
|
height = len(result.split("\n")) * 45
|
||||||
A = BuildImage(width, height, font_size=24)
|
A = BuildImage(width, height, font_size=24)
|
||||||
bk = BuildImage(
|
bk = BuildImage(
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
background=IMAGE_PATH / "background" / "1.png",
|
background=IMAGE_PATH / "background" / "1.png",
|
||||||
)
|
)
|
||||||
A.paste(bk, alpha=True)
|
A.paste(bk, alpha=True)
|
||||||
A.text((int(width * 0.048), int(height * 0.21)), result)
|
A.text((int(width * 0.048), int(height * 0.21)), result)
|
||||||
return A.pic2bs4()
|
return A.pic2bs4()
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
return None
|
return None
|
||||||
@ -1,5 +1,9 @@
|
|||||||
|
from pathlib import Path
|
||||||
from typing import List, Tuple, Dict, Optional
|
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.decorator import Singleton
|
||||||
from utils.image_utils import BuildImage
|
from utils.image_utils import BuildImage
|
||||||
from configs.config import Config
|
from configs.config import Config
|
||||||
@ -9,8 +13,11 @@ import random
|
|||||||
from utils.manager import plugin_data_manager, group_manager
|
from utils.manager import plugin_data_manager, group_manager
|
||||||
from utils.manager.models import PluginData, PluginType
|
from utils.manager.models import PluginData, PluginType
|
||||||
|
|
||||||
|
|
||||||
background_path = IMAGE_PATH / "background" / "help" / "simple_help"
|
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):
|
async def build_help_image(image_group: List[List[BuildImage]], h: int):
|
||||||
bk = None
|
bk = None
|
||||||
@ -114,22 +121,35 @@ def group_image(image_list: List[BuildImage]) -> Tuple[List[List[BuildImage]], i
|
|||||||
class HelpImageBuild:
|
class HelpImageBuild:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
print('初始化咯')
|
|
||||||
self._data: Dict[str, PluginData] = plugin_data_manager.get_data()
|
self._data: Dict[str, PluginData] = plugin_data_manager.get_data()
|
||||||
self._sort_data: Dict[str, List[PluginData]] = {}
|
self._sort_data: Dict[str, List[PluginData]] = {}
|
||||||
self._image_list = []
|
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):
|
def sort_type(self):
|
||||||
"""
|
"""
|
||||||
说明:
|
说明:
|
||||||
对插件按照菜单类型分类
|
对插件按照菜单类型分类
|
||||||
"""
|
"""
|
||||||
for key in self._data.keys():
|
if not self._sort_data.keys():
|
||||||
plugin_data = self._data[key]
|
for key in self._data.keys():
|
||||||
if plugin_data.plugin_type == PluginType.NORMAL:
|
plugin_data = self._data[key]
|
||||||
if not self._sort_data.get(plugin_data.menu_type[0]):
|
if plugin_data.plugin_type == PluginType.NORMAL:
|
||||||
self._sort_data[plugin_data.menu_type[0]] = []
|
if not self._sort_data.get(plugin_data.menu_type[0]):
|
||||||
self._sort_data[plugin_data.menu_type[0]].append(self._data[key])
|
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(
|
async def build_name_image(
|
||||||
self,
|
self,
|
||||||
@ -144,7 +164,66 @@ class HelpImageBuild:
|
|||||||
await image.atext((0, 0), name, text_color, center_type="center")
|
await image.atext((0, 0), name, text_color, center_type="center")
|
||||||
return image
|
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: 群号
|
:param group_id: 群号
|
||||||
"""
|
"""
|
||||||
self._image_list = []
|
self._image_list = []
|
||||||
if not self._sort_data.keys():
|
self.sort_type()
|
||||||
self.sort_type()
|
|
||||||
font_size = 24
|
font_size = 24
|
||||||
build_type = Config.get_config("help", "TYPE")
|
build_type = Config.get_config("help", "TYPE")
|
||||||
_image = BuildImage(0, 0, plain_text="1", font_size=font_size)
|
_image = BuildImage(0, 0, plain_text="1", font_size=font_size)
|
||||||
Loading…
Reference in New Issue
Block a user