Протокол - 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
и значением равным длине тела сообщения в символах.
Сообщения
-
Регистрация (роль, никнейм) [клиент]
CONNECT /?role=...&nickname=...
role
может быть равенplayer
илиcroupier
-
Начало игры [крупье]
PUT /start-game
Формат ответа (
message-body
):game-id
Идентификатор запущенной игры.
-
Состояние игры (значение таймера, текущие ставки) [игрок, крупье]
GET /game-status
Формат ответа (
message-body
):game-id SP time-left-sec CRLF (nickname SP bet)*
Идентификатор текущей игры, значение таймера и список ставок всех игроков.
-
Узнать баланс [игрок]
GET /balance
Формат ответа (
message-body
):balance
Баланс игрока (с вычетом текущей ставки).
-
Сделать ставку [игрок]
PUT /bet?id=..&value=...
Сделать ставку данной величины в игре с данным идентификатором.
-
Узнать результат розыгрыша (число, изменение баланса) [игрок, крупье]
GET /game-results?id=...
Формат ответа (
message-body
): value CRLF (nickname SP balance-change)*Результат вращения рулетки и список изменений баланса для каждого из игроков.