Реакції
Боти можуть працювати з реакціями на повідомлення. Існує два типи реакцій: звичайні емодзі та користувацькі емодзі.
Реагування на повідомлення
Боти можуть додавати одну емодзі-реакцію на повідомлення.
У тих же випадках боти також можуть реагувати на повідомлення користувацькими емодзі, хоч боти і не можуть мати Telegram Premium. Коли преміум користувач додає до повідомлення користувацьку емодзі-реакцію, боти можуть згодом додати таку саму реакцію до цього повідомлення. Крім того, якщо адміністратор чату явно дозволяє використовувати користувацькі емодзі, вони також можуть бути використані ботами в цьому чаті.
Ось як ви можете реагувати на повідомлення:
// Використовуємо `ctx.react` для реакції на поточне повідомлення.
bot.command("start", (ctx) => ctx.react("😍"));
bot.on("message", (ctx) => ctx.react("👍"));
// Використовуємо `ctx.api.setMessageReaction` для реакції деінде.
bot.on("message", async (ctx) => {
await ctx.api.setMessageReaction(chat_id, message_id, "🎉");
});
// Використовуємо `bot.api.setMessageReaction` поза обробниками.
await bot.api.setMessageReaction(chat_id, message_id, "💯");
2
3
4
5
6
7
8
9
10
11
Як завжди, TypeScript забезпечить автодоповнення для емодзі, які ви можете використовувати. Список доступних емодзі-реакцій можна знайти тут.
Плагін емодзі
Програмувати з емодзі може бути доволі погано. Не всі системи можуть правильно відображати ваш вихідний код. Крім того, дратує постійно копіювати їх з різних місць.
Дозвольте плагіну емодзі допомогти вам!
Тепер, коли ви знаєте, як ваш бот може реагувати на повідомлення, давайте подивимося, як ми можемо впоратися з реакціями ваших користувачів.
Отримання оновлень про реакції
Існує кілька різних способів обробки оновлень про реакції. У приватних і групових чатах ваш бот отримає оновлення message
, якщо користувач змінить свою реакцію на повідомлення. У каналах (або автоматично перенаправлених дописах каналів у групах) ваш бот отримає оновлення message
, яке показує лише загальну кількість реакцій, але не розкриває, хто саме відреагував.
Обидва типи реакцій потрібно увімкнути, перш ніж ви зможете їх отримувати. Наприклад, для вбудованого тривалого опитування ви можете увімкнути їх так:
bot.start({
allowed_updates: ["message", "message_reaction", "message_reaction_count"],
});
2
3
Увімкнення всіх оновлень
Ви також можете імпортувати API
з grammY і потім вказати
allowed_updates: API_CONSTANTS.ALL_UPDATE_TYPES;
для того, щоб отримувати всі оновлення. Обов’язково перегляньте довідку API.
Плагін для конкурентності (runner) і set
мають схожі способи вказати allowed
.
Тепер, коли ваш бот може отримувати оновлення реакцій, давайте подивимося, як він може їх обробляти!
Оброблення нових реакцій
Працювати з новими реакціями дуже просто. grammY має спеціальну підтримку для цього через bot
.
bot.reaction("🎉", (ctx) => ctx.reply("юхху-у-у"));
bot.reaction(["👍", "👎"], (ctx) => ctx.reply("Гарний палець"));
2
Ці обробники спрацьовуватимуть щоразу, коли користувач додаватиме нову емодзі-реакцію до повідомлення.
Звісно, якщо ваш бот обробляє користувацькі емодзі-реакції від преміум користувачів, ви можете прослуховувати і їх.
bot.reaction(
{ type: "custom_emoji", custom_emoji_id: "identifier-string" },
async (ctx) => {
/* ... */
},
);
2
3
4
5
6
Для цього вам потрібно заздалегідь знати ідентифікатор користувацького емодзі.
Обробка довільних змін у реакціях
Хоча цього не видно в інтерфейсі жодного з офіційних клієнтів Telegram, користувачі можуть змінювати кілька реакцій одночасно. Ось чому оновлення реакцій дає вам два списки: старі реакції та нові реакції. Це дозволяє вашому боту обробляти довільні зміни в списку реакцій.
bot.on("message_reaction", async (ctx) => {
const reaction = ctx.messageReaction;
// Отримуємо лише ідентифікатор повідомлення, а не його вміст.
const message = reaction.message_id;
// Різниця між цими двома списками описує зміни.
const old = reaction.old_reaction; // попередній
const now = reaction.new_reaction; // поточний
});
2
3
4
5
6
7
8
grammY надає вам можливість ще більше відфільтрувати оновлення за допомогою спеціальних запитів фільтрування для типу реакції.
// Оновлення, в яких поточна реакція містить принаймні один емодзі.
bot.on("message_reaction:new_reaction:emoji", (ctx) => {/* ... */});
// Оновлення, в яких попередня реакція містила принаймні один користувацький емодзі.
bot.on("message_reaction:old_reaction:custom_emoji", (ctx) => {/* ... */});
2
3
4
Хоча ці два масиви об’єктів Reaction
технічно надають вам усю інформацію, необхідну для обробки оновлень реакцій, вони все одно можуть бути дещо громіздкими для роботи. Ось чому grammY може обчислювати більше корисних речей з оновлення.
Перевіряємо, як змінилися реакції
Існує скорочений метод контексту під назвою ctx
, який дозволяє побачити, як саме змінилася реакція.
Ось як ви можете використовувати ctx
, щоб виявити, чи видалив користувач свій голос “за”, але пробачити йому, якщо він все ще зберігає реакцію “ОК”.
bot.on("message_reaction", async (ctx) => {
const { emoji, emojiAdded, emojiRemoved } = ctx.reactions();
if (emojiRemoved.includes("👍")) {
// Голос "за" було видалено! Неприйнятно.
if (emoji.includes("👌")) {
// Поки що добре, не караємо.
await ctx.reply("Пробачаю тобі");
} else {
// Як вони посміли.
await ctx.banAuthor();
}
}
});
2
3
4
5
6
7
8
9
10
11
12
13
Метод ctx
повертає чотири масиви: додані емодзі, вилучені емодзі, збережені емодзі та список, який показує результат зміни. Крім того, є ще чотири масиви для користувацьких емодзі з аналогічною інформацією.
const {
/** Емодзі, які наразі присутні у реакції цього користувача */
emoji,
/** Емодзі, які було додано до реакції цього користувача */
emojiAdded,
/** Емодзі, які не змінилися після оновлення реакції цього користувача */
emojiKept,
/** Емодзі, які було видалено з реакції цього користувача */
emojiRemoved,
/** Користувацьці емодзі, які наразі присутні у реакції цього користувача */
customEmoji,
/** Користувацьці емодзі, які було додано до реакції цього користувача */
customEmojiAdded,
/** Користувацьці емодзі, які не змінилися після оновлення реакції цього користувача */
customEmojiKept,
/** Користувацьці емодзі, які було видалено з реакції цього користувача */
customEmojiRemoved,
} = ctx.reactions();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Про роботу з оновленнями в приватних і групових чатах було сказано багато. Давайте розглянемо канали.
Обробка оновлень кількості реакцій
У приватних чатах, групах і супергрупах відомо, хто реагує на те чи інше повідомлення. Однак для дописів на каналі ми маємо лише список анонімних реакцій. Отримати список користувачів, які відреагували на певний допис, неможливо. Те ж саме стосується дописів у каналах, які автоматично пересилаються в чати пов’язаних дискусійних груп.
В обох випадках ваш бот отримає оновлення message
.
Ви можете впоратися з цим так:
bot.on("message_reaction_count", async (ctx) => {
const counts = ctx.messageReactionCount;
// Знову ж таки, ми бачимо лише ідентифікатор повідомлення.
const message = counts.message_id;
// Ось список реакцій з їхньою кількістю.
const { reactions } = counts;
});
2
3
4
5
6
7
Обов’язково перевірте специфікацію щодо оновлення кількості реакцій на повідомлення.