Учасники чату (chat-members
)
Автоматично зберігайте інформацію про користувачів у чаті та легко отримуйте її. Відстежуйте учасників груп і каналів та переглядайте їх список.
Вступ
У багатьох ситуаціях боту необхідно мати інформацію про всіх користувачів певного чату. Однак, наразі Telegram Bot API не надає методів для отримання цієї інформації.
На допомогу приходить цей плагін: він автоматично обробляє оновлення chat
і зберігає всі обʼєкти Chat
.
Використання
Зберігання учасників чату
Ви можете використовувати дійсний адаптер сховища або екземпляр будь-якого класу, що реалізує інтерфейс Storage
.
Зверніть увагу, що згідно з офіційною документацією Telegram, ваш бот повинен вказати оновлення chat
в масиві allowed
, як показано в прикладі нижче. Це означає, що вам також потрібно вказати всі інші оновлення, які ви також хотіли б отримувати.
import { Bot, type Context, MemorySessionStorage } from "grammy";
import { type ChatMember } from "grammy/types";
import { chatMembers, type ChatMembersFlavor } from "@grammyjs/chat-members";
type MyContext = Context & ChatMembersFlavor;
const adapter = new MemorySessionStorage<ChatMember>();
const bot = new Bot<MyContext>("");
bot.use(chatMembers(adapter));
bot.start({
// Не забуваємо вказати бажані типи оновлень
allowed_updates: ["chat_member", "message"],
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import { Bot, MemorySessionStorage } from "grammy";
import { chatMembers } from "@grammyjs/chat-members";
const adapter = new MemorySessionStorage();
const bot = new Bot("");
bot.use(chatMembers(adapter));
bot.start({
// Не забуваємо вказати бажані типи оновлень
allowed_updates: ["chat_member", "message"],
});
2
3
4
5
6
7
8
9
10
11
12
13
import {
Bot,
type Context,
MemorySessionStorage,
} from "https://deno.land/x/grammy@v1.30.0/mod.ts";
import { type ChatMember } from "https://deno.land/x/grammy@v1.30.0/types.ts";
import {
chatMembers,
type ChatMembersFlavor,
} from "https://deno.land/x/grammy_chat_members/mod.ts";
type MyContext = Context & ChatMembersFlavor;
const adapter = new MemorySessionStorage<ChatMember>();
const bot = new Bot<MyContext>("");
bot.use(chatMembers(adapter));
bot.start({
// Не забуваємо вказати бажані типи оновлень
allowed_updates: ["chat_member", "message"],
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Читання учасників чату
Цей плагін також додає нову функцію ctx
, яка перевірятиме сховище на наявність інформації про учасника чату перед тим, як запитувати його в Telegram. Якщо учасник чату існує в сховищі, буде повернута інформація про нього. В іншому випадку буде викликано ctx
, а результат буде збережено до сховища, що пришвидшить подальші виклики і усуне необхідність повторного виклику Telegram для цього користувача і чату в майбутньому.
Ось приклад:
bot.on("message", async (ctx) => {
const chatMember = await ctx.chatMembers.getChatMember();
return ctx.reply(
`Привіт, ${chatMember.user.first_name}! Я бачу, що ви є ${chatMember.status} цього чату!`,
);
});
2
3
4
5
6
7
Ця функція приймає наступні необовʼязкові параметри:
chat
:Id - Значення за замовчуванням:
ctx
.chat .id - Ідентифікатор чату
- Значення за замовчуванням:
user
:Id - Значення за замовчуванням:
ctx
.from .id - Ідентифікатор користувача
- Значення за замовчуванням:
Ви можете передавати їх наступним чином:
bot.on("message", async (ctx) => {
const chatMember = await ctx.chatMembers.getChatMember(
ctx.chat.id,
ctx.from.id,
);
return ctx.reply(
`Привіт, ${chatMember.user.first_name}! Я бачу, що ви є ${chatMember.status} цього чату!`,
);
});
2
3
4
5
6
7
8
9
Зверніть увагу, що якщо ви не вкажете ідентифікатор чату і в контексті не буде властивості chat
, що може бути при оновленні запиту в режимі реального часу, це призведе до помилки. Те ж саме станеться, якщо в контексті немає властивості ctx
.
Агресивне зберігання
Параметр конфігурації enable
встановить проміжний обробник для кешування учасників чату без залежності від події chat
. Під час кожного оновлення проміжний обробник перевіряє наявність ctx
та ctx
. Якщо обидві властивості наявні й користувач відстуній у сховищі, виконується виклик ctx
для додавання інформації про учасника чату до сховища.
Зверніть увагу, що це означає, що сховище буде викликатися для кожного оновлення, що може бути дуже часто, залежно від того, скільки оновлень отримує ваш бот. Це може суттєво вплинути на продуктивність вашого бота. Використовуйте цю функцію, тільки якщо ви дійсно знаєте, що робите, й згодні з ризиками та наслідками.