mirror of
				https://github.com/InsanusMokrassar/TelegramBotAPI.git
				synced 2025-11-03 21:50:13 +00:00 
			
		
		
		
	
							
								
								
									
										23
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,5 +1,28 @@
 | 
				
			|||||||
# TelegramBotAPI changelog
 | 
					# TelegramBotAPI changelog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 0.35.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `Common`:
 | 
				
			||||||
 | 
					    * `Version`:
 | 
				
			||||||
 | 
					        * `Klock`: `2.2.0` -> `2.3.1`
 | 
				
			||||||
 | 
					        * `Ktor`: `1.6.1` -> `1.6.2`
 | 
				
			||||||
 | 
					        * `MicroUtils`: `0.5.16` -> `0.5.18`
 | 
				
			||||||
 | 
					* `Core`:
 | 
				
			||||||
 | 
					    * **`SimpleRequestCallFactory` and `MultipartRequestCallFactory` became a classes instead of objects to avoid
 | 
				
			||||||
 | 
					    collisions in different bots**
 | 
				
			||||||
 | 
					    * Support of strongly-typed ietf language codes has been added
 | 
				
			||||||
 | 
					* `API`:
 | 
				
			||||||
 | 
					    * New extension `TelegramBot#downloadFile` for any `MediaContent`
 | 
				
			||||||
 | 
					* `Behaviour Builder`:
 | 
				
			||||||
 | 
					    * New provider `defaultCoroutineScopeProvider`
 | 
				
			||||||
 | 
					        * Now it is not necessary to provide `CoroutineScope` to `TelegramBot#buildBehaviour`
 | 
				
			||||||
 | 
					        extension
 | 
				
			||||||
 | 
					    * New `TelegramBot#buildBehaviour` extension with `FlowUpdatesFilter` and `CoroutineScope` with
 | 
				
			||||||
 | 
					    default `CoroutineScope`
 | 
				
			||||||
 | 
					    * New typealias `SimpleFilter` for unifying triggers filter signatures
 | 
				
			||||||
 | 
					         * All waiters got real filters (`SimpleFilter`) and rename old filters as mappers
 | 
				
			||||||
 | 
					    * New extensions for `Any`: `as`/`when`/`require` for `WithOptionalLanguageCode` and `WithLanguageCode`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 0.35.2
 | 
					## 0.35.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* `Common`:
 | 
					* `Common`:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,15 +8,15 @@ kotlin.incremental.js=true
 | 
				
			|||||||
kotlin_version=1.5.21
 | 
					kotlin_version=1.5.21
 | 
				
			||||||
kotlin_coroutines_version=1.5.1
 | 
					kotlin_coroutines_version=1.5.1
 | 
				
			||||||
kotlin_serialisation_runtime_version=1.2.2
 | 
					kotlin_serialisation_runtime_version=1.2.2
 | 
				
			||||||
klock_version=2.2.0
 | 
					klock_version=2.3.1
 | 
				
			||||||
uuid_version=0.3.0
 | 
					uuid_version=0.3.0
 | 
				
			||||||
ktor_version=1.6.1
 | 
					ktor_version=1.6.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
micro_utils_version=0.5.16
 | 
					micro_utils_version=0.5.18
 | 
				
			||||||
 | 
					
 | 
				
			||||||
javax_activation_version=1.1.1
 | 
					javax_activation_version=1.1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
library_group=dev.inmo
 | 
					library_group=dev.inmo
 | 
				
			||||||
library_version=0.35.2
 | 
					library_version=0.35.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
