From 6da77e24046bc52e728a35368d9a2daea01a0850 Mon Sep 17 00:00:00 2001 From: Azide <rukuy@qq.com> Date: Tue, 5 Jul 2022 22:11:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=9F=BA=E6=9C=AC=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E4=BA=86custom-post?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/nonebot_bison/post/custom_post.py | 23 +++------ tests/test_custom_post.py | 51 +++++++++++++++---- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/plugins/nonebot_bison/post/custom_post.py b/src/plugins/nonebot_bison/post/custom_post.py index c9d8ebd..800637f 100644 --- a/src/plugins/nonebot_bison/post/custom_post.py +++ b/src/plugins/nonebot_bison/post/custom_post.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field from pathlib import Path from nonebot.adapters.onebot.v11.message import Message, MessageSegment @@ -11,8 +11,8 @@ from .abstract_post import AbstractPost, BasePost @dataclass class _CustomPost(BasePost): - message_segments: list[MessageSegment] - css_path: str = "" # 模板文件所用css路径 + message_segments: list[MessageSegment] = field(default_factory=list) + css_path: str = None # 模板文件所用css路径 async def generate_text_messages(self) -> list[MessageSegment]: return self.message_segments @@ -21,9 +21,7 @@ class _CustomPost(BasePost): require("nonebot_plugin_htmlrender") from nonebot_plugin_htmlrender import md_to_pic - pic_bytes = await md_to_pic( - md=self._generate_md(), css_path=self._get_css_path() - ) + pic_bytes = await md_to_pic(md=self._generate_md(), css_path=self.css_path) return [MessageSegment.image(pic_bytes)] def _generate_md(self) -> str: @@ -31,7 +29,7 @@ class _CustomPost(BasePost): for message_segment in self.message_segments: if message_segment.type == "text": - md += "{}\n".format(message_segment.data.get("text", "")) + md += "{}<br>".format(message_segment.data.get("text", "")) elif message_segment.type == "image": try: # 先尝试获取file的值,没有在尝试获取url的值,都没有则为空 @@ -49,15 +47,6 @@ class _CustomPost(BasePost): return md - def _get_css_path(self): - """返回css路径""" - css_path = ( - str(Path(__file__).parent / "templates" / "custom_post.css") - if not self.css_path - else self.css_path - ) - return css_path - @dataclass class CustomPost(_CustomPost, AbstractPost): @@ -68,6 +57,8 @@ class CustomPost(_CustomPost, AbstractPost): 理论上text部分可以直接使用markdown语法, 例如 ###123 + 注意:list中的每一个text都会被解释为独立的一行文字 + 最后使用htmlrender渲染为图片 """ diff --git a/tests/test_custom_post.py b/tests/test_custom_post.py index 2072388..6f7c101 100644 --- a/tests/test_custom_post.py +++ b/tests/test_custom_post.py @@ -1,16 +1,14 @@ +import base64 +import hashlib +import logging + import pytest from nonebot.adapters.onebot.v11.message import MessageSegment -from nonebot_bison.post import custom_post from nonebug.app import App @pytest.fixture -def expect_md(): - return "【Zc】每早合约日替攻略!\n\n来源: Bilibili直播 魔法Zc目录\n\n详情: https://live.bilibili.com/3044248\n" - - -def test_gene_md(app: App): - +def ms_list(): msg_segments: list[MessageSegment] = [] msg_segments.append(MessageSegment.text("【Zc】每早合约日替攻略!")) msg_segments.append( @@ -19,10 +17,41 @@ def test_gene_md(app: App): cache=0, ) ) - msg_segments.append(MessageSegment.text("来源: Bilibili直播 魔法Zc目录\n ")) + msg_segments.append(MessageSegment.text("来源: Bilibili直播 魔法Zc目录")) msg_segments.append(MessageSegment.text("详情: https://live.bilibili.com/3044248")) - cp = custom_post.CustomPost(message_segments=msg_segments) - cp_md = cp._generate_md() + return msg_segments - assert cp_md == expect_md() + +@pytest.fixture +def pic_hash(): + return "58723fdc24b473b6dbd8ec8cbc3b7e46160c83df" + + +@pytest.fixture +def expect_md(): + return "【Zc】每早合约日替攻略!<br>\n来源: Bilibili直播 魔法Zc目录\n\n详情: https://live.bilibili.com/3044248\n" + + +def test_gene_md(app: App, expect_md, ms_list): + from nonebot_bison.post.custom_post import CustomPost + + cp = CustomPost(message_segments=ms_list) + cp_md = cp._generate_md() + assert cp_md == expect_md + + +@pytest.mark.asyncio +async def test_gene_pic(app: App, ms_list, pic_hash): + from nonebot_bison.post.custom_post import CustomPost + + cp = CustomPost(message_segments=ms_list) + cp_pic_bytes: list[MessageSegment] = await cp.generate_pic_messages() + + pure_b64 = base64.b64decode( + cp_pic_bytes[0].data.get("file").replace("base64://", "") + ) + sha1obj = hashlib.sha1() + sha1obj.update(pure_b64) + sha1hash = sha1obj.hexdigest() + assert sha1hash == pic_hash