2026-01-22 19:36:23 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
"""
|
|
|
|
|
Schedule Research Script
|
|
|
|
|
Runs market research and upgrade suggestions on a schedule.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import schedule
|
|
|
|
|
import time
|
|
|
|
|
import subprocess
|
|
|
|
|
import logging
|
|
|
|
|
import sys
|
2026-01-24 19:54:18 +00:00
|
|
|
import os
|
2026-01-22 19:36:23 +00:00
|
|
|
from pathlib import Path
|
2026-01-28 20:07:51 +00:00
|
|
|
from datetime import datetime, timedelta
|
2026-01-23 19:50:48 +00:00
|
|
|
from dotenv import load_dotenv
|
2026-01-22 19:36:23 +00:00
|
|
|
|
2026-01-28 20:07:51 +00:00
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
LOGS_DIR = REPO_ROOT / "logs"
|
|
|
|
|
|
2026-01-22 19:36:23 +00:00
|
|
|
# Setup logging
|
2026-01-28 20:07:51 +00:00
|
|
|
LOGS_DIR.mkdir(exist_ok=True)
|
|
|
|
|
log_file = LOGS_DIR / "scheduler.log"
|
2026-01-22 19:36:23 +00:00
|
|
|
|
2026-01-28 20:07:51 +00:00
|
|
|
logging.basicConfig(
|
|
|
|
|
level=logging.INFO,
|
|
|
|
|
format='%(asctime)s - %(levelname)s - %(message)s',
|
|
|
|
|
handlers=[
|
|
|
|
|
logging.FileHandler(log_file),
|
|
|
|
|
logging.StreamHandler(sys.stdout)
|
|
|
|
|
]
|
|
|
|
|
)
|
|
|
|
|
logger = logging.getLogger(__name__)
|
2026-01-22 19:36:23 +00:00
|
|
|
|
|
|
|
|
def job():
|
|
|
|
|
logger.info("Running scheduled research task...")
|
|
|
|
|
|
|
|
|
|
# Run market research
|
|
|
|
|
research_script = REPO_ROOT / "scripts" / "market_research.py"
|
|
|
|
|
try:
|
|
|
|
|
subprocess.run([sys.executable, str(research_script)], check=True)
|
|
|
|
|
except subprocess.CalledProcessError as e:
|
|
|
|
|
logger.error(f"Market research failed: {e}")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# Run upgrade repo
|
|
|
|
|
upgrade_script = REPO_ROOT / "scripts" / "upgrade_repo.py"
|
|
|
|
|
try:
|
|
|
|
|
subprocess.run([sys.executable, str(upgrade_script)], check=True)
|
|
|
|
|
except subprocess.CalledProcessError as e:
|
|
|
|
|
logger.error(f"Upgrade repo failed: {e}")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
logger.info("Scheduled task completed successfully.")
|
|
|
|
|
|
2026-01-28 20:07:51 +00:00
|
|
|
# Calculate next run
|
|
|
|
|
next_run = datetime.now() + timedelta(hours=4)
|
|
|
|
|
logger.info(f"Next scheduled run at: {next_run.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
|
|
|
|
2026-01-22 19:36:23 +00:00
|
|
|
def main():
|
2026-01-23 19:50:48 +00:00
|
|
|
# Load env vars
|
|
|
|
|
load_dotenv()
|
|
|
|
|
|
2026-01-28 20:07:51 +00:00
|
|
|
if not os.environ.get("GEMINI_API_KEY") and not os.environ.get("GOOGLE_API_KEY"):
|
|
|
|
|
logger.warning("Missing GEMINI_API_KEY or GOOGLE_API_KEY in environment.")
|
|
|
|
|
|
|
|
|
|
if not os.environ.get("JULES_API_KEY"):
|
|
|
|
|
logger.warning("Missing JULES_API_KEY in environment.")
|
2026-01-24 19:54:18 +00:00
|
|
|
|
2026-01-22 19:36:23 +00:00
|
|
|
logger.info("Starting Schedule Research Service...")
|
2026-01-28 20:07:51 +00:00
|
|
|
logger.info(f"Logs will be written to {log_file}")
|
2026-01-22 19:36:23 +00:00
|
|
|
|
|
|
|
|
# Run immediately on start
|
|
|
|
|
job()
|
|
|
|
|
|
|
|
|
|
# Schedule every 4 hours
|
|
|
|
|
schedule.every(4).hours.do(job)
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
schedule.run_pending()
|
|
|
|
|
time.sleep(60)
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
main()
|