github_release_plugin_version=2.2.12
 | 
					github_release_plugin_version=2.2.12
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,6 +51,7 @@ kotlin {
 | 
				
			|||||||
                api "dev.inmo:micro_utils.serialization.base64:$micro_utils_version"
 | 
					                api "dev.inmo:micro_utils.serialization.base64:$micro_utils_version"
 | 
				
			||||||
                api "dev.inmo:micro_utils.serialization.encapsulator:$micro_utils_version"
 | 
					                api "dev.inmo:micro_utils.serialization.encapsulator:$micro_utils_version"
 | 
				
			||||||
                api "dev.inmo:micro_utils.serialization.typed_serializer:$micro_utils_version"
 | 
					                api "dev.inmo:micro_utils.serialization.typed_serializer:$micro_utils_version"
 | 
				
			||||||
 | 
					                api "dev.inmo:micro_utils.language_codes:$micro_utils_version"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                api "io.ktor:ktor-client-core:$ktor_version"
 | 
					                api "io.ktor:ktor-client-core:$ktor_version"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,7 +52,7 @@ class KtorRequestsExecutor(
 | 
				
			|||||||
) : BaseRequestsExecutor(telegramAPIUrlsKeeper) {
 | 
					) : BaseRequestsExecutor(telegramAPIUrlsKeeper) {
 | 
				
			||||||
    private val callsFactories: List<KtorCallFactory> = callsFactories.run {
 | 
					    private val callsFactories: List<KtorCallFactory> = callsFactories.run {
 | 
				
			||||||
        if (!excludeDefaultFactories) {
 | 
					        if (!excludeDefaultFactories) {
 | 
				
			||||||
            this + listOf(SimpleRequestCallFactory, MultipartRequestCallFactory, DownloadFileRequestCallFactory)
 | 
					            this + listOf(SimpleRequestCallFactory(), MultipartRequestCallFactory(), DownloadFileRequestCallFactory)
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            this
 | 
					            this
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.bot.Ktor.base
 | 
					package dev.inmo.tgbotapi.bot.Ktor.base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.bot.Ktor.KtorCallFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.abstracts.*
 | 
					import dev.inmo.tgbotapi.requests.abstracts.*
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper
 | 
					import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.mapWithCommonValues
 | 
					import dev.inmo.tgbotapi.utils.mapWithCommonValues
 | 
				
			||||||
@@ -9,7 +10,7 @@ import io.ktor.client.request.forms.formData
 | 
				
			|||||||
import io.ktor.http.Headers
 | 
					import io.ktor.http.Headers
 | 
				
			||||||
import io.ktor.http.HttpHeaders
 | 
					import io.ktor.http.HttpHeaders
 | 
				
			||||||
 | 
					
 | 
				
			||||||
object MultipartRequestCallFactory : AbstractRequestCallFactory() {
 | 
					class MultipartRequestCallFactory : AbstractRequestCallFactory() {
 | 
				
			||||||
    override fun <T : Any> prepareCallBody(
 | 
					    override fun <T : Any> prepareCallBody(
 | 
				
			||||||
        client: HttpClient,
 | 
					        client: HttpClient,
 | 
				
			||||||
        urlsKeeper: TelegramAPIUrlsKeeper,
 | 
					        urlsKeeper: TelegramAPIUrlsKeeper,
 | 
				
			||||||
@@ -35,4 +36,7 @@ object MultipartRequestCallFactory : AbstractRequestCallFactory() {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Deprecated("Use class MultipartRequestCallFactory() constructor call instead of just MultipartRequestCallFactory")
 | 
				
			||||||
 | 
					    companion object : KtorCallFactory by MultipartRequestCallFactory()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1,12 +1,13 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.bot.Ktor.base
 | 
					package dev.inmo.tgbotapi.bot.Ktor.base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.bot.Ktor.KtorCallFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.abstracts.*
 | 
					import dev.inmo.tgbotapi.requests.abstracts.*
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper
 | 
					import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper
 | 
				
			||||||
import io.ktor.client.HttpClient
 | 
					import io.ktor.client.HttpClient
 | 
				
			||||||
import io.ktor.http.ContentType
 | 
					import io.ktor.http.ContentType
 | 
				
			||||||
import io.ktor.http.content.TextContent
 | 
					import io.ktor.http.content.TextContent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
object SimpleRequestCallFactory : AbstractRequestCallFactory() {
 | 
					class SimpleRequestCallFactory : AbstractRequestCallFactory() {
 | 
				
			||||||
    override fun <T : Any> prepareCallBody(
 | 
					    override fun <T : Any> prepareCallBody(
 | 
				
			||||||
        client: HttpClient,
 | 
					        client: HttpClient,
 | 
				
			||||||
        urlsKeeper: TelegramAPIUrlsKeeper,
 | 
					        urlsKeeper: TelegramAPIUrlsKeeper,
 | 
				
			||||||
@@ -19,4 +20,7 @@ object SimpleRequestCallFactory : AbstractRequestCallFactory() {
 | 
				
			|||||||
            ContentType.Application.Json
 | 
					            ContentType.Application.Json
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Deprecated("Use class SimpleRequestCallFactory() constructor call instead of just SimpleRequestCallFactory")
 | 
				
			||||||
 | 
					    companion object : KtorCallFactory by SimpleRequestCallFactory()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1,9 +1,9 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.requests.bot
 | 
					package dev.inmo.tgbotapi.requests.bot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
 | 
					import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.types.abstracts.WithOptionalLanguageCode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.commands.BotCommandScope
 | 
					import dev.inmo.tgbotapi.types.commands.BotCommandScope
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sealed interface MyCommandsRequest<T : Any> : SimpleRequest<T> {
 | 
					sealed interface MyCommandsRequest<T : Any> : SimpleRequest<T>, WithOptionalLanguageCode {
 | 
				
			||||||
    val scope: BotCommandScope
 | 
					    val scope: BotCommandScope
 | 
				
			||||||
    val languageCode: String?
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.requests.bot
 | 
					package dev.inmo.tgbotapi.requests.bot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCode
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCodeSerializer
 | 
				
			||||||
import dev.inmo.tgbotapi.types.commands.*
 | 
					import dev.inmo.tgbotapi.types.commands.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.languageCodeField
 | 
					import dev.inmo.tgbotapi.types.languageCodeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.scopeField
 | 
					import dev.inmo.tgbotapi.types.scopeField
 | 
				
			||||||
@@ -12,11 +14,20 @@ data class DeleteMyCommands(
 | 
				
			|||||||
    @Serializable(BotCommandScopeSerializer::class)
 | 
					    @Serializable(BotCommandScopeSerializer::class)
 | 
				
			||||||
    override val scope: BotCommandScope = BotCommandScopeDefault,
 | 
					    override val scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
    @SerialName(languageCodeField)
 | 
					    @SerialName(languageCodeField)
 | 
				
			||||||
    override val languageCode: String? = null
 | 
					    @Serializable(IetfLanguageCodeSerializer::class)
 | 
				
			||||||
 | 
					    override val ietfLanguageCode: IetfLanguageCode? = null
 | 
				
			||||||
) : MyCommandsRequest<Boolean> {
 | 
					) : MyCommandsRequest<Boolean> {
 | 
				
			||||||
    override fun method(): String  = "deleteMyCommands"
 | 
					    override fun method(): String  = "deleteMyCommands"
 | 
				
			||||||
    override val requestSerializer: SerializationStrategy<DeleteMyCommands> = serializer()
 | 
					    override val requestSerializer: SerializationStrategy<DeleteMyCommands> = serializer()
 | 
				
			||||||
    override val resultDeserializer: DeserializationStrategy<Boolean> = Boolean.serializer()
 | 
					    override val resultDeserializer: DeserializationStrategy<Boolean> = Boolean.serializer()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(
 | 
				
			||||||
 | 
					        scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
 | 
					        languageCode: String?
 | 
				
			||||||
 | 
					    ) : this(
 | 
				
			||||||
 | 
					        scope,
 | 
				
			||||||
 | 
					        languageCode ?.let(::IetfLanguageCode)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    companion object : MyCommandsRequest<Boolean> by DeleteMyCommands()
 | 
					    companion object : MyCommandsRequest<Boolean> by DeleteMyCommands()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.requests.bot
 | 
					package dev.inmo.tgbotapi.requests.bot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCode
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCodeSerializer
 | 
				
			||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.commands.*
 | 
					import dev.inmo.tgbotapi.types.commands.*
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
@@ -13,7 +15,8 @@ data class GetMyCommands(
 | 
				
			|||||||
    @Serializable(BotCommandScopeSerializer::class)
 | 
					    @Serializable(BotCommandScopeSerializer::class)
 | 
				
			||||||
    override val scope: BotCommandScope = BotCommandScopeDefault,
 | 
					    override val scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
    @SerialName(languageCodeField)
 | 
					    @SerialName(languageCodeField)
 | 
				
			||||||
    override val languageCode: String? = null
 | 
					    @Serializable(IetfLanguageCodeSerializer::class)
 | 
				
			||||||
 | 
					    override val ietfLanguageCode: IetfLanguageCode? = null
 | 
				
			||||||
) : MyCommandsRequest<List<BotCommand>> {
 | 
					) : MyCommandsRequest<List<BotCommand>> {
 | 
				
			||||||
    override fun method(): String = "getMyCommands"
 | 
					    override fun method(): String = "getMyCommands"
 | 
				
			||||||
    override val resultDeserializer: DeserializationStrategy<List<BotCommand>>
 | 
					    override val resultDeserializer: DeserializationStrategy<List<BotCommand>>
 | 
				
			||||||
@@ -21,5 +24,13 @@ data class GetMyCommands(
 | 
				
			|||||||
    override val requestSerializer: SerializationStrategy<*>
 | 
					    override val requestSerializer: SerializationStrategy<*>
 | 
				
			||||||
        get() = serializer()
 | 
					        get() = serializer()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(
 | 
				
			||||||
 | 
					        scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
 | 
					        languageCode: String?
 | 
				
			||||||
 | 
					    ) : this(
 | 
				
			||||||
 | 
					        scope,
 | 
				
			||||||
 | 
					        languageCode ?.let(::IetfLanguageCode)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    companion object : MyCommandsRequest<List<BotCommand>> by GetMyCommands()
 | 
					    companion object : MyCommandsRequest<List<BotCommand>> by GetMyCommands()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.requests.bot
 | 
					package dev.inmo.tgbotapi.requests.bot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCode
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCodeSerializer
 | 
				
			||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.commands.*
 | 
					import dev.inmo.tgbotapi.types.commands.*
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
@@ -13,7 +15,8 @@ class SetMyCommands(
 | 
				
			|||||||
    @Serializable(BotCommandScopeSerializer::class)
 | 
					    @Serializable(BotCommandScopeSerializer::class)
 | 
				
			||||||
    override val scope: BotCommandScope = BotCommandScopeDefault,
 | 
					    override val scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
    @SerialName(languageCodeField)
 | 
					    @SerialName(languageCodeField)
 | 
				
			||||||
    override val languageCode: String? = null
 | 
					    @Serializable(IetfLanguageCodeSerializer::class)
 | 
				
			||||||
 | 
					    override val ietfLanguageCode: IetfLanguageCode? = null
 | 
				
			||||||
) : MyCommandsRequest<Boolean> {
 | 
					) : MyCommandsRequest<Boolean> {
 | 
				
			||||||
    override fun method(): String = "setMyCommands"
 | 
					    override fun method(): String = "setMyCommands"
 | 
				
			||||||
    override val resultDeserializer: DeserializationStrategy<Boolean>
 | 
					    override val resultDeserializer: DeserializationStrategy<Boolean>
 | 
				
			||||||
@@ -21,6 +24,16 @@ class SetMyCommands(
 | 
				
			|||||||
    override val requestSerializer: SerializationStrategy<*>
 | 
					    override val requestSerializer: SerializationStrategy<*>
 | 
				
			||||||
        get() = serializer()
 | 
					        get() = serializer()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(
 | 
				
			||||||
 | 
					        commands: List<BotCommand>,
 | 
				
			||||||
 | 
					        scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
 | 
					        languageCode: String?
 | 
				
			||||||
 | 
					    ) : this(
 | 
				
			||||||
 | 
					        commands,
 | 
				
			||||||
 | 
					        scope,
 | 
				
			||||||
 | 
					        languageCode ?.let(::IetfLanguageCode)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    init {
 | 
					    init {
 | 
				
			||||||
        if (commands.size !in botCommandsLimit) {
 | 
					        if (commands.size !in botCommandsLimit) {
 | 
				
			||||||
            error("Bot commands list size able to be in range $botCommandsLimit, but incoming size is ${commands.size}")
 | 
					            error("Bot commands list size able to be in range $botCommandsLimit, but incoming size is ${commands.size}")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,12 +5,12 @@ import dev.inmo.tgbotapi.requests.edit.media.MediaContentMessageResultDeserializ
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent
 | 
					import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const val editMessageCaptionMethod = "editMessageCaption"
 | 
					const val editMessageCaptionMethod = "editMessageCaption"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,10 +4,10 @@ import dev.inmo.tgbotapi.requests.edit.abstracts.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fun EditInlineMessageCaption(
 | 
					fun EditInlineMessageCaption(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,12 +5,12 @@ import dev.inmo.tgbotapi.requests.send.TextContentMessageResultDeserializer
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.TextContent
 | 
					import dev.inmo.tgbotapi.types.message.content.TextContent
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const val editMessageTextMethod = "editMessageText"
 | 
					const val editMessageTextMethod = "editMessageText"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,10 +4,10 @@ import dev.inmo.tgbotapi.requests.edit.abstracts.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fun EditInlineMessageText(
 | 
					fun EditInlineMessageText(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,10 +7,10 @@ import dev.inmo.tgbotapi.requests.send.abstracts.ReplyingMarkupSendMessageReques
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSource
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSource
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fun CopyMessage(
 | 
					fun CopyMessage(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,13 +5,13 @@ import dev.inmo.tgbotapi.requests.send.abstracts.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.TextContent
 | 
					import dev.inmo.tgbotapi.types.message.content.TextContent
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.throwRangeError
 | 
					import dev.inmo.tgbotapi.utils.throwRangeError
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,13 +6,13 @@ import dev.inmo.tgbotapi.requests.send.media.base.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.media.AnimationContent
 | 
					import dev.inmo.tgbotapi.types.message.content.media.AnimationContent
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.mapOfNotNull
 | 
					import dev.inmo.tgbotapi.utils.mapOfNotNull
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.throwRangeError
 | 
					import dev.inmo.tgbotapi.utils.throwRangeError
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,13 +7,13 @@ import dev.inmo.tgbotapi.requests.send.media.base.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSource
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSource
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.media.AudioContent
 | 
					import dev.inmo.tgbotapi.types.message.content.media.AudioContent
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.mapOfNotNull
 | 
					import dev.inmo.tgbotapi.utils.mapOfNotNull
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.throwRangeError
 | 
					import dev.inmo.tgbotapi.utils.throwRangeError
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,13 +6,13 @@ import dev.inmo.tgbotapi.requests.send.media.base.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.media.DocumentContent
 | 
					import dev.inmo.tgbotapi.types.message.content.media.DocumentContent
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.mapOfNotNull
 | 
					import dev.inmo.tgbotapi.utils.mapOfNotNull
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.throwRangeError
 | 
					import dev.inmo.tgbotapi.utils.throwRangeError
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,13 +6,13 @@ import dev.inmo.tgbotapi.requests.send.media.base.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.media.PhotoContent
 | 
					import dev.inmo.tgbotapi.types.message.content.media.PhotoContent
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.throwRangeError
 | 
					import dev.inmo.tgbotapi.utils.throwRangeError
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,13 +6,13 @@ import dev.inmo.tgbotapi.requests.send.media.base.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.media.VideoContent
 | 
					import dev.inmo.tgbotapi.types.message.content.media.VideoContent
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.mapOfNotNull
 | 
					import dev.inmo.tgbotapi.utils.mapOfNotNull
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.throwRangeError
 | 
					import dev.inmo.tgbotapi.utils.throwRangeError
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,13 +6,13 @@ import dev.inmo.tgbotapi.requests.send.media.base.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.media.VoiceContent
 | 
					import dev.inmo.tgbotapi.types.message.content.media.VoiceContent
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.mapOfNotNull
 | 
					import dev.inmo.tgbotapi.utils.mapOfNotNull
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.throwRangeError
 | 
					import dev.inmo.tgbotapi.utils.throwRangeError
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,13 +7,13 @@ import dev.inmo.tgbotapi.requests.send.abstracts.SendMessageRequest
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSource
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSource
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.PollContent
 | 
					import dev.inmo.tgbotapi.types.message.content.PollContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.polls.*
 | 
					import dev.inmo.tgbotapi.types.polls.*
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private val commonResultDeserializer: DeserializationStrategy<ContentMessage<PollContent>> = TelegramBotAPIMessageDeserializationStrategyClass()
 | 
					private val commonResultDeserializer: DeserializationStrategy<ContentMessage<PollContent>> = TelegramBotAPIMessageDeserializationStrategyClass()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,8 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.types.InlineQueries.ChosenInlineResult
 | 
					package dev.inmo.tgbotapi.types.InlineQueries.ChosenInlineResult
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import dev.inmo.tgbotapi.CommonAbstracts.FromUser
 | 
					import dev.inmo.tgbotapi.CommonAbstracts.FromUser
 | 
				
			||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.InlineMessageIdentifier
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.types.InlineQueryIdentifier
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sealed interface ChosenInlineResult : FromUser {
 | 
					sealed interface ChosenInlineResult : FromUser {
 | 
				
			||||||
    val resultId: InlineQueryIdentifier //chosen temporary, can be changed
 | 
					    val resultId: InlineQueryIdentifier //chosen temporary, can be changed
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,10 +7,10 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,10 +6,10 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,10 +7,10 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,12 +6,12 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.files.abstracts.mimeTypeField
 | 
					import dev.inmo.tgbotapi.types.files.abstracts.mimeTypeField
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.MimeType
 | 
					import dev.inmo.tgbotapi.utils.MimeType
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,10 +7,10 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,11 +6,11 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.MimeType
 | 
					import dev.inmo.tgbotapi.utils.MimeType
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,10 +7,10 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,11 +6,11 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.MimeType
 | 
					import dev.inmo.tgbotapi.utils.MimeType
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,10 +7,10 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,10 +6,10 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,10 +7,10 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,12 +6,12 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSource
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSource
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
import dev.inmo.tgbotapi.types.files.abstracts.mimeTypeField
 | 
					import dev.inmo.tgbotapi.types.files.abstracts.mimeTypeField
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.MimeType
 | 
					import dev.inmo.tgbotapi.utils.MimeType
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,10 +7,10 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,10 +6,10 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.abstracts.results
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputMessageContent
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,9 +5,9 @@ import dev.inmo.tgbotapi.CommonAbstracts.types.DisableWebPagePreview
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,9 +6,9 @@ import dev.inmo.tgbotapi.requests.abstracts.fileIdToSend
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.SerialName
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,10 +6,10 @@ import dev.inmo.tgbotapi.requests.abstracts.fileIdToSend
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.files.AudioFile
 | 
					import dev.inmo.tgbotapi.types.files.AudioFile
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal const val audioInputMediaType = "audio"
 | 
					internal const val audioInputMediaType = "audio"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,10 +4,10 @@ import dev.inmo.tgbotapi.requests.abstracts.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.files.DocumentFile
 | 
					import dev.inmo.tgbotapi.types.files.DocumentFile
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal const val documentInputMediaType = "document"
 | 
					internal const val documentInputMediaType = "document"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,10 +5,10 @@ import dev.inmo.tgbotapi.requests.abstracts.fileIdToSend
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
import dev.inmo.tgbotapi.types.files.PhotoSize
 | 
					import dev.inmo.tgbotapi.types.files.PhotoSize
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal const val photoInputMediaType = "photo"
 | 
					internal const val photoInputMediaType = "photo"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,9 +5,9 @@ import dev.inmo.tgbotapi.requests.abstracts.fileIdToSend
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.*
 | 
					import dev.inmo.tgbotapi.types.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
					import dev.inmo.tgbotapi.types.ParseMode.ParseMode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
					import dev.inmo.tgbotapi.types.ParseMode.parseModeField
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.utils.extensions.makeString
 | 
				
			||||||
import kotlinx.serialization.*
 | 
					import kotlinx.serialization.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal const val videoInputMediaType = "video"
 | 
					internal const val videoInputMediaType = "video"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,8 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.types
 | 
					package dev.inmo.tgbotapi.types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCode
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCodeSerializer
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.types.abstracts.WithOptionalLanguageCode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.chat.abstracts.PrivateChat
 | 
					import dev.inmo.tgbotapi.types.chat.abstracts.PrivateChat
 | 
				
			||||||
import dev.inmo.tgbotapi.types.chat.extended.ExtendedPrivateChatImpl
 | 
					import dev.inmo.tgbotapi.types.chat.extended.ExtendedPrivateChatImpl
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.*
 | 
					import dev.inmo.tgbotapi.utils.*
 | 
				
			||||||
@@ -22,8 +25,17 @@ data class CommonUser(
 | 
				
			|||||||
    @SerialName(usernameField)
 | 
					    @SerialName(usernameField)
 | 
				
			||||||
    override val username: Username? = null,
 | 
					    override val username: Username? = null,
 | 
				
			||||||
    @SerialName(languageCodeField)
 | 
					    @SerialName(languageCodeField)
 | 
				
			||||||
    val languageCode: String? = null
 | 
					    @Serializable(IetfLanguageCodeSerializer::class)
 | 
				
			||||||
) : User()
 | 
					    override val ietfLanguageCode: IetfLanguageCode? = null
 | 
				
			||||||
 | 
					) : User(), WithOptionalLanguageCode {
 | 
				
			||||||
 | 
					    constructor(
 | 
				
			||||||
 | 
					        id: UserId,
 | 
				
			||||||
 | 
					        firstName: String,
 | 
				
			||||||
 | 
					        lastName: String = "",
 | 
				
			||||||
 | 
					        username: Username? = null,
 | 
				
			||||||
 | 
					        languageCode: String
 | 
				
			||||||
 | 
					    ) : this(id, firstName, lastName, username, IetfLanguageCode(languageCode))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PreviewFeature
 | 
					@PreviewFeature
 | 
				
			||||||
typealias ExtendedUser = ExtendedPrivateChatImpl
 | 
					typealias ExtendedUser = ExtendedPrivateChatImpl
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					package dev.inmo.tgbotapi.types.abstracts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface WithOptionalLanguageCode {
 | 
				
			||||||
 | 
					    val ietfLanguageCode: IetfLanguageCode?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    val languageCode: String?
 | 
				
			||||||
 | 
					        get() = ietfLanguageCode ?.code
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,7 +1,6 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.utils.internal
 | 
					package dev.inmo.tgbotapi.utils.internal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.MultilevelTextSource
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.MultilevelTextSource
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.types.UserId
 | 
					import dev.inmo.tgbotapi.types.UserId
 | 
				
			||||||
import dev.inmo.tgbotapi.types.link
 | 
					import dev.inmo.tgbotapi.types.link
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.extensions.*
 | 
					import dev.inmo.tgbotapi.utils.extensions.*
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,8 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.types
 | 
					package dev.inmo.tgbotapi.types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCode
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.types.abstracts.WithOptionalLanguageCode
 | 
				
			||||||
import java.util.*
 | 
					import java.util.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fun CommonUser.javaLocale(): Locale? = languageCode ?.let {
 | 
					fun IetfLanguageCode?.javaLocale() = this ?.code ?.let { Locale.forLanguageTag(it) }
 | 
				
			||||||
    Locale.forLanguageTag(it)
 | 
					fun WithOptionalLanguageCode?.javaLocale() = this ?.ietfLanguageCode ?.javaLocale()
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@ import dev.inmo.tgbotapi.requests.DownloadFile
 | 
				
			|||||||
import dev.inmo.tgbotapi.requests.abstracts.FileId
 | 
					import dev.inmo.tgbotapi.requests.abstracts.FileId
 | 
				
			||||||
import dev.inmo.tgbotapi.types.files.PathedFile
 | 
					import dev.inmo.tgbotapi.types.files.PathedFile
 | 
				
			||||||
import dev.inmo.tgbotapi.types.files.abstracts.TelegramMediaFile
 | 
					import dev.inmo.tgbotapi.types.files.abstracts.TelegramMediaFile
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun TelegramBot.downloadFile(
 | 
					suspend fun TelegramBot.downloadFile(
 | 
				
			||||||
    filePath: String
 | 
					    filePath: String
 | 
				
			||||||
@@ -30,3 +31,9 @@ suspend fun TelegramBot.downloadFile(
 | 
				
			|||||||
): ByteArray = downloadFile(
 | 
					): ByteArray = downloadFile(
 | 
				
			||||||
    getFileAdditionalInfo(file)
 | 
					    getFileAdditionalInfo(file)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					suspend fun TelegramBot.downloadFile(
 | 
				
			||||||
 | 
					    file: MediaContent
 | 
				
			||||||
 | 
					): ByteArray = downloadFile(
 | 
				
			||||||
 | 
					    getFileAdditionalInfo(file.media)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.extensions.api.bot
 | 
					package dev.inmo.tgbotapi.extensions.api.bot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCode
 | 
				
			||||||
import dev.inmo.tgbotapi.bot.TelegramBot
 | 
					import dev.inmo.tgbotapi.bot.TelegramBot
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.bot.DeleteMyCommands
 | 
					import dev.inmo.tgbotapi.requests.bot.DeleteMyCommands
 | 
				
			||||||
import dev.inmo.tgbotapi.types.commands.BotCommandScope
 | 
					import dev.inmo.tgbotapi.types.commands.BotCommandScope
 | 
				
			||||||
@@ -7,5 +8,10 @@ import dev.inmo.tgbotapi.types.commands.BotCommandScopeDefault
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun TelegramBot.deleteMyCommands(
 | 
					suspend fun TelegramBot.deleteMyCommands(
 | 
				
			||||||
    scope: BotCommandScope = BotCommandScopeDefault,
 | 
					    scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
    languageCode: String? = null
 | 
					    languageCode: IetfLanguageCode?
 | 
				
			||||||
) = execute(DeleteMyCommands(scope, languageCode))
 | 
					) = execute(DeleteMyCommands(scope, languageCode))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					suspend fun TelegramBot.deleteMyCommands(
 | 
				
			||||||
 | 
					    scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
 | 
					    languageCode: String? = null
 | 
				
			||||||
 | 
					) = deleteMyCommands(scope, languageCode ?.let(::IetfLanguageCode))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.extensions.api.bot
 | 
					package dev.inmo.tgbotapi.extensions.api.bot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCode
 | 
				
			||||||
import dev.inmo.tgbotapi.bot.TelegramBot
 | 
					import dev.inmo.tgbotapi.bot.TelegramBot
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.bot.GetMyCommands
 | 
					import dev.inmo.tgbotapi.requests.bot.GetMyCommands
 | 
				
			||||||
import dev.inmo.tgbotapi.types.commands.BotCommandScope
 | 
					import dev.inmo.tgbotapi.types.commands.BotCommandScope
 | 
				
			||||||
@@ -7,5 +8,10 @@ import dev.inmo.tgbotapi.types.commands.BotCommandScopeDefault
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun TelegramBot.getMyCommands(
 | 
					suspend fun TelegramBot.getMyCommands(
 | 
				
			||||||
    scope: BotCommandScope = BotCommandScopeDefault,
 | 
					    scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
    languageCode: String? = null
 | 
					    languageCode: IetfLanguageCode? = null
 | 
				
			||||||
) = execute(GetMyCommands(scope, languageCode))
 | 
					) = execute(GetMyCommands(scope, languageCode))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					suspend fun TelegramBot.getMyCommands(
 | 
				
			||||||
 | 
					    scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
 | 
					    languageCode: String? = null
 | 
				
			||||||
 | 
					) = getMyCommands(scope, languageCode ?.let(::IetfLanguageCode))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.extensions.api.bot
 | 
					package dev.inmo.tgbotapi.extensions.api.bot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.inmo.micro_utils.language_codes.IetfLanguageCode
 | 
				
			||||||
import dev.inmo.tgbotapi.bot.TelegramBot
 | 
					import dev.inmo.tgbotapi.bot.TelegramBot
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.bot.SetMyCommands
 | 
					import dev.inmo.tgbotapi.requests.bot.SetMyCommands
 | 
				
			||||||
import dev.inmo.tgbotapi.types.BotCommand
 | 
					import dev.inmo.tgbotapi.types.BotCommand
 | 
				
			||||||
@@ -9,9 +10,21 @@ import dev.inmo.tgbotapi.types.commands.BotCommandScopeDefault
 | 
				
			|||||||
suspend fun TelegramBot.setMyCommands(
 | 
					suspend fun TelegramBot.setMyCommands(
 | 
				
			||||||
    commands: List<BotCommand>,
 | 
					    commands: List<BotCommand>,
 | 
				
			||||||
    scope: BotCommandScope = BotCommandScopeDefault,
 | 
					    scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
    languageCode: String? = null
 | 
					    languageCode: IetfLanguageCode?
 | 
				
			||||||
) = execute(SetMyCommands(commands, scope, languageCode))
 | 
					) = execute(SetMyCommands(commands, scope, languageCode))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					suspend fun TelegramBot.setMyCommands(
 | 
				
			||||||
 | 
					    vararg commands: BotCommand,
 | 
				
			||||||
 | 
					    scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
 | 
					    languageCode: IetfLanguageCode?
 | 
				
			||||||
 | 
					) = setMyCommands(commands.toList(), scope, languageCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					suspend fun TelegramBot.setMyCommands(
 | 
				
			||||||
 | 
					    commands: List<BotCommand>,
 | 
				
			||||||
 | 
					    scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
 | 
					    languageCode: String? = null
 | 
				
			||||||
 | 
					) = setMyCommands(commands, scope, languageCode ?.let(::IetfLanguageCode))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun TelegramBot.setMyCommands(
 | 
					suspend fun TelegramBot.setMyCommands(
 | 
				
			||||||
    vararg commands: BotCommand,
 | 
					    vararg commands: BotCommand,
 | 
				
			||||||
    scope: BotCommandScope = BotCommandScopeDefault,
 | 
					    scope: BotCommandScope = BotCommandScopeDefault,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,42 @@ import dev.inmo.tgbotapi.utils.PreviewFeature
 | 
				
			|||||||
import kotlinx.coroutines.CoroutineScope
 | 
					import kotlinx.coroutines.CoroutineScope
 | 
				
			||||||
import kotlinx.coroutines.plus
 | 
					import kotlinx.coroutines.plus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * This function is used in [buildBehaviour] extensions to provide default [CoroutineScope] and allow to avoid all
 | 
				
			||||||
 | 
					 * unnecessary parameters except of block
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					expect var defaultCoroutineScopeProvider: () -> CoroutineScope
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Use this method in case you wish to make some additional actions with [flowUpdatesFilter].
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * **WARNING** This method WILL NOT launch any listening of updates. Use something like
 | 
				
			||||||
 | 
					 * [startGettingOfUpdatesByLongPolling] or tools for work with webhooks
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @see [BehaviourContext]
 | 
				
			||||||
 | 
					 * @see startGettingOfUpdatesByLongPolling
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@PreviewFeature
 | 
				
			||||||
 | 
					@Deprecated("Parameters has been reordered. Replace scope and flowUpdatesFilter for correct order")
 | 
				
			||||||
 | 
					suspend fun TelegramBot.buildBehaviour(
 | 
				
			||||||
 | 
					    scope: CoroutineScope,
 | 
				
			||||||
 | 
					    flowUpdatesFilter: FlowsUpdatesFilter,
 | 
				
			||||||
 | 
					    defaultExceptionsHandler: ExceptionHandler<Unit>? = null,
 | 
				
			||||||
 | 
					    block: BehaviourContextReceiver<Unit>
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					    BehaviourContext(
 | 
				
			||||||
 | 
					        this,
 | 
				
			||||||
 | 
					        scope.let {
 | 
				
			||||||
 | 
					              if (defaultExceptionsHandler == null) {
 | 
				
			||||||
 | 
					                  it
 | 
				
			||||||
 | 
					              } else {
 | 
				
			||||||
 | 
					                  it + ContextSafelyExceptionHandler(defaultExceptionsHandler)
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        flowUpdatesFilter
 | 
				
			||||||
 | 
					    ).block()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Use this method in case you wish to make some additional actions with [flowUpdatesFilter].
 | 
					 * Use this method in case you wish to make some additional actions with [flowUpdatesFilter].
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -21,8 +57,8 @@ import kotlinx.coroutines.plus
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@PreviewFeature
 | 
					@PreviewFeature
 | 
				
			||||||
suspend fun TelegramBot.buildBehaviour(
 | 
					suspend fun TelegramBot.buildBehaviour(
 | 
				
			||||||
    scope: CoroutineScope,
 | 
					 | 
				
			||||||
    flowUpdatesFilter: FlowsUpdatesFilter,
 | 
					    flowUpdatesFilter: FlowsUpdatesFilter,
 | 
				
			||||||
 | 
					    scope: CoroutineScope = defaultCoroutineScopeProvider(),
 | 
				
			||||||
    defaultExceptionsHandler: ExceptionHandler<Unit>? = null,
 | 
					    defaultExceptionsHandler: ExceptionHandler<Unit>? = null,
 | 
				
			||||||
    block: BehaviourContextReceiver<Unit>
 | 
					    block: BehaviourContextReceiver<Unit>
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
@@ -49,7 +85,7 @@ suspend fun TelegramBot.buildBehaviour(
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@PreviewFeature
 | 
					@PreviewFeature
 | 
				
			||||||
suspend fun TelegramBot.buildBehaviour(
 | 
					suspend fun TelegramBot.buildBehaviour(
 | 
				
			||||||
    scope: CoroutineScope,
 | 
					    scope: CoroutineScope = defaultCoroutineScopeProvider(),
 | 
				
			||||||
    defaultExceptionsHandler: ExceptionHandler<Unit>? = null,
 | 
					    defaultExceptionsHandler: ExceptionHandler<Unit>? = null,
 | 
				
			||||||
    block: BehaviourContextReceiver<Unit>
 | 
					    block: BehaviourContextReceiver<Unit>
 | 
				
			||||||
) = FlowsUpdatesFilter().let {
 | 
					) = FlowsUpdatesFilter().let {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
 | 
					package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asCallbackQueryUpdate
 | 
					import dev.inmo.tgbotapi.extensions.utils.asCallbackQueryUpdate
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
					import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
				
			||||||
import dev.inmo.tgbotapi.types.CallbackQuery.*
 | 
					import dev.inmo.tgbotapi.types.CallbackQuery.*
 | 
				
			||||||
@@ -14,13 +15,19 @@ private suspend fun <O> BehaviourContext.waitCallbackQueries(
 | 
				
			|||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
 | 
					    filter: SimpleFilter<CallbackQuery>? = null,
 | 
				
			||||||
    mapper: suspend CallbackQuery.() -> O?
 | 
					    mapper: suspend CallbackQuery.() -> O?
 | 
				
			||||||
): List<O> = expectFlow(
 | 
					): List<O> = expectFlow(
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    count,
 | 
					    count,
 | 
				
			||||||
    errorFactory
 | 
					    errorFactory
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    it.asCallbackQueryUpdate() ?.data ?.mapper().let(::listOfNotNull)
 | 
					    val data = it.asCallbackQueryUpdate() ?.data
 | 
				
			||||||
 | 
					    if (data != null && (filter == null || filter(data))) {
 | 
				
			||||||
 | 
					        data.mapper().let(::listOfNotNull)
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        emptyList()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}.toList().toList()
 | 
					}.toList().toList()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,17 +35,23 @@ private suspend inline fun <reified T : CallbackQuery> BehaviourContext.waitCall
 | 
				
			|||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    noinline filter: CallbackQueryMapper<T>? = null
 | 
					    noinline filter: SimpleFilter<T>? = null,
 | 
				
			||||||
 | 
					    noinline mapper: CallbackQueryMapper<T>? = null
 | 
				
			||||||
) : List<T> = waitCallbackQueries<T>(
 | 
					) : List<T> = waitCallbackQueries<T>(
 | 
				
			||||||
    count,
 | 
					    count,
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    errorFactory
 | 
					    errorFactory,
 | 
				
			||||||
 | 
					    filter ?.let {
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            (it as? T) ?.let { filter(it) } == true
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    if (this is T) {
 | 
					    if (this is T) {
 | 
				
			||||||
        if (filter == null) {
 | 
					        if (mapper == null) {
 | 
				
			||||||
            this
 | 
					            this
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            filter(this)
 | 
					            mapper(this)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        null
 | 
					        null
 | 
				
			||||||
@@ -50,53 +63,62 @@ suspend fun BehaviourContext.waitDataCallbackQuery(
 | 
				
			|||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CallbackQueryMapper<DataCallbackQuery>? = null
 | 
					    filter: SimpleFilter<DataCallbackQuery>? = null,
 | 
				
			||||||
) = waitCallbacks(count, initRequest, errorFactory, filter)
 | 
					    mapper: CallbackQueryMapper<DataCallbackQuery>? = null
 | 
				
			||||||
 | 
					) = waitCallbacks(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitGameShortNameCallbackQuery(
 | 
					suspend fun BehaviourContext.waitGameShortNameCallbackQuery(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CallbackQueryMapper<GameShortNameCallbackQuery>? = null
 | 
					    filter: SimpleFilter<GameShortNameCallbackQuery>? = null,
 | 
				
			||||||
) = waitCallbacks(count, initRequest, errorFactory, filter)
 | 
					    mapper: CallbackQueryMapper<GameShortNameCallbackQuery>? = null
 | 
				
			||||||
 | 
					) = waitCallbacks(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitInlineMessageIdCallbackQuery(
 | 
					suspend fun BehaviourContext.waitInlineMessageIdCallbackQuery(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CallbackQueryMapper<InlineMessageIdCallbackQuery>? = null
 | 
					    filter: SimpleFilter<InlineMessageIdCallbackQuery>? = null,
 | 
				
			||||||
) = waitCallbacks(count, initRequest, errorFactory, filter)
 | 
					    mapper: CallbackQueryMapper<InlineMessageIdCallbackQuery>? = null
 | 
				
			||||||
 | 
					) = waitCallbacks(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitInlineMessageIdDataCallbackQuery(
 | 
					suspend fun BehaviourContext.waitInlineMessageIdDataCallbackQuery(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CallbackQueryMapper<InlineMessageIdDataCallbackQuery>? = null
 | 
					    filter: SimpleFilter<InlineMessageIdDataCallbackQuery>? = null,
 | 
				
			||||||
) = waitCallbacks(count, initRequest, errorFactory, filter)
 | 
					    mapper: CallbackQueryMapper<InlineMessageIdDataCallbackQuery>? = null
 | 
				
			||||||
 | 
					) = waitCallbacks(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitInlineMessageIdGameShortNameCallbackQuery(
 | 
					suspend fun BehaviourContext.waitInlineMessageIdGameShortNameCallbackQuery(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CallbackQueryMapper<InlineMessageIdGameShortNameCallbackQuery>? = null
 | 
					    filter: SimpleFilter<InlineMessageIdGameShortNameCallbackQuery>? = null,
 | 
				
			||||||
) = waitCallbacks(count, initRequest, errorFactory, filter)
 | 
					    mapper: CallbackQueryMapper<InlineMessageIdGameShortNameCallbackQuery>? = null
 | 
				
			||||||
 | 
					) = waitCallbacks(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitMessageCallbackQuery(
 | 
					suspend fun BehaviourContext.waitMessageCallbackQuery(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CallbackQueryMapper<MessageCallbackQuery>? = null
 | 
					    filter: SimpleFilter<MessageCallbackQuery>? = null,
 | 
				
			||||||
) = waitCallbacks(count, initRequest, errorFactory, filter)
 | 
					    mapper: CallbackQueryMapper<MessageCallbackQuery>? = null
 | 
				
			||||||
 | 
					) = waitCallbacks(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitMessageDataCallbackQuery(
 | 
					suspend fun BehaviourContext.waitMessageDataCallbackQuery(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CallbackQueryMapper<MessageDataCallbackQuery>? = null
 | 
					    filter: SimpleFilter<MessageDataCallbackQuery>? = null,
 | 
				
			||||||
) = waitCallbacks(count, initRequest, errorFactory, filter)
 | 
					    mapper: CallbackQueryMapper<MessageDataCallbackQuery>? = null
 | 
				
			||||||
 | 
					) = waitCallbacks(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitMessageGameShortNameCallbackQuery(
 | 
					suspend fun BehaviourContext.waitMessageGameShortNameCallbackQuery(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CallbackQueryMapper<MessageGameShortNameCallbackQuery>? = null
 | 
					    filter: SimpleFilter<MessageGameShortNameCallbackQuery>? = null,
 | 
				
			||||||
) = waitCallbacks(count, initRequest, errorFactory, filter)
 | 
					    mapper: CallbackQueryMapper<MessageGameShortNameCallbackQuery>? = null
 | 
				
			||||||
 | 
					) = waitCallbacks(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitUnknownCallbackQuery(
 | 
					suspend fun BehaviourContext.waitUnknownCallbackQuery(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CallbackQueryMapper<UnknownCallbackQueryType>? = null
 | 
					    filter: SimpleFilter<UnknownCallbackQueryType>? = null,
 | 
				
			||||||
) = waitCallbacks(count, initRequest, errorFactory, filter)
 | 
					    mapper: CallbackQueryMapper<UnknownCallbackQueryType>? = null
 | 
				
			||||||
 | 
					) = waitCallbacks(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
 | 
					package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
					import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
				
			||||||
import dev.inmo.tgbotapi.types.ChatMemberUpdated
 | 
					import dev.inmo.tgbotapi.types.ChatMemberUpdated
 | 
				
			||||||
import dev.inmo.tgbotapi.types.update.CommonChatMemberUpdatedUpdate
 | 
					import dev.inmo.tgbotapi.types.update.CommonChatMemberUpdatedUpdate
 | 
				
			||||||
@@ -14,29 +15,37 @@ private suspend inline fun <reified T : ChatMemberUpdatedUpdate> BehaviourContex
 | 
				
			|||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
 | 
					    noinline filter: SimpleFilter<T>? = null,
 | 
				
			||||||
    noinline mapper: ChatMemberUpdatedMapper<ChatMemberUpdated>
 | 
					    noinline mapper: ChatMemberUpdatedMapper<ChatMemberUpdated>
 | 
				
			||||||
): List<ChatMemberUpdated> = expectFlow(
 | 
					): List<ChatMemberUpdated> = expectFlow(
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    count,
 | 
					    count,
 | 
				
			||||||
    errorFactory
 | 
					    errorFactory
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    (it as? T) ?.data.let(::listOfNotNull)
 | 
					    val casted = (it as? T) ?: return@expectFlow emptyList()
 | 
				
			||||||
 | 
					    if (filter == null || filter(casted)) {
 | 
				
			||||||
 | 
					        casted.data.mapper().let(::listOfNotNull)
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        emptyList()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}.toList().toList()
 | 
					}.toList().toList()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private suspend inline fun <reified T : ChatMemberUpdatedUpdate> BehaviourContext.waitChatMemberUpdatedWithFilter(
 | 
					private suspend inline fun <reified T : ChatMemberUpdatedUpdate> BehaviourContext.waitChatMemberUpdatedWithFilter(
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    noinline filter: ChatMemberUpdatedMapper<ChatMemberUpdated>? = null
 | 
					    noinline filter: SimpleFilter<T>? = null,
 | 
				
			||||||
 | 
					    noinline mapper: ChatMemberUpdatedMapper<ChatMemberUpdated>? = null
 | 
				
			||||||
) : List<ChatMemberUpdated> = waitChatMemberUpdated<T>(
 | 
					) : List<ChatMemberUpdated> = waitChatMemberUpdated<T>(
 | 
				
			||||||
    count,
 | 
					    count,
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    errorFactory
 | 
					    errorFactory,
 | 
				
			||||||
 | 
					    filter,
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    if (filter == null) {
 | 
					    if (mapper == null) {
 | 
				
			||||||
        this
 | 
					        this
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        filter(this)
 | 
					        mapper(this)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -44,19 +53,22 @@ suspend fun BehaviourContext.waitChatMemberUpdated(
 | 
				
			|||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: ChatMemberUpdatedMapper<ChatMemberUpdated>? = null
 | 
					    filter: SimpleFilter<ChatMemberUpdatedUpdate>? = null,
 | 
				
			||||||
) = waitChatMemberUpdatedWithFilter<ChatMemberUpdatedUpdate>(count, initRequest, errorFactory, filter)
 | 
					    mapper: ChatMemberUpdatedMapper<ChatMemberUpdated>? = null
 | 
				
			||||||
 | 
					) = waitChatMemberUpdatedWithFilter<ChatMemberUpdatedUpdate>(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.waitCommonChatMemberUpdated(
 | 
					suspend fun BehaviourContext.waitCommonChatMemberUpdated(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: ChatMemberUpdatedMapper<ChatMemberUpdated>? = null
 | 
					    filter: SimpleFilter<CommonChatMemberUpdatedUpdate>? = null,
 | 
				
			||||||
) = waitChatMemberUpdatedWithFilter<CommonChatMemberUpdatedUpdate>(count, initRequest, errorFactory, filter)
 | 
					    mapper: ChatMemberUpdatedMapper<ChatMemberUpdated>? = null
 | 
				
			||||||
 | 
					) = waitChatMemberUpdatedWithFilter<CommonChatMemberUpdatedUpdate>(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.waitMyChatMemberUpdated(
 | 
					suspend fun BehaviourContext.waitMyChatMemberUpdated(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: ChatMemberUpdatedMapper<ChatMemberUpdated>? = null
 | 
					    filter: SimpleFilter<MyChatMemberUpdatedUpdate>? = null,
 | 
				
			||||||
) = waitChatMemberUpdatedWithFilter<MyChatMemberUpdatedUpdate>(count, initRequest, errorFactory, filter)
 | 
					    mapper: ChatMemberUpdatedMapper<ChatMemberUpdated>? = null
 | 
				
			||||||
 | 
					) = waitChatMemberUpdatedWithFilter<MyChatMemberUpdatedUpdate>(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,13 +4,16 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions
 | 
					import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.*
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.utils.withContent
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
					import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
 | 
					import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.*
 | 
					import dev.inmo.tgbotapi.types.message.content.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.abstracts.*
 | 
					import dev.inmo.tgbotapi.types.message.content.abstracts.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.content.media.*
 | 
					import dev.inmo.tgbotapi.types.message.content.media.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.message.payments.InvoiceContent
 | 
					import dev.inmo.tgbotapi.types.message.payments.InvoiceContent
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.types.update.MediaGroupUpdates.SentMediaGroupUpdate
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.types.update.abstracts.BaseSentMessageUpdate
 | 
				
			||||||
import kotlinx.coroutines.flow.toList
 | 
					import kotlinx.coroutines.flow.toList
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typealias CommonMessageToContentMapper<T> = suspend CommonMessage<T>.() -> T?
 | 
					typealias CommonMessageToContentMapper<T> = suspend CommonMessage<T>.() -> T?
 | 
				
			||||||
@@ -20,18 +23,32 @@ private suspend fun <O> BehaviourContext.waitCommonMessage(
 | 
				
			|||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    includeMediaGroups: Boolean = true,
 | 
					    includeMediaGroups: Boolean = true,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
 | 
					    filter: SimpleFilter<CommonMessage<MessageContent>>? = null,
 | 
				
			||||||
    mapper: suspend CommonMessage<MessageContent>.() -> O?
 | 
					    mapper: suspend CommonMessage<MessageContent>.() -> O?
 | 
				
			||||||
): List<O> = expectFlow(
 | 
					): List<O> = expectFlow(
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    count,
 | 
					    count,
 | 
				
			||||||
    errorFactory
 | 
					    errorFactory
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
 | 
					    val messages = when (it) {
 | 
				
			||||||
 | 
					        is SentMediaGroupUpdate -> {
 | 
				
			||||||
            if (includeMediaGroups) {
 | 
					            if (includeMediaGroups) {
 | 
				
			||||||
        it.asSentMediaGroupUpdate() ?.data ?.mapNotNull {
 | 
					                it.data.map { it as CommonMessage<MessageContent> }
 | 
				
			||||||
            (it as CommonMessage<MessageContent>).mapper()
 | 
					            } else {
 | 
				
			||||||
        } ?.let { return@expectFlow it }
 | 
					                emptyList()
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        is BaseSentMessageUpdate -> listOf(it.data)
 | 
				
			||||||
 | 
					        else -> return@expectFlow emptyList()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    messages.mapNotNull { message ->
 | 
				
			||||||
 | 
					        val asCommonMessage = message as CommonMessage<MessageContent>
 | 
				
			||||||
 | 
					        if (filter == null || filter(asCommonMessage)) {
 | 
				
			||||||
 | 
					            asCommonMessage.mapper()
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            null
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    it.asBaseSentMessageUpdate() ?.data ?.asCommonMessage() ?.mapper().let(::listOfNotNull)
 | 
					 | 
				
			||||||
}.toList().toList()
 | 
					}.toList().toList()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private suspend inline fun <reified T : MessageContent> BehaviourContext.waitContent(
 | 
					private suspend inline fun <reified T : MessageContent> BehaviourContext.waitContent(
 | 
				
			||||||
@@ -39,20 +56,26 @@ private suspend inline fun <reified T : MessageContent> BehaviourContext.waitCon
 | 
				
			|||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    includeMediaGroups: Boolean = true,
 | 
					    includeMediaGroups: Boolean = true,
 | 
				
			||||||
    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    noinline filter: CommonMessageToContentMapper<T>? = null
 | 
					    noinline filter: SimpleFilter<CommonMessage<T>>? = null,
 | 
				
			||||||
 | 
					    noinline mapper: CommonMessageToContentMapper<T>? = null
 | 
				
			||||||
) : List<T> = waitCommonMessage<T>(
 | 
					) : List<T> = waitCommonMessage<T>(
 | 
				
			||||||
    count,
 | 
					    count,
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    includeMediaGroups,
 | 
					    includeMediaGroups,
 | 
				
			||||||
    errorFactory
 | 
					    errorFactory,
 | 
				
			||||||
 | 
					    filter ?.let {
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            it.withContent<T>() ?.let { filter(it) } == true
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    if (content is T) {
 | 
					    if (content is T) {
 | 
				
			||||||
        @Suppress("UNCHECKED_CAST")
 | 
					        @Suppress("UNCHECKED_CAST")
 | 
				
			||||||
        val message = (this as CommonMessage<T>)
 | 
					        val message = (this as CommonMessage<T>)
 | 
				
			||||||
        if (filter == null) {
 | 
					        if (mapper == null) {
 | 
				
			||||||
            message.content
 | 
					            message.content
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            safelyWithoutExceptions { filter(message) }
 | 
					            safelyWithoutExceptions { mapper(message) }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        null
 | 
					        null
 | 
				
			||||||
@@ -64,140 +87,162 @@ suspend fun BehaviourContext.waitContentMessage(
 | 
				
			|||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    includeMediaGroups: Boolean = true,
 | 
					    includeMediaGroups: Boolean = true,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<MessageContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<MessageContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<MessageContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitContact(
 | 
					suspend fun BehaviourContext.waitContact(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<ContactContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<ContactContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<ContactContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitDice(
 | 
					suspend fun BehaviourContext.waitDice(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<DiceContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<DiceContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<DiceContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitGame(
 | 
					suspend fun BehaviourContext.waitGame(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<GameContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<GameContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<GameContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitLocation(
 | 
					suspend fun BehaviourContext.waitLocation(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<LocationContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<LocationContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<LocationContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitPoll(
 | 
					suspend fun BehaviourContext.waitPoll(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<PollContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<PollContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<PollContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitText(
 | 
					suspend fun BehaviourContext.waitText(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<TextContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<TextContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<TextContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitVenue(
 | 
					suspend fun BehaviourContext.waitVenue(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<VenueContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<VenueContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<VenueContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitAudioMediaGroupContent(
 | 
					suspend fun BehaviourContext.waitAudioMediaGroupContent(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    includeMediaGroups: Boolean = true,
 | 
					    includeMediaGroups: Boolean = true,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<AudioMediaGroupContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<AudioMediaGroupContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<AudioMediaGroupContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitDocumentMediaGroupContent(
 | 
					suspend fun BehaviourContext.waitDocumentMediaGroupContent(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    includeMediaGroups: Boolean = true,
 | 
					    includeMediaGroups: Boolean = true,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<DocumentMediaGroupContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<DocumentMediaGroupContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<DocumentMediaGroupContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitMedia(
 | 
					suspend fun BehaviourContext.waitMedia(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    includeMediaGroups: Boolean = false,
 | 
					    includeMediaGroups: Boolean = false,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<MediaContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<MediaContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<MediaContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitAnyMediaGroupContent(
 | 
					suspend fun BehaviourContext.waitAnyMediaGroupContent(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    includeMediaGroups: Boolean = true,
 | 
					    includeMediaGroups: Boolean = true,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<MediaGroupContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<MediaGroupContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<MediaGroupContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitVisualMediaGroupContent(
 | 
					suspend fun BehaviourContext.waitVisualMediaGroupContent(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    includeMediaGroups: Boolean = true,
 | 
					    includeMediaGroups: Boolean = true,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<VisualMediaGroupContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<VisualMediaGroupContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<VisualMediaGroupContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitAnimation(
 | 
					suspend fun BehaviourContext.waitAnimation(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<AnimationContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<AnimationContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<AnimationContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitAudio(
 | 
					suspend fun BehaviourContext.waitAudio(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    includeMediaGroups: Boolean = false,
 | 
					    includeMediaGroups: Boolean = false,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<AudioContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<AudioContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<AudioContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitDocument(
 | 
					suspend fun BehaviourContext.waitDocument(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    includeMediaGroups: Boolean = false,
 | 
					    includeMediaGroups: Boolean = false,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<DocumentContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<DocumentContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<DocumentContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitPhoto(
 | 
					suspend fun BehaviourContext.waitPhoto(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    includeMediaGroups: Boolean = false,
 | 
					    includeMediaGroups: Boolean = false,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<PhotoContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<PhotoContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<PhotoContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitSticker(
 | 
					suspend fun BehaviourContext.waitSticker(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<StickerContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<StickerContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<StickerContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitVideo(
 | 
					suspend fun BehaviourContext.waitVideo(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    includeMediaGroups: Boolean = false,
 | 
					    includeMediaGroups: Boolean = false,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<VideoContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<VideoContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<VideoContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitVideoNote(
 | 
					suspend fun BehaviourContext.waitVideoNote(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<VideoNoteContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<VideoNoteContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<VideoNoteContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitVoice(
 | 
					suspend fun BehaviourContext.waitVoice(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<VoiceContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<VoiceContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<VoiceContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitInvoice(
 | 
					suspend fun BehaviourContext.waitInvoice(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: CommonMessageToContentMapper<InvoiceContent>? = null
 | 
					    filter: SimpleFilter<CommonMessage<InvoiceContent>>? = null,
 | 
				
			||||||
) = waitContent(count, initRequest, false, errorFactory, filter)
 | 
					    mapper: CommonMessageToContentMapper<InvoiceContent>? = null
 | 
				
			||||||
 | 
					) = waitContent(count, initRequest, false, errorFactory, filter, mapper)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
 | 
					package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asBaseSentMessageUpdate
 | 
					import dev.inmo.tgbotapi.extensions.utils.asBaseSentMessageUpdate
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asChatEventMessage
 | 
					import dev.inmo.tgbotapi.extensions.utils.asChatEventMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
					import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
				
			||||||
@@ -18,13 +19,19 @@ private suspend fun <O> BehaviourContext.waitEventMessages(
 | 
				
			|||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
 | 
					    filter: SimpleFilter<ChatEventMessage<ChatEvent>>? = null,
 | 
				
			||||||
    mapper: suspend ChatEventMessage<ChatEvent>.() -> O?
 | 
					    mapper: suspend ChatEventMessage<ChatEvent>.() -> O?
 | 
				
			||||||
): List<O> = expectFlow(
 | 
					): List<O> = expectFlow(
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    count,
 | 
					    count,
 | 
				
			||||||
    errorFactory
 | 
					    errorFactory
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage() ?.mapper().let(::listOfNotNull)
 | 
					    val data = it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage()
 | 
				
			||||||
 | 
					    if (data != null && (filter == null || filter(data))) {
 | 
				
			||||||
 | 
					        data.mapper().let(::listOfNotNull)
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        emptyList()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}.toList().toList()
 | 
					}.toList().toList()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -32,19 +39,25 @@ private suspend inline fun <reified T : ChatEvent> BehaviourContext.waitEvents(
 | 
				
			|||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    noinline filter: EventMessageToEventMapper<T>? = null
 | 
					    noinline filter: SimpleFilter<ChatEventMessage<T>>? = null,
 | 
				
			||||||
 | 
					    noinline mapper: EventMessageToEventMapper<T>? = null
 | 
				
			||||||
) : List<T> = waitEventMessages<T>(
 | 
					) : List<T> = waitEventMessages<T>(
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    errorFactory,
 | 
					    errorFactory,
 | 
				
			||||||
    count
 | 
					    count,
 | 
				
			||||||
 | 
					    filter ?.let {
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            (it.chatEvent as? T) ?.let { filter(it as ChatEventMessage<T>) } == true
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    if (chatEvent is T) {
 | 
					    if (chatEvent is T) {
 | 
				
			||||||
        @Suppress("UNCHECKED_CAST")
 | 
					        @Suppress("UNCHECKED_CAST")
 | 
				
			||||||
        val message = (this as ChatEventMessage<T>)
 | 
					        val message = (this as ChatEventMessage<T>)
 | 
				
			||||||
        if (filter == null) {
 | 
					        if (mapper == null) {
 | 
				
			||||||
            message.chatEvent
 | 
					            message.chatEvent
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            filter(message)
 | 
					            mapper(message)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        null
 | 
					        null
 | 
				
			||||||
@@ -55,124 +68,144 @@ suspend fun BehaviourContext.waitChannelEvents(
 | 
				
			|||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<ChannelEvent>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<ChannelEvent>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<ChannelEvent>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.waitChatEvents(
 | 
					suspend fun BehaviourContext.waitChatEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<ChatEvent>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<ChatEvent>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<ChatEvent>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.waitVoiceChatEvents(
 | 
					suspend fun BehaviourContext.waitVoiceChatEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<VoiceChatEvent>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<VoiceChatEvent>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<VoiceChatEvent>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitVoiceChatStartedEvents(
 | 
					suspend fun BehaviourContext.waitVoiceChatStartedEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<VoiceChatStarted>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<VoiceChatStarted>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<VoiceChatStarted>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitVoiceChatEndedEvents(
 | 
					suspend fun BehaviourContext.waitVoiceChatEndedEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<VoiceChatEnded>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<VoiceChatEnded>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<VoiceChatEnded>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitVoiceChatParticipantsInvitedEvents(
 | 
					suspend fun BehaviourContext.waitVoiceChatParticipantsInvitedEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<VoiceChatParticipantsInvited>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<VoiceChatParticipantsInvited>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<VoiceChatParticipantsInvited>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.waitMessageAutoDeleteTimerChangedEvents(
 | 
					suspend fun BehaviourContext.waitMessageAutoDeleteTimerChangedEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<MessageAutoDeleteTimerChanged>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<MessageAutoDeleteTimerChanged>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<MessageAutoDeleteTimerChanged>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.waitCommonEvents(
 | 
					suspend fun BehaviourContext.waitCommonEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<CommonEvent>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<CommonEvent>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<CommonEvent>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitGroupEvents(
 | 
					suspend fun BehaviourContext.waitGroupEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<GroupEvent>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<GroupEvent>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<GroupEvent>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitSupergroupEvents(
 | 
					suspend fun BehaviourContext.waitSupergroupEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<SupergroupEvent>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<SupergroupEvent>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<SupergroupEvent>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.waitChannelChatCreatedEvents(
 | 
					suspend fun BehaviourContext.waitChannelChatCreatedEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<ChannelChatCreated>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<ChannelChatCreated>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<ChannelChatCreated>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitDeleteChatPhotoEvents(
 | 
					suspend fun BehaviourContext.waitDeleteChatPhotoEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<DeleteChatPhoto>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<DeleteChatPhoto>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<DeleteChatPhoto>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitGroupChatCreatedEvents(
 | 
					suspend fun BehaviourContext.waitGroupChatCreatedEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<GroupChatCreated>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<GroupChatCreated>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<GroupChatCreated>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitLeftChatMemberEvents(
 | 
					suspend fun BehaviourContext.waitLeftChatMemberEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<LeftChatMember>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<LeftChatMember>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<LeftChatMember>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitNewChatPhotoEvents(
 | 
					suspend fun BehaviourContext.waitNewChatPhotoEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<NewChatPhoto>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<NewChatPhoto>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<NewChatPhoto>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitNewChatMembersEvents(
 | 
					suspend fun BehaviourContext.waitNewChatMembersEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<NewChatMembers>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<NewChatMembers>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<NewChatMembers>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitNewChatTitleEvents(
 | 
					suspend fun BehaviourContext.waitNewChatTitleEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<NewChatTitle>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<NewChatTitle>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<NewChatTitle>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitPinnedMessageEvents(
 | 
					suspend fun BehaviourContext.waitPinnedMessageEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<PinnedMessage>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<PinnedMessage>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<PinnedMessage>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitProximityAlertTriggeredEvents(
 | 
					suspend fun BehaviourContext.waitProximityAlertTriggeredEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<ProximityAlertTriggered>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<ProximityAlertTriggered>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<ProximityAlertTriggered>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitSupergroupChatCreatedEvents(
 | 
					suspend fun BehaviourContext.waitSupergroupChatCreatedEvents(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: EventMessageToEventMapper<SupergroupChatCreated>? = null
 | 
					    filter: SimpleFilter<ChatEventMessage<SupergroupChatCreated>>? = null,
 | 
				
			||||||
) = waitEvents(count, initRequest, errorFactory, filter)
 | 
					    mapper: EventMessageToEventMapper<SupergroupChatCreated>? = null
 | 
				
			||||||
 | 
					) = waitEvents(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
 | 
					package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asInlineQueryUpdate
 | 
					import dev.inmo.tgbotapi.extensions.utils.asInlineQueryUpdate
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
					import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
				
			||||||
import dev.inmo.tgbotapi.types.InlineQueries.query.*
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.query.*
 | 
				
			||||||
@@ -12,13 +13,19 @@ private suspend fun <O> BehaviourContext.waitInlineQueries(
 | 
				
			|||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
 | 
					    filter: SimpleFilter<InlineQuery>? = null,
 | 
				
			||||||
    mapper: suspend InlineQuery.() -> O?
 | 
					    mapper: suspend InlineQuery.() -> O?
 | 
				
			||||||
): List<O> = expectFlow(
 | 
					): List<O> = expectFlow(
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    count,
 | 
					    count,
 | 
				
			||||||
    errorFactory
 | 
					    errorFactory
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    it.asInlineQueryUpdate() ?.data ?.mapper().let(::listOfNotNull)
 | 
					    val data = it.asInlineQueryUpdate() ?.data
 | 
				
			||||||
 | 
					    if (data != null && (filter == null || filter(data))) {
 | 
				
			||||||
 | 
					        data.mapper().let(::listOfNotNull)
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        emptyList()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}.toList().toList()
 | 
					}.toList().toList()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -26,17 +33,23 @@ private suspend inline fun <reified T : InlineQuery> BehaviourContext.waitInline
 | 
				
			|||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    noinline filter: InlineQueryMapper<T>? = null
 | 
					    noinline filter: SimpleFilter<T>? = null,
 | 
				
			||||||
 | 
					    noinline mapper: InlineQueryMapper<T>? = null
 | 
				
			||||||
) : List<T> = waitInlineQueries<T>(
 | 
					) : List<T> = waitInlineQueries<T>(
 | 
				
			||||||
    count,
 | 
					    count,
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    errorFactory
 | 
					    errorFactory,
 | 
				
			||||||
 | 
					    filter ?.let {
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            (it as? T) ?.let { casted -> filter(casted) } == true
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    if (this is T) {
 | 
					    if (this is T) {
 | 
				
			||||||
        if (filter == null) {
 | 
					        if (mapper == null) {
 | 
				
			||||||
            this
 | 
					            this
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            filter(this)
 | 
					            mapper(this)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        null
 | 
					        null
 | 
				
			||||||
@@ -47,18 +60,21 @@ suspend fun BehaviourContext.waitAnyInlineQuery(
 | 
				
			|||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: InlineQueryMapper<InlineQuery>? = null
 | 
					    filter: SimpleFilter<InlineQuery>? = null,
 | 
				
			||||||
) = waitInlines(count, initRequest, errorFactory, filter)
 | 
					    mapper: InlineQueryMapper<InlineQuery>? = null
 | 
				
			||||||
 | 
					) = waitInlines(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.waitBaseInlineQuery(
 | 
					suspend fun BehaviourContext.waitBaseInlineQuery(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: InlineQueryMapper<BaseInlineQuery>? = null
 | 
					    filter: SimpleFilter<BaseInlineQuery>? = null,
 | 
				
			||||||
) = waitInlines(count, initRequest, errorFactory, filter)
 | 
					    mapper: InlineQueryMapper<BaseInlineQuery>? = null
 | 
				
			||||||
 | 
					) = waitInlines(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
suspend fun BehaviourContext.waitLocationInlineQuery(
 | 
					suspend fun BehaviourContext.waitLocationInlineQuery(
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: InlineQueryMapper<LocationInlineQuery>? = null
 | 
					    filter: SimpleFilter<LocationInlineQuery>? = null,
 | 
				
			||||||
) = waitInlines(count, initRequest, errorFactory, filter)
 | 
					    mapper: InlineQueryMapper<LocationInlineQuery>? = null
 | 
				
			||||||
 | 
					) = waitInlines(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
 | 
					package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate
 | 
					import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asPassportMessage
 | 
					import dev.inmo.tgbotapi.extensions.utils.asPassportMessage
 | 
				
			||||||
import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
					import dev.inmo.tgbotapi.requests.abstracts.Request
 | 
				
			||||||
@@ -17,30 +18,38 @@ suspend fun <O> BehaviourContext.waitPassportMessages(
 | 
				
			|||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
 | 
					    filter: SimpleFilter<PassportMessage>? = null,
 | 
				
			||||||
    mapper: suspend PassportMessage.() -> O?
 | 
					    mapper: suspend PassportMessage.() -> O?
 | 
				
			||||||
): List<O> = expectFlow(
 | 
					): List<O> = expectFlow(
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    count,
 | 
					    count,
 | 
				
			||||||
    errorFactory
 | 
					    errorFactory
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    it.asMessageUpdate() ?.data ?.asPassportMessage() ?.mapper().let(::listOfNotNull)
 | 
					    val data = it.asMessageUpdate() ?.data ?.asPassportMessage() ?: return@expectFlow emptyList()
 | 
				
			||||||
 | 
					    if (filter == null || filter(data)) {
 | 
				
			||||||
 | 
					        data.mapper().let(::listOfNotNull)
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        emptyList()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}.toList().toList()
 | 
					}.toList().toList()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend inline fun <reified T : EncryptedPassportElement> BehaviourContext.waitPassportMessagesWith(
 | 
					suspend inline fun <reified T : EncryptedPassportElement> BehaviourContext.waitPassportMessagesWith(
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    noinline errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    noinline filter: PassportMessageMapper? = null
 | 
					    noinline filter: SimpleFilter<PassportMessage>? = null,
 | 
				
			||||||
 | 
					    noinline mapper: PassportMessageMapper? = null
 | 
				
			||||||
) : List<PassportData> = waitPassportMessages(
 | 
					) : List<PassportData> = waitPassportMessages(
 | 
				
			||||||
    initRequest,
 | 
					    initRequest,
 | 
				
			||||||
    errorFactory,
 | 
					    errorFactory,
 | 
				
			||||||
    count
 | 
					    count,
 | 
				
			||||||
 | 
					    filter
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    if (passportData.data.any { it is T }) {
 | 
					    if (passportData.data.any { it is T }) {
 | 
				
			||||||
        if (filter == null) {
 | 
					        if (mapper == null) {
 | 
				
			||||||
            passportData
 | 
					            passportData
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            filter(this)
 | 
					            mapper(this)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        null
 | 
					        null
 | 
				
			||||||
@@ -51,5 +60,6 @@ suspend fun BehaviourContext.waitAnyPassportMessages(
 | 
				
			|||||||
    initRequest: Request<*>? = null,
 | 
					    initRequest: Request<*>? = null,
 | 
				
			||||||
    errorFactory: NullableRequestBuilder<*> = { null },
 | 
					    errorFactory: NullableRequestBuilder<*> = { null },
 | 
				
			||||||
    count: Int = 1,
 | 
					    count: Int = 1,
 | 
				
			||||||
    filter: PassportMessageMapper? = null
 | 
					    filter: SimpleFilter<PassportMessage>? = null,
 | 
				
			||||||
) = waitPassportMessagesWith<EncryptedPassportElement>(count, initRequest, errorFactory, filter)
 | 
					    mapper: PassportMessageMapper? = null
 | 
				
			||||||
 | 
					) = waitPassportMessagesWith<EncryptedPassportElement>(count, initRequest, errorFactory, filter, mapper)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling
 | 
				
			|||||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
					import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByUserCallbackQueryMarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByUserCallbackQueryMarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asCallbackQueryUpdate
 | 
					import dev.inmo.tgbotapi.extensions.utils.asCallbackQueryUpdate
 | 
				
			||||||
@@ -11,7 +12,7 @@ import dev.inmo.tgbotapi.types.CallbackQuery.*
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
internal suspend inline fun <reified T : CallbackQuery> BehaviourContext.onCallbackQuery(
 | 
					internal suspend inline fun <reified T : CallbackQuery> BehaviourContext.onCallbackQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    noinline additionalFilter: (suspend (T) -> Boolean)? = null,
 | 
					    noinline additionalFilter: SimpleFilter<T>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in T, Any> = ByUserCallbackQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in T, Any> = ByUserCallbackQueryMarkerFactory,
 | 
				
			||||||
    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, T>
 | 
					    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, T>
 | 
				
			||||||
) = flowsUpdatesFilter.expectFlow(bot) {
 | 
					) = flowsUpdatesFilter.expectFlow(bot) {
 | 
				
			||||||
@@ -41,56 +42,56 @@ internal suspend inline fun <reified T : CallbackQuery> BehaviourContext.onCallb
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onDataCallbackQuery(
 | 
					suspend fun BehaviourContext.onDataCallbackQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (DataCallbackQuery) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<DataCallbackQuery>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in DataCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in DataCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, DataCallbackQuery>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, DataCallbackQuery>
 | 
				
			||||||
) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onGameShortNameCallbackQuery(
 | 
					suspend fun BehaviourContext.onGameShortNameCallbackQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (GameShortNameCallbackQuery) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<GameShortNameCallbackQuery>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in GameShortNameCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in GameShortNameCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, GameShortNameCallbackQuery>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, GameShortNameCallbackQuery>
 | 
				
			||||||
) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onInlineMessageIdCallbackQuery(
 | 
					suspend fun BehaviourContext.onInlineMessageIdCallbackQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (InlineMessageIdCallbackQuery) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<InlineMessageIdCallbackQuery>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in InlineMessageIdCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in InlineMessageIdCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, InlineMessageIdCallbackQuery>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, InlineMessageIdCallbackQuery>
 | 
				
			||||||
) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onInlineMessageIdDataCallbackQuery(
 | 
					suspend fun BehaviourContext.onInlineMessageIdDataCallbackQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (InlineMessageIdDataCallbackQuery) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<InlineMessageIdDataCallbackQuery>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in InlineMessageIdDataCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in InlineMessageIdDataCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, InlineMessageIdDataCallbackQuery>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, InlineMessageIdDataCallbackQuery>
 | 
				
			||||||
) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onInlineMessageIdGameShortNameCallbackQuery(
 | 
					suspend fun BehaviourContext.onInlineMessageIdGameShortNameCallbackQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (InlineMessageIdGameShortNameCallbackQuery) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<InlineMessageIdGameShortNameCallbackQuery>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in InlineMessageIdGameShortNameCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in InlineMessageIdGameShortNameCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, InlineMessageIdGameShortNameCallbackQuery>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, InlineMessageIdGameShortNameCallbackQuery>
 | 
				
			||||||
) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onMessageCallbackQuery(
 | 
					suspend fun BehaviourContext.onMessageCallbackQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (MessageCallbackQuery) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<MessageCallbackQuery>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in MessageCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in MessageCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, MessageCallbackQuery>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, MessageCallbackQuery>
 | 
				
			||||||
) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onMessageDataCallbackQuery(
 | 
					suspend fun BehaviourContext.onMessageDataCallbackQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (MessageDataCallbackQuery) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<MessageDataCallbackQuery>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in MessageDataCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in MessageDataCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, MessageDataCallbackQuery>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, MessageDataCallbackQuery>
 | 
				
			||||||
) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onMessageGameShortNameCallbackQuery(
 | 
					suspend fun BehaviourContext.onMessageGameShortNameCallbackQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (MessageGameShortNameCallbackQuery) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<MessageGameShortNameCallbackQuery>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in MessageGameShortNameCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in MessageGameShortNameCallbackQuery, Any> = ByUserCallbackQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, MessageGameShortNameCallbackQuery>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, MessageGameShortNameCallbackQuery>
 | 
				
			||||||
) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onUnknownCallbackQueryType(
 | 
					suspend fun BehaviourContext.onUnknownCallbackQueryType(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (UnknownCallbackQueryType) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<UnknownCallbackQueryType>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in UnknownCallbackQueryType, Any> = ByUserCallbackQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in UnknownCallbackQueryType, Any> = ByUserCallbackQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, UnknownCallbackQueryType>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, UnknownCallbackQueryType>
 | 
				
			||||||
) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling
 | 
				
			|||||||
import dev.inmo.micro_utils.coroutines.subscribeSafelySkippingExceptionsAsync
 | 
					import dev.inmo.micro_utils.coroutines.subscribeSafelySkippingExceptionsAsync
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatChatMemberUpdatedMarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatChatMemberUpdatedMarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat
 | 
					import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat
 | 
				
			||||||
@@ -13,7 +14,7 @@ import dev.inmo.tgbotapi.types.update.abstracts.ChatMemberUpdatedUpdate
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
internal suspend inline fun <reified U : ChatMemberUpdatedUpdate> BehaviourContext.onChatMemberUpdatedInternal(
 | 
					internal suspend inline fun <reified U : ChatMemberUpdatedUpdate> BehaviourContext.onChatMemberUpdatedInternal(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    noinline additionalFilter: (suspend (ChatMemberUpdated) -> Boolean)? = null,
 | 
					    noinline additionalFilter: SimpleFilter<ChatMemberUpdated>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<ChatMemberUpdated, Any> = ByChatChatMemberUpdatedMarkerFactory,
 | 
					    markerFactory: MarkerFactory<ChatMemberUpdated, Any> = ByChatChatMemberUpdatedMarkerFactory,
 | 
				
			||||||
    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatMemberUpdated>
 | 
					    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatMemberUpdated>
 | 
				
			||||||
) = flowsUpdatesFilter.expectFlow(bot) {
 | 
					) = flowsUpdatesFilter.expectFlow(bot) {
 | 
				
			||||||
@@ -38,7 +39,7 @@ internal suspend inline fun <reified U : ChatMemberUpdatedUpdate> BehaviourConte
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onChatMemberUpdated(
 | 
					suspend fun BehaviourContext.onChatMemberUpdated(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatMemberUpdated) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatMemberUpdated>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<ChatMemberUpdated, Any> = ByChatChatMemberUpdatedMarkerFactory,
 | 
					    markerFactory: MarkerFactory<ChatMemberUpdated, Any> = ByChatChatMemberUpdatedMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatMemberUpdated>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatMemberUpdated>
 | 
				
			||||||
) = onChatMemberUpdatedInternal<ChatMemberUpdatedUpdate>(
 | 
					) = onChatMemberUpdatedInternal<ChatMemberUpdatedUpdate>(
 | 
				
			||||||
@@ -50,7 +51,7 @@ suspend fun BehaviourContext.onChatMemberUpdated(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onCommonChatMemberUpdated(
 | 
					suspend fun BehaviourContext.onCommonChatMemberUpdated(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatMemberUpdated) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatMemberUpdated>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<ChatMemberUpdated, Any> = ByChatChatMemberUpdatedMarkerFactory,
 | 
					    markerFactory: MarkerFactory<ChatMemberUpdated, Any> = ByChatChatMemberUpdatedMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatMemberUpdated>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatMemberUpdated>
 | 
				
			||||||
) = onChatMemberUpdatedInternal<CommonChatMemberUpdatedUpdate>(
 | 
					) = onChatMemberUpdatedInternal<CommonChatMemberUpdatedUpdate>(
 | 
				
			||||||
@@ -62,7 +63,7 @@ suspend fun BehaviourContext.onCommonChatMemberUpdated(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onMyChatMemberUpdated(
 | 
					suspend fun BehaviourContext.onMyChatMemberUpdated(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatMemberUpdated) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatMemberUpdated>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<ChatMemberUpdated, Any> = ByChatChatMemberUpdatedMarkerFactory,
 | 
					    markerFactory: MarkerFactory<ChatMemberUpdated, Any> = ByChatChatMemberUpdatedMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatMemberUpdated>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatMemberUpdated>
 | 
				
			||||||
) = onChatMemberUpdatedInternal<MyChatMemberUpdatedUpdate>(
 | 
					) = onChatMemberUpdatedInternal<MyChatMemberUpdatedUpdate>(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling
 | 
				
			|||||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
					import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.*
 | 
					import dev.inmo.tgbotapi.extensions.utils.*
 | 
				
			||||||
@@ -17,7 +18,7 @@ import dev.inmo.tgbotapi.types.message.content.media.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.message.payments.InvoiceContent
 | 
					import dev.inmo.tgbotapi.types.message.payments.InvoiceContent
 | 
				
			||||||
import dev.inmo.tgbotapi.utils.PreviewFeature
 | 
					import dev.inmo.tgbotapi.utils.PreviewFeature
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typealias CommonMessageFilter<T> = (suspend (CommonMessage<T>) -> Boolean)
 | 
					typealias CommonMessageFilter<T> = SimpleFilter<CommonMessage<T>>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PreviewFeature
 | 
					@PreviewFeature
 | 
				
			||||||
internal suspend inline fun <reified T : MessageContent> BehaviourContext.onContent(
 | 
					internal suspend inline fun <reified T : MessageContent> BehaviourContext.onContent(
 | 
				
			||||||
@@ -123,7 +124,7 @@ suspend fun BehaviourContext.onDocumentMediaGroupContent(
 | 
				
			|||||||
suspend fun BehaviourContext.onMediaCollection(
 | 
					suspend fun BehaviourContext.onMediaCollection(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    includeMediaGroups: Boolean = false,
 | 
					    includeMediaGroups: Boolean = false,
 | 
				
			||||||
    additionalFilter: (suspend (CommonMessage<MediaCollectionContent<TelegramMediaFile>>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<CommonMessage<MediaCollectionContent<TelegramMediaFile>>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in CommonMessage<MediaCollectionContent<TelegramMediaFile>>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in CommonMessage<MediaCollectionContent<TelegramMediaFile>>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, CommonMessage<MediaCollectionContent<TelegramMediaFile>>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, CommonMessage<MediaCollectionContent<TelegramMediaFile>>>
 | 
				
			||||||
) = onContent(includeFilterByChatInBehaviourSubContext, includeMediaGroups, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onContent(includeFilterByChatInBehaviourSubContext, includeMediaGroups, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling
 | 
				
			|||||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
					import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asBaseSentMessageUpdate
 | 
					import dev.inmo.tgbotapi.extensions.utils.asBaseSentMessageUpdate
 | 
				
			||||||
@@ -16,7 +17,7 @@ import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
internal suspend inline fun <reified T : ChatEvent> BehaviourContext.onEvent(
 | 
					internal suspend inline fun <reified T : ChatEvent> BehaviourContext.onEvent(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    noinline additionalFilter: (suspend (ChatEventMessage<T>) -> Boolean)? = null,
 | 
					    noinline additionalFilter: SimpleFilter<ChatEventMessage<T>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<T>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<T>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<T>>
 | 
					    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<T>>
 | 
				
			||||||
) = flowsUpdatesFilter.expectFlow(bot) {
 | 
					) = flowsUpdatesFilter.expectFlow(bot) {
 | 
				
			||||||
@@ -44,122 +45,122 @@ internal suspend inline fun <reified T : ChatEvent> BehaviourContext.onEvent(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onChannelEvent(
 | 
					suspend fun BehaviourContext.onChannelEvent(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<ChannelEvent>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<ChannelEvent>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<ChannelEvent>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<ChannelEvent>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChannelEvent>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChannelEvent>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onChatEvent(
 | 
					suspend fun BehaviourContext.onChatEvent(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<ChatEvent>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<ChatEvent>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<ChatEvent>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<ChatEvent>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChatEvent>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChatEvent>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onVoiceChatEvent(
 | 
					suspend fun BehaviourContext.onVoiceChatEvent(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<VoiceChatEvent>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<VoiceChatEvent>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<VoiceChatEvent>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<VoiceChatEvent>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<VoiceChatEvent>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<VoiceChatEvent>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onVoiceChatStartedEvent(
 | 
					suspend fun BehaviourContext.onVoiceChatStartedEvent(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<VoiceChatStarted>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<VoiceChatStarted>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<VoiceChatStarted>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<VoiceChatStarted>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<VoiceChatStarted>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<VoiceChatStarted>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onVoiceChatEndedEvent(
 | 
					suspend fun BehaviourContext.onVoiceChatEndedEvent(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<VoiceChatEnded>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<VoiceChatEnded>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<VoiceChatEnded>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<VoiceChatEnded>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<VoiceChatEnded>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<VoiceChatEnded>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onVoiceChatParticipantsInvitedEvent(
 | 
					suspend fun BehaviourContext.onVoiceChatParticipantsInvitedEvent(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<VoiceChatParticipantsInvited>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<VoiceChatParticipantsInvited>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<VoiceChatParticipantsInvited>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<VoiceChatParticipantsInvited>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<VoiceChatParticipantsInvited>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<VoiceChatParticipantsInvited>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onMessageAutoDeleteTimerChangedEvent(
 | 
					suspend fun BehaviourContext.onMessageAutoDeleteTimerChangedEvent(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<MessageAutoDeleteTimerChanged>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<MessageAutoDeleteTimerChanged>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<MessageAutoDeleteTimerChanged>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<MessageAutoDeleteTimerChanged>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<MessageAutoDeleteTimerChanged>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<MessageAutoDeleteTimerChanged>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onCommonEvent(
 | 
					suspend fun BehaviourContext.onCommonEvent(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<CommonEvent>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<CommonEvent>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<CommonEvent>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<CommonEvent>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<CommonEvent>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<CommonEvent>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onGroupEvent(
 | 
					suspend fun BehaviourContext.onGroupEvent(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<GroupEvent>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<GroupEvent>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<GroupEvent>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<GroupEvent>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<GroupEvent>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<GroupEvent>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onSupergroupEvent(
 | 
					suspend fun BehaviourContext.onSupergroupEvent(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<SupergroupEvent>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<SupergroupEvent>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<SupergroupEvent>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<SupergroupEvent>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<SupergroupEvent>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<SupergroupEvent>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onChannelChatCreated(
 | 
					suspend fun BehaviourContext.onChannelChatCreated(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<ChannelChatCreated>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<ChannelChatCreated>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<ChannelChatCreated>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<ChannelChatCreated>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChannelChatCreated>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChannelChatCreated>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onDeleteChatPhoto(
 | 
					suspend fun BehaviourContext.onDeleteChatPhoto(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<DeleteChatPhoto>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<DeleteChatPhoto>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<DeleteChatPhoto>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<DeleteChatPhoto>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<DeleteChatPhoto>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<DeleteChatPhoto>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onGroupChatCreated(
 | 
					suspend fun BehaviourContext.onGroupChatCreated(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<GroupChatCreated>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<GroupChatCreated>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<GroupChatCreated>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<GroupChatCreated>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<GroupChatCreated>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<GroupChatCreated>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onLeftChatMember(
 | 
					suspend fun BehaviourContext.onLeftChatMember(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<LeftChatMember>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<LeftChatMember>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<LeftChatMember>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<LeftChatMember>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<LeftChatMember>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<LeftChatMember>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onNewChatMembers(
 | 
					suspend fun BehaviourContext.onNewChatMembers(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<NewChatMembers>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<NewChatMembers>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<NewChatMembers>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<NewChatMembers>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatMembers>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatMembers>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onNewChatPhoto(
 | 
					suspend fun BehaviourContext.onNewChatPhoto(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<NewChatPhoto>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<NewChatPhoto>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<NewChatPhoto>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<NewChatPhoto>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatPhoto>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatPhoto>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onNewChatTitle(
 | 
					suspend fun BehaviourContext.onNewChatTitle(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<NewChatTitle>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<NewChatTitle>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<NewChatTitle>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<NewChatTitle>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatTitle>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatTitle>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onPinnedMessage(
 | 
					suspend fun BehaviourContext.onPinnedMessage(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<PinnedMessage>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<PinnedMessage>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<PinnedMessage>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<PinnedMessage>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<PinnedMessage>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<PinnedMessage>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onProximityAlertTriggered(
 | 
					suspend fun BehaviourContext.onProximityAlertTriggered(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<ProximityAlertTriggered>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<ProximityAlertTriggered>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<ProximityAlertTriggered>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<ProximityAlertTriggered>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ProximityAlertTriggered>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ProximityAlertTriggered>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onSupergroupChatCreated(
 | 
					suspend fun BehaviourContext.onSupergroupChatCreated(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (ChatEventMessage<SupergroupChatCreated>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<ChatEventMessage<SupergroupChatCreated>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in ChatEventMessage<SupergroupChatCreated>, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in ChatEventMessage<SupergroupChatCreated>, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<SupergroupChatCreated>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<SupergroupChatCreated>>
 | 
				
			||||||
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling
 | 
				
			|||||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
					import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByUserInlineQueryMarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByUserInlineQueryMarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asInlineQueryUpdate
 | 
					import dev.inmo.tgbotapi.extensions.utils.asInlineQueryUpdate
 | 
				
			||||||
@@ -11,7 +12,7 @@ import dev.inmo.tgbotapi.types.InlineQueries.query.*
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
internal suspend inline fun <reified T : InlineQuery> BehaviourContext.onInlineQuery(
 | 
					internal suspend inline fun <reified T : InlineQuery> BehaviourContext.onInlineQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    noinline additionalFilter: (suspend (T) -> Boolean)? = null,
 | 
					    noinline additionalFilter: SimpleFilter<T>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in T, Any> = ByUserInlineQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in T, Any> = ByUserInlineQueryMarkerFactory,
 | 
				
			||||||
    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, T>
 | 
					    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, T>
 | 
				
			||||||
) = flowsUpdatesFilter.expectFlow(bot) {
 | 
					) = flowsUpdatesFilter.expectFlow(bot) {
 | 
				
			||||||
@@ -41,7 +42,7 @@ internal suspend inline fun <reified T : InlineQuery> BehaviourContext.onInlineQ
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onAnyInlineQuery(
 | 
					suspend fun BehaviourContext.onAnyInlineQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (InlineQuery) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<InlineQuery>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in InlineQuery, Any> = ByUserInlineQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in InlineQuery, Any> = ByUserInlineQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, InlineQuery>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, InlineQuery>
 | 
				
			||||||
) = onInlineQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onInlineQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
@@ -49,7 +50,7 @@ suspend fun BehaviourContext.onAnyInlineQuery(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onBaseInlineQuery(
 | 
					suspend fun BehaviourContext.onBaseInlineQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (BaseInlineQuery) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<BaseInlineQuery>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in BaseInlineQuery, Any> = ByUserInlineQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in BaseInlineQuery, Any> = ByUserInlineQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, BaseInlineQuery>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, BaseInlineQuery>
 | 
				
			||||||
) = onInlineQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onInlineQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
@@ -57,7 +58,7 @@ suspend fun BehaviourContext.onBaseInlineQuery(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onLocationInlineQuery(
 | 
					suspend fun BehaviourContext.onLocationInlineQuery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (LocationInlineQuery) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<LocationInlineQuery>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in LocationInlineQuery, Any> = ByUserInlineQueryMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in LocationInlineQuery, Any> = ByUserInlineQueryMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, LocationInlineQuery>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, LocationInlineQuery>
 | 
				
			||||||
) = onInlineQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onInlineQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling
 | 
				
			|||||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
					import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMediaGroupMarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMediaGroupMarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asSentMediaGroupUpdate
 | 
					import dev.inmo.tgbotapi.extensions.utils.asSentMediaGroupUpdate
 | 
				
			||||||
@@ -19,7 +20,7 @@ import dev.inmo.tgbotapi.utils.PreviewFeature
 | 
				
			|||||||
@PreviewFeature
 | 
					@PreviewFeature
 | 
				
			||||||
internal suspend inline fun <reified T : MediaGroupContent> BehaviourContext.buildMediaGroupTrigger(
 | 
					internal suspend inline fun <reified T : MediaGroupContent> BehaviourContext.buildMediaGroupTrigger(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    noinline additionalFilter: (suspend (List<MediaGroupMessage<T>>) -> Boolean)? = null,
 | 
					    noinline additionalFilter: SimpleFilter<List<MediaGroupMessage<T>>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in List<MediaGroupMessage<T>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in List<MediaGroupMessage<T>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
				
			||||||
    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<T>>>
 | 
					    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<T>>>
 | 
				
			||||||
) = flowsUpdatesFilter.expectFlow(bot) { update ->
 | 
					) = flowsUpdatesFilter.expectFlow(bot) { update ->
 | 
				
			||||||
@@ -47,43 +48,43 @@ internal suspend inline fun <reified T : MediaGroupContent> BehaviourContext.bui
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onMediaGroup(
 | 
					suspend fun BehaviourContext.onMediaGroup(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (List<MediaGroupMessage<MediaGroupContent>>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<List<MediaGroupMessage<MediaGroupContent>>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in List<MediaGroupMessage<MediaGroupContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in List<MediaGroupMessage<MediaGroupContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<MediaGroupContent>>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<MediaGroupContent>>>
 | 
				
			||||||
) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onPlaylist(
 | 
					suspend fun BehaviourContext.onPlaylist(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (List<MediaGroupMessage<AudioMediaGroupContent>>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<List<MediaGroupMessage<AudioMediaGroupContent>>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in List<MediaGroupMessage<AudioMediaGroupContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in List<MediaGroupMessage<AudioMediaGroupContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<AudioMediaGroupContent>>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<AudioMediaGroupContent>>>
 | 
				
			||||||
) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onDocumentsGroup(
 | 
					suspend fun BehaviourContext.onDocumentsGroup(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (List<MediaGroupMessage<DocumentMediaGroupContent>>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<List<MediaGroupMessage<DocumentMediaGroupContent>>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in List<MediaGroupMessage<DocumentMediaGroupContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in List<MediaGroupMessage<DocumentMediaGroupContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<DocumentMediaGroupContent>>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<DocumentMediaGroupContent>>>
 | 
				
			||||||
) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onVisualGallery(
 | 
					suspend fun BehaviourContext.onVisualGallery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (List<MediaGroupMessage<VisualMediaGroupContent>>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<List<MediaGroupMessage<VisualMediaGroupContent>>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in List<MediaGroupMessage<VisualMediaGroupContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in List<MediaGroupMessage<VisualMediaGroupContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<VisualMediaGroupContent>>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<VisualMediaGroupContent>>>
 | 
				
			||||||
) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onVisualMediaGroup(
 | 
					suspend fun BehaviourContext.onVisualMediaGroup(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (List<MediaGroupMessage<VisualMediaGroupContent>>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<List<MediaGroupMessage<VisualMediaGroupContent>>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in List<MediaGroupMessage<VisualMediaGroupContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in List<MediaGroupMessage<VisualMediaGroupContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<VisualMediaGroupContent>>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<VisualMediaGroupContent>>>
 | 
				
			||||||
) = onVisualGallery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = onVisualGallery(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onPhotoGallery(
 | 
					suspend fun BehaviourContext.onPhotoGallery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (List<MediaGroupMessage<PhotoContent>>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<List<MediaGroupMessage<PhotoContent>>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in List<MediaGroupMessage<PhotoContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in List<MediaGroupMessage<PhotoContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<PhotoContent>>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<PhotoContent>>>
 | 
				
			||||||
) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
suspend fun BehaviourContext.onVideoGallery(
 | 
					suspend fun BehaviourContext.onVideoGallery(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (List<MediaGroupMessage<VideoContent>>) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<List<MediaGroupMessage<VideoContent>>>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in List<MediaGroupMessage<VideoContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in List<MediaGroupMessage<VideoContent>>, Any> = ByChatMediaGroupMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<VideoContent>>>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, List<MediaGroupMessage<VideoContent>>>
 | 
				
			||||||
) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
					) = buildMediaGroupTrigger(includeFilterByChatInBehaviourSubContext, additionalFilter, markerFactory, scenarioReceiver)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling
 | 
				
			|||||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
					import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.*
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
					import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate
 | 
					import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate
 | 
				
			||||||
@@ -13,7 +14,7 @@ import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.EncryptedPassportEle
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
internal suspend inline fun <reified T : EncryptedPassportElement> BehaviourContext.onPassportMessageWith(
 | 
					internal suspend inline fun <reified T : EncryptedPassportElement> BehaviourContext.onPassportMessageWith(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    noinline additionalFilter: (suspend (PassportMessage) -> Boolean)? = null,
 | 
					    noinline additionalFilter: SimpleFilter<PassportMessage>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in PassportMessage, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in PassportMessage, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, PassportMessage>
 | 
					    noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, PassportMessage>
 | 
				
			||||||
) = flowsUpdatesFilter.expectFlow(bot) {
 | 
					) = flowsUpdatesFilter.expectFlow(bot) {
 | 
				
			||||||
@@ -40,7 +41,7 @@ internal suspend inline fun <reified T : EncryptedPassportElement> BehaviourCont
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
suspend fun BehaviourContext.onPassportMessage(
 | 
					suspend fun BehaviourContext.onPassportMessage(
 | 
				
			||||||
    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
					    includeFilterByChatInBehaviourSubContext: Boolean = true,
 | 
				
			||||||
    additionalFilter: (suspend (PassportMessage) -> Boolean)? = null,
 | 
					    additionalFilter: SimpleFilter<PassportMessage>? = null,
 | 
				
			||||||
    markerFactory: MarkerFactory<in PassportMessage, Any> = ByChatMessageMarkerFactory,
 | 
					    markerFactory: MarkerFactory<in PassportMessage, Any> = ByChatMessageMarkerFactory,
 | 
				
			||||||
    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, PassportMessage>
 | 
					    scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, PassportMessage>
 | 
				
			||||||
) = onPassportMessageWith<EncryptedPassportElement>(
 | 
					) = onPassportMessageWith<EncryptedPassportElement>(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					package dev.inmo.tgbotapi.extensions.behaviour_builder.utils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typealias SimpleFilter<T> = suspend (T) -> Boolean
 | 
				
			||||||
@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					package dev.inmo.tgbotapi.extensions.behaviour_builder
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import kotlinx.coroutines.CoroutineScope
 | 
				
			||||||
 | 
					import kotlinx.coroutines.Dispatchers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					actual var defaultCoroutineScopeProvider = {
 | 
				
			||||||
 | 
					    CoroutineScope(Dispatchers.Default)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					package dev.inmo.tgbotapi.extensions.behaviour_builder
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import kotlinx.coroutines.CoroutineScope
 | 
				
			||||||
 | 
					import kotlinx.coroutines.Dispatchers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					actual var defaultCoroutineScopeProvider = {
 | 
				
			||||||
 | 
					    CoroutineScope(Dispatchers.IO)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -23,6 +23,7 @@ import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.*
 | 
				
			|||||||
import dev.inmo.tgbotapi.types.InlineQueries.query.*
 | 
					import dev.inmo.tgbotapi.types.InlineQueries.query.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.InputMedia.*
 | 
					import dev.inmo.tgbotapi.types.InputMedia.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.MessageEntity.textsources.*
 | 
					import dev.inmo.tgbotapi.types.MessageEntity.textsources.*
 | 
				
			||||||
 | 
					import dev.inmo.tgbotapi.types.abstracts.WithOptionalLanguageCode
 | 
				
			||||||
import dev.inmo.tgbotapi.types.actions.*
 | 
					import dev.inmo.tgbotapi.types.actions.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.*
 | 
					import dev.inmo.tgbotapi.types.buttons.*
 | 
				
			||||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.*
 | 
					import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.*
 | 
				
			||||||
@@ -3106,3 +3107,12 @@ inline fun Any.asFromUser(): FromUser? = this as? FromUser
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@PreviewFeature
 | 
					@PreviewFeature
 | 
				
			||||||
inline fun Any.requireFromUser(): FromUser = this as FromUser
 | 
					inline fun Any.requireFromUser(): FromUser = this as FromUser
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PreviewFeature
 | 
				
			||||||
 | 
					inline fun <T> Any.whenWithOptionalLanguageCode(block: (WithOptionalLanguageCode) -> T) = asWithOptionalLanguageCode() ?.let(block)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PreviewFeature
 | 
				
			||||||
 | 
					inline fun Any.asWithOptionalLanguageCode(): WithOptionalLanguageCode? = this as? WithOptionalLanguageCode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PreviewFeature
 | 
				
			||||||
 | 
					inline fun Any.requireWithOptionalLanguageCode(): WithOptionalLanguageCode = this as WithOptionalLanguageCode
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,6 @@
 | 
				
			|||||||
package dev.inmo.tgbotapi.extensions.utils.extensions
 | 
					package dev.inmo.tgbotapi.extensions.utils.extensions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asFromUser
 | 
					import dev.inmo.tgbotapi.extensions.utils.asFromUser
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asFromUserMessage
 | 
					 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.asUser
 | 
					import dev.inmo.tgbotapi.extensions.utils.asUser
 | 
				
			||||||
import dev.inmo.tgbotapi.extensions.utils.shortcuts.chat
 | 
					import dev.inmo.tgbotapi.extensions.utils.shortcuts.chat
 | 
				
			||||||
import dev.inmo.tgbotapi.types.User
 | 
					import dev.inmo.tgbotapi.types.User
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user