feat(maizone): 新增日程活动黑名单以防止自动发送
新增了一个配置项 `schedule.activity_blacklist`,允许用户定义一个包含特定关键字的列表。当定时任务检测到的当前日程活动包含这些关键字(如“睡觉”、“睡眠”)时,将跳过本次自动发送说说的流程。 此功能主要解决了在睡眠等不希望被打扰的活动期间,插件仍然会根据日程表自动发送说说的问题。通过引入黑名单机制,可以更智能地过滤掉不适合发布动态的活动,提升了用户体验和插件的实用性。 主要的逻辑变更在 `SchedulerService` 中: - 在获取到当前活动后,会先检查活动名称是否包含黑名单中的任意关键字。 - 如果匹配成功,则记录日志并跳过本次发送,同时更新 `last_processed_activity` 状态,以避免在黑名单活动结束后立即错误地触发发送。 - 只有当活动不在黑名单中,且与上一次处理的活动不同时,才会触发发送流程。
This commit is contained in:
@@ -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获取服务的主机地址"),
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user