Running directly with `python -m gaming_deals_bot` didn't pick up variables from .env — only the Docker path (--env-file) did. Now dotenv is loaded before config parsing so both workflows work. https://claude.ai/code/session_01LPpSZFfyh6vdV5HGFWjoQX
92 lines
2.0 KiB
Python
92 lines
2.0 KiB
Python
"""Entry point — sets up logging, scheduler, and runs the bot."""
|
|
|
|
import asyncio
|
|
import logging
|
|
import signal
|
|
import sys
|
|
|
|
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
|
from dotenv import load_dotenv
|
|
|
|
from .bot import DealsBot
|
|
from .config import Config
|
|
from .preflight import run_preflight
|
|
|
|
|
|
def setup_logging():
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
|
|
stream=sys.stdout,
|
|
)
|
|
|
|
|
|
async def main():
|
|
load_dotenv()
|
|
setup_logging()
|
|
logger = logging.getLogger("gaming_deals_bot")
|
|
|
|
check_mode = "--check" in sys.argv
|
|
|
|
try:
|
|
config = Config()
|
|
except ValueError as exc:
|
|
logger.error("Configuration error: %s", exc)
|
|
sys.exit(1)
|
|
|
|
if check_mode:
|
|
ok = await run_preflight(config)
|
|
sys.exit(0 if ok else 1)
|
|
|
|
bot = DealsBot(config)
|
|
await bot.start()
|
|
|
|
scheduler = AsyncIOScheduler()
|
|
|
|
# CheapShark: every 2 hours
|
|
scheduler.add_job(
|
|
bot.check_cheapshark,
|
|
"interval",
|
|
hours=2,
|
|
id="cheapshark",
|
|
name="CheapShark deals check",
|
|
)
|
|
|
|
# Epic free games: once daily
|
|
scheduler.add_job(
|
|
bot.check_epic_free_games,
|
|
"interval",
|
|
hours=24,
|
|
id="epic_free",
|
|
name="Epic free games check",
|
|
)
|
|
|
|
scheduler.start()
|
|
logger.info("Bot started — scheduler running")
|
|
|
|
# Run initial checks immediately (after first-run population is done)
|
|
await bot.check_cheapshark()
|
|
await bot.check_epic_free_games()
|
|
|
|
# Keep running until signaled to stop
|
|
stop_event = asyncio.Event()
|
|
|
|
def handle_signal():
|
|
logger.info("Shutdown signal received")
|
|
stop_event.set()
|
|
|
|
loop = asyncio.get_running_loop()
|
|
for sig in (signal.SIGINT, signal.SIGTERM):
|
|
loop.add_signal_handler(sig, handle_signal)
|
|
|
|
await stop_event.wait()
|
|
|
|
logger.info("Shutting down...")
|
|
scheduler.shutdown(wait=False)
|
|
await bot.stop()
|
|
logger.info("Bot stopped")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|