UNPKG

@grammyjs/chat-members

Version:
111 lines (110 loc) 3.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.chatMemberIs = chatMemberIs; exports.myChatMemberFilter = myChatMemberFilter; exports.chatMemberFilter = chatMemberFilter; /** * Used to normalize queries to the simplest components. */ const chatMemberQueries = { admin: ["administrator", "creator"], administrator: ["administrator"], creator: ["creator"], free: ["administrator", "creator", "member"], in: ["administrator", "creator", "member", "restricted_in"], out: ["kicked", "left", "restricted_out"], regular: ["member", "restricted_in"], kicked: ["kicked"], left: ["left"], member: ["member"], restricted: ["restricted"], restricted_in: ["restricted_in"], restricted_out: ["restricted_out"], }; /** * Normalizes the query, returning the corresponding list of chat member * statuses. */ function normalizeChatMemberQuery(query) { if (Array.isArray(query)) { const res = new Set(query.flatMap(normalizeChatMemberQuery)); return [...res]; } return [ ...chatMemberQueries[query], ]; } /** * Utility function to query the status of a chat member. * * Pass one of 'restricted_in', 'restricted_out', 'in', 'out', 'free', 'admin', * 'regular', or one of the default Telegram statuses ('administrator', * 'creator', 'kicked', 'left', 'member', 'restricted'), or an array of them. * * Returns true if the chat member matches the query. */ function chatMemberIs(chatMember, query) { const roles = normalizeChatMemberQuery(query); if (chatMember.status === "restricted") { if (roles.includes("restricted")) { return true; } else if (chatMember.is_member) { return roles.includes("restricted_in"); } else { return roles.includes("restricted_out"); } } return roles.includes(chatMember.status); } /** * Filter context to only find updates of type 'my_chat_member' where the status * transitions from oldStatus to newStatus. * * Example: * ```typescript * // listen for updates where the bot enters a group/supergroup * bot.chatType(['group', 'supergroup']).filter( * myChatMemberFilter('out', 'in'), * (ctx) => { * const { old_chat_member: oldChatMember, new_chat_member: newChatMember } = * ctx.myChatMember; * // ... * }, * ); */ function myChatMemberFilter(oldStatus, newStatus) { return (ctx) => { return (ctx.has("my_chat_member") && chatMemberIs(ctx.myChatMember.old_chat_member, oldStatus) && chatMemberIs(ctx.myChatMember.new_chat_member, newStatus)); }; } /** * Filter context to only find updates of type 'chat_member' where the status * transitions from oldStatus to newStatus. * * Example: * ```typescript * // listen for updates where a user leaves a channel * bot.chatType('channel').filter( * chatMemberFilter('in', 'out'), * (ctx) => { * const { old_chat_member: oldChatMember, new_chat_member: newChatMember } = * ctx.chatMember; * // ... * }, * ); * ``` * * **Note**: To receive these updates the bot must be admin in the chat **and** * you must add 'chat_member' to the list of allowed updates. */ function chatMemberFilter(oldStatus, newStatus) { return (ctx) => { return (ctx.has("chat_member") && chatMemberIs(ctx.chatMember.old_chat_member, oldStatus) && chatMemberIs(ctx.chatMember.new_chat_member, newStatus)); }; }