Плагин участников чата (chat-members
)
Автоматически сохраняйте информацию о пользователях в чате и легко извлекайте ее. Отслеживайте участников групп и каналов и составляйте их списки.
Введение
Во многих ситуациях боту необходимо иметь информацию обо всех пользователях данного чата. Однако, в настоящее время Telegram Bot API не предоставляет методов, позволяющих получить эту информацию.
Этот плагин приходит на помощь: автоматически прослушивает события chat
и сохраняет все объекты Chat
.
Использование
Сохранение пользователей чата
Вы можете использовать действующий адаптер grammY storage adapter или экземпляр любого класса, реализующего интерфейс 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
установит middleware для кэширования членов чата без зависимости от события chat
. При каждом обновлении middleware проверяет, существуют ли ctx
и ctx
. Если они существуют, то выполняется вызов ctx
, чтобы добавить информацию о пользователи чата в хранилище, если она не существует.
Обратите внимание, что это означает, что хранилище будет вызываться каждое обновление, что может быть очень много, в зависимости от того, сколько обновлений получает ваш бот. Это может сильно повлиять на производительность вашего бота. Используйте это только в том случае, если вы действительно знаете, что делаете, и не боитесь рисков и последствий.