# services/admin_service.py from database.db import db class AdminService: @staticmethod async def give_currency(user_id: int, currency_type: str, amount: int): async with db.pool.acquire() as conn: await conn.execute("INSERT INTO users (user_id) VALUES ($1) ON CONFLICT DO NOTHING", user_id) if currency_type == "coins": await conn.execute("UPDATE users SET coins = coins + $1 WHERE user_id = $2", amount, user_id) elif currency_type == "dust": await conn.execute("UPDATE users SET dust = dust + $1 WHERE user_id = $2", amount, user_id) else: raise ValueError("Invalid currency type.") return await conn.fetchrow("SELECT coins, dust FROM users WHERE user_id = $1", user_id) @staticmethod async def set_pity(user_id: int, banner_id: int, pity_amount: int): async with db.pool.acquire() as conn: await conn.execute( """ INSERT INTO user_pity (user_id, banner_id, pull_count) VALUES ($1, $2, $3) ON CONFLICT (user_id, banner_id) DO UPDATE SET pull_count = $3 """, user_id, banner_id, pity_amount ) return pity_amount @staticmethod async def grant_character(user_id: int, char_id: int): async with db.pool.acquire() as conn: char_data = await conn.fetchrow("SELECT name, rarity FROM characters WHERE char_id = $1", char_id) if not char_data: raise ValueError(f"Global Character ID `{char_id}` does not exist.") # 🔥 RACE CONDITION & MISSING PRINT_NUM FIX instance_id = await conn.fetchval(""" WITH update_char AS ( UPDATE characters SET acquired_count = acquired_count + 1 WHERE char_id = $2 RETURNING acquired_count ) INSERT INTO user_characters (user_id, char_id, print_num) SELECT $1, $2, acquired_count FROM update_char RETURNING instance_id; """, user_id, char_id) return instance_id, char_data['name'], char_data['rarity']