diff --git a/CHANGELOG.md b/CHANGELOG.md index fae726e1ec..176a8c50c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # TelegramBotAPI changelog + ## 0.38.0 * `Common`: @@ -13,7 +14,14 @@ ## 0.37.4 -## 0.37.3 Hotfix of 0.37.3 +* `Common`: + * `Version`: + * `MicroUtils`: `0.8.7` -> `0.8.9` +* `Core`: + * New `SupergroupEvent` subtype: `MigratedToSupergroup`. This event is sent when a group is converted to a supergroup while bot is in the group. + * Helper extenstion functions on `ChatEvent` to cast it to `MigratedToSupergroup`. + +## 0.37.3 Hotfix of 0.37.2 * `Core`: * Fixes in hierarchy (and creating) of messages from channels @@ -22,6 +30,8 @@ `0.37.2` changelog: +_This update contains [Telegram Bot API 5.5](https://core.telegram.org/bots/api-changelog#december-7-2021) implementation_ + * `Common`: * `Version`: * `MicroUtils`: `0.8.2` -> `0.8.7` diff --git a/gradle.properties b/gradle.properties index bd9559450c..b1e761c4a1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,6 +12,7 @@ klock_version=2.4.10 uuid_version=0.3.1 ktor_version=1.6.7 + micro_utils_version=0.9.0 javax_activation_version=1.1.1 diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/GroupChatCreated.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/GroupChatCreated.kt index edecacfd6a..4ac21f5771 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/GroupChatCreated.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/GroupChatCreated.kt @@ -1,8 +1,8 @@ package dev.inmo.tgbotapi.types.message.ChatEvents -import dev.inmo.tgbotapi.types.ChatIdentifier +import dev.inmo.tgbotapi.types.ChatId import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.GroupEvent class GroupChatCreated( - val migratedTo: ChatIdentifier? + val migratedTo: ChatId? ): GroupEvent diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/MigratedToSupergroup.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/MigratedToSupergroup.kt new file mode 100644 index 0000000000..276deeb0e1 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/MigratedToSupergroup.kt @@ -0,0 +1,11 @@ +package dev.inmo.tgbotapi.types.message.ChatEvents + +import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.SupergroupEvent + +/** + * This event is sent when a group is converted to a supergroup. + */ +data class MigratedToSupergroup( + val migratedFrom: ChatId +): SupergroupEvent diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/SupergroupChatCreated.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/SupergroupChatCreated.kt index 5ea4ef8247..31830380cb 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/SupergroupChatCreated.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/SupergroupChatCreated.kt @@ -1,8 +1,8 @@ package dev.inmo.tgbotapi.types.message.ChatEvents -import dev.inmo.tgbotapi.types.ChatIdentifier +import dev.inmo.tgbotapi.types.ChatId import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.SupergroupEvent class SupergroupChatCreated( - val migratedFrom: ChatIdentifier? + val migratedFrom: ChatId? ): SupergroupEvent diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt index 343afb1f75..c0fcc5334b 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt @@ -75,8 +75,8 @@ internal data class RawMessage( private val group_chat_created: Boolean = false, private val supergroup_chat_created: Boolean = false, private val channel_chat_created: Boolean = false, - private val migrate_to_chat_id: ChatIdentifier? = null, - private val migrate_from_chat_id: ChatIdentifier? = null, + private val migrate_to_chat_id: ChatId? = null, + private val migrate_from_chat_id: ChatId? = null, private val pinned_message: RawMessage? = null, private val invoice: Invoice? = null, private val dice: Dice? = null, @@ -194,6 +194,9 @@ internal data class RawMessage( supergroup_chat_created -> SupergroupChatCreated( migrate_from_chat_id ) + migrate_from_chat_id != null -> MigratedToSupergroup( + migrate_from_chat_id + ) channel_chat_created -> ChannelChatCreated() pinned_message != null -> PinnedMessage(pinned_message.asMessage) proximity_alert_triggered != null -> proximity_alert_triggered diff --git a/tgbotapi.core/src/commonTest/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/MigratedToSupergroupTest.kt b/tgbotapi.core/src/commonTest/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/MigratedToSupergroupTest.kt new file mode 100644 index 0000000000..4c243155a3 --- /dev/null +++ b/tgbotapi.core/src/commonTest/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/MigratedToSupergroupTest.kt @@ -0,0 +1,52 @@ +package dev.inmo.tgbotapi.types.message.ChatEvents + +import dev.inmo.tgbotapi.TestsJsonFormat +import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate +import dev.inmo.tgbotapi.extensions.utils.asMigratedToSupergroup +import dev.inmo.tgbotapi.extensions.utils.asSupergroupChatCreated +import dev.inmo.tgbotapi.extensions.utils.asSupergroupEventMessage +import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.update.abstracts.UpdateDeserializationStrategy +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.fail + + +class MigratedToSupergroupTest { + @Test + fun MigratedToSupergroupEventShouldBeParsed() { + val payload = """ + { + "update_id": 42, + "message": { + "message_id": 1, + "from": { + "id": 1087968824, + "is_bot": true, + "first_name": "Group", + "username": "GroupAnonymousBot" + }, + "sender_chat": { + "id": 42, + "title": "MigratedToSupergroupTest", + "type": "supergroup" + }, + "chat": { + "id": 42, + "title": "MigratedToSupergroupTest", + "type": "supergroup" + }, + "date": 1639955462, + "migrate_from_chat_id": 57005 + } + } + """.trimIndent() + val update = TestsJsonFormat.decodeFromString(UpdateDeserializationStrategy, payload) + val message = update.asMessageUpdate() ?: fail("update should be of MessageUpdate subtype") + val data = message.data.asSupergroupEventMessage() ?: fail("message should be of SupergroupEventMessage subtype") + val event = data.chatEvent.asMigratedToSupergroup() ?: fail("event should be of SupergroupChatCreated subtype") + + assertEquals(ChatId(57005), event.migratedFrom) + } +} diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt index 52af1c45fe..a0e7317dc1 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt @@ -3081,6 +3081,15 @@ inline fun ChatEvent.asSupergroupChatCreated(): SupergroupChatCreated? = this as @PreviewFeature inline fun ChatEvent.requireSupergroupChatCreated(): SupergroupChatCreated = this as SupergroupChatCreated +@PreviewFeature +inline fun ChatEvent.whenMigratedToSupergroup(block: (MigratedToSupergroup) -> T) = asMigratedToSupergroup() ?.let(block) + +@PreviewFeature +inline fun ChatEvent.asMigratedToSupergroup(): MigratedToSupergroup? = this as? MigratedToSupergroup + +@PreviewFeature +inline fun ChatEvent.requireMigratedToSupergroup(): MigratedToSupergroup = this as MigratedToSupergroup + @PreviewFeature inline fun ChatEvent.whenChannelEvent(block: (ChannelEvent) -> T) = asChannelEvent() ?.let(block)