feat: 檔案名稱模板支援 ULID 和資料夾路徑 (#146 @lekoOwO)

* feat: Enhance HTML report generation and dispatching with captions

* chore: apply ruff fixes

* fix(ReportGenerator): update HTML caption for report generation

* fix(ReportGenerator): encode filename in HTML report caption URL

* fix(ReportGenerator): refactor golden quotes handling for clarity and consistency

* feat(ReportGenerator): enhance filename formatting with ulid support and path sanitization

* fix(ReportGenerator): enhance path validation and filename uniqueness in report generation

* fix: pylance type error and ruff

* fix: 路径默认使用 ulid 变量

---------

Co-authored-by: SXP-Simon <sxp20061207@163.com>
This commit is contained in:
leko
2026-04-01 20:38:57 +08:00
committed by GitHub
co-authored by SXP-Simon
parent 1fa1ebe5ca
commit 8ba5f69788
6 changed files with 225 additions and 45 deletions
+23 -9
View File
@@ -32,6 +32,7 @@ from .src.domain.services.incremental_merge_service import IncrementalMergeServi
from .src.domain.services.statistics_service import StatisticsService
from .src.infrastructure.analysis.llm_analyzer import LLMAnalyzer
from .src.infrastructure.config.config_manager import ConfigManager
from .src.infrastructure.messaging.message_sender import MessageSender
from .src.infrastructure.persistence.history_manager import HistoryManager
from .src.infrastructure.persistence.incremental_store import IncrementalStore
from .src.infrastructure.persistence.telegram_group_registry import (
@@ -72,6 +73,7 @@ class GroupDailyAnalysis(Star):
template_preview_router: TemplatePreviewRouter
retry_manager: RetryManager
auto_scheduler: AutoScheduler
message_sender: MessageSender
def __init__(self, context: Context, config: AstrBotConfig):
super().__init__(context)
@@ -133,6 +135,9 @@ class GroupDailyAnalysis(Star):
self.retry_manager = RetryManager(
self.bot_manager, self.html_render, self.report_generator
)
self.message_sender = MessageSender(
self.bot_manager, self.config_manager, self.retry_manager
)
self.auto_scheduler = AutoScheduler(
self.config_manager,
self.analysis_service,
@@ -638,20 +643,29 @@ class GroupDailyAnalysis(Star):
nickname_getter=nickname_getter,
)
if html_path:
caption = self.report_generator.build_html_caption(html_path)
# 发送 HTML 文件
if not await adapter.send_file(group_id, html_path):
sender = getattr(self, "message_sender", None)
if sender:
sent = await sender.send_file(
group_id,
html_path,
caption=caption,
platform_id=platform_id,
)
else:
sent = await adapter.send_file(group_id, html_path)
if sent and caption:
await adapter.send_text(group_id, caption)
if not sent:
yield event.chain_result(
[File(name=Path(html_path).name, file=html_path)]
)
# 如果配置了外链 Base URL,则也发送超链接
base_url = self.config_manager.get_html_base_url()
if base_url:
filename = Path(html_path).name
url = f"{base_url.rstrip('/')}/{filename}"
link_message = f"报告已生成: {url}"
if not await adapter.send_text(group_id, link_message):
yield event.plain_result(link_message)
if caption:
yield event.plain_result(caption)
else:
yield event.plain_result("⚠️ HTML 生成失败。")