2d-game-backend / models.py
Student Hub
Initial backend for Hugging Face Spaces
2f4298a
from sqlalchemy import Column, Integer, String, Float, Boolean, DateTime, ForeignKey, Text
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from database import Base
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
username = Column(String(50), unique=True, index=True, nullable=False)
email = Column(String(100), unique=True, index=True, nullable=False)
hashed_password = Column(String(255), nullable=False)
is_active = Column(Boolean, default=True)
is_admin = Column(Boolean, default=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
last_login = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
stats = relationship("UserStats", back_populates="user", uselist=False, cascade="all, delete-orphan")
sessions = relationship("GameSession", back_populates="user", cascade="all, delete-orphan")
class UserStats(Base):
__tablename__ = "user_stats"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), unique=True, nullable=False)
# Игровые параметры
energy = Column(Float, default=100.0)
max_energy = Column(Float, default=100.0)
hunger = Column(Float, default=100.0) # сытость
max_hunger = Column(Float, default=100.0)
# Статистика
total_playtime = Column(Integer, default=0) # в секундах
level = Column(Integer, default=1)
experience = Column(Integer, default=0)
coins = Column(Integer, default=0)
# Игровые достижения
rooms_visited = Column(Integer, default=0)
items_collected = Column(Integer, default=0)
enemies_defeated = Column(Integer, default=0)
deaths = Column(Integer, default=0)
updated_at = Column(DateTime(timezone=True), onupdate=func.now(), server_default=func.now())
# Relationship
user = relationship("User", back_populates="stats")
class GameSession(Base):
__tablename__ = "game_sessions"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
started_at = Column(DateTime(timezone=True), server_default=func.now())
ended_at = Column(DateTime(timezone=True), nullable=True)
duration = Column(Integer, default=0) # в секундах
# Статистика сессии
energy_consumed = Column(Float, default=0.0)
hunger_consumed = Column(Float, default=0.0)
rooms_visited_session = Column(Integer, default=0)
items_collected_session = Column(Integer, default=0)
enemies_defeated_session = Column(Integer, default=0)
deaths_session = Column(Integer, default=0)
# Relationship
user = relationship("User", back_populates="sessions")
class GameAction(Base):
"""Лог действий пользователя для детальной аналитики"""
__tablename__ = "game_actions"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
action_type = Column(String(50), nullable=False) # move, attack, collect, eat, rest
action_data = Column(Text, nullable=True) # JSON данные
timestamp = Column(DateTime(timezone=True), server_default=func.now())
class SystemStats(Base):
"""Системная статистика для админки"""
__tablename__ = "system_stats"
id = Column(Integer, primary_key=True, index=True)
date = Column(DateTime(timezone=True), server_default=func.now())
# Общие показатели
total_users = Column(Integer, default=0)
active_users_today = Column(Integer, default=0)
new_users_today = Column(Integer, default=0)
total_sessions = Column(Integer, default=0)
avg_session_duration = Column(Float, default=0.0)
# Игровая статистика
total_playtime = Column(Integer, default=0)
total_rooms_visited = Column(Integer, default=0)
total_items_collected = Column(Integer, default=0)
total_enemies_defeated = Column(Integer, default=0)