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)