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

Обработка реакций

Если пользователь поставил или убрал реакцию у сообщения, в сценарий приходит событие telegramReaction.

Данные о реакциях

Если событие сработало, данные о реакциях доступны в переменной $request.rawRequest.message_reaction. Пример данных:

{
"chat": {},
"message_id": 97,
"user": {},
"date": 1742384158,
"old_reaction": [
{
"type": "custom_emoji",
"custom_emoji_id": "5334564744177133218"
}
],
"new_reaction": [
{
"type": "custom_emoji",
"custom_emoji_id": "5334564744177133218"
},
{
"type": "emoji",
"emoji": "👍"
}
]
}

Здесь:

  • chat — данные о чате в Telegram.
  • message_id — идентификатор сообщения из чата Telegram. У этого сообщения изменились реакции.
  • user — пользователь, который поставил или убрал реакцию.
  • date — Unix-время в часовом поясе UTC, когда изменились реакции.
  • old_reaction — массив реакций, которые были у сообщения до события.
  • new_reaction — массив текущих реакций у сообщения.

Эмодзи

Массивы old_reaction и new_reaction содержат реакции. Пример массива:

[
{
"type": "emoji",
"emoji": "🤔"
},
{
"type": "custom_emoji",
"custom_emoji_id": "5334564744177133218"
}
]

Здесь:

  • type — тип реакции:

    • emoji — стандартный эмодзи.
    • custom_emoji — кастомный эмодзи.
  • emoji — символ эмодзи. Указан только для стандартных эмодзи.

  • custom_emoji_id — идентификатор кастомного эмодзи.

Использование в сценарии

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

  • Стейт Promo:

    1. Бот отправляет сообщение об акции через Telegram API. Это нужно, чтобы получить от Telegram message_id для отправленного сообщения.
      • Для отправки запроса бот использует сервис $http.
      • В токене bot_api_key указан токен Telegram-бота, который получен от BotFather. Бот получает его значение с помощью $secrets.get и подставляет его в URL запроса.
    2. Бот сохраняет значение message_id в $session.promoMessageId.
    предупреждение

    Если бот отправил сообщение в Telegram через API, то оно не будет отображаться в аналитике. В этом примере бот сам записывает текст сообщения в аналитику с помощью $analytics.setComment.

  • Стейт Reaction:

    1. Событие telegramReaction срабатывает, если пользователь поставил или убрал реакцию у любого сообщения бота.
    2. Бот сравнивает message_id из события с message_id сообщения об акции.
    3. Если идентификаторы совпадают, то бот формирует массив из всех стандартных эмодзи, которые установлены на сообщении об акции.
    4. Бот записывает эмодзи в аналитику с помощью $analytics.setComment.
theme: /

state: Start
q!: $regex</start>
a: Начнём.
script:
$jsapi.startSession();
// Получаем идентификатор чата в Telegram
$session.chatId = $request.rawRequest.message.chat.id;

state: Promo
q!: * промо *
script:
$session.promoText = "Новая акция — скидки до 20%";
// Отправляем сообщение об акции через API
var response = $http.post(
"https://api.telegram.org/bot" + $secrets.get("bot_api_key") + "/sendMessage",
{
body: {
// Идентификатор чата
chat_id: $session.chatId,
// Текст сообщения
text: $session.promoText
}
}
)
// Сохраняем message_id сообщения об акции
$session.promoMessageId = response.data.result.message_id;
// Записываем текст сообщения в аналитику
$analytics.setComment("Отправлено сообщение об акции: " + $session.promoText);

state: Reaction
# Пользователь поставил или снял реакцию у сообщения
event!: telegramReaction
script:
// Сравниваем message_id из события с message_id сообщения об акции
if ($request.rawRequest.message_reaction.message_id === $session.promoMessageId){
// Получаем массив из стандартных эмодзи, которые являются текущими реакциями
var currentReactions = $request.rawRequest.message_reaction.new_reaction;
var standardReactions = currentReactions.filter(function(reaction){
return reaction.type === "emoji";
});
var promoEmojis = standardReactions.map(function(item){
return item.emoji;
});
// Записываем результат в аналитику
$analytics.setComment(promoEmojis.join(",") || "Нет реакций");
}