重构:新增定时插件业务逻辑内聚到各自插件目录
- daily_news 插件内置百度新闻与60s图片获取逻辑,移除对 base.func_news 的业务依赖\n- epic_free 插件内置周五判断与免费游戏抓取逻辑,移除对 base.func_epic 的业务依赖\n- daily_ranking 插件内置排行生成与积分奖励逻辑,不再依赖 MessageStorage 业务封装\n- sehuatang_push 改为引用插件目录内的抓取与PDF生成实现,将核心业务代码迁入插件目录\n- 确保新插件可独立承载自身业务逻辑,平台层仅提供调度与基础设施能力
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional, Tuple
|
||||
|
||||
from base.func_epic import get_free, is_friday
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
from base.plugin_common.message_plugin_interface import MessagePluginInterface
|
||||
from base.plugin_common.plugin_interface import PluginStatus
|
||||
from utils.robot_cmd.robot_command import GroupBotManager
|
||||
@@ -89,7 +92,7 @@ class EpicFreePlugin(MessagePluginInterface):
|
||||
|
||||
payload = context.get("payload") or {}
|
||||
force = bool(payload.get("force", False))
|
||||
if not force and not is_friday():
|
||||
if not force and not self._is_friday():
|
||||
# 非周五时默认跳过;手动触发可通过 payload.force 强制执行。
|
||||
return {"success": True, "summary": "今天不是周五,已跳过 Epic 播报", "detail": {"skipped": True}}
|
||||
|
||||
@@ -103,7 +106,7 @@ class EpicFreePlugin(MessagePluginInterface):
|
||||
return {"success": False, "summary": "没有可推送目标群", "detail": {"target_count": 0}}
|
||||
|
||||
try:
|
||||
text = get_free()
|
||||
text = self._get_free_games()
|
||||
except Exception as e:
|
||||
return {"success": False, "summary": f"获取 Epic 免费游戏失败: {e}", "detail": {"error": str(e)}}
|
||||
|
||||
@@ -126,3 +129,58 @@ class EpicFreePlugin(MessagePluginInterface):
|
||||
"force": force,
|
||||
},
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def _is_friday() -> bool:
|
||||
"""判断是否周五(插件内实现)。"""
|
||||
return datetime.today().weekday() == 4
|
||||
|
||||
@staticmethod
|
||||
def _get_free_games() -> str:
|
||||
"""抓取 Epic 免费游戏列表(插件内实现)。"""
|
||||
url = "https://steamstats.cn/xi"
|
||||
headers = {
|
||||
"User-Agent": (
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
|
||||
"(KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.41"
|
||||
)
|
||||
}
|
||||
resp = requests.get(url, headers=headers, timeout=20)
|
||||
resp.raise_for_status()
|
||||
resp.encoding = resp.apparent_encoding
|
||||
soup = BeautifulSoup(resp.text, "html.parser")
|
||||
text = "今日喜加一 :https://store.epicgames.com/en-US/free-games\n"
|
||||
|
||||
tbody = soup.find("tbody")
|
||||
if not tbody:
|
||||
return text + "未抓取到免费游戏列表"
|
||||
|
||||
rows = tbody.find_all("tr")
|
||||
idx = 1
|
||||
for row in rows:
|
||||
cols = row.find_all("td")
|
||||
if len(cols) < 7:
|
||||
continue
|
||||
name = (cols[1].string or "").strip()
|
||||
gametype = (cols[2].string or "").replace(" ", "").strip()
|
||||
start = (cols[3].string or "").replace(" ", "").strip()
|
||||
end = (cols[4].string or "").replace(" ", "").strip()
|
||||
permanent = (cols[5].string or "").replace(" ", "").strip()
|
||||
origin_span = cols[6].find("span")
|
||||
origin = (origin_span.string or "").replace(" ", "").strip() if origin_span else ""
|
||||
href_value = ""
|
||||
for a in cols[6].find_all("a"):
|
||||
href_value = a.get("href", "") or href_value
|
||||
|
||||
text += (
|
||||
f"序号:{idx}\n"
|
||||
f"游戏名称:{name}\n"
|
||||
f"DLC/game:{gametype}\n"
|
||||
f"开始时间:{start}\n"
|
||||
f"结束时间:{end}\n"
|
||||
f"是否永久:{permanent}\n"
|
||||
f"平台:{origin}\n"
|
||||
f"URL:{href_value}\n"
|
||||
)
|
||||
idx += 1
|
||||
return text
|
||||
|
||||
Reference in New Issue
Block a user