import logging import asyncio from datetime import datetime, timedelta from sqlalchemy.orm import Session from card import _get_cards_async from models import Card as CardModel from models import User as UserModel from database import SessionLocal logger = logging.getLogger("app") POOL_MINIMUM = 1000 POOL_TARGET = 2000 POOL_BATCH_SIZE = 10 POOL_SLEEP = 4.0 pool_filling = False async def fill_card_pool(): global pool_filling if pool_filling: logger.info("Pool fill already in progress, skipping") return db: Session = SessionLocal() while True: try: unassigned = db.query(CardModel).filter(CardModel.user_id == None, CardModel.ai_used == False).count() logger.info(f"Card pool has {unassigned} unassigned cards") if unassigned >= POOL_MINIMUM: logger.info("Pool sufficiently stocked, skipping fill") return pool_filling = True needed = POOL_TARGET - unassigned logger.info(f"Filling pool with {needed} cards") fetched = 0 while fetched < needed: batch_size = min(POOL_BATCH_SIZE, needed - fetched) cards = await _get_cards_async(batch_size) for card in cards: db.add(CardModel( name=card.name, image_link=card.image_link, card_rarity=card.card_rarity.name, card_type=card.card_type.name, text=card.text, attack=card.attack, defense=card.defense, cost=card.cost, user_id=None, )) db.commit() fetched += batch_size logger.info(f"Pool fill progress: {fetched}/{needed}") await asyncio.sleep(POOL_SLEEP) finally: pool_filling = False db.close() BOOSTER_MAX = 5 BOOSTER_COOLDOWN_HOURS = 5 def check_boosters(user: UserModel, db: Session) -> tuple[int, datetime|None]: if user.boosters_countdown is None: if user.boosters < BOOSTER_MAX: user.boosters = BOOSTER_MAX db.commit() return (user.boosters, user.boosters_countdown) now = datetime.now() countdown = user.boosters_countdown while user.boosters < BOOSTER_MAX: next_tick = countdown + timedelta(hours=BOOSTER_COOLDOWN_HOURS) if now >= next_tick: user.boosters += 1 countdown = next_tick else: break user.boosters_countdown = countdown if user.boosters < BOOSTER_MAX else None db.commit() return (user.boosters, user.boosters_countdown)