From c211002ac13d18f7dc9322876c352071b88aa0a1 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 14 Jan 2023 22:24:00 +0600 Subject: [PATCH 1/5] start 0.7.1 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index e27f697..9883b90 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,4 +25,4 @@ dokka_version=1.7.20 # Project data group=dev.inmo -version=0.7.0 +version=0.7.1 From 88a89ff1e7730b707e22f0a49ed8a40321696b5e Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 14 Jan 2023 22:37:56 +0600 Subject: [PATCH 2/5] add resender module --- gradle.properties | 2 +- resender/build.gradle | 17 +++ .../src/commonMain/kotlin/MessageMetaInfo.kt | 18 +++ .../src/commonMain/kotlin/MessagesResender.kt | 144 ++++++++++++++++++ settings.gradle | 2 + 5 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 resender/build.gradle create mode 100644 resender/src/commonMain/kotlin/MessageMetaInfo.kt create mode 100644 resender/src/commonMain/kotlin/MessagesResender.kt diff --git a/gradle.properties b/gradle.properties index 9883b90..ae49d66 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ kotlin_serialisation_core_version=1.4.1 github_release_plugin_version=2.4.1 -tgbotapi_version=5.0.0 +tgbotapi_version=5.0.1-branch_5.0.1-build1361 micro_utils_version=0.16.4 exposed_version=0.41.1 plagubot_version=3.3.0 diff --git a/resender/build.gradle b/resender/build.gradle new file mode 100644 index 0000000..9a85f4f --- /dev/null +++ b/resender/build.gradle @@ -0,0 +1,17 @@ +plugins { + id "org.jetbrains.kotlin.multiplatform" + id "org.jetbrains.kotlin.plugin.serialization" +} + +apply from: "$mppJavaWithJsProjectPath" + +kotlin { + sourceSets { + commonMain { + dependencies { + api "dev.inmo:tgbotapi.core:$tgbotapi_version" + } + } + } +} + diff --git a/resender/src/commonMain/kotlin/MessageMetaInfo.kt b/resender/src/commonMain/kotlin/MessageMetaInfo.kt new file mode 100644 index 0000000..f844c63 --- /dev/null +++ b/resender/src/commonMain/kotlin/MessageMetaInfo.kt @@ -0,0 +1,18 @@ +package dev.inmo.tgbotapi.libraries.resender + +import dev.inmo.tgbotapi.types.IdChatIdentifier +import dev.inmo.tgbotapi.types.MessageId +import dev.inmo.tgbotapi.types.message.abstracts.Message +import dev.inmo.tgbotapi.types.message.abstracts.PossiblyMediaGroupMessage +import kotlinx.serialization.Serializable + +@Serializable +data class MessageMetaInfo( + val chatId: IdChatIdentifier, + val messageId: MessageId, + val group: String? = null +) + +operator fun MessageMetaInfo.Companion.invoke( + message: Message +) = MessageMetaInfo(message.chat.id, message.messageId, (message as? PossiblyMediaGroupMessage<*>) ?.mediaGroupId) diff --git a/resender/src/commonMain/kotlin/MessagesResender.kt b/resender/src/commonMain/kotlin/MessagesResender.kt new file mode 100644 index 0000000..27c6444 --- /dev/null +++ b/resender/src/commonMain/kotlin/MessagesResender.kt @@ -0,0 +1,144 @@ +package dev.inmo.tgbotapi.libraries.resender + +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.requests.ForwardMessage +import dev.inmo.tgbotapi.requests.send.CopyMessage +import dev.inmo.tgbotapi.requests.send.media.SendMediaGroup +import dev.inmo.tgbotapi.types.ChatIdentifier +import dev.inmo.tgbotapi.types.IdChatIdentifier +import dev.inmo.tgbotapi.types.mediaCountInMediaGroup +import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage +import dev.inmo.tgbotapi.types.message.content.MediaGroupPartContent + +class MessagesResender( + private val bot: TelegramBot, + private val cacheChatId: ChatIdentifier +) { + suspend fun resend( + targetChatId: IdChatIdentifier, + messagesInfo: List + ): List> { + val orders = messagesInfo.mapIndexed { i, messageInfo -> messageInfo to i }.toMap() + val sortedMessagesContents = messagesInfo.groupBy { it.group }.flatMap { (group, list) -> + if (group == null) { + list.map { + orders.getValue(it) to listOf(it) + } + } else { + listOf(orders.getValue(list.first()) to list) + } + }.sortedBy { it.first } + + return sortedMessagesContents.flatMap { (_, contents) -> + val result = mutableListOf>() + + when { + contents.size == 1 -> { + val messageInfo = contents.first() + runCatching { + MessageMetaInfo( + targetChatId, + bot.execute( + CopyMessage( + targetChatId, + fromChatId = messageInfo.chatId, + messageId = messageInfo.messageId + ) + ) + ) + }.onFailure { _ -> + runCatching { + bot.execute( + ForwardMessage( + toChatId = targetChatId, + fromChatId = messageInfo.chatId, + messageId = messageInfo.messageId + ) + ) + }.onSuccess { + MessageMetaInfo( + targetChatId, + bot.execute( + CopyMessage( + targetChatId, + fromChatId = it.chat.id, + messageId = it.messageId + ) + ) + ) + } + }.getOrNull() ?.let { + messageInfo to it + } + } + else -> { + val resultContents = contents.mapNotNull { + it to ( + bot.execute( + ForwardMessage( + toChatId = cacheChatId, + fromChatId = it.chatId, + messageId = it.messageId + ) + ) as? ContentMessage<*> ?: return@mapNotNull null) + }.mapNotNull { (src, forwardedMessage) -> + val forwardedMessageAsMediaPartMessage = forwardedMessage.takeIf { + it.content is MediaGroupPartContent + } ?.let { + it as ContentMessage + } + src to (forwardedMessageAsMediaPartMessage ?: null.also { _ -> + result.add( + src to MessageMetaInfo( + targetChatId, + bot.execute( + CopyMessage( + targetChatId, + fromChatId = forwardedMessage.chat.id, + messageId = forwardedMessage.messageId + ) + ) + ) + ) + } ?: return@mapNotNull null) + } + + resultContents.singleOrNull() ?.also { (src, it) -> + result.add( + src to MessageMetaInfo( + targetChatId, + bot.execute( + CopyMessage( + targetChatId, + it.chat.id, + it.messageId + ) + ) + ) + ) + } ?: resultContents.chunked(mediaCountInMediaGroup.last).forEach { + bot.execute( + SendMediaGroup( + targetChatId, + it.map { it.second.content.toMediaGroupMemberTelegramMedia() } + ) + ).content.group.mapIndexed { i, partWrapper -> + it.getOrNull(i) ?.let { + result.add( + it.first to MessageMetaInfo( + partWrapper.sourceMessage.chat.id, + partWrapper.sourceMessage.messageId, + partWrapper.sourceMessage.mediaGroupId + ) + ) + } + } + } + } + } + + result.toList() + } + + } +} diff --git a/settings.gradle b/settings.gradle index ccfc849..feb9455 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,6 +7,8 @@ String[] includes = [ ":cache:content:common", ":cache:content:micro_utils", + + ":resender", ] From 617b8091db1bafe7e912f0ca81516c88bda18ceb Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 14 Jan 2023 23:42:16 +0600 Subject: [PATCH 3/5] small refactor --- .../src/commonMain/kotlin/MessagesResender.kt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/resender/src/commonMain/kotlin/MessagesResender.kt b/resender/src/commonMain/kotlin/MessagesResender.kt index 27c6444..63d8893 100644 --- a/resender/src/commonMain/kotlin/MessagesResender.kt +++ b/resender/src/commonMain/kotlin/MessagesResender.kt @@ -18,19 +18,19 @@ class MessagesResender( targetChatId: IdChatIdentifier, messagesInfo: List ): List> { - val orders = messagesInfo.mapIndexed { i, messageInfo -> messageInfo to i }.toMap() - val sortedMessagesContents = messagesInfo.groupBy { it.group }.flatMap { (group, list) -> + val messagesWithOrders = messagesInfo.mapIndexed { i, messageInfo -> messageInfo to i }.toMap() + val ordersWithMessagesGroups = messagesInfo.groupBy { it.group }.flatMap { (group, list) -> if (group == null) { list.map { - orders.getValue(it) to listOf(it) + messagesWithOrders.getValue(it) to listOf(it) } } else { - listOf(orders.getValue(list.first()) to list) + listOf(messagesWithOrders.getValue(list.first()) to list) } }.sortedBy { it.first } - return sortedMessagesContents.flatMap { (_, contents) -> - val result = mutableListOf>() + return ordersWithMessagesGroups.flatMap { (_, contents) -> + val sourceMessagesToSentMessages = mutableListOf>() when { contents.size == 1 -> { @@ -88,7 +88,7 @@ class MessagesResender( it as ContentMessage } src to (forwardedMessageAsMediaPartMessage ?: null.also { _ -> - result.add( + sourceMessagesToSentMessages.add( src to MessageMetaInfo( targetChatId, bot.execute( @@ -104,7 +104,7 @@ class MessagesResender( } resultContents.singleOrNull() ?.also { (src, it) -> - result.add( + sourceMessagesToSentMessages.add( src to MessageMetaInfo( targetChatId, bot.execute( @@ -124,7 +124,7 @@ class MessagesResender( ) ).content.group.mapIndexed { i, partWrapper -> it.getOrNull(i) ?.let { - result.add( + sourceMessagesToSentMessages.add( it.first to MessageMetaInfo( partWrapper.sourceMessage.chat.id, partWrapper.sourceMessage.messageId, @@ -137,7 +137,7 @@ class MessagesResender( } } - result.toList() + sourceMessagesToSentMessages.toList() } } From 9023cc5acc2fa03c621261fc32fecaa37a8bcf07 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Thu, 19 Jan 2023 00:24:50 +0600 Subject: [PATCH 4/5] Update gradle.properties --- gradle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index ae49d66..198bacd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,10 +13,10 @@ kotlin_serialisation_core_version=1.4.1 github_release_plugin_version=2.4.1 -tgbotapi_version=5.0.1-branch_5.0.1-build1361 -micro_utils_version=0.16.4 +tgbotapi_version=5.0.1 +micro_utils_version=0.16.6 exposed_version=0.41.1 -plagubot_version=3.3.0 +plagubot_version=3.3.1 # Dokka From 9b056656e38d51763cc4f9f99ae943ac88d6aa66 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 6 Feb 2023 14:13:43 +0600 Subject: [PATCH 5/5] start 0.8.0 && update dependencies --- gradle.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 198bacd..d806b29 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,10 +13,10 @@ kotlin_serialisation_core_version=1.4.1 github_release_plugin_version=2.4.1 -tgbotapi_version=5.0.1 -micro_utils_version=0.16.6 +tgbotapi_version=5.1.0 +micro_utils_version=0.16.8 exposed_version=0.41.1 -plagubot_version=3.3.1 +plagubot_version=3.4.0 # Dokka @@ -25,4 +25,4 @@ dokka_version=1.7.20 # Project data group=dev.inmo -version=0.7.1 +version=0.8.0