Support for "migrated to supergroup" events
MODIFY
CHANGELOG.md
CHANGELOG.md
# TelegramBotAPI changelog
## 0.37.4
+* `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.3

MODIFY
tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/GroupChatCreated.kt
tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/GroupChatCreated.kt
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

ADD
tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/MigratedToSupergroup.kt
+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.
+ */
+class MigratedToSupergroup(
+ val migratedFrom: ChatId
+): SupergroupEvent

MODIFY
tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/SupergroupChatCreated.kt
tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/SupergroupChatCreated.kt
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

MODIFY
tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt
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

ADD
tgbotapi.core/src/commonTest/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/MigratedToSupergroupTest.kt
+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 `MigratedToSupergroup event should be parsed`() {
+ 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)
+ }
+}
\ No newline at end of file

MODIFY
tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt
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 <T> 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 <T> ChatEvent.whenChannelEvent(block: (ChannelEvent) -> T) = asChannelEvent() ?.let(block)

Support for "migrated to supergroup" events