package com.github.insanusmokrassar.TelegramBotAPI.utils.extensions import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestsExecutor import com.github.insanusmokrassar.TelegramBotAPI.bot.UpdatesPoller import com.github.insanusmokrassar.TelegramBotAPI.types.ALL_UPDATES_LIST import com.github.insanusmokrassar.TelegramBotAPI.types.update.* import com.github.insanusmokrassar.TelegramBotAPI.types.update.MediaGroupUpdates.* import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.UpdatesFilter import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.KtorUpdatesPoller import kotlinx.coroutines.* import java.util.concurrent.Executors typealias UpdateReceiver = suspend (T) -> Unit fun RequestsExecutor.startGettingOfUpdates( timeoutMillis: Long = 30 * 1000, scope: CoroutineScope = CoroutineScope(Executors.newFixedThreadPool(4).asCoroutineDispatcher()), allowedUpdates: List? = null, block: UpdateReceiver ): UpdatesPoller { return KtorUpdatesPoller( this, timeoutMillis.toInt() / 1000, allowedUpdates = allowedUpdates ?: ALL_UPDATES_LIST, updatesReceiver = block ).also { it.start(scope) } } fun RequestsExecutor.startGettingOfUpdates( messageCallback: UpdateReceiver? = null, messageMediaGroupCallback: UpdateReceiver? = null, editedMessageCallback: UpdateReceiver? = null, editedMessageMediaGroupCallback: UpdateReceiver? = null, channelPostCallback: UpdateReceiver? = null, channelPostMediaGroupCallback: UpdateReceiver? = null, editedChannelPostCallback: UpdateReceiver? = null, editedChannelPostMediaGroupCallback: UpdateReceiver? = null, chosenInlineResultCallback: UpdateReceiver? = null, inlineQueryCallback: UpdateReceiver? = null, callbackQueryCallback: UpdateReceiver? = null, shippingQueryCallback: UpdateReceiver? = null, preCheckoutQueryCallback: UpdateReceiver? = null, pollCallback: UpdateReceiver? = null, timeoutMillis: Long = 30 * 1000, scope: CoroutineScope = GlobalScope ): UpdatesPoller { val filter = UpdatesFilter( messageCallback, messageMediaGroupCallback, editedMessageCallback, editedMessageMediaGroupCallback, channelPostCallback, channelPostMediaGroupCallback, editedChannelPostCallback, editedChannelPostMediaGroupCallback, chosenInlineResultCallback, inlineQueryCallback, callbackQueryCallback, shippingQueryCallback, preCheckoutQueryCallback, pollCallback ) return startGettingOfUpdates( timeoutMillis, scope, filter.allowedUpdates, filter.asUpdateReceiver ) } fun RequestsExecutor.startGettingOfUpdates( 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, timeoutMillis: Long = 30 * 1000, scope: CoroutineScope = GlobalScope ): UpdatesPoller = startGettingOfUpdates( 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, pollCallback = pollCallback, timeoutMillis = timeoutMillis, scope = scope )