package com.github.insanusmokrassar.TelegramBotAPI.utils.extensions import com.github.insanusmokrassar.TelegramBotAPI.types.* import com.github.insanusmokrassar.TelegramBotAPI.types.update.* import com.github.insanusmokrassar.TelegramBotAPI.types.update.MediaGroupUpdates.* import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate import com.github.insanusmokrassar.TelegramBotAPI.utils.toMediaGroupUpdate data class UpdatesFilter( 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 ) { val asUpdateReceiver: UpdateReceiver = this::invoke 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 } ) suspend fun invoke(update: Any) { when (update) { is MessageUpdate -> messageCallback ?.invoke(update) is List<*> -> when (update.firstOrNull()) { is MessageUpdate, is MessageMediaGroupUpdate -> update.mapNotNull { it as? MessageUpdate }.let { mappedList -> messageMediaGroupCallback ?.also { receiver -> receiver(mappedList.mapNotNull { it.toMediaGroupUpdate() }) } ?: messageCallback ?.also { receiver -> mappedList.forEach { receiver(it) } } } is EditMessageUpdate, is EditMessageMediaGroupUpdate -> update.mapNotNull { it as? EditMessageUpdate }.let { mappedList -> editedMessageMediaGroupCallback ?.also { receiver -> receiver(mappedList.mapNotNull { it.toMediaGroupUpdate() }) } ?: editedMessageCallback ?.also { receiver -> mappedList.forEach { receiver(it) } } } is ChannelPostUpdate, is ChannelPostMediaGroupUpdate -> update.mapNotNull { it as? ChannelPostUpdate }.let { mappedList -> channelPostMediaGroupCallback ?.also { receiver -> receiver(mappedList.mapNotNull { it.toMediaGroupUpdate() }) } ?: channelPostCallback ?.also { receiver -> mappedList.forEach { receiver(it) } } } is EditChannelPostUpdate, is EditChannelPostMediaGroupUpdate -> update.mapNotNull { it as? EditChannelPostUpdate }.let { mappedList -> editedChannelPostMediaGroupCallback ?.also { receiver -> receiver(mappedList.mapNotNull { it.toMediaGroupUpdate() }) } ?: editedChannelPostCallback ?.also { receiver -> mappedList.forEach { receiver(it) } } } } is EditMessageUpdate -> editedMessageCallback ?.invoke(update) is ChannelPostUpdate -> channelPostCallback ?.invoke(update) is EditChannelPostUpdate -> editedChannelPostCallback ?.invoke(update) 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) } } } 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 ): UpdatesFilter = UpdatesFilter( 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 )