equilink-site/server/utils/scheduler.py
2025-02-12 17:38:06 +05:30

110 lines
3.8 KiB
Python

# standard imports
import threading
import schedule
import time
import os
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
class AgentScheduler:
def __init__(self):
self.scheduler_running = False
self.pause_event = threading.Event()
self.scheduler_thread = None
def run_scheduler(self):
"""Continuously run the scheduler in a loop"""
while self.scheduler_running:
if not self.pause_event.is_set():
schedule.run_pending()
time.sleep(1)
def start(self):
"""Start the scheduler thread"""
if not self.scheduler_thread or not self.scheduler_thread.is_alive():
self.scheduler_running = True
self.scheduler_thread = threading.Thread(target=self.run_scheduler)
self.scheduler_thread.daemon = True
self.scheduler_thread.start()
def stop(self):
"""Stop the scheduler thread"""
self.scheduler_running = False
if self.scheduler_thread:
self.scheduler_thread.join()
def pause(self):
"""Pause the scheduler"""
self.pause_event.set()
def resume(self):
"""Resume the scheduler"""
self.pause_event.clear()
def is_paused(self):
"""Check if scheduler is paused"""
return self.pause_event.is_set()
def is_running(self):
"""Check if scheduler is running"""
return self.scheduler_running and (self.scheduler_thread and self.scheduler_thread.is_alive())
def schedule_posts(self, post_manager, tracker_data):
"""Schedule posts with special handling for first post"""
# Schedule first post right away
self.schedule_first_post(post_manager, tracker_data)
# check what we to do the scheduler if all content is posted
self.schedule_last_post(post_manager, tracker_data)
# Schedule regular posts
# Production schedule:
if os.getenv("X_ENABLED") == "True":
schedule.every(tracker_data.get('post_every_x_minutes')).minutes.do(post_manager.post_to_twitter)
else:
# Test schedule if you want to :
schedule.every(5).seconds.do(post_manager.post_to_twitter)
def schedule_first_post(self, post_manager, tracker_data):
"""Schedule posts with special handling for first post"""
if (tracker_data['season_number'] == 0 and
tracker_data['episode_number'] == 0 and
tracker_data['post_number'] == 0):
# Post immediately for first post of first episode/season
post_manager.post_to_twitter()
def schedule_last_post(self, post_manager, tracker_data):
if (tracker_data['season_number'] == -1 and
tracker_data['episode_number'] == -1 and
tracker_data['post_number'] == -1):
# check what we to do the scheduler if all content is posted
self.check_generate_post_env(tracker_data)
def check_generate_post_env(self, tracker_data):
"""Check what settings the auto generate posts is set to"""
if os.getenv("AUTO_GENERATE_POSTS") == "AUTO":
# generate new content
# post_manager.create_content()
# tracker_data['season_number'] = length seasons -1
# tracker_data['episode_number'] = 0
# tracker_data['post_number'] = 0
self.stop()
elif os.getenv("AUTO_GENERATE_POSTS") == "LOOP":
tracker_data['season_number'] = 0
tracker_data['episode_number'] = 0
tracker_data['post_number'] = 0
elif os.getenv("AUTO_GENERATE_POSTS") == "STOP":
self.stop()
else:
print("Auto generate posts is not set to a valid setting")
print("Please set AUTO_GENERATE_POSTS to AUTO, LOOP, or STOP")