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![Iamge](http://i0.hdslb.com/bfs/live/new_room_cover/cf7d4d3b2f336c6dba299644c3af952c5db82612.jpg)\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>![Image](http://i0.hdslb.com/bfs/live/new_room_cover/cf7d4d3b2f336c6dba299644c3af952c5db82612.jpg)\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