mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-11-26 03:58:44 +00:00
commit
b9c8a89af9
12
CHANGELOG.md
12
CHANGELOG.md
@ -1,5 +1,17 @@
|
|||||||
# TelegramBotAPI changelog
|
# TelegramBotAPI changelog
|
||||||
|
|
||||||
|
## 0.33.3
|
||||||
|
|
||||||
|
* `Common`:
|
||||||
|
* `Version`:
|
||||||
|
* `MicroUtils`: `0.4.32` -> `0.4.33`
|
||||||
|
* `Ktor`: `1.5.2` -> `1.5.3`
|
||||||
|
* `API`:
|
||||||
|
* Bot actions DSL (fix for [#358](https://github.com/InsanusMokrassar/TelegramBotAPI/issues/358))
|
||||||
|
* `Behaviour Builder`:
|
||||||
|
* Rewrite logic of `doInSubContextWithUpdatesFilter` and `doInSubContextWithFlowsUpdatesFilterSetup` extensions
|
||||||
|
* All triggers now work with `stopOnCompletion` set up to `false`
|
||||||
|
|
||||||
## 0.33.2
|
## 0.33.2
|
||||||
|
|
||||||
* `Common`:
|
* `Common`:
|
||||||
|
@ -10,13 +10,13 @@ kotlin_coroutines_version=1.4.3
|
|||||||
kotlin_serialisation_runtime_version=1.1.0
|
kotlin_serialisation_runtime_version=1.1.0
|
||||||
klock_version=2.0.7
|
klock_version=2.0.7
|
||||||
uuid_version=0.2.3
|
uuid_version=0.2.3
|
||||||
ktor_version=1.5.2
|
ktor_version=1.5.3
|
||||||
|
|
||||||
micro_utils_version=0.4.32
|
micro_utils_version=0.4.33
|
||||||
|
|
||||||
javax_activation_version=1.1.1
|
javax_activation_version=1.1.1
|
||||||
|
|
||||||
library_group=dev.inmo
|
library_group=dev.inmo
|
||||||
library_version=0.33.2
|
library_version=0.33.3
|
||||||
|
|
||||||
github_release_plugin_version=2.2.12
|
github_release_plugin_version=2.2.12
|
||||||
|
@ -80,6 +80,8 @@ val openPeriodPollSecondsLimit = 5 .. 600
|
|||||||
|
|
||||||
val membersLimit = 1 .. 99999
|
val membersLimit = 1 .. 99999
|
||||||
|
|
||||||
|
const val botActionActualityTime: Seconds = 5
|
||||||
|
|
||||||
// Made as lazy for correct work in K/JS
|
// Made as lazy for correct work in K/JS
|
||||||
val telegramInlineModeGifPermittedMimeTypes by lazy {
|
val telegramInlineModeGifPermittedMimeTypes by lazy {
|
||||||
listOf(
|
listOf(
|
||||||
|
@ -0,0 +1,76 @@
|
|||||||
|
package dev.inmo.tgbotapi.extensions.api.send
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.coroutines.safely
|
||||||
|
import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions
|
||||||
|
import dev.inmo.tgbotapi.bot.TelegramBot
|
||||||
|
import dev.inmo.tgbotapi.requests.send.SendAction
|
||||||
|
import dev.inmo.tgbotapi.types.*
|
||||||
|
import dev.inmo.tgbotapi.types.actions.*
|
||||||
|
import dev.inmo.tgbotapi.types.chat.abstracts.Chat
|
||||||
|
import kotlinx.coroutines.*
|
||||||
|
|
||||||
|
private const val refreshTime: MilliSeconds = (botActionActualityTime - 1) * 1000L
|
||||||
|
typealias TelegramBotActionCallback<T> = suspend TelegramBot.() -> T
|
||||||
|
|
||||||
|
suspend fun <T> TelegramBot.withAction(
|
||||||
|
actionRequest: SendAction,
|
||||||
|
block: TelegramBotActionCallback<T>
|
||||||
|
): T {
|
||||||
|
val botActionJob = supervisorScope {
|
||||||
|
launch {
|
||||||
|
while (isActive) {
|
||||||
|
delay(refreshTime)
|
||||||
|
safelyWithoutExceptions {
|
||||||
|
execute(actionRequest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return try {
|
||||||
|
safely { block() }
|
||||||
|
} finally {
|
||||||
|
botActionJob.cancel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun <T> TelegramBot.withAction(
|
||||||
|
chatId: ChatId,
|
||||||
|
action: BotAction,
|
||||||
|
block: TelegramBotActionCallback<T>
|
||||||
|
) = withAction(
|
||||||
|
SendAction(chatId, action),
|
||||||
|
block
|
||||||
|
)
|
||||||
|
|
||||||
|
suspend fun <T> TelegramBot.withAction(
|
||||||
|
chat: Chat,
|
||||||
|
action: BotAction,
|
||||||
|
block: TelegramBotActionCallback<T>
|
||||||
|
) = withAction(
|
||||||
|
chat.id,
|
||||||
|
action,
|
||||||
|
block
|
||||||
|
)
|
||||||
|
|
||||||
|
suspend fun <T> TelegramBot.withTypingAction(chatId: ChatId, block: TelegramBotActionCallback<T>) = withAction(chatId, TypingAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withUploadPhotoAction(chatId: ChatId, block: TelegramBotActionCallback<T>) = withAction(chatId, UploadPhotoAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withRecordVideoAction(chatId: ChatId, block: TelegramBotActionCallback<T>) = withAction(chatId, RecordVideoAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withUploadVideoAction(chatId: ChatId, block: TelegramBotActionCallback<T>) = withAction(chatId, UploadVideoAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withRecordAudioAction(chatId: ChatId, block: TelegramBotActionCallback<T>) = withAction(chatId, RecordAudioAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withUploadAudioAction(chatId: ChatId, block: TelegramBotActionCallback<T>) = withAction(chatId, UploadAudioAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withUploadDocumentAction(chatId: ChatId, block: TelegramBotActionCallback<T>) = withAction(chatId, UploadDocumentAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withFindLocationAction(chatId: ChatId, block: TelegramBotActionCallback<T>) = withAction(chatId, FindLocationAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withRecordVideoNoteAction(chatId: ChatId, block: TelegramBotActionCallback<T>) = withAction(chatId, RecordVideoNoteAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withUploadVideoNoteAction(chatId: ChatId, block: TelegramBotActionCallback<T>) = withAction(chatId, UploadVideoNoteAction, block)
|
||||||
|
|
||||||
|
|
||||||
|
suspend fun <T> TelegramBot.withTypingAction(chat: Chat, block: TelegramBotActionCallback<T>) = withAction(chat, TypingAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withUploadPhotoAction(chat: Chat, block: TelegramBotActionCallback<T>) = withAction(chat, UploadPhotoAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withRecordVideoAction(chat: Chat, block: TelegramBotActionCallback<T>) = withAction(chat, RecordVideoAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withUploadVideoAction(chat: Chat, block: TelegramBotActionCallback<T>) = withAction(chat, UploadVideoAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withRecordAudioAction(chat: Chat, block: TelegramBotActionCallback<T>) = withAction(chat, RecordAudioAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withUploadAudioAction(chat: Chat, block: TelegramBotActionCallback<T>) = withAction(chat, UploadAudioAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withUploadDocumentAction(chat: Chat, block: TelegramBotActionCallback<T>) = withAction(chat, UploadDocumentAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withFindLocationAction(chat: Chat, block: TelegramBotActionCallback<T>) = withAction(chat, FindLocationAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withRecordVideoNoteAction(chat: Chat, block: TelegramBotActionCallback<T>) = withAction(chat, RecordVideoNoteAction, block)
|
||||||
|
suspend fun <T> TelegramBot.withUploadVideoNoteAction(chat: Chat, block: TelegramBotActionCallback<T>) = withAction(chat, UploadVideoNoteAction, block)
|
@ -1,6 +1,7 @@
|
|||||||
package dev.inmo.tgbotapi.extensions.behaviour_builder
|
package dev.inmo.tgbotapi.extensions.behaviour_builder
|
||||||
|
|
||||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
||||||
|
import dev.inmo.micro_utils.coroutines.weakLaunch
|
||||||
import dev.inmo.tgbotapi.bot.TelegramBot
|
import dev.inmo.tgbotapi.bot.TelegramBot
|
||||||
import dev.inmo.tgbotapi.types.update.abstracts.Update
|
import dev.inmo.tgbotapi.types.update.abstracts.Update
|
||||||
import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
|
import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
|
||||||
@ -36,14 +37,15 @@ suspend fun <T> BehaviourContext.doInSubContextWithFlowsUpdatesFilterSetup(
|
|||||||
newFlowsUpdatesFilterSetUp: BehaviourContextAndTypeReceiver<Unit, FlowsUpdatesFilter>?,
|
newFlowsUpdatesFilterSetUp: BehaviourContextAndTypeReceiver<Unit, FlowsUpdatesFilter>?,
|
||||||
stopOnCompletion: Boolean = true,
|
stopOnCompletion: Boolean = true,
|
||||||
behaviourContextReceiver: BehaviourContextReceiver<T>
|
behaviourContextReceiver: BehaviourContextReceiver<T>
|
||||||
) = copy(
|
): T = supervisorScope {
|
||||||
|
val newContext = copy(
|
||||||
flowsUpdatesFilter = FlowsUpdatesFilter(),
|
flowsUpdatesFilter = FlowsUpdatesFilter(),
|
||||||
scope = CoroutineScope(scope.coroutineContext + SupervisorJob())
|
scope = this
|
||||||
).run {
|
)
|
||||||
newFlowsUpdatesFilterSetUp ?.let {
|
newFlowsUpdatesFilterSetUp ?.let {
|
||||||
it.apply { invoke(this@run, this@doInSubContextWithFlowsUpdatesFilterSetup.flowsUpdatesFilter) }
|
it.apply { invoke(newContext, this@doInSubContextWithFlowsUpdatesFilterSetup.flowsUpdatesFilter) }
|
||||||
}
|
}
|
||||||
behaviourContextReceiver().also { if (stopOnCompletion) stop() }
|
newContext.behaviourContextReceiver().also { if (stopOnCompletion) stop() }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,13 +56,17 @@ suspend fun <T> BehaviourContext.doInSubContextWithUpdatesFilter(
|
|||||||
updatesFilter: BehaviourContextAndTypeReceiver<Boolean, Update>?,
|
updatesFilter: BehaviourContextAndTypeReceiver<Boolean, Update>?,
|
||||||
stopOnCompletion: Boolean = true,
|
stopOnCompletion: Boolean = true,
|
||||||
behaviourContextReceiver: BehaviourContextReceiver<T>
|
behaviourContextReceiver: BehaviourContextReceiver<T>
|
||||||
) = doInSubContextWithFlowsUpdatesFilterSetup(
|
): T = doInSubContextWithFlowsUpdatesFilterSetup(
|
||||||
newFlowsUpdatesFilterSetUp = updatesFilter ?.let {
|
newFlowsUpdatesFilterSetUp = updatesFilter ?.let {
|
||||||
{ oldOne ->
|
{ oldOne ->
|
||||||
|
weakLaunch {
|
||||||
oldOne.allUpdatesFlow.filter { updatesFilter(it) }.subscribeSafelyWithoutExceptions(this, asUpdateReceiver)
|
oldOne.allUpdatesFlow.filter { updatesFilter(it) }.subscribeSafelyWithoutExceptions(this, asUpdateReceiver)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} ?: { oldOne ->
|
} ?: { oldOne ->
|
||||||
|
weakLaunch {
|
||||||
oldOne.allUpdatesFlow.subscribeSafelyWithoutExceptions(this, asUpdateReceiver)
|
oldOne.allUpdatesFlow.subscribeSafelyWithoutExceptions(this, asUpdateReceiver)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
stopOnCompletion,
|
stopOnCompletion,
|
||||||
behaviourContextReceiver
|
behaviourContextReceiver
|
||||||
|
@ -26,7 +26,8 @@ internal suspend inline fun <reified T : CallbackQuery> BehaviourContext.onCallb
|
|||||||
{ it.sourceChat() ?.id ?.chatId == triggerQuery.user.id.chatId }
|
{ it.sourceChat() ?.id ?.chatId == triggerQuery.user.id.chatId }
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
},
|
||||||
|
stopOnCompletion = false
|
||||||
) {
|
) {
|
||||||
scenarioReceiver(triggerQuery)
|
scenarioReceiver(triggerQuery)
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,8 @@ internal suspend inline fun <reified U : ChatMemberUpdatedUpdate> BehaviourConte
|
|||||||
{ it.sourceChat() ?.id ?.chatId == triggerChatMemberUpdated.chat.id.chatId }
|
{ it.sourceChat() ?.id ?.chatId == triggerChatMemberUpdated.chat.id.chatId }
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
},
|
||||||
|
stopOnCompletion = false
|
||||||
) {
|
) {
|
||||||
scenarioReceiver(triggerChatMemberUpdated)
|
scenarioReceiver(triggerChatMemberUpdated)
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,8 @@ internal suspend inline fun <reified T : MessageContent> BehaviourContext.onCont
|
|||||||
{ it.sourceChat() ?.id ?.chatId == triggerMessage.chat.id.chatId }
|
{ it.sourceChat() ?.id ?.chatId == triggerMessage.chat.id.chatId }
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
},
|
||||||
|
stopOnCompletion = false
|
||||||
) {
|
) {
|
||||||
scenarioReceiver(triggerMessage)
|
scenarioReceiver(triggerMessage)
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,8 @@ internal suspend inline fun <reified T : ChatEvent> BehaviourContext.onEvent(
|
|||||||
doInSubContextWithUpdatesFilter(
|
doInSubContextWithUpdatesFilter(
|
||||||
updatesFilter = if (includeFilterByChatInBehaviourSubContext) {
|
updatesFilter = if (includeFilterByChatInBehaviourSubContext) {
|
||||||
{ it.sourceChat() ?.id ?.chatId == triggerMessage.chat.id.chatId }
|
{ it.sourceChat() ?.id ?.chatId == triggerMessage.chat.id.chatId }
|
||||||
} else null
|
} else null,
|
||||||
|
stopOnCompletion = false
|
||||||
) {
|
) {
|
||||||
scenarioReceiver(triggerMessage)
|
scenarioReceiver(triggerMessage)
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,8 @@ internal suspend inline fun <reified T : InlineQuery> BehaviourContext.onInlineQ
|
|||||||
{ it.sourceChat() ?.id ?.chatId == triggerQuery.from.id.chatId }
|
{ it.sourceChat() ?.id ?.chatId == triggerQuery.from.id.chatId }
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
},
|
||||||
|
stopOnCompletion = false
|
||||||
) {
|
) {
|
||||||
scenarioReceiver(triggerQuery)
|
scenarioReceiver(triggerQuery)
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,8 @@ internal suspend inline fun <reified T : MediaGroupContent> BehaviourContext.bui
|
|||||||
doInSubContextWithUpdatesFilter(
|
doInSubContextWithUpdatesFilter(
|
||||||
updatesFilter = if (includeFilterByChatInBehaviourSubContext) {
|
updatesFilter = if (includeFilterByChatInBehaviourSubContext) {
|
||||||
{ it.sourceChat() ?.id ?.chatId == mediaGroupChat.id.chatId }
|
{ it.sourceChat() ?.id ?.chatId == mediaGroupChat.id.chatId }
|
||||||
} else null
|
} else null,
|
||||||
|
stopOnCompletion = false
|
||||||
) {
|
) {
|
||||||
scenarioReceiver(mediaGroup)
|
scenarioReceiver(mediaGroup)
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,8 @@ suspend inline fun <reified T : EncryptedPassportElement> BehaviourContext.onPas
|
|||||||
doInSubContextWithUpdatesFilter(
|
doInSubContextWithUpdatesFilter(
|
||||||
updatesFilter = if (includeFilterByChatInBehaviourSubContext) {
|
updatesFilter = if (includeFilterByChatInBehaviourSubContext) {
|
||||||
{ it.sourceChat() ?.id ?.chatId == triggerMessage.chat.id.chatId }
|
{ it.sourceChat() ?.id ?.chatId == triggerMessage.chat.id.chatId }
|
||||||
} else null
|
} else null,
|
||||||
|
stopOnCompletion = false
|
||||||
) {
|
) {
|
||||||
scenarioReceiver(triggerMessage)
|
scenarioReceiver(triggerMessage)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user