From 989d33acb8a226a865e444d079e44e8ce661d929 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 3 Sep 2025 19:44:42 +0600 Subject: [PATCH] start separate channel direct messages thread id insttead of one merged message thread id --- .../expectations/WaitEventAction.kt | 4 +-- .../triggers_handling/EventTriggers.kt | 13 ++++--- ...onallyChannelDirectMessageThreadRequest.kt | 7 ++++ .../send/abstracts/SendMessageRequest.kt | 3 +- .../requests/send/payments/SendInvoice.kt | 2 ++ .../dev/inmo/tgbotapi/types/ChatIdentifier.kt | 36 ++++++++++++++++--- .../kotlin/dev/inmo/tgbotapi/types/Common.kt | 1 + .../types/DirectMessagePriceChanged.kt | 22 ++++++------ .../tgbotapi/types/DirectMessageThreadId.kt | 14 ++++++++ .../types/chat/DirectMessagesTopic.kt | 4 +-- .../inmo/tgbotapi/types/message/RawMessage.kt | 2 +- .../extensions/utils/ClassCastsNew.kt | 26 +++++++------- 12 files changed, 92 insertions(+), 42 deletions(-) create mode 100644 tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/abstracts/OptionallyChannelDirectMessageThreadRequest.kt create mode 100644 tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/DirectMessageThreadId.kt diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt index 9abfdaf6a5..e3a126146f 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt @@ -5,7 +5,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.requests.abstracts.Request -import dev.inmo.tgbotapi.types.ChannelDirectMessagesConfigurationChanged +import dev.inmo.tgbotapi.types.DirectMessagesConfigurationChanged import dev.inmo.tgbotapi.types.PaidMessagePriceChanged import dev.inmo.tgbotapi.types.chat.ChatBackground import dev.inmo.tgbotapi.types.checklists.ChecklistTasksAdded @@ -287,7 +287,7 @@ fun BehaviourContext.waitChecklistTasksAdded( fun BehaviourContext.waitChannelDirectMessagesConfigurationChanged( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } -) = waitEvents(initRequest, errorFactory) +) = waitEvents(initRequest, errorFactory) fun BehaviourContext.waitSuggestedPostApprovalFailed( initRequest: Request<*>? = null, diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt index 96c966e084..3c1647ea81 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt @@ -10,7 +10,7 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.Mar import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times import dev.inmo.tgbotapi.extensions.utils.baseSentMessageUpdateOrNull import dev.inmo.tgbotapi.extensions.utils.chatEventMessageOrNull -import dev.inmo.tgbotapi.types.ChannelDirectMessagesConfigurationChanged +import dev.inmo.tgbotapi.types.DirectMessagesConfigurationChanged import dev.inmo.tgbotapi.types.PaidMessagePriceChanged import dev.inmo.tgbotapi.types.chat.ChatBackground import dev.inmo.tgbotapi.types.checklists.ChecklistTasksAdded @@ -41,7 +41,6 @@ import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage import dev.inmo.tgbotapi.types.message.abstracts.SupergroupEventMessage import dev.inmo.tgbotapi.types.message.payments.RefundedPaymentEvent import dev.inmo.tgbotapi.types.message.payments.SuccessfulPaymentEvent -import dev.inmo.tgbotapi.types.payments.SuggestedPostPrice import dev.inmo.tgbotapi.types.request.ChatShared import dev.inmo.tgbotapi.types.request.ChatSharedRequest import dev.inmo.tgbotapi.types.request.UsersShared @@ -1184,11 +1183,11 @@ fun BC.onChecklistTasksAdded( * data */ fun BC.onChannelDirectMessagesConfigurationChanged( - initialFilter: SimpleFilter>? = null, - subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = MessageFilterByChat, - markerFactory: MarkerFactory, Any>? = ByChatMessageMarkerFactory, - additionalSubcontextInitialAction: CustomBehaviourContextAndTwoTypesReceiver>? = null, - scenarioReceiver: CustomBehaviourContextAndTypeReceiver> + initialFilter: SimpleFilter>? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = MessageFilterByChat, + markerFactory: MarkerFactory, Any>? = ByChatMessageMarkerFactory, + additionalSubcontextInitialAction: CustomBehaviourContextAndTwoTypesReceiver>? = null, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onEventWithCustomChatEventMessage(initialFilter, subcontextUpdatesFilter, markerFactory, additionalSubcontextInitialAction, scenarioReceiver) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/abstracts/OptionallyChannelDirectMessageThreadRequest.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/abstracts/OptionallyChannelDirectMessageThreadRequest.kt new file mode 100644 index 0000000000..311f2cfddb --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/abstracts/OptionallyChannelDirectMessageThreadRequest.kt @@ -0,0 +1,7 @@ +package dev.inmo.tgbotapi.requests.send.abstracts + +import dev.inmo.tgbotapi.types.DirectMessageThreadId + +interface OptionallyChannelDirectMessageThreadRequest { + val directMessageThreadId: DirectMessageThreadId? +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/abstracts/SendMessageRequest.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/abstracts/SendMessageRequest.kt index 8b1e4cb8f7..954b5f9acf 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/abstracts/SendMessageRequest.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/abstracts/SendMessageRequest.kt @@ -7,4 +7,5 @@ interface SendMessageRequest : SendChatMessageRequest, DisableNotification, ProtectContent, AllowPaidBroadcast, - OptionallyMessageThreadRequest + OptionallyMessageThreadRequest, + OptionallyChannelDirectMessageThreadRequest diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/payments/SendInvoice.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/payments/SendInvoice.kt index ea3697c4f1..373aa49991 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/payments/SendInvoice.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/payments/SendInvoice.kt @@ -63,6 +63,8 @@ data class SendInvoice( override val priceDependOnShipAddress: Boolean = false, @SerialName(messageThreadIdField) override val threadId: MessageThreadId? = chatId.threadId, + @SerialName(directMessagesTopicIdField) + override val directMessageThreadId: DirectMessageThreadId? = chatId.directMessageThreadId, @SerialName(disableNotificationField) override val disableNotification: Boolean = false, @SerialName(protectContentField) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt index a8b2d49a3c..6f401acee3 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt @@ -36,6 +36,8 @@ sealed interface IdChatIdentifier : ChatIdentifier { get() = null val businessConnectionId: BusinessConnectionId? get() = null + val directMessageThreadId: DirectMessageThreadId? + get() = null companion object { operator fun invoke(chatId: RawChatId, threadId: MessageThreadId? = null, businessConnectionId: BusinessConnectionId? = null) = threadId ?.let { @@ -64,6 +66,18 @@ value class ChatIdWithThreadId(val chatIdWithThreadId: Pair) : IdChatIdentifier { + override val chatId: RawChatId + get() = chatIdWithThreadId.first + override val directMessageThreadId: DirectMessageThreadId + get() = chatIdWithThreadId.second + + constructor(chatId: RawChatId, threadId: DirectMessageThreadId): this(chatId to threadId) +} @Suppress("SERIALIZER_TYPE_INCOMPATIBLE") @Serializable(ChatIdentifierSerializer::class) @JvmInline @@ -85,10 +99,12 @@ val ChatIdentifier.businessConnectionId: BusinessConnectionId? fun IdChatIdentifier.toChatId() = when (this) { is ChatId -> this is ChatIdWithThreadId -> ChatId(chatId) + is ChatIdWithChannelDirectMessageThreadId -> ChatId(chatId) is BusinessChatId -> ChatId(chatId) } fun IdChatIdentifier.toChatWithThreadId(threadId: MessageThreadId) = IdChatIdentifier(chatId, threadId) +fun IdChatIdentifier.toChatIdWithChannelDirectMessageThreadId(threadId: DirectMessageThreadId) = ChatIdWithChannelDirectMessageThreadId(chatId, threadId) fun IdChatIdentifier.toBusinessChatId(businessConnectionId: BusinessConnectionId) = IdChatIdentifier(chatId, businessConnectionId) /** @@ -221,11 +237,20 @@ object FullChatIdentifierSerializer : KSerializer { ) } 3 -> { - val (chatId, _, businessConnectionId) = splitted - BusinessChatId( - chatId.toLongOrNull() ?.let(::RawChatId) ?: return@let null, - businessConnectionId.let(::BusinessConnectionId) - ) + val (chatId, intermediateDelimiter, additionalId) = splitted + val additionalIdAsLong by lazy { + additionalId.toLongOrNull() + } + when { + intermediateDelimiter == "cdm" && additionalIdAsLong != null -> ChatIdWithChannelDirectMessageThreadId( + chatId.toLongOrNull() ?.let(::RawChatId) ?: return@let null, + additionalIdAsLong ?.let(::DirectMessageThreadId) ?: return@let null + ) + else -> BusinessChatId( + chatId.toLongOrNull() ?.let(::RawChatId) ?: return@let null, + additionalId.let(::BusinessConnectionId) + ) + } } else -> null } @@ -239,6 +264,7 @@ object FullChatIdentifierSerializer : KSerializer { is ChatId -> encoder.encodeLong(value.chatId.long) is ChatIdWithThreadId -> encoder.encodeString("${value.chatId}/${value.threadId}") is BusinessChatId -> encoder.encodeString("${value.chatId}//${value.businessConnectionId}") + is ChatIdWithChannelDirectMessageThreadId -> encoder.encodeString("${value.chatId}/cdm/${value.directMessageThreadId}") is Username -> encoder.encodeString(value.full) } } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt index ec9e23ce42..37466e9b38 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt @@ -141,6 +141,7 @@ const val giveawayMessageIdField = "giveaway_message_id" const val messageIdsField = "message_ids" const val actorChatField = "actor_chat" const val messageThreadIdField = "message_thread_id" +const val directMessagesTopicIdField = "direct_messages_topic_id" const val mediaGroupIdField = "media_group_id" const val updateIdField = "update_id" const val fromChatIdField = "from_chat_id" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/DirectMessagePriceChanged.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/DirectMessagePriceChanged.kt index ebcb8eb5fb..06b26f2d11 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/DirectMessagePriceChanged.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/DirectMessagePriceChanged.kt @@ -8,33 +8,33 @@ import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder @Suppress("SERIALIZER_TYPE_INCOMPATIBLE") -@Serializable(ChannelDirectMessagesConfigurationChanged.Companion::class) -sealed interface ChannelDirectMessagesConfigurationChanged : ChannelEvent { +@Serializable(DirectMessagesConfigurationChanged.Companion::class) +sealed interface DirectMessagesConfigurationChanged : ChannelEvent { val enabled: Boolean val cost: Int? - @Serializable(ChannelDirectMessagesConfigurationChanged.Companion::class) - data object Disabled : ChannelDirectMessagesConfigurationChanged { + @Serializable(DirectMessagesConfigurationChanged.Companion::class) + data object Disabled : DirectMessagesConfigurationChanged { override val enabled: Boolean get() = false override val cost: Int? get() = null } - @Serializable(ChannelDirectMessagesConfigurationChanged.Companion::class) - data object Free : ChannelDirectMessagesConfigurationChanged { + @Serializable(DirectMessagesConfigurationChanged.Companion::class) + data object Free : DirectMessagesConfigurationChanged { override val enabled: Boolean get() = true override val cost: Int get() = 0 } - @Serializable(ChannelDirectMessagesConfigurationChanged.Companion::class) + @Serializable(DirectMessagesConfigurationChanged.Companion::class) data class Paid( override val cost: Int - ) : ChannelDirectMessagesConfigurationChanged { + ) : DirectMessagesConfigurationChanged { override val enabled: Boolean get() = true } - companion object : KSerializer { + companion object : KSerializer { @Serializable private data class RawDirectMessagePriceChanged( val are_direct_messages_enabled: Boolean = false, @@ -45,7 +45,7 @@ sealed interface ChannelDirectMessagesConfigurationChanged : ChannelEvent { override fun serialize( encoder: Encoder, - value: ChannelDirectMessagesConfigurationChanged + value: DirectMessagesConfigurationChanged ) { RawDirectMessagePriceChanged.serializer().serialize( encoder, @@ -56,7 +56,7 @@ sealed interface ChannelDirectMessagesConfigurationChanged : ChannelEvent { ) } - override fun deserialize(decoder: Decoder): ChannelDirectMessagesConfigurationChanged { + override fun deserialize(decoder: Decoder): DirectMessagesConfigurationChanged { val raw = RawDirectMessagePriceChanged.serializer().deserialize(decoder) return when { diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/DirectMessageThreadId.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/DirectMessageThreadId.kt new file mode 100644 index 0000000000..3f595d00fe --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/DirectMessageThreadId.kt @@ -0,0 +1,14 @@ +package dev.inmo.tgbotapi.types + +import kotlinx.serialization.Serializable +import kotlin.jvm.JvmInline + +@Serializable +@JvmInline +value class DirectMessageThreadId( + val long: Long +) { + override fun toString(): String { + return long.toString() + } +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/DirectMessagesTopic.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/DirectMessagesTopic.kt index 0854474457..e74429327d 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/DirectMessagesTopic.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/DirectMessagesTopic.kt @@ -1,7 +1,7 @@ package dev.inmo.tgbotapi.types.chat import dev.inmo.tgbotapi.abstracts.OptionallyWithUser -import dev.inmo.tgbotapi.types.MessageThreadId +import dev.inmo.tgbotapi.types.DirectMessageThreadId import dev.inmo.tgbotapi.types.topicIdField import dev.inmo.tgbotapi.types.userField import kotlinx.serialization.SerialName @@ -10,7 +10,7 @@ import kotlinx.serialization.Serializable @Serializable data class DirectMessagesTopic( @SerialName(topicIdField) - val threadId: MessageThreadId, + val threadId: DirectMessageThreadId, @Suppress("SERIALIZER_TYPE_INCOMPATIBLE") @SerialName(userField) override val user: PreviewUser? = null, 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 8799724cf4..5be514b86b 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 @@ -188,7 +188,7 @@ internal data class RawMessage( private val checklist_tasks_added: ChecklistTasksAdded? = null, // Channel direct messages - private val direct_message_price_changed: ChannelDirectMessagesConfigurationChanged? = null, + private val direct_message_price_changed: DirectMessagesConfigurationChanged? = null, // private val suggested_post_approved: SuggestedPostApproved? = null, diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCastsNew.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCastsNew.kt index 344b748b70..0412d8ca63 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCastsNew.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCastsNew.kt @@ -21,7 +21,7 @@ import dev.inmo.tgbotapi.requests.stickers.InputSticker import dev.inmo.tgbotapi.types.BackgroundFill import dev.inmo.tgbotapi.types.BackgroundType import dev.inmo.tgbotapi.types.BusinessChatId -import dev.inmo.tgbotapi.types.ChannelDirectMessagesConfigurationChanged +import dev.inmo.tgbotapi.types.DirectMessagesConfigurationChanged import dev.inmo.tgbotapi.types.ChatId import dev.inmo.tgbotapi.types.ChatIdWithThreadId import dev.inmo.tgbotapi.types.ChatIdentifier @@ -2292,29 +2292,29 @@ public inline fun TelegramMedia.withCustomizableCaptionTelegramMediaOrThrow(): W public inline fun TelegramMedia.ifWithCustomizableCaptionTelegramMedia(block: (WithCustomizableCaptionTelegramMedia) -> T): T? = withCustomizableCaptionTelegramMediaOrNull() ?.let(block) -public inline fun ChatEvent.channelDirectMessagesConfigurationChangedOrNull(): ChannelDirectMessagesConfigurationChanged? = this as? dev.inmo.tgbotapi.types.ChannelDirectMessagesConfigurationChanged +public inline fun ChatEvent.channelDirectMessagesConfigurationChangedOrNull(): DirectMessagesConfigurationChanged? = this as? dev.inmo.tgbotapi.types.DirectMessagesConfigurationChanged -public inline fun ChatEvent.channelDirectMessagesConfigurationChangedOrThrow(): ChannelDirectMessagesConfigurationChanged = this as dev.inmo.tgbotapi.types.ChannelDirectMessagesConfigurationChanged +public inline fun ChatEvent.channelDirectMessagesConfigurationChangedOrThrow(): DirectMessagesConfigurationChanged = this as dev.inmo.tgbotapi.types.DirectMessagesConfigurationChanged -public inline fun ChatEvent.ifChannelDirectMessagesConfigurationChanged(block: (ChannelDirectMessagesConfigurationChanged) -> T): T? = channelDirectMessagesConfigurationChangedOrNull() ?.let(block) +public inline fun ChatEvent.ifChannelDirectMessagesConfigurationChanged(block: (DirectMessagesConfigurationChanged) -> T): T? = channelDirectMessagesConfigurationChangedOrNull() ?.let(block) -public inline fun ChatEvent.channelDirectMessagesConfigurationChangedDisabledOrNull(): ChannelDirectMessagesConfigurationChanged.Disabled? = this as? dev.inmo.tgbotapi.types.ChannelDirectMessagesConfigurationChanged.Disabled +public inline fun ChatEvent.channelDirectMessagesConfigurationChangedDisabledOrNull(): DirectMessagesConfigurationChanged.Disabled? = this as? dev.inmo.tgbotapi.types.DirectMessagesConfigurationChanged.Disabled -public inline fun ChatEvent.channelDirectMessagesConfigurationChangedDisabledOrThrow(): ChannelDirectMessagesConfigurationChanged.Disabled = this as dev.inmo.tgbotapi.types.ChannelDirectMessagesConfigurationChanged.Disabled +public inline fun ChatEvent.channelDirectMessagesConfigurationChangedDisabledOrThrow(): DirectMessagesConfigurationChanged.Disabled = this as dev.inmo.tgbotapi.types.DirectMessagesConfigurationChanged.Disabled -public inline fun ChatEvent.ifChannelDirectMessagesConfigurationChangedDisabled(block: (ChannelDirectMessagesConfigurationChanged.Disabled) -> T): T? = channelDirectMessagesConfigurationChangedDisabledOrNull() ?.let(block) +public inline fun ChatEvent.ifChannelDirectMessagesConfigurationChangedDisabled(block: (DirectMessagesConfigurationChanged.Disabled) -> T): T? = channelDirectMessagesConfigurationChangedDisabledOrNull() ?.let(block) -public inline fun ChatEvent.channelDirectMessagesConfigurationChangedFreeOrNull(): ChannelDirectMessagesConfigurationChanged.Free? = this as? dev.inmo.tgbotapi.types.ChannelDirectMessagesConfigurationChanged.Free +public inline fun ChatEvent.channelDirectMessagesConfigurationChangedFreeOrNull(): DirectMessagesConfigurationChanged.Free? = this as? dev.inmo.tgbotapi.types.DirectMessagesConfigurationChanged.Free -public inline fun ChatEvent.channelDirectMessagesConfigurationChangedFreeOrThrow(): ChannelDirectMessagesConfigurationChanged.Free = this as dev.inmo.tgbotapi.types.ChannelDirectMessagesConfigurationChanged.Free +public inline fun ChatEvent.channelDirectMessagesConfigurationChangedFreeOrThrow(): DirectMessagesConfigurationChanged.Free = this as dev.inmo.tgbotapi.types.DirectMessagesConfigurationChanged.Free -public inline fun ChatEvent.ifChannelDirectMessagesConfigurationChangedFree(block: (ChannelDirectMessagesConfigurationChanged.Free) -> T): T? = channelDirectMessagesConfigurationChangedFreeOrNull() ?.let(block) +public inline fun ChatEvent.ifChannelDirectMessagesConfigurationChangedFree(block: (DirectMessagesConfigurationChanged.Free) -> T): T? = channelDirectMessagesConfigurationChangedFreeOrNull() ?.let(block) -public inline fun ChatEvent.channelDirectMessagesConfigurationChangedPaidOrNull(): ChannelDirectMessagesConfigurationChanged.Paid? = this as? dev.inmo.tgbotapi.types.ChannelDirectMessagesConfigurationChanged.Paid +public inline fun ChatEvent.channelDirectMessagesConfigurationChangedPaidOrNull(): DirectMessagesConfigurationChanged.Paid? = this as? dev.inmo.tgbotapi.types.DirectMessagesConfigurationChanged.Paid -public inline fun ChatEvent.channelDirectMessagesConfigurationChangedPaidOrThrow(): ChannelDirectMessagesConfigurationChanged.Paid = this as dev.inmo.tgbotapi.types.ChannelDirectMessagesConfigurationChanged.Paid +public inline fun ChatEvent.channelDirectMessagesConfigurationChangedPaidOrThrow(): DirectMessagesConfigurationChanged.Paid = this as dev.inmo.tgbotapi.types.DirectMessagesConfigurationChanged.Paid -public inline fun ChatEvent.ifChannelDirectMessagesConfigurationChangedPaid(block: (ChannelDirectMessagesConfigurationChanged.Paid) -> T): T? = channelDirectMessagesConfigurationChangedPaidOrNull() ?.let(block) +public inline fun ChatEvent.ifChannelDirectMessagesConfigurationChangedPaid(block: (DirectMessagesConfigurationChanged.Paid) -> T): T? = channelDirectMessagesConfigurationChangedPaidOrNull() ?.let(block) public inline fun ChatEvent.paidMessagePriceChangedOrNull(): PaidMessagePriceChanged? = this as? dev.inmo.tgbotapi.types.PaidMessagePriceChanged