UNPKG

@grammyjs/chat-members

Version:
87 lines (86 loc) 3.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.chatMembers = chatMembers; const deps_node_js_1 = require("./deps.node.js"); function defaultKeyStrategy(chatId, userId) { return `${chatId}_${userId}`; } /** * Creates a middleware that keeps track of chat member updates * * **NOTE**: You need to manually enable `chat_members` update type for this to work * * Example usage: * * ```typescript * const bot = new Bot("<YOR_TELEGRAM_TOKEN>"); * const adapter = new MemorySessionStorage(); * * bot.use(chatMembers(adapter)); * * bot.start({ allowed_updates: ["chat_member"] }); * ``` * @param adapter Storage adapter responsible for saving members information * @param options Configuration options for the middleware * @returns A middleware that keeps track of chat member updates */ function chatMembers(adapter, options = {}) { const { keepLeftChatMembers = false, enableAggressiveStorage = false, getKey = defaultKeyStrategy, enableCaching = enableAggressiveStorage, } = options; const cache = new Map(); const composer = new deps_node_js_1.Composer(); composer.use((ctx, next) => { ctx.chatMembers = { getChatMember: async (chatId, userId) => { var _a, _b, _c, _d; if (chatId === void 0) { chatId = (_b = (_a = ctx.chat) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : undefined; } if (userId === void 0) { userId = (_d = (_c = ctx.from) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : undefined; } if (!userId) throw new Error("ctx.from is undefined and no userId was provided"); if (!chatId) throw new Error("ctx.chat is undefined and no chatId was provided"); const key = getKey(chatId, userId); const cachedChatMember = enableCaching ? cache.get(key) : undefined; if (cachedChatMember) return cachedChatMember.value; const dbChatMember = await adapter.read(key); if (dbChatMember) { if (enableCaching) cache.set(key, { timestamp: Date.now(), value: dbChatMember }); return dbChatMember; } const chatMember = await ctx.api.getChatMember(chatId, userId); if (enableCaching) cache.set(key, { timestamp: Date.now(), value: chatMember }); await adapter.write(key, chatMember); return chatMember; }, }; return next(); }); composer.on("chat_member", async (ctx, next) => { const key = getKey(ctx.chatMember.chat.id, ctx.chatMember.new_chat_member.user.id); const status = ctx.chatMember.new_chat_member.status; const DELETE_STATUS = ["left", "kicked"]; if (DELETE_STATUS.includes(status) && !keepLeftChatMembers) { if (enableCaching) cache.delete(key); if (await adapter.read(key)) await adapter.delete(key); return next(); } if (enableCaching) { cache.set(key, { timestamp: Date.now(), value: ctx.chatMember.new_chat_member }); } await adapter.write(key, ctx.chatMember.new_chat_member); return next(); }); composer .filter(() => enableAggressiveStorage) .filter((ctx) => Boolean(ctx.chat) && Boolean(ctx.from)) .use(async (ctx, next) => { await ctx.chatMembers.getChatMember(); return next(); }); return composer; } exports.default = { chatMembers };