from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from app.models.gamification import UserStats, PointsLedger import math class GamificationService: @staticmethod async def process_activity(db: AsyncSession, user_id: int, xp_amount: int, social_amount: int, reason: str): """ XP növelés, Szintlépés csekk és Automata Kredit váltás. """ # 1. User statisztika lekérése stmt = select(UserStats).where(UserStats.user_id == user_id) stats = (await db.execute(stmt)).scalar_one_or_none() if not stats: stats = UserStats(user_id=user_id, total_xp=0, social_points=0, current_level=1, credits=0) db.add(stats) # 2. Részletes Logolás (PointsLedger) - A visszakövethetőség miatt db.add(PointsLedger( user_id=user_id, xp_gain=xp_amount, social_gain=social_amount, reason=reason )) # 3. XP és Szintlépés (Nehezedő görbe) stats.total_xp += xp_amount # Képlet: Level = (XP / 500)^(1/1.5) new_level = int((stats.total_xp / 500) ** (1/1.5)) + 1 if new_level > stats.current_level: stats.current_level = new_level # 4. Automata Kredit váltás # Példa: Minden 100 Social pont automatikusan 1 Kredit lesz stats.social_points += social_amount if stats.social_points >= 100: new_credits = stats.social_points // 100 stats.credits += new_credits stats.social_points %= 100 # A maradék megmarad a következő váltáshoz # Külön log a váltásról db.add(PointsLedger(user_id=user_id, reason=f"Auto-conversion: {new_credits} Credits", credits_change=new_credits)) await db.commit() return stats