From 88d56aab5001c0098737a371a9991480c2ed3d63 Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Sat, 23 Aug 2025 17:20:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(maizone):=20=E6=96=B0=E5=A2=9E=E6=97=A5?= =?UTF-8?q?=E7=A8=8B=E6=B4=BB=E5=8A=A8=E9=BB=91=E5=90=8D=E5=8D=95=E4=BB=A5?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=E8=87=AA=E5=8A=A8=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增了一个配置项 `schedule.activity_blacklist`,允许用户定义一个包含特定关键字的列表。当定时任务检测到的当前日程活动包含这些关键字(如“睡觉”、“睡眠”)时,将跳过本次自动发送说说的流程。 此功能主要解决了在睡眠等不希望被打扰的活动期间,插件仍然会根据日程表自动发送说说的问题。通过引入黑名单机制,可以更智能地过滤掉不适合发布动态的活动,提升了用户体验和插件的实用性。 主要的逻辑变更在 `SchedulerService` 中: - 在获取到当前活动后,会先检查活动名称是否包含黑名单中的任意关键字。 - 如果匹配成功,则记录日志并跳过本次发送,同时更新 `last_processed_activity` 状态,以避免在黑名单活动结束后立即错误地触发发送。 - 只有当活动不在黑名单中,且与上一次处理的活动不同时,才会触发发送流程。 --- .../built_in/maizone_refactored/plugin.py | 1 + .../services/scheduler_service.py | 38 ++++++++++++------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/plugins/built_in/maizone_refactored/plugin.py b/src/plugins/built_in/maizone_refactored/plugin.py index 21955c78f..8f6481a55 100644 --- a/src/plugins/built_in/maizone_refactored/plugin.py +++ b/src/plugins/built_in/maizone_refactored/plugin.py @@ -70,6 +70,7 @@ class MaiZoneRefactoredPlugin(BasePlugin): "enable_schedule": ConfigField(type=bool, default=False, description="是否启用定时发送"), "random_interval_min_minutes": ConfigField(type=int, default=5, description="随机间隔分钟数下限"), "random_interval_max_minutes": ConfigField(type=int, default=15, description="随机间隔分钟数上限"), + "activity_blacklist": ConfigField(type=list, default=["睡觉", "睡眠", "梦乡"], description="不会触发自动说说的活动黑名单"), }, "cookie": { "http_fallback_host": ConfigField(type=str, default="172.20.130.55", description="备用Cookie获取服务的主机地址"), diff --git a/src/plugins/built_in/maizone_refactored/services/scheduler_service.py b/src/plugins/built_in/maizone_refactored/services/scheduler_service.py index 5aff2a218..86dea92e9 100644 --- a/src/plugins/built_in/maizone_refactored/services/scheduler_service.py +++ b/src/plugins/built_in/maizone_refactored/services/scheduler_service.py @@ -35,6 +35,7 @@ class SchedulerService: self.qzone_service = qzone_service self.is_running = False self.task = None + self.last_processed_activity = None async def start(self): """启动定时任务的主循环。""" @@ -69,30 +70,41 @@ class SchedulerService: if not self.get_config("schedule.enable_schedule", False): await asyncio.sleep(60) # 如果被禁用,则每分钟检查一次状态 continue - + # 2. 获取当前时间的日程活动 current_activity = schedule_manager.get_current_activity() - logger.info(current_activity) + logger.info(f"当前检测到的日程活动: {current_activity}") + if current_activity: - now = datetime.datetime.now() - hour_str = now.strftime("%Y-%m-%d %H") + # 3. 检查活动是否在黑名单中 + activity_blacklist = self.get_config("schedule.activity_blacklist", ["睡觉", "睡眠"]) + if any(keyword in current_activity for keyword in activity_blacklist): + logger.info(f"活动 '{current_activity}' 包含黑名单关键字,本次跳过。") + self.last_processed_activity = current_activity # 更新状态以防活动切换后立即触发 - # 3. 检查这个小时的这个活动是否已经处理过,防止重复发送 - if not await self._is_processed(hour_str, current_activity): + # 4. 检查活动是否是新的活动 + elif current_activity != self.last_processed_activity: logger.info(f"检测到新的日程活动: '{current_activity}',准备发送说说。") - # 4. 调用QZoneService执行完整的发送流程 + # 5. 调用QZoneService执行完整的发送流程 result = await self.qzone_service.send_feed_from_activity(current_activity) - # 5. 将处理结果记录到数据库 + # 6. 将处理结果记录到数据库 + now = datetime.datetime.now() + hour_str = now.strftime("%Y-%m-%d %H") await self._mark_as_processed( - hour_str, - current_activity, - result.get("success", False), + hour_str, + current_activity, + result.get("success", False), result.get("message", "") ) - - # 6. 计算并等待一个随机的时间间隔 + + # 7. 更新上一个处理的活动 + self.last_processed_activity = current_activity + else: + logger.info(f"活动 '{current_activity}' 与上次相同,本次跳过。") + + # 8. 计算并等待一个随机的时间间隔 min_minutes = self.get_config("schedule.random_interval_min_minutes", 5) max_minutes = self.get_config("schedule.random_interval_max_minutes", 15) wait_seconds = random.randint(min_minutes * 60, max_minutes * 60)