package dev.inmo.tgbotapi.updateshandlers import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.update.* import dev.inmo.tgbotapi.types.update.abstracts.UnknownUpdate import dev.inmo.tgbotapi.types.update.abstracts.Update import dev.inmo.tgbotapi.types.update.media_group.* typealias UpdateReceiver = suspend (T) -> Unit interface UpdatesFilter { val asUpdateReceiver: UpdateReceiver val allowedUpdates: List } data class SimpleUpdatesFilter( private val messageCallback: UpdateReceiver? = null, private val messageMediaGroupCallback: UpdateReceiver? = null, private val editedMessageCallback: UpdateReceiver? = null, private val editedMessageMediaGroupCallback: UpdateReceiver? = null, private val channelPostCallback: UpdateReceiver? = null, private val channelPostMediaGroupCallback: UpdateReceiver? = null, private val editedChannelPostCallback: UpdateReceiver? = null, private val editedChannelPostMediaGroupCallback: UpdateReceiver? = null, private val chosenInlineResultCallback: UpdateReceiver? = null, private val inlineQueryCallback: UpdateReceiver? = null, private val callbackQueryCallback: UpdateReceiver? = null, private val shippingQueryCallback: UpdateReceiver? = null, private val preCheckoutQueryCallback: UpdateReceiver? = null, private val pollUpdateCallback: UpdateReceiver? = null, private val pollAnswerUpdateCallback: UpdateReceiver? = null, private val unknownUpdateTypeCallback: UpdateReceiver? = null ) : UpdatesFilter { override val asUpdateReceiver: UpdateReceiver = this::invoke override val allowedUpdates = listOfNotNull( (messageCallback ?: messageMediaGroupCallback) ?.let { UPDATE_MESSAGE }, (editedMessageCallback ?: editedMessageMediaGroupCallback) ?.let { UPDATE_EDITED_MESSAGE }, (channelPostCallback ?: channelPostMediaGroupCallback) ?.let { UPDATE_CHANNEL_POST }, (editedChannelPostCallback ?: editedChannelPostMediaGroupCallback) ?.let { UPDATE_EDITED_CHANNEL_POST }, chosenInlineResultCallback ?.let { UPDATE_CHOSEN_INLINE_RESULT }, inlineQueryCallback ?.let { UPDATE_INLINE_QUERY }, callbackQueryCallback ?.let { UPDATE_CALLBACK_QUERY }, shippingQueryCallback ?.let { UPDATE_SHIPPING_QUERY }, preCheckoutQueryCallback ?.let { UPDATE_PRE_CHECKOUT_QUERY }, pollUpdateCallback ?.let { UPDATE_POLL }, pollAnswerUpdateCallback ?.let { UPDATE_POLL_ANSWER } ) suspend fun invoke(update: Update) { when (update) { is MessageUpdate -> messageCallback ?.invoke(update) is MessageMediaGroupUpdate -> messageMediaGroupCallback ?.also { receiver -> receiver(update) } ?: messageCallback ?.also { receiver -> update.origins.mapNotNull { it as? MessageUpdate }.forEach { receiver(it) } } is EditMessageUpdate -> editedMessageCallback ?.invoke(update) is EditMessageMediaGroupUpdate -> editedMessageMediaGroupCallback ?.also { receiver -> receiver(update) } ?: editedMessageCallback ?.also { receiver -> receiver(update.origin) } is ChannelPostUpdate -> channelPostCallback ?.invoke(update) is ChannelPostMediaGroupUpdate -> channelPostMediaGroupCallback ?.also { receiver -> receiver(update) } ?: channelPostCallback ?.also { receiver -> update.origins.mapNotNull { it as? ChannelPostUpdate }.forEach { receiver(it) } } is EditChannelPostUpdate -> editedChannelPostCallback ?.invoke(update) is EditChannelPostMediaGroupUpdate -> editedChannelPostMediaGroupCallback ?.also { receiver -> receiver(update) } ?: editedChannelPostCallback ?.also { receiver -> receiver(update.origin) } is ChosenInlineResultUpdate -> chosenInlineResultCallback ?.invoke(update) is InlineQueryUpdate -> inlineQueryCallback ?.invoke(update) is CallbackQueryUpdate -> callbackQueryCallback ?.invoke(update) is ShippingQueryUpdate -> shippingQueryCallback ?.invoke(update) is PreCheckoutQueryUpdate -> preCheckoutQueryCallback ?.invoke(update) is PollUpdate -> pollUpdateCallback ?.invoke(update) is PollAnswerUpdate -> pollAnswerUpdateCallback ?.invoke(update) is UnknownUpdate -> unknownUpdateTypeCallback ?.invoke(update) } } } fun createSimpleUpdateFilter( messageCallback: UpdateReceiver? = null, mediaGroupCallback: UpdateReceiver? = null, editedMessageCallback: UpdateReceiver? = null, channelPostCallback: UpdateReceiver? = null, editedChannelPostCallback: UpdateReceiver? = null, chosenInlineResultCallback: UpdateReceiver? = null, inlineQueryCallback: UpdateReceiver? = null, callbackQueryCallback: UpdateReceiver? = null, shippingQueryCallback: UpdateReceiver? = null, preCheckoutQueryCallback: UpdateReceiver? = null, pollCallback: UpdateReceiver? = null, pollAnswerCallback: UpdateReceiver? = null, unknownCallback: UpdateReceiver? = null ): UpdatesFilter = SimpleUpdatesFilter( messageCallback = messageCallback, messageMediaGroupCallback = mediaGroupCallback, editedMessageCallback = editedMessageCallback, editedMessageMediaGroupCallback = mediaGroupCallback, channelPostCallback = channelPostCallback, channelPostMediaGroupCallback = mediaGroupCallback, editedChannelPostCallback = editedChannelPostCallback, editedChannelPostMediaGroupCallback = mediaGroupCallback, chosenInlineResultCallback = chosenInlineResultCallback, inlineQueryCallback = inlineQueryCallback, callbackQueryCallback = callbackQueryCallback, shippingQueryCallback = shippingQueryCallback, preCheckoutQueryCallback = preCheckoutQueryCallback, pollUpdateCallback = pollCallback, pollAnswerUpdateCallback = pollAnswerCallback, unknownUpdateTypeCallback = unknownCallback )