feat: 优化了排版和渲染

This commit is contained in:
2024-04-03 01:03:25 +08:00
parent 14fb96fec2
commit 955d9f6d62
19 changed files with 121 additions and 72 deletions

View File

@ -61,17 +61,6 @@ def init():
if not os.path.exists("data/liteyuki/liteyuki.json"):
register_bot()
print("\033[34m" + r"""
__ ______ ________ ________ __ __ __ __ __ __ ______
/ | / |/ |/ |/ \ / |/ | / |/ | / |/ |
$$ | $$$$$$/ $$$$$$$$/ $$$$$$$$/ $$ \ /$$/ $$ | $$ |$$ | /$$/ $$$$$$/
$$ | $$ | $$ | $$ |__ $$ \/$$/ $$ | $$ |$$ |/$$/ $$ |
$$ | $$ | $$ | $$ | $$ $$/ $$ | $$ |$$ $$< $$ |
$$ | $$ | $$ | $$$$$/ $$$$/ $$ | $$ |$$$$$ \ $$ |
$$ |_____ _$$ |_ $$ | $$ |_____ $$ | $$ \__$$ |$$ |$$ \ _$$ |_
$$ |/ $$ | $$ | $$ | $$ | $$ $$/ $$ | $$ |/ $$ |
$$$$$$$$/ $$$$$$/ $$/ $$$$$$$$/ $$/ $$$$$$/ $$/ $$/ $$$$$$/
""" + "\033[0m")
nonebot.logger.info(
f"Run Liteyuki with Python{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro} "
f"at {sys.executable}"

View File

@ -1,5 +1,8 @@
import os.path
import time
from os import getcwd
import aiofiles
from nonebot import require
require("nonebot_plugin_htmlrender")
@ -31,25 +34,44 @@ from nonebot_plugin_htmlrender import *
async def template2image(
template: str,
templates: dict,
pages: dict | None = None,
pages=None,
wait: int = 0,
scale_factor: float = 2,
**kwargs
scale_factor: float = 1,
debug: bool = False,
) -> bytes:
"""
template -> html -> image
Args:
debug: 输入渲染好的 html
wait: 等待时间,单位秒
pages: 页面参数
template: str: 模板文件
templates: dict: 模板参数
scale_factor: 缩放因子,越高越清晰
**kwargs: page 参数
Returns:
图片二进制数据
"""
if pages is None:
pages = {
"viewport": {
"width" : 1080,
"height": 10
},
"base_url": f"file://{getcwd()}",
}
template_path = os.path.dirname(template)
template_name = os.path.basename(template)
if debug:
raw_html = await template_to_html(
template_name=template_name,
template_path=template_path,
**templates,
)
async with aiofiles.open(os.path.join(template_path, "latest-debug.html"), "w", encoding="utf-8") as f:
await f.write(raw_html)
nonebot.logger.info("Debug HTML: %s" % "latest-debug.html")
return await template_to_pic(
template_name=template_name,
template_path=template_path,

View File

@ -100,12 +100,15 @@ def load_from_dict(data: dict, lang_code: str):
class Language:
def __init__(self, lang_code: str = None, fallback_lang_code: str = "en"):
def __init__(self, lang_code: str = None, fallback_lang_code: str = None):
if lang_code is None:
lang_code = get_system_lang_code()
lang_code = config.get("default_language", get_default_lang())
self.lang_code = lang_code
self.fallback_lang_code = fallback_lang_code
if self.fallback_lang_code is None:
self.fallback_lang_code = config.get("default_language", get_system_lang_code())
def get(self, item: str, *args, **kwargs) -> str | Any:
"""
获取当前语言文本
@ -154,7 +157,7 @@ def get_user_lang(user_id: str) -> Language:
username="Unknown"
))
return Language(user.profile.get("lang", config.get("default_language", get_system_lang_code())))
return Language(user.profile.get("lang", get_default_lang()))
def get_system_lang_code() -> str:

View File

@ -2,7 +2,7 @@ import sys
import loguru
from typing import TYPE_CHECKING
from .config import load_from_yaml
from .language import Language, get_default_lang, get_system_lang_code
from .language import Language, get_default_lang
logger = loguru.logger
if TYPE_CHECKING:
@ -59,7 +59,7 @@ def init_log():
format=get_format(config.get("log_level", "INFO")),
)
show_icon = config.get("log_icon", True)
lang = Language(config.get("default_language", get_system_lang_code()))
lang = get_default_lang()
debug = lang.get("log.debug", default="==DEBUG")
info = lang.get("log.info", default="===INFO")

0
liteyuki/utils/plugin.py Normal file
View File

View File

@ -0,0 +1,61 @@
import threading
from multiprocessing import get_context
import nonebot
from nonebot import logger
reboot_grace_time_limit: int = 20
_nb_run = nonebot.run
class Reloader:
event: threading.Event = None
@classmethod
def reload(cls, delay: int = 0):
if cls.event is None:
raise RuntimeError()
if delay > 0:
threading.Timer(delay, function=cls.event.set).start()
return
cls.event.set()
def _run(ev: threading.Event, *args, **kwargs):
Reloader.event = ev
_nb_run(*args, **kwargs)
def run(*args, **kwargs):
should_exit = False
ctx = get_context("spawn")
while not should_exit:
event = ctx.Event()
process = ctx.Process(
target=_run,
args=(
event,
*args,
),
kwargs=kwargs,
)
process.start()
while not should_exit:
if event.wait(1):
logger.info("Receive reboot event")
process.terminate()
process.join(reboot_grace_time_limit)
if process.is_alive():
logger.warning(
f"Cannot shutdown gracefully in {reboot_grace_time_limit} second, force kill process."
)
process.kill()
break
elif process.is_alive():
continue
else:
should_exit = True
nonebot.run = run

View File

@ -1,5 +1,18 @@
from importlib.metadata import PackageNotFoundError, version
from urllib.parse import quote
def clamp(value: float, min_value: float, max_value: float) -> float | int:
"""将值限制在最小值和最大值之间
Args:
value (float): 要限制的值
min_value (float): 最小值
max_value (float): 最大值
Returns:
float: 限制后的值
"""
return max(min(value, max_value), min_value)
def convert_size(size: int, precision: int = 2, add_unit: bool = True, suffix: str = "iB") -> str: