diff --git a/core/async_task.py b/core/async_task.py index acfe77f..c4105a7 100644 --- a/core/async_task.py +++ b/core/async_task.py @@ -1,13 +1,11 @@ # pyright: reportArgumentType=false import asyncio -import json -import aiofiles from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.interval import IntervalTrigger -from astrbot.api.event import filter, AstrMessageEvent, MessageEventResult, MessageChain -from astrbot.api.star import Context, Star, register, StarTools +from astrbot.api.event import MessageChain +from astrbot.api.star import Context from astrbot.api import logger from astrbot.api import AstrBotConfig diff --git a/core/fun_basic.py b/core/fun_basic.py index b92bdb2..4c2dd30 100644 --- a/core/fun_basic.py +++ b/core/fun_basic.py @@ -1,6 +1,8 @@ from pathlib import Path from datetime import datetime,date import aiofiles +import base64 +import os async def load_template(template_name: str) -> str: """ @@ -58,6 +60,7 @@ def week_to_num(week :str): } return week_map.get(week,None) + def compare_date_str(date_str: str) -> str: """ date_str 格式:YYYY-MM-DD @@ -70,4 +73,41 @@ def compare_date_str(date_str: str) -> str: elif d == today: return "今天" else: - return "将来" \ No newline at end of file + return "将来" + + +def load_as_base64(icons_dir: str) -> dict[str, str]: + """ + 将指定目录下的图标文件转换为 base64 字符串。 + 返回 {"文件名(不含扩展名)": "data:image/xxx;base64,xxx"} 的字典。 + """ + supported_ext = {".png", ".jpg", ".jpeg", ".gif", ".webp", ".svg", ".ico"} + icons = {} + + for filename in os.listdir(icons_dir): + name, ext = os.path.splitext(filename) + if ext.lower() not in supported_ext: + continue + + # 用原始文件名(系统实际存储的)打开文件 + filepath = os.path.join(icons_dir, filename) + with open(filepath, "rb") as f: + data = base64.b64encode(f.read()).decode() + + # 尝试修正显示用的 key(如果文件名是 GBK 乱码) + display_name = name + try: + display_name = name.encode("latin-1").decode("gbk") + except (UnicodeEncodeError, UnicodeDecodeError): + pass # 本来就是正确的 UTF-8 + + if ext.lower() == ".svg": + mime = "image/svg+xml" + elif ext.lower() == ".jpg": + mime = "image/jpeg" + else: + mime = f"image/{ext.lower().lstrip('.')}" + + icons[display_name] = f"data:{mime};base64,{data}" + + return icons \ No newline at end of file diff --git a/core/jx3_data.py b/core/jx3_data.py index 93b2cd7..8400e8e 100644 --- a/core/jx3_data.py +++ b/core/jx3_data.py @@ -51,7 +51,8 @@ class JX3Service: "code": 0, "msg": "功能函数未执行", "data": {}, - "temp": "" + "temp": "", + "icons": {} } @@ -1063,7 +1064,7 @@ class JX3Service: # 4. 加载模板 try: - return_data["temp"] = await load_template("juesheqiyu.html") + return_data["temp"] = await load_template("test.html") except FileNotFoundError as e: logger.error(f"加载模板失败: {e}") return_data["msg"] = "系统错误:模板文件不存在" diff --git a/core/message.py b/core/message.py index e003e3c..ee506ef 100644 --- a/core/message.py +++ b/core/message.py @@ -13,11 +13,12 @@ from .bilei_data import BiLeidata class MessageBuilder: """回复消息构建""" - def __init__(self, server: str, jx3api: JX3Service, bilei: BiLeidata, jx3at: AsyncTask): + def __init__(self, server: str, jx3api: JX3Service, bilei: BiLeidata, jx3at: AsyncTask, icons: dict[str, dict[str, str]]): self.server = server self.jx3api = jx3api self.bilei = bilei self.jx3at = jx3at + self.icons = icons async def html_render( @@ -68,6 +69,7 @@ class MessageBuilder: "omit_background": False, "type": "jpeg" } + data["data"]["icons"] = self.icons url = await self.html_render(data["temp"], data["data"], options=options) await event.send(event.image_result(url)) else: diff --git a/main.py b/main.py index 6b284d7..11e9613 100644 --- a/main.py +++ b/main.py @@ -11,6 +11,7 @@ from .core.jx3_data import JX3Service from .core.async_task import AsyncTask from .core.bilei_data import BiLeidata from .core.message import MessageBuilder +from .core.fun_basic import load_as_base64 @register("astrbot_plugin_jx3", "fxdyz", @@ -37,9 +38,12 @@ class Jx3ApiPlugin(Star): # 获取数据文件路径 self.get_data_path() + # 加载图片base64编码 + self.load_local_base64() # 构造所有类 self.create_all() + # 声明指令集 self.command_map = {} @@ -95,6 +99,7 @@ class Jx3ApiPlugin(Star): self.local_data_dir = StarTools.get_data_dir("astrbot_plugin_jx3") # 插件数据存储路径 self.plugin_data_dir = Path(__file__).parent / "data" + self.plugin_temp_dir = Path(__file__).parent /"templates" # SQLite本地路径 self.local_data_path = self.local_data_dir / "local_data.db" @@ -102,11 +107,31 @@ class Jx3ApiPlugin(Star): self.plugin_data_path = self.plugin_data_dir /"plugin_data.db" # API配置文件路径 self.api_data_path = self.plugin_data_dir / "api_config.json" + # 图片文件路径 + self.plugin_temp_img = self.plugin_temp_dir / "img" + self.plugin_temp_sect = self.plugin_temp_dir / "sect" + self.plugin_temp_serendipity = self.plugin_temp_dir / "serendipity" # 数据路径打印 logger.debug(f"本地数据路径: {self.local_data_path}") logger.debug(f"插件数据路径: {self.plugin_data_path}") logger.debug(f"API配置文件路径: {self.api_data_path}") + logger.debug(f"图片文件路径: {self.plugin_temp_img}") + logger.debug(f"图片文件路径: {self.plugin_temp_sect}") + logger.debug(f"图片文件路径: {self.plugin_temp_serendipity}") + + + def load_local_base64(self): + """加载图片文件的base64编码""" + img = load_as_base64(str(self.plugin_temp_img)) + sect = load_as_base64(str(self.plugin_temp_sect)) + serendipity = load_as_base64(str(self.plugin_temp_serendipity)) + self.icons = { + "img": img, + "sect": sect, + "serendipity": serendipity + } + logger.debug(f"图片base64编码加载完成: {self.icons}") def create_all(self): @@ -119,7 +144,7 @@ class Jx3ApiPlugin(Star): self.bilei = BiLeidata(self.local_sql_db) self.jx3api = JX3Service(str(self.api_data_path), self.conf, self.plugin_sql_db) self.jx3at = AsyncTask(self.context, self.conf, self.jx3api, self.local_sql_db) - self.jx3cmd = MessageBuilder(self.server, self.jx3api, self.bilei, self.jx3at) + self.jx3cmd = MessageBuilder(self.server, self.jx3api, self.bilei, self.jx3at, self.icons) async def init_bilei_data(self): diff --git a/templates/img/金.png b/templates/img/jin.png similarity index 100% rename from templates/img/金.png rename to templates/img/jin.png diff --git a/templates/img/铜.png b/templates/img/tong.png similarity index 100% rename from templates/img/铜.png rename to templates/img/tong.png diff --git a/templates/img/银.png b/templates/img/yin.png similarity index 100% rename from templates/img/银.png rename to templates/img/yin.png diff --git a/templates/img/砖.png b/templates/img/zhuang.png similarity index 100% rename from templates/img/砖.png rename to templates/img/zhuang.png diff --git a/templates/test.html b/templates/test.html new file mode 100644 index 0000000..029a712 --- /dev/null +++ b/templates/test.html @@ -0,0 +1,139 @@ + + +
+ +