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