From 59a044a0e26f27eaaefc936827c2d867ef809415 Mon Sep 17 00:00:00 2001 From: liuwei Date: Fri, 17 Apr 2026 11:19:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BC=BA=E5=88=B6=E9=87=8D?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=97=A5=E6=8A=A5=E6=8C=87=E4=BB=A4=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=B7=B3=E8=BF=87=E7=BC=93=E5=AD=98=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E5=BC=B9=E5=B9=95=E6=80=BB=E7=BB=93=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增指令:#强制斗鱼弹幕日报(支持带日期参数)\n2. 强制指令执行时跳过日报缓存读取,直接重生成文本与图片并覆盖缓存\n3. _send_daily_reports 增加 force_regenerate 参数并向下传递\n4. 保留原 #斗鱼弹幕日报 行为不变,兼容既有使用方式\n5. 补充中文注释,说明强制重生成的用途与行为 --- plugins/douyu/main.py | 50 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/plugins/douyu/main.py b/plugins/douyu/main.py index 15233a3..9dbef04 100644 --- a/plugins/douyu/main.py +++ b/plugins/douyu/main.py @@ -505,7 +505,8 @@ class DouyuPlugin(MessagePluginInterface): self.feature = self.register_feature() self.redis_manager: Optional[DouyuRedisManager] = None self._commands = ["斗鱼订阅", "取消斗鱼订阅", "斗鱼订阅列表", "斗鱼订阅提醒", "取消斗鱼订阅提醒", - "订阅鱼吧", "取消订阅鱼吧", "鱼吧订阅列表", "#斗鱼弹幕日报", "斗鱼弹幕日报"] + "订阅鱼吧", "取消订阅鱼吧", "鱼吧订阅列表", + "#斗鱼弹幕日报", "斗鱼弹幕日报", "#强制斗鱼弹幕日报", "强制斗鱼弹幕日报"] self._api_template = "https://www.douyu.com/betard/{room_id}" self._yuba_api = "https://yuba.douyu.com/wgapi/yubanc/api/feed/getUserFeedList" self._user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" @@ -741,6 +742,32 @@ class DouyuPlugin(MessagePluginInterface): await self.bot.send_text_message(roomid, f"暂无可发送的斗鱼弹幕日报:{anchor_day}", sender) return True, "暂无日报" + if first_token in {"#强制斗鱼弹幕日报", "强制斗鱼弹幕日报"}: + if not roomid: + await self.bot.send_text_message(sender, "请在群聊中使用该命令", sender) + return True, "仅支持群聊" + parts = content.split() + anchor_day = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d") + if len(parts) >= 2: + day_text = parts[1].strip() + try: + anchor_day = datetime.strptime(day_text, "%Y-%m-%d").strftime("%Y-%m-%d") + except Exception: + await self.bot.send_text_message(roomid, "日期格式错误,请使用:#强制斗鱼弹幕日报 2026-04-07", sender) + return True, "日期格式错误" + # 这里明确提示“强制重生成”,便于群内区分普通日报和回归测试操作。 + await self.bot.send_text_message(roomid, f"⏳ 正在强制重生成斗鱼弹幕日报:{anchor_day}", sender) + delivered = await self._send_daily_reports( + anchor_day, + target_group_id=roomid, + force=True, + force_regenerate=True, + ) + if delivered: + return True, f"斗鱼弹幕日报已强制重生成并发送:{anchor_day}" + await self.bot.send_text_message(roomid, f"暂无可发送的斗鱼弹幕日报:{anchor_day}", sender) + return True, "暂无日报" + return False, None async def _scheduled_check_job(self): @@ -1908,8 +1935,17 @@ class DouyuPlugin(MessagePluginInterface): ) return self._build_fallback_daily_report(payload) - async def _get_or_create_daily_report_result(self, room_id: str, anchor_day: str, payload: Dict[str, Any]) -> Dict[str, Any]: - cached = self._load_daily_report_cache(room_id, anchor_day) or {} + async def _get_or_create_daily_report_result( + self, + room_id: str, + anchor_day: str, + payload: Dict[str, Any], + *, + force_regenerate: bool = False, + ) -> Dict[str, Any]: + # force_regenerate=True 时,跳过本地缓存读取,直接重新生成文本/图片并覆盖缓存。 + # 这样可以在模型提示词或模板变更后,通过命令立即验证最新效果。 + cached = {} if force_regenerate else (self._load_daily_report_cache(room_id, anchor_day) or {}) cached_image = self._resolve_existing_report_image(cached.get("report_image")) cached_text = str(cached.get("report_text") or "").strip() cached_version = int(cached.get("cache_version", 0) or 0) @@ -1942,6 +1978,7 @@ class DouyuPlugin(MessagePluginInterface): anchor_day: str, target_group_id: Optional[str] = None, force: bool = False, + force_regenerate: bool = False, ) -> bool: rooms = ( set(self.redis_manager.list_group_rooms(target_group_id)) @@ -1972,7 +2009,12 @@ class DouyuPlugin(MessagePluginInterface): f"sessions={len(sessions)}, min_messages={self._daily_report_min_messages}" ) continue - report_result = await self._get_or_create_daily_report_result(room_id, anchor_day, payload) + report_result = await self._get_or_create_daily_report_result( + room_id, + anchor_day, + payload, + force_regenerate=force_regenerate, + ) report_text = str(report_result.get("report_text") or "").strip() report_image = self._resolve_existing_report_image(report_result.get("report_image")) groups = [target_group_id] if target_group_id else self.redis_manager.groups_for_room(room_id)