From 84a086e7e4c9fd30eae250157cf5b9b57f64d176 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Thu, 16 May 2019 14:58:19 +0800 Subject: [PATCH] 0.14.2 --- CHANGELOG.md | 6 +++ build.gradle | 2 +- .../ChannelPostMediaGroupUpdate.kt | 2 +- .../EditChannelPostMediaGroupUpdate.kt | 9 ++-- .../EditMessageMediaGroupUpdate.kt | 9 ++-- .../MediaGroupUpdates/MediaGroupUpdate.kt | 9 +++- .../MessageMediaGroupUpdate.kt | 2 +- .../updateshandlers/UpdatesFilter.kt | 8 +--- .../updateshandlers/UpdatesPoller.kt | 7 +-- .../BaseMessageUpdateToMediaGroupUpdate.kt | 45 +++++++++++++++++-- .../utils/extensions/Webhooks.kt | 20 +++++---- 11 files changed, 85 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a71af3dd13..2a0575a97c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,12 @@ some default library * `UpdatesFilter` now have additional callback for polls * `StopPoll#replyMarkup` now is optional +### 0.14.2 MediaGroups edit hotfixes + +* `convertWithMediaGroupUpdates` extension added +* All media group converting extensions are internal for now +* Fixes according to updates in converting of updates to media group updates + ## 0.13.0 Telegram Polls * Type `PollOption` and `AnonymousPollOption` added diff --git a/build.gradle b/build.gradle index 75bf10f8a9..cc0ead9718 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -project.version = "0.14.1" +project.version = "0.14.2" project.group = "com.github.insanusmokrassar" buildscript { diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/ChannelPostMediaGroupUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/ChannelPostMediaGroupUpdate.kt index b571ad2c51..28f93496c6 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/ChannelPostMediaGroupUpdate.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/ChannelPostMediaGroupUpdate.kt @@ -6,7 +6,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMes data class ChannelPostMediaGroupUpdate( override val origins: List -) : MediaGroupUpdate { +) : SentMediaGroupUpdate { override val updateId: UpdateIdentifier = origins.last().updateId override val data: List = origins.mapNotNull { it.data as? MediaGroupMessage } } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/EditChannelPostMediaGroupUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/EditChannelPostMediaGroupUpdate.kt index 2ff35f9463..e13ba2a8d7 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/EditChannelPostMediaGroupUpdate.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/EditChannelPostMediaGroupUpdate.kt @@ -2,11 +2,12 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.update.MediaGroupUpdate import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.MediaGroupMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.update.EditChannelPostUpdate import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate data class EditChannelPostMediaGroupUpdate( - override val origins: List -) : MediaGroupUpdate { - override val updateId: UpdateIdentifier = origins.last().updateId - override val data: List = origins.mapNotNull { it.data as? MediaGroupMessage } + override val origin: EditChannelPostUpdate +) : EditMediaGroupUpdate { + override val updateId: UpdateIdentifier = origin.updateId + override val data: MediaGroupMessage = origin.data as MediaGroupMessage } \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/EditMessageMediaGroupUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/EditMessageMediaGroupUpdate.kt index 0f8ca911f9..0801f6c051 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/EditMessageMediaGroupUpdate.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/EditMessageMediaGroupUpdate.kt @@ -2,11 +2,12 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.update.MediaGroupUpdate import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.MediaGroupMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.update.EditMessageUpdate import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate data class EditMessageMediaGroupUpdate( - override val origins: List -) : MediaGroupUpdate { - override val updateId: UpdateIdentifier = origins.last().updateId - override val data: List = origins.mapNotNull { it.data as? MediaGroupMessage } + override val origin: EditMessageUpdate +) : EditMediaGroupUpdate { + override val updateId: UpdateIdentifier = origin.updateId + override val data: MediaGroupMessage = origin.data as MediaGroupMessage } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/MediaGroupUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/MediaGroupUpdate.kt index cccce9247b..c61ae5b674 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/MediaGroupUpdate.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/MediaGroupUpdate.kt @@ -4,7 +4,14 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.MediaG import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update -interface MediaGroupUpdate: Update { +interface MediaGroupUpdate : Update + +interface SentMediaGroupUpdate: MediaGroupUpdate { override val data: List val origins: List } + +interface EditMediaGroupUpdate : MediaGroupUpdate { + override val data: MediaGroupMessage + val origin: BaseMessageUpdate +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/MessageMediaGroupUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/MessageMediaGroupUpdate.kt index f1d253c869..c1139bc944 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/MessageMediaGroupUpdate.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MediaGroupUpdates/MessageMediaGroupUpdate.kt @@ -6,7 +6,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMes data class MessageMediaGroupUpdate( override val origins: List -) : MediaGroupUpdate { +) : SentMediaGroupUpdate { override val updateId: UpdateIdentifier = origins.last().updateId override val data: List = origins.mapNotNull { it.data as? MediaGroupMessage } } \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/updateshandlers/UpdatesFilter.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/updateshandlers/UpdatesFilter.kt index 218ec5737b..9f3845f8f2 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/updateshandlers/UpdatesFilter.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/updateshandlers/UpdatesFilter.kt @@ -50,9 +50,7 @@ data class UpdatesFilter( is EditMessageMediaGroupUpdate -> editedMessageMediaGroupCallback ?.also { receiver -> receiver(update) } ?: editedMessageCallback ?.also { receiver -> - update.origins.mapNotNull { it as? EditMessageUpdate }.forEach { - receiver(it) - } + receiver(update.origin) } is ChannelPostUpdate -> channelPostCallback ?.invoke(update) is ChannelPostMediaGroupUpdate -> channelPostMediaGroupCallback ?.also { receiver -> @@ -66,9 +64,7 @@ data class UpdatesFilter( is EditChannelPostMediaGroupUpdate -> editedChannelPostMediaGroupCallback ?.also { receiver -> receiver(update) } ?: editedChannelPostCallback ?.also { receiver -> - update.origins.mapNotNull { it as? EditChannelPostUpdate }.forEach { - receiver(it) - } + receiver(update.origin) } is ChosenInlineResultUpdate -> chosenInlineResultCallback ?.invoke(update) is InlineQueryUpdate -> inlineQueryCallback ?.invoke(update) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/updateshandlers/UpdatesPoller.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/updateshandlers/UpdatesPoller.kt index 672208d2ea..d146895c6c 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/updateshandlers/UpdatesPoller.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/updateshandlers/UpdatesPoller.kt @@ -7,10 +7,9 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.MediaGroupMessage import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update +import com.github.insanusmokrassar.TelegramBotAPI.utils.* import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.UpdateReceiver import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.executeUnsafe -import com.github.insanusmokrassar.TelegramBotAPI.utils.mediaGroupId -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMediaGroupUpdate import kotlinx.coroutines.* import java.util.concurrent.Executors @@ -35,9 +34,7 @@ class UpdatesPoller( val inputMediaGroupId = (update ?.data as? MediaGroupMessage) ?.mediaGroupId if (mediaGroup.isNotEmpty() && inputMediaGroupId ?.equals(mediaGroup.mediaGroupId) != true) { mediaGroup.sortBy { it.updateId } - mediaGroup.toMediaGroupUpdate() ?.let { - sendToBlock(it) - } ?: mediaGroup.forEach { + mediaGroup.convertWithMediaGroupUpdates().forEach { sendToBlock(it) } mediaGroup.clear() diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/BaseMessageUpdateToMediaGroupUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/BaseMessageUpdateToMediaGroupUpdate.kt index bf9ffd359e..0c2f3a8d99 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/BaseMessageUpdateToMediaGroupUpdate.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/BaseMessageUpdateToMediaGroupUpdate.kt @@ -1,16 +1,55 @@ package com.github.insanusmokrassar.TelegramBotAPI.utils +import com.github.insanusmokrassar.TelegramBotAPI.types.MediaGroupIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.MediaGroupMessage import com.github.insanusmokrassar.TelegramBotAPI.types.update.* import com.github.insanusmokrassar.TelegramBotAPI.types.update.MediaGroupUpdates.* import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update -fun List.toMediaGroupUpdate(): MediaGroupUpdate? = (this as? MediaGroupUpdate) ?: let { +private inline val Pair.message + get() = first + +internal fun List.convertWithMediaGroupUpdates(): List { + val resultUpdates = mutableListOf() + val mediaGroups = mutableMapOf>() + for (update in this) { + val asEditMediaGroupMessage = update.toEditMediaGroupUpdate() + if (asEditMediaGroupMessage != null) { + resultUpdates.add(asEditMediaGroupMessage) + } else { + val data = update.data + if (data is MediaGroupMessage) { + (mediaGroups[data.mediaGroupId] ?: mutableListOf().also { mediaGroups[data.mediaGroupId] = it }).add(update) + } else { + resultUpdates.add(update) + } + } + } + mediaGroups.values.map { + it.toSentMediaGroupUpdate() ?.let { mediaGroupUpdate -> + resultUpdates.add(mediaGroupUpdate) + } + } + return resultUpdates.sortedBy { it.updateId } +} + +internal fun List.toSentMediaGroupUpdate(): SentMediaGroupUpdate? = (this as? SentMediaGroupUpdate) ?: let { + if (isEmpty()) { + return@let null + } val resultList = sortedBy { it.updateId } when (first()) { is MessageUpdate -> MessageMediaGroupUpdate(resultList) - is EditMessageUpdate -> EditMessageMediaGroupUpdate(resultList) is ChannelPostUpdate -> ChannelPostMediaGroupUpdate(resultList) - is EditChannelPostUpdate -> EditChannelPostMediaGroupUpdate(resultList) + else -> null + } +} + +internal fun BaseMessageUpdate.toEditMediaGroupUpdate(): EditMediaGroupUpdate? = (this as? EditMediaGroupUpdate) ?: let { + when (this) { + is EditMessageUpdate -> EditMessageMediaGroupUpdate(this) + is EditChannelPostUpdate -> EditChannelPostMediaGroupUpdate(this) else -> null } } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/Webhooks.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/Webhooks.kt index af6804d443..86011af428 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/Webhooks.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/Webhooks.kt @@ -3,14 +3,15 @@ package com.github.insanusmokrassar.TelegramBotAPI.utils.extensions import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestsExecutor import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.InputFile import com.github.insanusmokrassar.TelegramBotAPI.requests.webhook.SetWebhook -import com.github.insanusmokrassar.TelegramBotAPI.types.MediaGroupIdentifier import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.MediaGroupMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.update.MediaGroupUpdates.MediaGroupUpdate import com.github.insanusmokrassar.TelegramBotAPI.types.update.RawUpdate import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.UpdatesFilter import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.webhook.WebhookPrivateKeyConfig -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMediaGroupUpdate +import com.github.insanusmokrassar.TelegramBotAPI.utils.convertWithMediaGroupUpdates +import com.github.insanusmokrassar.TelegramBotAPI.utils.toSentMediaGroupUpdate import io.ktor.application.call import io.ktor.request.receiveText import io.ktor.response.respond @@ -61,7 +62,7 @@ suspend fun RequestsExecutor.setWebhook( ) ) val updatesChannel = Channel(Channel.UNLIMITED) - val mediaGroupChannel = Channel>(Channel.UNLIMITED) + val mediaGroupChannel = Channel>(Channel.UNLIMITED) val mediaGroupAccumulatedChannel = mediaGroupChannel.accumulateByKey( 1000L, scope = scope @@ -110,17 +111,20 @@ suspend fun RequestsExecutor.setWebhook( launch { for (update in updatesChannel) { val data = update.data + if (data is MediaGroupUpdate) { + + } else { + + } when (data) { - is MediaGroupMessage -> mediaGroupChannel.send(data.mediaGroupId to update as BaseMessageUpdate) + is MediaGroupMessage -> mediaGroupChannel.send("${data.mediaGroupId}${update::class.simpleName}" to update as BaseMessageUpdate) else -> block(update) } } } launch { - for (mediaGroupUpdate in mediaGroupAccumulatedChannel) { - mediaGroupUpdate.second.toMediaGroupUpdate() ?.let { - block(it) - } ?: mediaGroupUpdate.second.forEach { + for ((_, mediaGroup) in mediaGroupAccumulatedChannel) { + mediaGroup.convertWithMediaGroupUpdates().forEach { block(it) } }