Spaces:
Sleeping
Sleeping
| 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) | |