Plugin para miembros del chat (chat-members
)
Almacena automáticamente información sobre los usuarios de un chat y recupérala fácilmente. Rastrea miembros de grupos y canales, y enlístalos.
Introducción
En muchas situaciones, es necesario que un bot tenga información sobre todos los usuarios de un determinado chat. Actualmente, sin embargo, la API de Telegram Bot no expone ningún método que nos permita recuperar esta información.
Este plugin viene al rescate: escucha automáticamente los eventos chat
y almacena todos los objetos Chat
.
Uso
Almacenamiento de miembros del chat
Puedes usar un adaptador de almacenamiento válido de grammY o una instancia de cualquier clase que implemente la interfaz Storage
.
Por favor, ten en cuenta que según la documentación oficial de Telegram, tu bot necesita especificar la actualización chat
en el array allowed
, como se muestra en el ejemplo de abajo. Esto significa que también necesitas especificar cualquier otro evento que quieras recibir.
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>("<tu token de bot>");
bot.use(chatMembers(adapter));
bot.start({
// Asegúrese de especificar los tipos de actualización deseados
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({
// Asegúrese de especificar los tipos de actualización deseados
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.33.0/mod.ts";
import { type ChatMember } from "https://deno.land/x/grammy@v1.33.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>("<tu token de bot>");
bot.use(chatMembers(adapter));
bot.start({
// Asegúrese de especificar los tipos de actualización deseados
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
Lectura de Miembros del Chat
Este complemento también añade una nueva función ctx
que buscará en el almacenamiento, información sobre un miembro del chat antes de solicitarla a Telegram. Si el miembro del chat existe en el almacenamiento, será devuelto. Si no, se llamará a ctx
y el resultado se guardará en el almacenamiento, haciendo que las llamadas posteriores sean más rápidas y eliminando la necesidad de volver a llamar a Telegram para ese usuario y chat en el futuro.
Aquí tienes un ejemplo:
bot.on("message", async (ctx) => {
const chatMember = await ctx.chatMembers.getChatMember();
return ctx.reply(
`Hola, ${chatMember.user.first_name}! Veo que eres un ${chatMember.status} de este chat!`,
);
});
2
3
4
5
6
7
Esta función acepta los siguientes parámetros opcionales:
chat
:Id - Por defecto:
ctx
.chat .id - El identificador del chat
- Por defecto:
user
:Id - Por defecto:
ctx
.from .id - El identificador del chat
- Por defecto:
Puedes pasarlos así:
bot.on("message", async (ctx) => {
const chatMember = await ctx.chatMembers.getChatMember(
ctx.chat.id,
ctx.from.id,
);
return ctx.reply(
`Hola, ${chatMember.user.first_name}! Veo que eres un ${chatMember.status} de este chat!`,
);
});
2
3
4
5
6
7
8
9
Tenga en cuenta que, si no proporciona un identificador de chat y no hay ninguna propiedad chat
dentro del contexto (por ejemplo, en las actualizaciones de consulta en línea), se producirá un error. Lo mismo ocurrirá si no hay ctx
en el contexto.
Almacenamiento agresivo
La opción de configuración enable
instalará un middleware para almacenar en caché los miembros del chat sin depender del evento chat
. Para cada actualización, el middleware comprueba si ctx
y ctx
existen. Si ambos existen, entonces procede a llamar a ctx
para añadir la información del miembro del chat al almacenamiento en caso de que no exista.
Ten en cuenta que esto significa que se llamará al almacenamiento para cada actualización, lo que puede ser mucho, dependiendo de cuántas actualizaciones reciba tu bot. Esto puede afectar drásticamente al rendimiento de tu bot. Utilízalo sólo si realmente sabes lo que estás haciendo y estás de acuerdo con los riesgos y consecuencias.
Resumen del plugin
- Nombre:
chat
-members - Fuente
- Referencia