Протокол - Ivan-Veselov/roulette GitHub Wiki

Общее описание

Клиент пытается подсоединиться к серверу в качестве одной из двух ролей (игрок или крупье). Если крупье уже есть, то соединение отклоняется. Ещё нужно указать никнейм клиента. На сервере хранится баланс клиента-игрока.

Крупье может послать запрос на раскрутку рулетки (запуск таймера). Пока рулетка крутится, повторный запрос данного типа возвращает ошибку.

Клиент может спрашивать у сервера текущее состояние игры: идет ли игра и, если да, то какое значение таймера; свой баланс; текущее состояние ставок.

Во время работы таймера клиент может послать ставку. Изменить ставку нельзя. Если ставка невалидная, то сервер возвращает ошибку, а ставку можно переотправить.

Если игра завершилась, то клиент может узнать у сервера результат розыгрыша.

Общий вид HTTP сообщений

HTTP-Version = HTTP/1.1

Запрос

Method SP Request-URI SP HTTP-Version CRLF [ (message-header CRLF)* ] CRLF [ message-body ]

Method = GET | PUT | CONNECT

message-header = field-name ":" [ field-value ]

Request-URI может содержать query line с & в качестве разделителей.

Ответ

HTTP-Version SP Status-Code SP Reason-Phrase CRLF [ (message-header CRLF)* ] CRLF [ message-body ]

Status-Code, Reason-Phrase = 200, OK | 400, BadRequest


Все сообщения, которые содержат message-body должны содержать заголовок с именем body-length и значением равным длине тела сообщения в символах.

Сообщения

  1. Регистрация (роль, никнейм) [клиент]

    CONNECT /?role=...&nickname=...

    role может быть равен player или croupier

  2. Начало игры [крупье]

    PUT /start-game

    Формат ответа (message-body): game-id

    Идентификатор запущенной игры.

  3. Состояние игры (значение таймера, текущие ставки) [игрок, крупье]

    GET /game-status

    Формат ответа (message-body): game-id SP time-left-sec CRLF (nickname SP bet)*

    Идентификатор текущей игры, значение таймера и список ставок всех игроков.

  4. Узнать баланс [игрок]

    GET /balance

    Формат ответа (message-body): balance

    Баланс игрока (с вычетом текущей ставки).

  5. Сделать ставку [игрок]

    PUT /bet?id=..&value=...

    Сделать ставку данной величины в игре с данным идентификатором.

  6. Узнать результат розыгрыша (число, изменение баланса) [игрок, крупье]

    GET /game-results?id=...

    Формат ответа (message-body): value CRLF (nickname SP balance-change)*

    Результат вращения рулетки и список изменений баланса для каждого из игроков.