128 lines
4.4 KiB
Python
128 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
import asyncio
|
|
from typing import Any, Dict, List, Optional, Tuple
|
|
|
|
from base.plugin_common.message_plugin_interface import MessagePluginInterface
|
|
from base.plugin_common.plugin_interface import PluginStatus
|
|
from plugins.sehuatang_push.shehuatang import pdf_file_path
|
|
from plugins.sehuatang_push.shehuatang_undetected import pdf_file_path_undetected
|
|
|
|
|
|
class SehuatangPushPlugin(MessagePluginInterface):
|
|
"""涩图 PDF 推送插件。"""
|
|
|
|
FEATURE_KEY = "PDF_CAPABILITY"
|
|
FEATURE_DESCRIPTION = "📄 sehuatang PDF能力 [无]"
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
return "涩图推送"
|
|
|
|
@property
|
|
def version(self) -> str:
|
|
return "1.0.0"
|
|
|
|
@property
|
|
def description(self) -> str:
|
|
return "将 sehuatang PDF 推送从系统任务迁移到插件任务。"
|
|
|
|
@property
|
|
def author(self) -> str:
|
|
return "ABOT Team"
|
|
|
|
@property
|
|
def commands(self) -> List[str]:
|
|
return []
|
|
|
|
@property
|
|
def feature_key(self) -> Optional[str]:
|
|
return self.FEATURE_KEY
|
|
|
|
@property
|
|
def feature_description(self) -> Optional[str]:
|
|
return self.FEATURE_DESCRIPTION
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.feature = self.register_feature()
|
|
|
|
def initialize(self, context: Dict[str, Any]) -> bool:
|
|
return True
|
|
|
|
def start(self) -> bool:
|
|
self.status = PluginStatus.RUNNING
|
|
return True
|
|
|
|
def stop(self) -> bool:
|
|
self.status = PluginStatus.STOPPED
|
|
return True
|
|
|
|
def can_process(self, message: Dict[str, Any]) -> bool:
|
|
return False
|
|
|
|
async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]:
|
|
return False, None
|
|
|
|
def get_schedule_actions(self) -> List[Dict[str, Any]]:
|
|
return [
|
|
{
|
|
"action_key": "daily_pdf_push",
|
|
"name": "涩图PDF推送",
|
|
"description": "每天生成并推送涩图 PDF 提醒",
|
|
"trigger_type": "at_times",
|
|
"trigger_config": {"time_list": ["15:30"]},
|
|
"target_scope": "all_enabled_groups",
|
|
"target_config": {},
|
|
"payload": {"at_user": "Jyunere"},
|
|
"default_enabled": True,
|
|
}
|
|
]
|
|
|
|
async def run_scheduled_action(self, action_key: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
|
if action_key != "daily_pdf_push":
|
|
return {
|
|
"success": False,
|
|
"summary": f"不支持的动作: {action_key}",
|
|
"detail": {"action_key": action_key},
|
|
}
|
|
if not self.bot:
|
|
return {"success": False, "summary": "bot 未注入", "detail": {}}
|
|
|
|
target_groups = [str(g).strip() for g in (context.get("target_groups") or []) if str(g).strip()]
|
|
if not target_groups:
|
|
return {"success": False, "summary": "没有可推送目标群", "detail": {"target_count": 0}}
|
|
|
|
payload = context.get("payload") or {}
|
|
at_user = str(payload.get("at_user", "Jyunere") or "Jyunere").strip()
|
|
|
|
# 兼容历史逻辑:优先使用 undetected 方案,失败后回退普通抓取。
|
|
try:
|
|
ok, path = await asyncio.to_thread(pdf_file_path_undetected)
|
|
if not ok:
|
|
ok, path = await asyncio.to_thread(pdf_file_path)
|
|
if not ok:
|
|
return {"success": False, "summary": "PDF 生成失败", "detail": {}}
|
|
except Exception as e:
|
|
return {"success": False, "summary": f"PDF 生成异常: {e}", "detail": {"error": str(e)}}
|
|
|
|
success_groups = []
|
|
failed_groups = {}
|
|
for gid in target_groups:
|
|
try:
|
|
# 历史系统任务仅发送提醒文本,这里保持一致,避免引入文件发送兼容风险。
|
|
await self.bot.send_at_message(gid, f"98堂 PDF已就绪,请手动发送!", [at_user])
|
|
success_groups.append(gid)
|
|
except Exception as e:
|
|
failed_groups[gid] = str(e)
|
|
|
|
return {
|
|
"success": len(failed_groups) == 0,
|
|
"summary": f"涩图推送完成: 成功{len(success_groups)}群, 失败{len(failed_groups)}群",
|
|
"detail": {
|
|
"target_count": len(target_groups),
|
|
"success_groups": success_groups,
|
|
"failed_groups": failed_groups,
|
|
"pdf_path": path,
|
|
},
|
|
}
|