Skip to content

API комнат

Alexander Korzun edited this page Jun 3, 2021 · 11 revisions

API комнат

Каждая комната имеет ID (hex строка), имя/алиас (произвольная строка, по умолчанию тот же ID), параметры игры (изначальная длина змеи, размер поля, max/min количество игроков, etc.) и список администраторов (игроков, которые могут менять параметры комнаты). Доступ к комнате может быть (1) недоступен для других (полезно на время настройки параметров), (2) доступен по вайт-листу (задаётся параметром), (3) доступен по паролю (задаётся параметром) или (4) доступен для всех.

Игра в комнате начинается только тогда, когда количество игроков не меньше min_players, и все игроки в комнате отправили серверу сообщение Ready.

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

Новые сообщения (варианты Message)

От клиента серверу:

ListRooms()                     Запросить у сервера список комнат. В ответ возвращается сообщение
                                RoomListAvailable.

EnterRoom(room_name: str)       Подсоединиться к комнате. room_name — либо имя комнаты,
                                либо её ID. В ответ приходит сообщение Ok.

EnterAnyRoom()                  Подключиться к любой комнате на усмотрение сервера. В ответ приходит
                                сообщение Ok.

NewRoom()                       Создать новую комнату с параметрами по умолчанию и подсоединиться
                                к ней. В этой комнате вы будете единственным игроком и администратором.
                                В ответ приходит сообщение Ok.

LeaveRoom()                     Выйти из текущей комнаты в хаб. В ответ приходит сообщение Ok.

GetRoomProperties()             Запросить у сервера параметры текущей комнаты. Можно использовать
                                только если вы сейчас находитесь в комнате. В ответ возвращается
                                сообщение RoomPropertiesAvailable. Некоторые параметры (например
                                пароли) доступны для просмотра только администраторам комнаты.
                                Остальным вернутся недействительные значения таких параметров
                                (например, вместо паролей вернутся пустые строки).

SetRoomProperties(properties)   Установить параметры текущей комнаты. Можно использовать только
                                если вы сейчас находитесь в комнате и являетесь её администратором.
                                Некоторые параметры установить нельзя (например players), их можно
                                только прочитать сообщением GetRoomProperties.
                                properties — это словарь (dict), в котором ключами являются названия
                                параметров, а значениями — новые значения для соответствующих параметров.
                                Таким образом можно изменять сразу несколько параметров одним
                                сообщением. В ответ возвращается Ok.

В случае ошибки вместо ответа присылается сообщение Err с сообщением об ошибке.

От сервера клиенту:

RoomListAvailable(rooms)        Ответ сервера на ListRooms со списком комнат.
                                rooms — это список (list) объектов RoomInfo.

RoomPropertiesAvailable(props)  Ответ сервера на GetRoomProperties.
                                props — это словарь, ключами которого являются названия
                                параметров, а значениями — их значения.

Объекты RoomInfo:

id: str                         ID комнаты.
name: str                       Имя комнаты.
players: List[str]              Список имён игроков в комнате.
min_players: int                Мин. число игроков.
max_players: int                Макс. число игроков.
can_join: "yes"|"no"|"password" "yes" = подключиться можно, "no" = подключиться нельзя,
                                "password" = подключиться можно, зная пароль.

Предполагаемые изменения в библиотеке:

Новые методы ClientSession:

.list_rooms() -> List[RoomInfo]
.enter_room(room_name: str)
.enter_any_room()
.new_room()
.get_room_properties() -> Dict[str, Any]
.set_room_properties(properties: Dict[str, any])

Изменённый тип Event:

.name: str                      Название события.
.data: Any                      Данные (в зависимости от типа события).
.must_know: bool                Если клиенту неизвестно такое событие, то при False он его проигнорирует,
                                а при True завершится с ошибкой.

Список параметров комнаты:

name: str                           Человекочитаемое имя комнаты.
players (Read Only): List[str]      Список игроков в комнате.
admins: List[str]                   Список администраторов комнаты.
min_players: int                    Мин. количестов игроков, при котором можно начать игру.
max_players: int                    Макс. количество игроков, которое можно пустить в комнату.
snake_len: int                      Изначальная длина питонов.
field_width: int                    Ширина поля.
field_height: int                   Высота поля.
num_food_items: int                 Количество клеток с едой в начале игры.
respawn_food: FoodRespawnBehavior   Как респаунить еду при её поедании.
open: RoomOpenness                  Открытость комнаты для других игроков (по умолчанию: Closed).
max_turns: Optional[int]            Лимит на количество ходов, после которого игра завершается (None значит отсутствие лимита)
turn_timeout_seconds: Optional[float]  Лимит на время хода в секундах. None означает отсутствие лимита

Варианты FoodRespawnBehavior:

Yes                                 При каждом поедании 1 клетки еды создавать новую (если есть место).
No                                  Не создавать новую еду.
Random(p: float)                    Каждый ход (не обязательно при поедании) создавать где-то
                                    еду с вероятностью p. 0 ≤ p ≤ 1.

Варианты RoomOpenness:

Open                                Подключиться могут все.
Closed                              Подключиться нельзя.
Whitelist(List[str])                Подключиться могут только игроки из белого списка. Значение "@viewers" в списке позволяет подключаться всем желающим визуализаторам.
Password(str)                       Подключиться можно только по паролю.