zhenxun_bot/zhenxun/builtin_plugins/shop/html_image.py
2025-01-05 23:55:47 +08:00

92 lines
2.9 KiB
Python

import random
import time
from nonebot_plugin_htmlrender import template_to_pic
from pydantic import BaseModel
from zhenxun.configs.config import BotConfig
from zhenxun.configs.path_config import TEMPLATE_PATH
from zhenxun.models.goods_info import GoodsInfo
from zhenxun.utils._build_image import BuildImage
from .config import ICON_PATH, LEFT_RIGHT_IMAGE
class GoodsItem(BaseModel):
goods_list: list[dict]
"""商品列表"""
partition: str
"""分区名称"""
left_image: tuple[int, str, str]
"""左图"""
right_image: tuple[int, str, str]
"""右图"""
def get_left_right_image() -> tuple[tuple[int, str, str], tuple[int, str, str]]:
qq_top = random.randint(0, 280)
img_top = random.randint(10, 80)
left_image = random.choice(LEFT_RIGHT_IMAGE)
right_image = None
if left_image == "qq.png":
left_top = qq_top
right_top = img_top
left_css = "shop-item-left-qq"
right_css = "shop-item-right-zx"
right_image = random.choice(LEFT_RIGHT_IMAGE[:-1])
else:
left_top = img_top
right_top = qq_top
right_image = "qq.png"
left_css = "shop-item-right-zx"
right_css = "shop-item-left-qq"
return (left_top, left_css, left_image), (right_top, right_css, right_image)
async def html_image() -> bytes:
"""构建图片"""
goods_list: list[tuple[int, GoodsInfo]] = [
(i + 1, goods)
for i, goods in enumerate(await GoodsInfo.get_all_goods())
if goods.goods_limit_time == 0 or time.time() < goods.goods_limit_time
]
partition_dict: dict[str, list[dict]] = {}
for goods in goods_list:
if not goods[1].partition:
goods[1].partition = "默认分区"
if goods[1].partition not in partition_dict:
partition_dict[goods[1].partition] = []
partition_dict[goods[1].partition].append(
{
"id": goods[0],
"price": goods[1].goods_price,
"daily_limit": goods[1].daily_limit or "",
"name": goods[1].goods_name,
"icon": "data:image/png;base64,"
+ BuildImage.open(ICON_PATH / goods[1].icon).pic2bs4()[9:],
"description": goods[1].goods_description,
}
)
data_list = []
for partition in partition_dict:
left, right = get_left_right_image()
data_list.append(
GoodsItem(
goods_list=partition_dict[partition],
partition=partition,
left_image=left,
right_image=right,
)
)
return await template_to_pic(
template_path=str((TEMPLATE_PATH / "shop").absolute()),
template_name="main.html",
templates={"name": BotConfig.self_nickname, "data_list": data_list},
pages={
"viewport": {"width": 800, "height": 1024},
"base_url": f"file://{TEMPLATE_PATH}",
},
wait=2,
)