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

Отправка подарка через фид игрока

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

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

  • 1 шаг: игрок 1 отправляет подарок игроку 2 в фид
  • 2 шаг: игрок 2 ищет среди сообщений в фиде маркированные подарки
  • 3 шаг: игрок 2 принимает подарок
  • 4 шаг: сохранение данных игрока 2
  • 5 шаг: удаление сообщения с подарком

Подробно разберем работу на каждом шаге, а в конце приведем код целиком.

1 Шаг - Игрок 1 отправляет подарок в фид Игрока 2

Отправить сообщение от имени Игрока 1 в фид Игрока 2 можно с помощью метода gp.channels.sendFeedMessage:

Теперь укажем, что сообщение содержит подарок. Для этого пометим сообщение тегом gift. В тексте сообщения можно передать информацию об идентификаторе подарка, например {id: 5}:

gp.channels.sendFeedMessage({
playerId: 1807692,
text: JSON.stringify({id:5}),
tags: ["gift"]
});
tip

playerId - идентификатор игрока - получателя.

Чтобы разделить подарки по виду можно использовать id, теги и даже текст. Главное - понять по сообщению тип подарка. Например, если подарок пришел с id: 5, — то в качестве подарка начисляется 100 монет, если id:6 - то 1000 алмазов. Разработчик решает сам, какой вид подарков начислять по указанным идентификаторам и тегам.

2 Шаг - Поиск подарка среди сообщений и отрисовка в интерфейсе

На этом действия со стороны Игрока 1 завершаются. Разберём действия со стороны второго игрока. Представим в интерфейсе кнопку “Подарки”, при нажатии на которую:

  • происходит поиск сообщений с подарком среди сообщений в фиде
  • отрисовка сообщений в интерфейсе

Рассмотрим реализацию giftsQuery и renderGifts.

Для поиска сообщения с подарком нам нужны фильтры поиска: тег подарка, идентификатор игрока и лимиты. Объявим переменную giftsQuery, которая будет содержать эти фильтры:

const giftsQuery = {
playerId: gp.player.id,
tags: ['gift'],
limit: 100,
};

Теперь получим список сообщений с подарком. Найти нужные сообщения по фильтру можно конструкцией gp.channels.fetchFeedMessages(giftsQuery), где в переменную giftsQuery помещаются параметры фильтра. Рисовать список подарков можно с помощью renderGifts:

// Ищем сообщения giftsQuery с подарком и запускаем отрисовку renderGifts
gp.channels.fetchFeedMessages(giftsQuery).then(renderGifts);

info

Когда придет сообщение, игрок автоматически получит уведомление, если он онлайн

Теперь отрисуем список. Для этого создадим функцию renderGifts, в которую передадим ответ от сервера со списком сообщений. В цикле функции отрисуем кнопку. При клике на кнопку “Подарок” ожидаем, что подарок будет принят. Поэтому нужно ввести функцию processGift, которая будет принимать подарок и начислять награду. В нее будет передано конкретное сообщение с id и тегами, определяющими сообщение как подарок.

function renderGifts(result) {
// для каждого подарка
result.items.forEach((message) => {
// рисуем отображение для message
// здесь доступен игрок - отправитель через message.player
const button = createAcceptButton();
// по клику начисляем подарок
button.on('click', () => processGift(message));
});
}

3 Шаг - Принятие подарка

Чтобы присвоить игроку подарок:

  • распарсим сообщение - функция processGift, вызывается при нажатии на кнопку
  • и присвоим игроку подарок gp.player.add('gold', 100). Можно немного усложнить и начислять 100 монет, если пришел подарок с id: 5. И если пришел id:6, — то начислим 1000 монет:
// начисляем выбранный подарок
async function processGift(message){
// парсим JSON
const gift = JSON.parse(message.text);

if (gift.id === 5) {
// начисляем игроку подарок
gp.player.add('gold', 100);
} else if (gift.id === 6) {
// начисляем игроку подарок
gp.player.add('gold', 1000);
}
}

4 Шаг - Сохранение данных игрока

После получения подарка необходимо сохранить данные игрока:

// сохраняем данные игрока
await gp.player.sync();

Теперь схему можно представить так:

  • игрок 2 получил список
  • отрисовка списка
  • игрок 2 нажимает кнопку “Подарок”, распарсиваем сообщение (если подарков много - каждое нужно распарсить)
  • начисление награды
  • сохранение данных игрока

5 Шаг - Удаляем сообщение с подарком

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

Удалим сообщение, используя идентификатор message.id. Он приходит вместе с сообщением message.text:

// удаляем сообщение о подарке
await gp.channels.deleteMessage({ messageId: message.id });

На этом передача подарка завершена.

Код целиком и другие дополнительные функции

Код передачи подарка:

gp.channels.sendFeedMessage({
playerId: 1807692,
text: JSON.stringify({id:5}),
tags: ["gift"]
});

Код получения подарка игроком:

const giftsQuery = {
playerId: gp.player.id,
tags: ['gift'],
limit: 100,
};

// начисляем выбранный подарок
async function processGift(message) {
// парсим JSON
const gift = JSON.parse(message.text);
if (gift.id === 5) {
// начисляем игроку подарок
gp.player.add('gold', 100);
}
}

// сохраняем данные игрока
await gp.player.sync();

// удаляем сообщение о подарке
await gp.channels.deleteMessage({ messageId: message.id });

function renderGifts(result) {
// для каждого подарка
result.items.forEach((message) => {
// рисуем отображение для message
// здесь доступен игрок-отправитель через message.player
const button = createAcceptButton();
// по клику начисляем подарок
button.on('click', () => processGift(message));
});

// если можно подгрузить еще - показываем кнопку подгрузить еще
if (result.canLoadMore) {
const buttonMore = createLoadMoreButton();
buttonMore.on('click', () => {
gp.channels.fetchMoreFeedMessages(giftsQuery).then(renderGifts);
});
}
}

// запускаем отрисовку первой сотни подарков
gp.channels.fetchFeedMessages(giftsQuery).then(renderGifts);

Дополнительный функционал, который может быть полезен:

Подгрузить ещё

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

// если можно подгрузить еще - показываем кнопку подгрузить еще
if (result.canLoadMore) {
const buttonMore = createLoadMoreButton();
buttonMore.on('click', () => {
gp.channels.fetchMoreFeedMessages(giftsQuery).then(renderGifts);
});
}

Галочка напротив имен получателей

При отправке сообщений нескольким игрокам может быть полезно событие gp.channels.on('sendMessage'), на которое можно подписаться. sendMessage вернет успешно созданное сообщение, которое отправил игрок. Например, этот функционал будет полезен, чтобы поставить галочку рядом с именами тех игроков, которым отправляется подарок.

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

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

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

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

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