Перейти к основному содержимому

Создание общего чата

Обзор

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

  • создание чата в панели управления играми
  • вступление Игрока 1 в чат
  • получение списка сообщений из чата
  • отправка сообщения в чат
  • подписка на уведомление об отправке сообщений в реальном времени
  • вступление Игрока 2 в чат и отправка сообщений
  • проверка онлайна игроков в чате

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

Создание чата

Создать общий чат можно с помощью функций каналов. То есть мы создадим канал, который будет играть роль общего чата. Чтобы это сделать перейдите в панель управления играми, выберите раздел “Каналы - Добавить канал”:

В поле название канала укажите произвольное имя, например, Chat. Остальные настройки канала оставьте по умолчанию, нажмите кнопку “Сохранить канал”. Так будет создан канал - чат. В нашем примере он имеет идентификатор ID: 90:

Вступление игрока в чат

Когда Игрок заходит в игру, он может вступить в созданный канал по идентификатору:

gp.channel.join({channelID:90})

Проверить наличие игрока в канале можно из панели управления играми. Для этого кликните по названию созданного канала Chat и нажмите кнопку выбора участников. Будет показан список игроков, находящихся в канале. В нашем примере в чат вступил один игрок с ID: 1807696:

Действия в канале

После вступления в чат, Игрок 1 может получить сообщения. Для этого используется метод fetchMessages, в который нужно передать ID канала:

gp.channels.fetchMessages({channelId:90})

Если все сделано правильно, то промис будет содержать информацию о том, что в чате пока нет сообщений. Повторим запрос позднее, когда добавим в чат второго участника - Игрока 2.

А пока можно отправить сообщение от имени Игрока 1:

gp.channels.sendMessages({channelId:90, text: `privet`})

При этом всем участникам чата приходит ивент event:message с информацией о том, что “кто-то” отправил сообщение в канал. Отправителю помимо event:message также приходит ответ от сервера, который содержит:

  • Id игрока - отправителя сообщения
  • текст - text
  • дату отправки - createdAt
  • информацию об отправителе player. При этом у игрока player перечислены все публичные поля: имя, аватар и т.д. То есть при желании можно отрисовать аватар отправителя и показать всю публичную информацию в интерфейсе игры:

Все остальные участники чата должны подписаться на это уведомление. И как только придет сообщение, нужно его где-то вывести. В качестве примера подпишемся на ивент о том, что “кто-то” написал в чат. Подписываемся на событие и говорим, какую функцию вызвать, если это событие произойдет:

gp.channels.on('event:message', (message) => {
//вывести сообщение в чат (добавить новое сообщение)
console.log(`игрок #${message.player.id}: ${message.text}`);
})

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

Отправка сообщений вторым игроком

В качестве эксперимента в этот же чат отправим сообщение другим игроком. Но сначала добавим Игрока 2:

gp.channel.join({channelID:90})

Запрашиваем список сообщений в чате от имени Игрока 2:

gp.channels.fetchMessages({channelId:90})

В промис видим информацию о том, что в чате существует одно сообщение. То самое сообщение privet, которое отправил Игрок 1:

Отправляем сообщение в канал от имени Игрока 2:

gp.channels.sendMessages({channelId:90, text: `Hello`})

При этом в чат пришел ивент о том, что игрок прислал сообщение Hello:

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

Если администратор напишет сообщение из панели управления, то все игроки в чате получат сообщения от игрока с Id:0 (нулевой идентификатор игрока позволяет его определять как администратора):

Также можно посмотреть список игроков в чате с помощью fetchMembers:

gp.channels.fetchMembers({channelId: 90})

В нашем примере промис будет содержать двух участников (Игрок 1 и Игрок 2), а также общую информацию об игроках (замьчен или нет, аватар, количество золота и т.д.). Отдельно показывается статус isOnline, который позволяет проверить, кто из участников чата онлайн:

Проверка онлайна игроков

В то же время есть дополнительное свойство при запросе, позволяющее запросить пользователей, которые онлайн. Для этого можно передать isOnline:true в качестве дополнительного аргумента в метод fetchMembers. В этом случае будут возвращены только те игроки, которые онлайн:

Если кто-то выйдет из чата, всем участникам чата придет соответствующее уведомление:

Итак, канал, созданный с дефолтными настройками, можно использовать в качестве общего чата. Все остальные игроки могут вступать в чат, получать / отправлять сообщений и подписываться на уведомления. Надеемся, что данный функционал будет вам полезен.

Оставайтесь на связи

С другими разделами документации вы можете ознакомиться здесь. Для начала работы вы можете ознакомиться с нашими туториалами.

Сообщество GamePush в Telegram: @gs_community.

Для ваших обращений e-mail: [email protected]

Желаем вам успехов!