Spaces:
Runtime error
Runtime error
| # services/admin_service.py | |
| from database.db import db | |
| class AdminService: | |
| 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) | |
| 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 | |
| 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'] | |