initial commit
This commit is contained in:
81
src/glitchup_bot/tasks/scheduler.py
Normal file
81
src/glitchup_bot/tasks/scheduler.py
Normal file
@@ -0,0 +1,81 @@
|
||||
import logging
|
||||
|
||||
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||||
from apscheduler.triggers.cron import CronTrigger
|
||||
from apscheduler.triggers.interval import IntervalTrigger
|
||||
|
||||
from glitchup_bot.config import settings
|
||||
from glitchup_bot.services.digest_builder import build_digest
|
||||
from glitchup_bot.services.sync_service import sync_issues
|
||||
from glitchup_bot.services.telegram_sender import send_digest_message
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
scheduler: AsyncIOScheduler | None = None
|
||||
|
||||
|
||||
async def weekly_digest_job() -> None:
|
||||
logger.info("Running weekly digest job")
|
||||
try:
|
||||
await send_digest_message(await build_digest(refresh=True))
|
||||
logger.info("Weekly digest sent successfully")
|
||||
except Exception:
|
||||
logger.exception("Failed to send weekly digest")
|
||||
|
||||
|
||||
async def sync_job() -> None:
|
||||
logger.info("Running scheduled issue sync")
|
||||
try:
|
||||
summary = await sync_issues()
|
||||
logger.info(
|
||||
"Issue sync finished: %s projects, %s issues, %s resolved",
|
||||
summary.project_count,
|
||||
summary.issue_count,
|
||||
summary.resolved_count,
|
||||
)
|
||||
except Exception:
|
||||
logger.exception("Scheduled issue sync failed")
|
||||
|
||||
|
||||
def setup_scheduler() -> AsyncIOScheduler:
|
||||
global scheduler
|
||||
|
||||
if scheduler is not None and scheduler.running:
|
||||
return scheduler
|
||||
|
||||
scheduler = AsyncIOScheduler()
|
||||
scheduler.add_job(
|
||||
sync_job,
|
||||
IntervalTrigger(minutes=settings.sync_interval_minutes),
|
||||
id="issue_sync",
|
||||
replace_existing=True,
|
||||
)
|
||||
scheduler.add_job(
|
||||
weekly_digest_job,
|
||||
CronTrigger(
|
||||
day_of_week=settings.digest_cron_day,
|
||||
hour=settings.digest_cron_hour,
|
||||
minute=settings.digest_cron_minute,
|
||||
timezone=settings.digest_timezone,
|
||||
),
|
||||
id="weekly_digest",
|
||||
replace_existing=True,
|
||||
)
|
||||
scheduler.start()
|
||||
logger.info(
|
||||
"Scheduler started: sync every %s min, digest at %s %02d:%02d %s",
|
||||
settings.sync_interval_minutes,
|
||||
settings.digest_cron_day,
|
||||
settings.digest_cron_hour,
|
||||
settings.digest_cron_minute,
|
||||
settings.digest_timezone,
|
||||
)
|
||||
return scheduler
|
||||
|
||||
|
||||
async def shutdown_scheduler() -> None:
|
||||
global scheduler
|
||||
|
||||
if scheduler is not None:
|
||||
scheduler.shutdown(wait=False)
|
||||
scheduler = None
|
||||
Reference in New Issue
Block a user