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)