Spaces:
Sleeping
Sleeping
File size: 4,205 Bytes
2f4298a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
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)
|