telegramBotWithBehaviour

This commit is contained in:
InsanusMokrassar 2021-06-23 21:51:30 +06:00
parent 45b32fd6f7
commit 55b1d3734d
4 changed files with 82 additions and 4 deletions

View File

@ -2,6 +2,9 @@
## 0.35.1
* `Behaviour Builder`:
* New extensions `telegramBotWithBehaviour`
## 0.35.0
**ALL PREVIOUS DEPRECATIONS HAVE BEEN REMOVED**

View File

@ -12,7 +12,7 @@ klock_version=2.1.2
uuid_version=0.3.0
ktor_version=1.6.0
micro_utils_version=0.5.6
micro_utils_version=0.5.12
javax_activation_version=1.1.1

View File

@ -15,7 +15,7 @@ bot.startGettingFlowsUpdatesByLongPolling {
This library offer other way to do a lot of routine in more simple way:
```kotlin
telegramBot(token) {
telegramBotWithBehaviour(token) {
onCommand("start".regex) {
execute(SendTextMessage(it.chat.id, "This bot can ...")) // replaceable with reply(it, "This bot can ...") when you are using `tgbotapi.extensions.api`
}
@ -28,7 +28,7 @@ In terminology of this project the `Triggers` are things which have no initial m
messages and filter messages for context which will be used in subcontext. Full syntax with `onText` as an example:
```kotlin
telegramBot(TOKEN) {
telegramBotWithBehaviour(TOKEN) {
onText(
includeFilterByChatInBehaviourSubContext = true, // if false - last lambda will receive all messages instead of filtered by chat messages
additionalFilter = { message: CommonMessage<TextContent> ->
@ -45,7 +45,7 @@ telegramBot(TOKEN) {
Waiters targeted to get some content "here and now", they must be used inside some trigger main lambda:
```kotlin
telegramBot(TOKEN) {
telegramBotWithBehaviour(TOKEN) {
onCommand("start") { message: CommonMessage<TextContent> ->
val userPhotos = waitPhoto(
SendTextMessage(it.chat.id, "Ok, send me some photo, please"), // init request, can be any `Request` object

View File

@ -0,0 +1,75 @@
package dev.inmo.tgbotapi.extensions.behaviour_builder
import dev.inmo.tgbotapi.bot.Ktor.KtorRequestsExecutorBuilder
import dev.inmo.tgbotapi.bot.Ktor.telegramBot
import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling
import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
import dev.inmo.tgbotapi.utils.telegramBotAPIDefaultUrl
import kotlinx.coroutines.*
import kotlin.coroutines.coroutineContext
/**
* Create bot using [telegramBot] and start listening for updates using [buildBehaviour].
* Use this method in case you wish to make some additional actions with [flowsUpdatesFilter].
*
* **WARNING** This method WILL NOT launch any listening of updates. Use something like
* [startGettingOfUpdatesByLongPolling] or tools for work with webhooks
*
* @return Created bot which has been used to create [BehaviourContext] via [buildBehaviour]
*
* @see [BehaviourContext]
* @see [buildBehaviour]
* @see startGettingOfUpdatesByLongPolling
*/
suspend fun telegramBotWithBehaviour(
token: String,
flowsUpdatesFilter: FlowsUpdatesFilter,
scope: CoroutineScope? = null,
apiUrl: String = telegramBotAPIDefaultUrl,
builder: KtorRequestsExecutorBuilder.() -> Unit = {},
block: BehaviourContextReceiver<Unit>
): TelegramBot = telegramBot(
token,
apiUrl,
builder
).apply {
buildBehaviour(
scope ?: CoroutineScope(coroutineContext),
flowsUpdatesFilter,
block
)
}
/**
* Create bot using [telegramBot] and start listening for updates using [buildBehaviour].
* Use this method in case you wish to make some additional actions with [flowsUpdatesFilter].
*
* **WARNING** This method WILL NOT launch any listening of updates. Use something like
* [startGettingOfUpdatesByLongPolling] or tools for work with webhooks
*
* @return Pair of [TelegramBot] and [Job]. This [Job] can be used to stop listening updates in your [block] you passed
* here
*
* @see [BehaviourContext]
* @see [buildBehaviour]
* @see startGettingOfUpdatesByLongPolling
*/
suspend fun telegramBotWithBehaviour(
token: String,
scope: CoroutineScope? = null,
apiUrl: String = telegramBotAPIDefaultUrl,
builder: KtorRequestsExecutorBuilder.() -> Unit = {},
block: BehaviourContextReceiver<Unit>
): Pair<TelegramBot, Job> {
return telegramBot(
token,
apiUrl,
builder
).let {
it to it.buildBehaviour(
scope ?: CoroutineScope(coroutineContext),
block
)
}
}