Плагин участников чата (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.38.3/mod.ts";
import { type ChatMember } from "https://deno.land/x/grammy@v1.38.3/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, чтобы добавить информацию о пользователи чата в хранилище, если она не существует.
Обратите внимание, что это означает, что хранилище будет вызываться каждое обновление, что может быть очень много, в зависимости от того, сколько обновлений получает ваш бот. Это может сильно повлиять на производительность вашего бота. Используйте это только в том случае, если вы действительно знаете, что делаете, и не боитесь рисков и последствий.