initial commit
Some checks failed
CI / Run tests (push) Has been cancelled
CI / Docker build test (push) Has been cancelled
CI / Lint (ruff + mypy) (push) Has been cancelled

This commit is contained in:
2026-03-30 16:46:26 +07:00
commit 2a7dfa95c8
67 changed files with 5864 additions and 0 deletions

View 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