mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2025-12-09 15:55:51 +00:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c91426a910 | |||
| d2228e274c | |||
| 790959ea49 | |||
| ce9f7f35dc | |||
| 4f984d1dbc | |||
| 6f650f6d6c | |||
| 2d15e13ae6 | |||
| d60ee7b8a5 | |||
| 8f882e9825 | |||
| 48e946c2d0 | |||
| 1758d80020 | |||
| 63b2bd61b5 | |||
| ff2c70fc76 | |||
| e3bfc4472a | |||
| 1cff6f616f | |||
| 1dfe4bf276 |
65
CHANGELOG.md
65
CHANGELOG.md
@@ -49,6 +49,71 @@
|
||||
* `closePollExactAfter`
|
||||
* `closePollAfter`
|
||||
|
||||
### 0.27.11
|
||||
|
||||
* `TelegramBotAPI`:
|
||||
* Extension `String#filenameFromUrl` was created
|
||||
* Extension `PathedFile#filename` was created
|
||||
* `TelegramBotAPI-extensions-utils`:
|
||||
* `Flow<Iterable<T>>.flatMap` extension was added
|
||||
* Extensions for `FlowUpdatesFilter` were added:
|
||||
* `FlowsUpdatesFilter#allSentMessagesFlow` (combination of `messageFlow` and `channelPostFlow`)
|
||||
* `FlowsUpdatesFilter#allSentMediaGroupsFlow` (combination of `messageMediaGroupFlow` and `channelPostMediaGroupFlow`)
|
||||
* `FlowsUpdatesFilter#sentMessages`
|
||||
* `FlowsUpdatesFilter#sentMessagesWithMediaGroups`
|
||||
* `FlowsUpdatesFilter#photoMessagesWithMediaGroups`
|
||||
* `FlowsUpdatesFilter#imageMessagesWithMediaGroups`
|
||||
* `FlowsUpdatesFilter#videoMessagesWithMediaGroups`
|
||||
* `FlowsUpdatesFilter#mediaGroupMessages`
|
||||
* `FlowsUpdatesFilter#mediaGroupPhotosMessages`
|
||||
* `FlowsUpdatesFilter#mediaGroupVideosMessages`
|
||||
* A lot of extensions like `Flow<BaseSentMessageUpdate>#textMessages` were added:
|
||||
* `Flow<BaseSentMessageUpdate>#animationMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#audioMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#contactMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#diceMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#documentMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#gameMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#invoiceMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#locationMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#photoMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#imageMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#pollMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#stickerMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#textMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#venueMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#videoMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#videoNoteMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#voiceMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#mediaGroupMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#mediaGroupPhotosMessages`
|
||||
* `Flow<BaseSentMessageUpdate>#mediaGroupVideosMessages`
|
||||
|
||||
### 0.27.10
|
||||
|
||||
* `TelegramBotAPI-extensions-api`:
|
||||
* Function `telegramBot(TelegramAPIUrlsKeeper)` was added
|
||||
* `TelegramBotAPI-extensions-utils`:
|
||||
* Extension `Route#includeWebhookHandlingInRouteWithFlows` was added
|
||||
* A lot of extensions like `FlowsUpdatesFilter#textMessages` were added:
|
||||
* `FlowsUpdatesFilter#animationMessages`
|
||||
* `FlowsUpdatesFilter#audioMessages`
|
||||
* `FlowsUpdatesFilter#contactMessages`
|
||||
* `FlowsUpdatesFilter#diceMessages`
|
||||
* `FlowsUpdatesFilter#documentMessages`
|
||||
* `FlowsUpdatesFilter#gameMessages`
|
||||
* `FlowsUpdatesFilter#invoiceMessages`
|
||||
* `FlowsUpdatesFilter#locationMessages`
|
||||
* `FlowsUpdatesFilter#photoMessages`
|
||||
* `FlowsUpdatesFilter#imageMessages`
|
||||
* `FlowsUpdatesFilter#pollMessages`
|
||||
* `FlowsUpdatesFilter#stickerMessages`
|
||||
* `FlowsUpdatesFilter#textMessages`
|
||||
* `FlowsUpdatesFilter#venueMessages`
|
||||
* `FlowsUpdatesFilter#videoMessages`
|
||||
* `FlowsUpdatesFilter#videoNoteMessages`
|
||||
* `FlowsUpdatesFilter#voiceMessages`
|
||||
|
||||
### 0.27.9
|
||||
|
||||
* `Common`
|
||||
|
||||
@@ -12,7 +12,7 @@ import io.ktor.client.engine.HttpClientEngine
|
||||
*/
|
||||
fun telegramBot(
|
||||
urlsKeeper: TelegramAPIUrlsKeeper,
|
||||
client: HttpClient
|
||||
client: HttpClient = HttpClient()
|
||||
): RequestsExecutor = KtorRequestsExecutor(
|
||||
urlsKeeper,
|
||||
client
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
# TelegramBotAPI Util Extensions
|
||||
# TelegramBotAPI Util Extensions
|
||||
|
||||
- [TelegramBotAPI Util Extensions](#telegrambotapi-util--extensions)
|
||||
* [What is it?](#what-is-it-)
|
||||
* [How to implement library?](#how-to-implement-library-)
|
||||
- [TelegramBotAPI Util Extensions](#telegrambotapi-util-extensions)
|
||||
* [What is it?](#what-is-it)
|
||||
* [How to implement library?](#how-to-implement-library)
|
||||
+ [Maven](#maven)
|
||||
+ [Gradle](#gradle)
|
||||
* [How to use?](#how-to-use-)
|
||||
* [How to use?](#how-to-use)
|
||||
+ [Updates](#updates)
|
||||
- [Long polling](#long-polling)
|
||||
- [WebHooks (currently JVM-only)](#webhooks--currently-jvm-only-)
|
||||
- [WebHooks (currently JVM-only)](#webhooks--currently-jvm-only)
|
||||
+ [Filters](#filters)
|
||||
- [Sent messages](#sent-messages)
|
||||
* [Common messages](#common-messages)
|
||||
@@ -102,6 +102,9 @@ Anyway, in both of ways it will be useful to know that it is possible to create
|
||||
```kotlin
|
||||
val internalChannelsSizes = 128
|
||||
flowsUpdatesFilter(internalChannelsSizes/* default is 64 */) {
|
||||
textMessages().onEach {
|
||||
println("I have received text message: ${it.content}")
|
||||
}.launchIn(someCoroutineScope)
|
||||
/* ... */
|
||||
}
|
||||
```
|
||||
@@ -159,6 +162,8 @@ Besides, there are two additional opportunities:
|
||||
|
||||
* Extension `Route#includeWebhookHandlingInRoute`, which allow you to include webhook processing inside your ktor
|
||||
application without creating of new one server (as it is happening in `startListenWebhooks`)
|
||||
* Also, you can use `Route#includeWebhookHandlingInRouteWithFlows` to use it like `flowUpdatesFilter` fun, but apply
|
||||
`FlowsUpdatesFilter` to the block
|
||||
* Extension `RequestsExecutor#setWebhookInfoAndStartListenWebhooks`. It is allow to set up full server (in fact, with
|
||||
`startListenWebhooks`), but also send `SetWebhook` request before and check that it was successful
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils
|
||||
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.channels.BroadcastChannel
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.flow.*
|
||||
|
||||
/**
|
||||
* Analog of [merge] function for [Flow]s. The difference is in the usage of [BroadcastChannel] in this case
|
||||
*/
|
||||
fun <T> aggregateFlows(
|
||||
withScope: CoroutineScope,
|
||||
vararg flows: Flow<T>,
|
||||
internalBufferSize: Int = Channel.BUFFERED
|
||||
): Flow<T> {
|
||||
val bc = BroadcastChannel<T>(internalBufferSize)
|
||||
flows.forEach {
|
||||
it.onEach {
|
||||
safely { bc.send(it) }
|
||||
}.launchIn(withScope)
|
||||
}
|
||||
return bc.asFlow()
|
||||
}
|
||||
|
||||
fun <T> Flow<Iterable<T>>.flatMap(): Flow<T> = flow {
|
||||
collect {
|
||||
it.forEach {
|
||||
emit(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T, R> Flow<T>.flatMap(mapper: (T) -> Iterable<R>): Flow<R> = flow {
|
||||
collect {
|
||||
mapper(it).forEach {
|
||||
emit(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.extensions
|
||||
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.update.MediaGroupUpdates.SentMediaGroupUpdate
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseSentMessageUpdate
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.FlowsUpdatesFilter
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.merge
|
||||
|
||||
val FlowsUpdatesFilter.allSentMessagesFlow: Flow<BaseSentMessageUpdate>
|
||||
get() = merge(
|
||||
messageFlow,
|
||||
channelPostFlow
|
||||
)
|
||||
|
||||
val FlowsUpdatesFilter.allSentMediaGroupsFlow: Flow<SentMediaGroupUpdate>
|
||||
get() = merge(
|
||||
messageMediaGroupFlow,
|
||||
channelPostMediaGroupFlow
|
||||
)
|
||||
@@ -0,0 +1,207 @@
|
||||
package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.shortcuts
|
||||
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.aggregateFlows
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.flatMap
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.updates.asContentMessagesFlow
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.CommonMessage
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.*
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaGroupContent
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media.*
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.InvoiceContent
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.update.MediaGroupUpdates.SentMediaGroupUpdate
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseSentMessageUpdate
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.FlowsUpdatesFilter
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.flow.*
|
||||
|
||||
inline fun <reified T : MessageContent> filterForContentMessage(): suspend (ContentMessage<*>) -> ContentMessage<T>? = {
|
||||
if (it.content is T) {
|
||||
it as ContentMessage<T>
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
inline fun <reified T: MessageContent> Flow<BaseSentMessageUpdate>.filterContentMessages(
|
||||
): Flow<ContentMessage<T>> = asContentMessagesFlow().mapNotNull(filterForContentMessage())
|
||||
|
||||
inline fun <reified T : MediaGroupContent> Flow<SentMediaGroupUpdate>.filterMediaGroupMessages(
|
||||
): Flow<List<CommonMessage<T>>> = map {
|
||||
it.data.mapNotNull { message ->
|
||||
if (message.content is T) {
|
||||
message as CommonMessage<T>
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param scopeToIncludeChannels This parameter is required when you want to include [textMessages] for channels too.
|
||||
* In this case will be created new channel which will aggregate messages from [FlowsUpdatesFilter.messageFlow] and
|
||||
* [FlowsUpdatesFilter.channelPostFlow]. In case it is null will be used [Flow]s mapping
|
||||
*/
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
inline fun <reified T: MessageContent> FlowsUpdatesFilter.filterContentMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
): Flow<ContentMessage<T>> {
|
||||
return (scopeToIncludeChannels ?.let { scope ->
|
||||
aggregateFlows(
|
||||
scope,
|
||||
messageFlow,
|
||||
channelPostFlow
|
||||
)
|
||||
} ?: messageFlow).filterContentMessages()
|
||||
}
|
||||
|
||||
/**
|
||||
* @param scopeToIncludeChannels This parameter is required when you want to include [SentMediaGroupUpdate] for channels
|
||||
* too. In this case will be created new channel which will aggregate messages from [FlowsUpdatesFilter.messageFlow] and
|
||||
* [FlowsUpdatesFilter.channelPostFlow]. In case it is null will be used [Flow]s mapping
|
||||
*/
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
inline fun <reified T: MediaGroupContent> FlowsUpdatesFilter.filterMediaGroupMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
): Flow<List<CommonMessage<T>>> {
|
||||
return (scopeToIncludeChannels ?.let { scope ->
|
||||
aggregateFlows(
|
||||
scope,
|
||||
messageMediaGroupFlow,
|
||||
channelPostMediaGroupFlow
|
||||
)
|
||||
} ?: messageMediaGroupFlow).filterMediaGroupMessages()
|
||||
}
|
||||
|
||||
fun FlowsUpdatesFilter.sentMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
): Flow<ContentMessage<MessageContent>> = filterContentMessages(scopeToIncludeChannels)
|
||||
fun FlowsUpdatesFilter.sentMessagesWithMediaGroups(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
): Flow<ContentMessage<MessageContent>> = merge(
|
||||
sentMessages(scopeToIncludeChannels),
|
||||
mediaGroupMessages(scopeToIncludeChannels).flatMap {
|
||||
it.mapNotNull { it as? ContentMessage<MessageContent> }
|
||||
}
|
||||
)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.animationMessages() = filterContentMessages<AnimationContent>()
|
||||
fun FlowsUpdatesFilter.animationMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<AnimationContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.audioMessages() = filterContentMessages<AudioContent>()
|
||||
fun FlowsUpdatesFilter.audioMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<AudioContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.contactMessages() = filterContentMessages<ContactContent>()
|
||||
fun FlowsUpdatesFilter.contactMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<ContactContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.diceMessages() = filterContentMessages<DiceContent>()
|
||||
fun FlowsUpdatesFilter.diceMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<DiceContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.documentMessages() = filterContentMessages<DocumentContent>()
|
||||
fun FlowsUpdatesFilter.documentMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<DocumentContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.gameMessages() = filterContentMessages<GameContent>()
|
||||
fun FlowsUpdatesFilter.gameMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<GameContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.invoiceMessages() = filterContentMessages<InvoiceContent>()
|
||||
fun FlowsUpdatesFilter.invoiceMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<InvoiceContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.locationMessages() = filterContentMessages<LocationContent>()
|
||||
fun FlowsUpdatesFilter.locationMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<LocationContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.photoMessages() = filterContentMessages<PhotoContent>()
|
||||
fun Flow<BaseSentMessageUpdate>.imageMessages() = photoMessages()
|
||||
fun FlowsUpdatesFilter.photoMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<PhotoContent>(scopeToIncludeChannels)
|
||||
fun FlowsUpdatesFilter.photoMessagesWithMediaGroups(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = merge(
|
||||
filterContentMessages<PhotoContent>(scopeToIncludeChannels),
|
||||
mediaGroupPhotosMessages(scopeToIncludeChannels).flatMap()
|
||||
)
|
||||
/**
|
||||
* Shortcut for [photoMessages]
|
||||
*/
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun FlowsUpdatesFilter.imageMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = photoMessages(scopeToIncludeChannels)
|
||||
fun FlowsUpdatesFilter.imageMessagesWithMediaGroups(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = photoMessagesWithMediaGroups(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.pollMessages() = filterContentMessages<PollContent>()
|
||||
fun FlowsUpdatesFilter.pollMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<PollContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.stickerMessages() = filterContentMessages<StickerContent>()
|
||||
fun FlowsUpdatesFilter.stickerMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<StickerContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.textMessages() = filterContentMessages<TextContent>()
|
||||
fun FlowsUpdatesFilter.textMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<TextContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.venueMessages() = filterContentMessages<VenueContent>()
|
||||
fun FlowsUpdatesFilter.venueMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<VenueContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.videoMessages() = filterContentMessages<VideoContent>()
|
||||
fun FlowsUpdatesFilter.videoMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<VideoContent>(scopeToIncludeChannels)
|
||||
fun FlowsUpdatesFilter.videoMessagesWithMediaGroups(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = merge(
|
||||
filterContentMessages<VideoContent>(scopeToIncludeChannels),
|
||||
mediaGroupVideosMessages(scopeToIncludeChannels).flatMap()
|
||||
)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.videoNoteMessages() = filterContentMessages<VideoNoteContent>()
|
||||
fun FlowsUpdatesFilter.videoNoteMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<VideoNoteContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<BaseSentMessageUpdate>.voiceMessages() = filterContentMessages<VoiceContent>()
|
||||
fun FlowsUpdatesFilter.voiceMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterContentMessages<VoiceContent>(scopeToIncludeChannels)
|
||||
|
||||
|
||||
fun Flow<SentMediaGroupUpdate>.mediaGroupMessages() = filterMediaGroupMessages<MediaGroupContent>()
|
||||
fun FlowsUpdatesFilter.mediaGroupMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterMediaGroupMessages<MediaGroupContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<SentMediaGroupUpdate>.mediaGroupPhotosMessages() = filterMediaGroupMessages<PhotoContent>()
|
||||
fun FlowsUpdatesFilter.mediaGroupPhotosMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterMediaGroupMessages<PhotoContent>(scopeToIncludeChannels)
|
||||
|
||||
fun Flow<SentMediaGroupUpdate>.mediaGroupVideosMessages() = filterMediaGroupMessages<VideoContent>()
|
||||
fun FlowsUpdatesFilter.mediaGroupVideosMessages(
|
||||
scopeToIncludeChannels: CoroutineScope? = null
|
||||
) = filterMediaGroupMessages<VideoContent>(scopeToIncludeChannels)
|
||||
@@ -114,7 +114,7 @@ fun RequestsExecutor.startGettingOfUpdatesByLongPolling(
|
||||
pollAnswerCallback: UpdateReceiver<PollAnswerUpdate>? = null,
|
||||
timeoutSeconds: Seconds = 30,
|
||||
exceptionsHandler: ExceptionHandler<Unit>? = null,
|
||||
scope: CoroutineScope = GlobalScope
|
||||
scope: CoroutineScope = CoroutineScope(Dispatchers.Default)
|
||||
): Job {
|
||||
return startGettingOfUpdatesByLongPolling(
|
||||
SimpleUpdatesFilter(
|
||||
|
||||
@@ -2,14 +2,14 @@ package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.updates.retr
|
||||
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestsExecutor
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.nonstrictJsonFormat
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.updates.flowsUpdatesFilter
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.MultipartRequestImpl
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.requests.webhook.SetWebhook
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.UpdateDeserializationStrategy
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.UpdateReceiver
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.UpdatesFilter
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.*
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.webhook.WebhookPrivateKeyConfig
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.utils.ExceptionHandler
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.utils.handleSafely
|
||||
@@ -56,6 +56,16 @@ fun Route.includeWebhookHandlingInRoute(
|
||||
}
|
||||
}
|
||||
|
||||
fun Route.includeWebhookHandlingInRouteWithFlows(
|
||||
scope: CoroutineScope,
|
||||
exceptionsHandler: ExceptionHandler<Unit>? = null,
|
||||
block: FlowsUpdatesFilter.() -> Unit
|
||||
) = includeWebhookHandlingInRoute(
|
||||
scope,
|
||||
exceptionsHandler,
|
||||
flowsUpdatesFilter(block = block).asUpdateReceiver
|
||||
)
|
||||
|
||||
/**
|
||||
* Setting up ktor server, set webhook info via [SetWebhook] request.
|
||||
*
|
||||
|
||||
@@ -4,7 +4,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.FileUniqueId
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.fileUniqueIdField
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.*
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.utils.TelegramAPIUrlsKeeper
|
||||
import com.github.insanusmokrassar.TelegramBotAPI.utils.*
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@@ -20,5 +20,7 @@ data class PathedFile(
|
||||
override val fileSize: Long? = null
|
||||
): TelegramMediaFile
|
||||
|
||||
val PathedFile.filename: FileName
|
||||
get() = filePath.filenameFromUrl
|
||||
fun TelegramAPIUrlsKeeper.resolveFileURL(file: PathedFile): String = "$fileBaseUrl/${file.filePath}"
|
||||
fun PathedFile.fullUrl(keeper: TelegramAPIUrlsKeeper): String = keeper.resolveFileURL(this)
|
||||
|
||||
@@ -1,6 +1,15 @@
|
||||
package com.github.insanusmokrassar.TelegramBotAPI.utils
|
||||
|
||||
private val filenameRegex = Regex("[^/]*$")
|
||||
private val extensionRegex = Regex("[^.]*$")
|
||||
|
||||
/**
|
||||
* File name like hello.jpg
|
||||
*/
|
||||
typealias FileName = String
|
||||
|
||||
val String.filenameFromUrl: FileName
|
||||
get() = filenameRegex.find(this) ?.value ?: ""
|
||||
|
||||
val String.fileExtension
|
||||
get() = extensionRegex.find(this) ?.value ?: ""
|
||||
|
||||
@@ -9,6 +9,6 @@ ktor_version=1.3.2
|
||||
javax_activation_version=1.1.1
|
||||
|
||||
library_group=com.github.insanusmokrassar
|
||||
library_version=0.27.9
|
||||
library_version=0.27.11
|
||||
|
||||
gradle_bintray_plugin_version=1.8.4
|
||||
|
||||
Reference in New Issue
Block a user