110 lines
3.8 KiB
Python
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")
|