/* eslint-disable @typescript-eslint/ban-types */ import type { CallbackQuery, CommonMessageBundle, Message, Update, } from '@telegraf/types' import type { Deunionize, UnionKeys } from './deunionize' type DistinctKeys = Exclude, keyof T> type Keyed> = Record & Deunionize, T> export type Filter = (update: Update) => update is U export const message = []>(...keys: Ks) => ( update: Update ): update is Update.MessageUpdate> => { if (!('message' in update)) return false for (const key of keys) { if (!(key in update.message)) return false } return true } export const editedMessage = []>(...keys: Ks) => ( update: Update ): update is Update.EditedMessageUpdate< Keyed > => { if (!('edited_message' in update)) return false for (const key of keys) { if (!(key in update.edited_message)) return false } return true } export const channelPost = []>(...keys: Ks) => ( update: Update ): update is Update.ChannelPostUpdate> => { if (!('channel_post' in update)) return false for (const key of keys) { if (!(key in update.channel_post)) return false } return true } export const editedChannelPost = []>(...keys: Ks) => ( update: Update ): update is Update.EditedChannelPostUpdate< Keyed > => { if (!('edited_channel_post' in update)) return false for (const key of keys) { if (!(key in update.edited_channel_post)) return false } return true } export const callbackQuery = []>(...keys: Ks) => ( update: Update ): update is Update.CallbackQueryUpdate> => { if (!('callback_query' in update)) return false for (const key of keys) { if (!(key in update.callback_query)) return false } return true } export const either = ( ...filters: { [UIdx in keyof Us]: Filter } ) => (update: Update): update is Us[number] => { for (const filter of filters) { if (filter(update)) return true } return false }