Игровая сессия¶
Описание сущностей для проведения игровых сессий на LED-платформе.
Игровая сессия — это факт проведения игры или викторины. В зависимости от режима сессия может быть:
- Индивидуальная викторина (mode = individual) — вопросы с вариантами ответов, все участники отвечают индивидуально, рейтинг по individual_score
- Командная игра (mode = team) — профориентационная игра с формированием команд, раундами заданий, обсуждениями и рейтингом команд
Используется в сценариях: Индивидуальная викторина, Командная работа.
→ GameQuestion и GameAnswerOption | Шаблоны сценариев | CMS: Викторина
GameSession (Игровая сессия)¶
Факт проведения игры или викторины. При создании сессия заполняется раундами и вопросами (из шаблона или вручную оператором) — снапшоты хранятся в GameSessionRound и GameSessionQuestion.
Атрибуты¶
| Поле | Тип | Описание |
|---|---|---|
id |
UUID | Уникальный идентификатор сессии |
mode |
enum | Режим: individual (индивидуальная викторина), team (командная игра) |
status |
enum | Статус: waiting (формирование команд), active (идёт игра), finished (завершена) |
current_round_index |
integer | Индекс текущего раунда (для восстановления после сбоя) |
current_question_index |
integer | Индекс текущего вопроса в раунде (для восстановления после сбоя) |
settings |
json | Настройки сессии — см. ниже. Включая team_count для mode=team |
created_at |
timestamp | Дата создания |
finished_at |
timestamp, nullable | Дата завершения |
settings (JSON)¶
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
team_count |
integer | — | Количество команд (для mode=team, от 2 до 8) |
auto_reveal |
boolean | true |
Автоматический показ правильного ответа по истечении времени на вопрос. Если false — оператор нажимает «Показать ответ» на планшете |
auto_next |
boolean | false |
Автоматический переход к следующему вопросу после показа ответа |
auto_next_delay |
integer | 5 |
Задержка автоперехода в секундах |
between_rounds_delay |
integer | 10 |
Пауза между раундами в секундах (экран результатов раунда) |
show_intermediate_results |
boolean | true |
Показывать промежуточный рейтинг после каждого раунда |
Время на ответ берётся из GameQuestion.time_limit (у каждого вопроса своё).
Связи¶
- GameSession → GameSessionRound: сессия имеет множество раундов (снапшоты)
- GameSession → GameSessionTeam: сессия имеет множество команд (для режима
team) - GameSession → GameSessionParticipant: сессия имеет множество участников
Где используется¶
- LED-медиаплатформа — проведение сессий
- Аналитика — анализ результатов сессий
GameSessionRound (Раунд сессии)¶
Снапшот раунда, заполненный при создании сессии из шаблона или вручную оператором.
Атрибуты¶
| Поле | Тип | Описание |
|---|---|---|
id |
UUID | Уникальный идентификатор |
session_id |
UUID | ID сессии |
round_type |
enum | Тип раунда из справочника: quick_start, tools, skills, situation, team_building, process, future, regional, final |
order |
integer | Порядок раунда в сессии |
Связи¶
- GameSessionRound → GameSession: раунд принадлежит одной сессии
- GameSessionRound → GameSessionQuestion: раунд имеет множество вопросов
GameSessionQuestion (Вопрос в раунде сессии)¶
Снапшот вопроса, закреплённого за раундом сессии.
Атрибуты¶
| Поле | Тип | Описание |
|---|---|---|
id |
UUID | Уникальный идентификатор |
round_id |
UUID | ID раунда сессии |
question_id |
UUID | ID исходного вопроса (GameQuestion) |
order |
integer | Порядок вопроса в раунде |
Связи¶
- GameSessionQuestion → GameSessionRound: вопрос принадлежит одному раунду
- GameSessionQuestion → GameQuestion: ссылка на исходный вопрос (текст, варианты, время, баллы)
- GameSessionQuestion → GameSessionAnswer: вопрос имеет множество ответов
GameSessionTeam (Команда в сессии)¶
Команда, участвующая в командной игре. Создаётся автоматически при создании сессии (по team_count).
Используется только для сессий с mode = team.
Атрибуты¶
| Поле | Тип | Описание |
|---|---|---|
id |
UUID | Уникальный идентификатор команды |
session_id |
UUID | ID сессии |
name |
string | Название команды |
color |
string | Цвет команды (для визуального различия) |
captain_id |
UUID, nullable | ID капитана команды (ссылка на GameSessionParticipant) |
score |
integer | Итоговый счёт команды |
created_at |
timestamp | Дата создания |
Связи¶
- GameSessionTeam → GameSession: команда принадлежит одной сессии
- GameSessionTeam → GameSessionParticipant: капитан команды и множество участников
Примечания¶
- Состав команды — от 2 до 10 человек
- В сессии может быть от 2 до 8 команд
- Капитан — первый подключившийся к команде; может передать роль; при отключении — случайный; оператор может сменить
GameSessionParticipant (Участник сессии)¶
Участник игровой сессии. Может быть авторизованным пользователем или гостем.
Атрибуты¶
| Поле | Тип | Описание |
|---|---|---|
id |
UUID | Уникальный идентификатор |
session_id |
UUID | ID сессии |
team_id |
UUID, nullable | ID команды (null для индивидуальной викторины) |
user_id |
UUID, nullable | ID пользователя (null для гостя) |
individual_score |
integer | Индивидуальный счёт участника |
joined_at |
timestamp | Дата подключения к сессии |
Связи¶
- GameSessionParticipant → GameSession: участник принадлежит одной сессии
- GameSessionParticipant → GameSessionTeam: участник может принадлежать команде
- GameSessionParticipant → User: участник привязан к пользователю (nullable)
Примечания¶
- Для индивидуальной викторины
team_id= null - Капитан определяется через
GameSessionTeam.captain_id, не через роль участника
GameSessionAnswer (Ответ в сессии)¶
Факт ответа на вопрос в рамках сессии. Хранится в БД для аналитики и истории.
Атрибуты¶
| Поле | Тип | Описание |
|---|---|---|
id |
UUID | Уникальный идентификатор |
session_id |
UUID | ID сессии |
session_question_id |
UUID | ID вопроса в сессии (GameSessionQuestion) |
participant_id |
UUID | ID участника, давшего ответ (капитан для команды, или индивидуальный участник) |
team_id |
UUID, nullable | ID команды (для team mode) |
answer |
json | Ответ — структура зависит от типа вопроса |
is_correct |
boolean | Правильность ответа |
score |
integer | Начисленные баллы |
created_at |
timestamp | Дата ответа |
Связи¶
- GameSessionAnswer → GameSession: ответ в рамках сессии
- GameSessionAnswer → GameSessionQuestion: ответ на конкретный вопрос
- GameSessionAnswer → GameSessionParticipant: кто ответил
- GameSessionAnswer → GameSessionTeam: какая команда (для team mode)
Где используется¶
- Аналитика — анализ результатов, статистика правильных ответов
- Результаты — формирование рейтингов по раундам и итогового
Состояние активной сессии (Redis)¶
Горячее состояние текущей игры. При сбое восстанавливается из БД (current_round_index, current_question_index), таймер сбрасывается.
| Ключ | Тип | Описание |
|---|---|---|
session:{id}:timer_remaining |
integer | Секунд осталось на текущий вопрос |
session:{id}:timer_running |
boolean | Идёт ли отсчёт |
session:{id}:timer_updated_at |
timestamp | Когда последний раз обновили |
session:{id}:votes |
hash | {participant_id → vote} — голоса текущего вопроса |
session:{id}:revealed |
boolean | Правильный ответ уже показан |
Логика таймера¶
- Старт вопроса:
remaining = question.time_limit,running = true,updated_at = now - Пауза:
remaining = remaining - (now - updated_at),running = false - Возобновление:
updated_at = now,running = true - Клиент вычисляет: если
running→remaining - (now - updated_at), иначе →remaining
Особенности режимов¶
Индивидуальная викторина¶
mode = individual- Оператор выбирает шаблон сценария или настраивает раунды вручную (от 3 до 8 типов)
- Каждый участник отвечает персонально через
answer GameSessionTeamне создаётся- Рейтинг формируется по
individual_score
Командная игра¶
mode = team- Команды создаются автоматически при создании сессии (
team_count) - Участники подключаются к команде через
team/{teamId}/join - Участники голосуют через
vote, капитан отправляет итоговый ответ черезanswer - Рейтинг формируется по
GameSessionTeam.score