@grammyjs/chat-members
Version:
Chat member plugin for grammY
87 lines (86 loc) • 3.73 kB
JavaScript
;
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 };