gacha-bot2 / services /admin_service.py
Amit
Clean Cloud Deployment
732ca45
Raw
History Blame Contribute Delete
2.25 kB
# 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']