diff --git a/CHANGELOG.md b/CHANGELOG.md index fded36b8c7..ecff173f4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,8 @@ * (`Communities`) Added `CommunityId` value class and `Community` type (`id`/`name`) * (`Communities`) Added `CommunityChatAdded` (`community`) and `CommunityChatRemoved` (fieldless) chat events (`CommonEvent`); `RawMessage` parses `community_chat_added`/`community_chat_removed` * (`Communities`) Added `community` field to `ExtendedChat` (`ChatFullInfo.community`), parsed for `ExtendedChannelChatImpl`, `ExtendedGroupChatImpl`, `ExtendedSupergroupChatImpl`, `ExtendedForumChatImpl`, `ExtendedChannelDirectMessagesChatImpl` and `ExtendedBot` + * (`Bot Subscriptions`) Added `BotSubscriptionUpdated` (`user`, `invoicePayload`, `state`) and `BotSubscriptionUpdatedUpdate`; `state` is modeled as the typed sealed `BotSubscriptionUpdated.State` (`Canceled`/`Active`/`Failed`, with an `Unknown` fallback), mirroring `TransactionType` + * (`Bot Subscriptions`) `RawUpdate` parses the new `subscription` field; added `UPDATE_SUBSCRIPTION` to `ALL_UPDATES_LIST_WITHOUT_REACTIONS`; `FlowsUpdatesFilter` gained `botSubscriptionUpdatedUpdatesFlow` * `API`: * (`Ephemeral Messages`) Threaded `receiverUserId`/`callbackQueryId` through the `sendXxx`/`send`/`reply`/`replyWithXxx` extensions for the 13 ephemeral-capable senders (`send/Sends.kt`, `send/Replies.kt`, `send/RepliesWithChatsAndMessages.kt` and their per-type extension files); `reply(to = ...)` now automatically sends an ephemeral reply when `to` is itself ephemeral (see Breaking changes) * (`Ephemeral Messages`) Added `editEphemeralMessageText`/`editEphemeralMessageMedia`/`editEphemeralMessageCaption`/`editEphemeralMessageReplyMarkup` and `deleteEphemeralMessage` `TelegramBot` extensions (the latter also accepts a `PossiblyEphemeralMessage` directly) @@ -34,6 +36,11 @@ * `BehaviourBuilder`: * (`Communities`) Added `onCommunityChatAdded`/`onCommunityChatRemoved` triggers * (`Communities`) Added `waitCommunityChatAdded`/`waitCommunityChatRemoved` and `waitCommunityChatAddedEventsMessages`/`waitCommunityChatRemovedEventsMessages` expectations + * (`Bot Subscriptions`) Added `onBotSubscriptionUpdated` trigger, `waitBotSubscriptionUpdated` expectation and `ByUserBotSubscriptionUpdatedMarkerFactory` +* `Utils`: + * (`Bot Subscriptions`) Added class casts for `BotSubscriptionUpdatedUpdate` (`whenBotSubscriptionUpdatedUpdate`/`asBotSubscriptionUpdatedUpdate`/`requireBotSubscriptionUpdatedUpdate`); regenerated class casts extensions (`botSubscriptionUpdatedUpdateOrNull`/`OrThrow`, `botSubscriptionUpdatedOrNull`/`OrThrow`) +* `WebApps`: + * Telegram hardened Mini App method-origin security, auto-enabling for all Mini Apps on July 20, 2026; no library change required ## 35.1.0 diff --git a/tgbotapi.behaviour_builder.fsm/api/tgbotapi.behaviour_builder.fsm.api b/tgbotapi.behaviour_builder.fsm/api/tgbotapi.behaviour_builder.fsm.api index 93f344fc8f..ced2ba176c 100644 --- a/tgbotapi.behaviour_builder.fsm/api/tgbotapi.behaviour_builder.fsm.api +++ b/tgbotapi.behaviour_builder.fsm/api/tgbotapi.behaviour_builder.fsm.api @@ -83,6 +83,7 @@ public final class dev/inmo/tgbotapi/extensions/behaviour_builder/DefaultBehavio public fun getAllowedUpdates ()Ljava/util/List; public fun getAsUpdateReceiver ()Lkotlin/jvm/functions/Function2; public fun getBot ()Ldev/inmo/tgbotapi/bot/RequestsExecutor; + public fun getBotSubscriptionUpdatedUpdatesFlow ()Lkotlinx/coroutines/flow/Flow; public fun getBusinessConnectionUpdatesFlow ()Lkotlinx/coroutines/flow/Flow; public fun getBusinessMessageUpdatesFlow ()Lkotlinx/coroutines/flow/Flow; public fun getCallbackQueriesFlow ()Lkotlinx/coroutines/flow/Flow; diff --git a/tgbotapi.behaviour_builder/api/tgbotapi.behaviour_builder.api b/tgbotapi.behaviour_builder/api/tgbotapi.behaviour_builder.api index 9b560af6cf..4c31b19d6b 100644 --- a/tgbotapi.behaviour_builder/api/tgbotapi.behaviour_builder.api +++ b/tgbotapi.behaviour_builder/api/tgbotapi.behaviour_builder.api @@ -166,6 +166,11 @@ public final class dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/B public static synthetic fun expectOne$default (Ldev/inmo/tgbotapi/updateshandlers/FlowsUpdatesFilter;Ldev/inmo/tgbotapi/bot/RequestsExecutor;Ldev/inmo/tgbotapi/requests/abstracts/Request;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; } +public final class dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitBotSubscriptionUpdatedKt { + public static final fun waitBotSubscriptionUpdated (Ldev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext;Ldev/inmo/tgbotapi/requests/abstracts/Request;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; + public static synthetic fun waitBotSubscriptionUpdated$default (Ldev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext;Ldev/inmo/tgbotapi/requests/abstracts/Request;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; +} + public final class dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitBusinessConnectionKt { public static final fun waitBusinessConnection (Ldev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext;Ldev/inmo/tgbotapi/requests/abstracts/Request;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; public static synthetic fun waitBusinessConnection$default (Ldev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext;Ldev/inmo/tgbotapi/requests/abstracts/Request;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; @@ -1032,6 +1037,11 @@ public final class dev/inmo/tgbotapi/extensions/behaviour_builder/filters/Messag public static final fun getMessageFilterForums ()Ldev/inmo/tgbotapi/extensions/behaviour_builder/utils/SimpleFilter; } +public final class dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/BotSubscriptionUpdatedTriggersKt { + public static final fun onBotSubscriptionUpdated (Ldev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext;Ldev/inmo/tgbotapi/extensions/behaviour_builder/utils/SimpleFilter;Lkotlin/jvm/functions/Function4;Ldev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/MarkerFactory;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/Job; + public static synthetic fun onBotSubscriptionUpdated$default (Ldev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext;Ldev/inmo/tgbotapi/extensions/behaviour_builder/utils/SimpleFilter;Lkotlin/jvm/functions/Function4;Ldev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/MarkerFactory;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lkotlinx/coroutines/Job; +} + public final class dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/BusinessConnectionTriggersKt { public static final fun onBusinessConnection (Ldev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext;Ldev/inmo/tgbotapi/extensions/behaviour_builder/utils/SimpleFilter;Lkotlin/jvm/functions/Function4;Ldev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/MarkerFactory;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/Job; public static synthetic fun onBusinessConnection$default (Ldev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext;Ldev/inmo/tgbotapi/extensions/behaviour_builder/utils/SimpleFilter;Lkotlin/jvm/functions/Function4;Ldev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/MarkerFactory;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lkotlinx/coroutines/Job; @@ -1882,6 +1892,12 @@ public final class dev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_f public fun invoke-ErVIubg (Ldev/inmo/tgbotapi/types/polls/Poll;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } +public final class dev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/ByUserBotSubscriptionUpdatedMarkerFactory : dev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/MarkerFactory { + public static final field INSTANCE Ldev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/ByUserBotSubscriptionUpdatedMarkerFactory; + public fun invoke (Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public synthetic fun invoke (Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + public final class dev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/ByUserBusinessConnectionUpdatedMarkerFactory : dev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/MarkerFactory { public static final field INSTANCE Ldev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/ByUserBusinessConnectionUpdatedMarkerFactory; public fun invoke (Ldev/inmo/tgbotapi/types/business_connection/BusinessConnection;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitBotSubscriptionUpdated.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitBotSubscriptionUpdated.kt new file mode 100644 index 0000000000..67400d58c3 --- /dev/null +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitBotSubscriptionUpdated.kt @@ -0,0 +1,17 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations + +import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.utils.botSubscriptionUpdatedUpdateOrNull +import dev.inmo.tgbotapi.requests.abstracts.Request +import dev.inmo.tgbotapi.types.payments.BotSubscriptionUpdated +import kotlinx.coroutines.flow.Flow + +fun BehaviourContext.waitBotSubscriptionUpdated( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( + initRequest, + errorFactory +) { + (it.botSubscriptionUpdatedUpdateOrNull() ?.data).let(::listOfNotNull) +} diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/BotSubscriptionUpdatedTriggers.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/BotSubscriptionUpdatedTriggers.kt new file mode 100644 index 0000000000..6e8fcaad47 --- /dev/null +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/BotSubscriptionUpdatedTriggers.kt @@ -0,0 +1,34 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling + +import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.behaviour_builder.CustomBehaviourContextAndTwoTypesReceiver +import dev.inmo.tgbotapi.extensions.behaviour_builder.CustomBehaviourContextAndTypeReceiver +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByUserBotSubscriptionUpdatedMarkerFactory +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory +import dev.inmo.tgbotapi.extensions.utils.botSubscriptionUpdatedUpdateOrNull +import dev.inmo.tgbotapi.types.payments.BotSubscriptionUpdated +import dev.inmo.tgbotapi.types.update.abstracts.Update + +/** + * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call + * @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example, + * this filter will be used if you will call [dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitContentMessage]. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTwoTypesReceiver] function to create your own. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus] or [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times] + * to combinate several filters + * @param [markerFactory] **Pass null to handle requests fully parallel**. Will be used to identify different "stream". + * [scenarioReceiver] will be called synchronously in one "stream". Output of [markerFactory] will be used as a key for + * "stream" + * @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that + * data + */ +fun BC.onBotSubscriptionUpdated( + initialFilter: SimpleFilter? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver? = null, + markerFactory: MarkerFactory? = ByUserBotSubscriptionUpdatedMarkerFactory, + additionalSubcontextInitialAction: CustomBehaviourContextAndTwoTypesReceiver? = null, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver +) = on(markerFactory, initialFilter, subcontextUpdatesFilter, additionalSubcontextInitialAction, scenarioReceiver) { + (it.botSubscriptionUpdatedUpdateOrNull() ?.data) ?.let(::listOfNotNull) +} diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/ByUserBotSubscriptionUpdatedMarkerFactory.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/ByUserBotSubscriptionUpdatedMarkerFactory.kt new file mode 100644 index 0000000000..a059ecc3b3 --- /dev/null +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/marker_factories/ByUserBotSubscriptionUpdatedMarkerFactory.kt @@ -0,0 +1,7 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories + +import dev.inmo.tgbotapi.types.payments.BotSubscriptionUpdated + +object ByUserBotSubscriptionUpdatedMarkerFactory : MarkerFactory { + override suspend fun invoke(data: BotSubscriptionUpdated) = data.user +} diff --git a/tgbotapi.core/api/tgbotapi.core.api b/tgbotapi.core/api/tgbotapi.core.api index 5821246b09..9f0e5f53cc 100644 --- a/tgbotapi.core/api/tgbotapi.core.api +++ b/tgbotapi.core/api/tgbotapi.core.api @@ -15851,6 +15851,7 @@ public final class dev/inmo/tgbotapi/types/UpdateTypesKt { public static final field UPDATE_PURCHASED_PAID_MEDIA Ljava/lang/String; public static final field UPDATE_REMOVE_CHAT_BOOST Ljava/lang/String; public static final field UPDATE_SHIPPING_QUERY Ljava/lang/String; + public static final field UPDATE_SUBSCRIPTION Ljava/lang/String; public static final fun getALL_UPDATES_LIST ()Ljava/util/List; public static final fun getALL_UPDATES_LIST_WITHOUT_REACTIONS ()Ljava/util/List; } @@ -32796,6 +32797,103 @@ public final class dev/inmo/tgbotapi/types/payments/AffiliateInfo$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated : dev/inmo/tgbotapi/abstracts/WithUser { + public static final field Companion Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$Companion; + public fun (Ldev/inmo/tgbotapi/types/chat/User;Ljava/lang/String;Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State;)V + public final fun component1 ()Ldev/inmo/tgbotapi/types/chat/User; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State; + public final fun copy (Ldev/inmo/tgbotapi/types/chat/User;Ljava/lang/String;Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State;)Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated; + public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated;Ldev/inmo/tgbotapi/types/chat/User;Ljava/lang/String;Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated; + public fun equals (Ljava/lang/Object;)Z + public final fun getInvoicePayload ()Ljava/lang/String; + public final fun getState ()Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State; + public fun getUser ()Ldev/inmo/tgbotapi/types/chat/User; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State { + public static final field Companion Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Companion; + public abstract fun getName ()Ljava/lang/String; +} + +public final class dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Active : dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State { + public static final field INSTANCE Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Active; + public fun equals (Ljava/lang/Object;)Z + public fun getName ()Ljava/lang/String; + public fun hashCode ()I + public final fun serializer ()Lkotlinx/serialization/KSerializer; + public fun toString ()Ljava/lang/String; +} + +public final class dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Canceled : dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State { + public static final field INSTANCE Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Canceled; + public fun equals (Ljava/lang/Object;)Z + public fun getName ()Ljava/lang/String; + public fun hashCode ()I + public final fun serializer ()Lkotlinx/serialization/KSerializer; + public fun toString ()Ljava/lang/String; +} + +public final class dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Failed : dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State { + public static final field INSTANCE Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Failed; + public fun equals (Ljava/lang/Object;)Z + public fun getName ()Ljava/lang/String; + public fun hashCode ()I + public final fun serializer ()Lkotlinx/serialization/KSerializer; + public fun toString ()Ljava/lang/String; +} + +public final class dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Unknown : dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State { + public static final field Companion Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Unknown$Companion; + public static final synthetic fun box-impl (Ljava/lang/String;)Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Unknown; + public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z + public fun getName ()Ljava/lang/String; + public fun hashCode ()I + public static fun hashCode-impl (Ljava/lang/String;)I + public fun toString ()Ljava/lang/String; + public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Ljava/lang/String; +} + +public final synthetic class dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Unknown$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Unknown$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun deserialize-56ZYDkg (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/String; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public final fun serialize-OHdutMU (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/String;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated$State$Unknown$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class dev/inmo/tgbotapi/types/payments/CurrenciedKt { public static final fun javaCurrency (Ldev/inmo/tgbotapi/types/payments/abstracts/Currencied;)Ljava/util/Currency; } @@ -38618,6 +38716,36 @@ public final class dev/inmo/tgbotapi/types/stories/StoryAreaType$Weather$Compani public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class dev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate : dev/inmo/tgbotapi/types/update/abstracts/Update { + public static final field Companion Ldev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate$Companion; + public synthetic fun (JLdev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1-4k5XoGU ()J + public final fun component2 ()Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated; + public final fun copy-VElHuNg (JLdev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated;)Ldev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate; + public static synthetic fun copy-VElHuNg$default (Ldev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate;JLdev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate; + public fun equals (Ljava/lang/Object;)Z + public fun getData ()Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated; + public synthetic fun getData ()Ljava/lang/Object; + public fun getUpdateId-4k5XoGU ()J + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class dev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Ldev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ldev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Ldev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class dev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class dev/inmo/tgbotapi/types/update/BusinessConnectionUpdate : dev/inmo/tgbotapi/types/update/abstracts/Update { public static final field Companion Ldev/inmo/tgbotapi/types/update/BusinessConnectionUpdate$Companion; public synthetic fun (JLdev/inmo/tgbotapi/types/business_connection/BusinessConnection;Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -39245,6 +39373,7 @@ public final class dev/inmo/tgbotapi/types/webapps/query/SentWebAppMessage$Compa public abstract class dev/inmo/tgbotapi/updateshandlers/AbstractFlowsUpdatesFilter : dev/inmo/tgbotapi/updateshandlers/FlowsUpdatesFilter { public fun ()V public fun getAllowedUpdates ()Ljava/util/List; + public fun getBotSubscriptionUpdatedUpdatesFlow ()Lkotlinx/coroutines/flow/Flow; public fun getBusinessConnectionUpdatesFlow ()Lkotlinx/coroutines/flow/Flow; public fun getBusinessMessageUpdatesFlow ()Lkotlinx/coroutines/flow/Flow; public fun getCallbackQueriesFlow ()Lkotlinx/coroutines/flow/Flow; @@ -39288,6 +39417,7 @@ public final class dev/inmo/tgbotapi/updateshandlers/DefaultFlowsUpdatesFilter : public abstract interface class dev/inmo/tgbotapi/updateshandlers/FlowsUpdatesFilter : dev/inmo/tgbotapi/updateshandlers/UpdatesFilter { public abstract fun getAllUpdatesFlow ()Lkotlinx/coroutines/flow/Flow; public fun getAllowedUpdates ()Ljava/util/List; + public abstract fun getBotSubscriptionUpdatedUpdatesFlow ()Lkotlinx/coroutines/flow/Flow; public abstract fun getBusinessConnectionUpdatesFlow ()Lkotlinx/coroutines/flow/Flow; public abstract fun getBusinessMessageUpdatesFlow ()Lkotlinx/coroutines/flow/Flow; public abstract fun getCallbackQueriesFlow ()Lkotlinx/coroutines/flow/Flow; diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/UpdateTypes.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/UpdateTypes.kt index 8a0041a742..7107d00d3d 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/UpdateTypes.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/UpdateTypes.kt @@ -28,6 +28,8 @@ const val UPDATE_GUEST_MESSAGE = "guest_message" const val UPDATE_MANAGED_BOT = "managed_bot" +const val UPDATE_SUBSCRIPTION = "subscription" + val ALL_UPDATES_LIST_WITHOUT_REACTIONS = listOf( UPDATE_MESSAGE, UPDATE_EDITED_MESSAGE, @@ -65,6 +67,8 @@ val ALL_UPDATES_LIST_WITHOUT_REACTIONS = listOf( UPDATE_REMOVE_CHAT_BOOST, UPDATE_MANAGED_BOT, + + UPDATE_SUBSCRIPTION, ) val ALL_UPDATES_LIST = ALL_UPDATES_LIST_WITHOUT_REACTIONS + listOf( diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated.kt new file mode 100644 index 0000000000..8d4cf1c0c4 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated.kt @@ -0,0 +1,85 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package dev.inmo.tgbotapi.types.payments + +import dev.inmo.tgbotapi.abstracts.WithUser +import dev.inmo.tgbotapi.types.chat.User +import dev.inmo.tgbotapi.types.invoicePayloadField +import dev.inmo.tgbotapi.types.stateField +import dev.inmo.tgbotapi.types.userField +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlin.jvm.JvmInline + +/** + * Information about changes to a user payment subscription toward the current bot + * + * @param user User who subscribed for payments toward the bot + * @param invoicePayload Bot-specified invoice payload + * @param state New state of the subscription + */ +@Serializable +data class BotSubscriptionUpdated( + @SerialName(userField) + override val user: User, + @SerialName(invoicePayloadField) + val invoicePayload: String, + @SerialName(stateField) + val state: State +) : WithUser { + @Serializable(StateSerializer::class) + sealed interface State { + val name: String + + @Serializable + data object Canceled : State { + @EncodeDefault + override val name = "canceled" + } + + @Serializable + data object Active : State { + @EncodeDefault + override val name = "active" + } + + @Serializable + data object Failed : State { + @EncodeDefault + override val name = "failed" + } + + @Serializable + @JvmInline + value class Unknown(override val name: String) : State + } + + private object StateSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( + serialName = "dev.inmo.tgbotapi.types.payments.BotSubscriptionUpdated.State", + kind = PrimitiveKind.STRING + ) + + override fun deserialize(decoder: Decoder): State { + val value = decoder.decodeString() + return when (value) { + State.Canceled.name -> State.Canceled + State.Active.name -> State.Active + State.Failed.name -> State.Failed + else -> State.Unknown(value) + } + } + + override fun serialize(encoder: Encoder, value: State) { + encoder.encodeString(value.name) + } + } +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate.kt new file mode 100644 index 0000000000..643a92d308 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate.kt @@ -0,0 +1,12 @@ +package dev.inmo.tgbotapi.types.update + +import dev.inmo.tgbotapi.types.UpdateId +import dev.inmo.tgbotapi.types.payments.BotSubscriptionUpdated +import dev.inmo.tgbotapi.types.update.abstracts.Update +import kotlinx.serialization.Serializable + +@Serializable +data class BotSubscriptionUpdatedUpdate( + override val updateId: UpdateId, + override val data: BotSubscriptionUpdated +) : Update diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/RawUpdate.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/RawUpdate.kt index e39648909d..1c6d6643a5 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/RawUpdate.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/RawUpdate.kt @@ -15,6 +15,7 @@ import dev.inmo.tgbotapi.types.chat.member.ChatMemberUpdated import dev.inmo.tgbotapi.types.managed_bots.ManagedBotUpdated import dev.inmo.tgbotapi.types.message.abstracts.* import dev.inmo.tgbotapi.types.message.payments.PaidMediaPurchased +import dev.inmo.tgbotapi.types.payments.BotSubscriptionUpdated import dev.inmo.tgbotapi.types.payments.PreCheckoutQuery import dev.inmo.tgbotapi.types.payments.ShippingQuery import dev.inmo.tgbotapi.types.polls.Poll @@ -69,6 +70,7 @@ internal data class RawUpdate constructor( private val guest_message: RequestGuestContentMessage<*>? = null, private val purchased_paid_media: PaidMediaPurchased? = null, private val managed_bot: ManagedBotUpdated? = null, + private val subscription: BotSubscriptionUpdated? = null, ) { @Transient private var initedUpdate: Update? = null @@ -107,6 +109,7 @@ internal data class RawUpdate constructor( guest_message != null -> GuestMessageUpdate(updateId, guest_message) purchased_paid_media != null -> PaidMediaPurchasedUpdate(updateId, purchased_paid_media) managed_bot != null -> ManagedBotUpdate(updateId, managed_bot) + subscription != null -> BotSubscriptionUpdatedUpdate(updateId, subscription) else -> UnknownUpdate( updateId, raw diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/updateshandlers/FlowsUpdatesFilter.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/updateshandlers/FlowsUpdatesFilter.kt index f62d0e692d..ab3fab99c6 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/updateshandlers/FlowsUpdatesFilter.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/updateshandlers/FlowsUpdatesFilter.kt @@ -47,6 +47,7 @@ interface FlowsUpdatesFilter : UpdatesFilter { val guestMessageUpdatesFlow: Flow val paidMediaPurchasedUpdatesFlow: Flow val managedBotUpdatesFlow: Flow + val botSubscriptionUpdatedUpdatesFlow: Flow val unknownUpdatesFlow: Flow } @@ -77,6 +78,7 @@ abstract class AbstractFlowsUpdatesFilter : FlowsUpdatesFilter { override val guestMessageUpdatesFlow: Flow by lazy { allUpdatesFlow.filterIsInstance() } override val paidMediaPurchasedUpdatesFlow: Flow by lazy { allUpdatesFlow.filterIsInstance() } override val managedBotUpdatesFlow: Flow by lazy { allUpdatesFlow.filterIsInstance() } + override val botSubscriptionUpdatedUpdatesFlow: Flow by lazy { allUpdatesFlow.filterIsInstance() } } /** diff --git a/tgbotapi.utils/api/tgbotapi.utils.api b/tgbotapi.utils/api/tgbotapi.utils.api index eb406a2c83..f837185a28 100644 --- a/tgbotapi.utils/api/tgbotapi.utils.api +++ b/tgbotapi.utils/api/tgbotapi.utils.api @@ -30,6 +30,7 @@ public final class dev/inmo/tgbotapi/extensions/utils/ClassCastsKt { public static final fun asBoldTextSource (Ldev/inmo/tgbotapi/types/message/textsources/TextSource;)Ldev/inmo/tgbotapi/types/message/textsources/BoldTextSource; public static final fun asBot (Ldev/inmo/tgbotapi/types/chat/Chat;)Ldev/inmo/tgbotapi/types/chat/Bot; public static final fun asBotCommandTextSource (Ldev/inmo/tgbotapi/types/message/textsources/TextSource;)Ldev/inmo/tgbotapi/types/message/textsources/BotCommandTextSource; + public static final fun asBotSubscriptionUpdatedUpdate (Ldev/inmo/tgbotapi/types/update/abstracts/Update;)Ldev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate; public static final fun asBowlingDiceAnimationType (Ldev/inmo/tgbotapi/types/dice/DiceAnimationType;)Ldev/inmo/tgbotapi/types/dice/BowlingDiceAnimationType; public static final fun asCallbackDataInlineKeyboardButton (Ldev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton;)Ldev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/CallbackDataInlineKeyboardButton; public static final fun asCallbackGameInlineKeyboardButton (Ldev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton;)Ldev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/CallbackGameInlineKeyboardButton; @@ -376,6 +377,7 @@ public final class dev/inmo/tgbotapi/extensions/utils/ClassCastsKt { public static final fun requireBoldTextSource (Ldev/inmo/tgbotapi/types/message/textsources/TextSource;)Ldev/inmo/tgbotapi/types/message/textsources/BoldTextSource; public static final fun requireBot (Ldev/inmo/tgbotapi/types/chat/Chat;)Ldev/inmo/tgbotapi/types/chat/Bot; public static final fun requireBotCommandTextSource (Ldev/inmo/tgbotapi/types/message/textsources/TextSource;)Ldev/inmo/tgbotapi/types/message/textsources/BotCommandTextSource; + public static final fun requireBotSubscriptionUpdatedUpdate (Ldev/inmo/tgbotapi/types/update/abstracts/Update;)Ldev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate; public static final fun requireBowlingDiceAnimationType (Ldev/inmo/tgbotapi/types/dice/DiceAnimationType;)Ldev/inmo/tgbotapi/types/dice/BowlingDiceAnimationType; public static final fun requireCallbackDataInlineKeyboardButton (Ldev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton;)Ldev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/CallbackDataInlineKeyboardButton; public static final fun requireCallbackGameInlineKeyboardButton (Ldev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton;)Ldev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/CallbackGameInlineKeyboardButton; @@ -722,6 +724,7 @@ public final class dev/inmo/tgbotapi/extensions/utils/ClassCastsKt { public static final fun whenBoldTextSource (Ldev/inmo/tgbotapi/types/message/textsources/TextSource;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun whenBot (Ldev/inmo/tgbotapi/types/chat/Chat;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun whenBotCommandTextSource (Ldev/inmo/tgbotapi/types/message/textsources/TextSource;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static final fun whenBotSubscriptionUpdatedUpdate (Ldev/inmo/tgbotapi/types/update/abstracts/Update;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun whenBowlingDiceAnimationType (Ldev/inmo/tgbotapi/types/dice/DiceAnimationType;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun whenCallbackDataInlineKeyboardButton (Ldev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun whenCallbackGameInlineKeyboardButton (Ldev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; @@ -1132,6 +1135,10 @@ public final class dev/inmo/tgbotapi/extensions/utils/ClassCastsNewKt { public static final fun botOrNull (Ldev/inmo/tgbotapi/types/chat/Chat;)Ldev/inmo/tgbotapi/types/chat/Bot; public static final fun botOrThrow (Ldev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestUsers;)Ldev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestUsers$Bot; public static final fun botOrThrow (Ldev/inmo/tgbotapi/types/chat/Chat;)Ldev/inmo/tgbotapi/types/chat/Bot; + public static final fun botSubscriptionUpdatedOrNull (Ldev/inmo/tgbotapi/abstracts/OptionallyWithUser;)Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated; + public static final fun botSubscriptionUpdatedOrThrow (Ldev/inmo/tgbotapi/abstracts/OptionallyWithUser;)Ldev/inmo/tgbotapi/types/payments/BotSubscriptionUpdated; + public static final fun botSubscriptionUpdatedUpdateOrNull (Ldev/inmo/tgbotapi/types/update/abstracts/Update;)Ldev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate; + public static final fun botSubscriptionUpdatedUpdateOrThrow (Ldev/inmo/tgbotapi/types/update/abstracts/Update;)Ldev/inmo/tgbotapi/types/update/BotSubscriptionUpdatedUpdate; public static final fun bowlingDiceAnimationTypeOrNull (Ldev/inmo/tgbotapi/types/dice/DiceAnimationType;)Ldev/inmo/tgbotapi/types/dice/BowlingDiceAnimationType; public static final fun bowlingDiceAnimationTypeOrThrow (Ldev/inmo/tgbotapi/types/dice/DiceAnimationType;)Ldev/inmo/tgbotapi/types/dice/BowlingDiceAnimationType; public static final fun businessChatIdOrNull (Ldev/inmo/tgbotapi/types/ChatIdentifier;)Lkotlin/Pair; @@ -1635,6 +1642,8 @@ public final class dev/inmo/tgbotapi/extensions/utils/ClassCastsNewKt { public static final fun ifBot (Ldev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestUsers;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun ifBot (Ldev/inmo/tgbotapi/types/chat/Chat;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun ifBotCommandTextSource (Ldev/inmo/tgbotapi/types/message/textsources/TextSource;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static final fun ifBotSubscriptionUpdated (Ldev/inmo/tgbotapi/abstracts/OptionallyWithUser;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static final fun ifBotSubscriptionUpdatedUpdate (Ldev/inmo/tgbotapi/types/update/abstracts/Update;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun ifBowlingDiceAnimationType (Ldev/inmo/tgbotapi/types/dice/DiceAnimationType;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun ifBusinessChat (Ldev/inmo/tgbotapi/types/chat/Chat;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun ifBusinessChatId (Ldev/inmo/tgbotapi/types/ChatIdentifier;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; 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 e7ed834f86..4baa0d8bad 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 @@ -2328,6 +2328,16 @@ inline fun Update.asChatJoinRequestUpdate(): ChatJoinRequestUpdate? = this as? C @PreviewFeature inline fun Update.requireChatJoinRequestUpdate(): ChatJoinRequestUpdate = this as ChatJoinRequestUpdate +@PreviewFeature +inline fun Update.whenBotSubscriptionUpdatedUpdate(block: (BotSubscriptionUpdatedUpdate) -> T) = + asBotSubscriptionUpdatedUpdate()?.let(block) + +@PreviewFeature +inline fun Update.asBotSubscriptionUpdatedUpdate(): BotSubscriptionUpdatedUpdate? = this as? BotSubscriptionUpdatedUpdate + +@PreviewFeature +inline fun Update.requireBotSubscriptionUpdatedUpdate(): BotSubscriptionUpdatedUpdate = this as BotSubscriptionUpdatedUpdate + @PreviewFeature inline fun TelegramMediaFile.whenAnimationFile(block: (AnimationFile) -> T) = asAnimationFile()?.let(block) 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 4521d0c890..2a9ec14e43 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 @@ -521,6 +521,7 @@ import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.EncryptedPassportEle import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.EncryptedPassportElementWithReverseSide import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.EncryptedPassportElementWithSelfie import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.UnknownEncryptedPassportElement +import dev.inmo.tgbotapi.types.payments.BotSubscriptionUpdated import dev.inmo.tgbotapi.types.payments.PreCheckoutQuery import dev.inmo.tgbotapi.types.payments.ShippingQuery import dev.inmo.tgbotapi.types.payments.stars.RevenueWithdrawalState @@ -630,6 +631,7 @@ import dev.inmo.tgbotapi.types.rich.RichTextSuperscript import dev.inmo.tgbotapi.types.rich.RichTextTextMention import dev.inmo.tgbotapi.types.rich.RichTextUnderline import dev.inmo.tgbotapi.types.rich.RichTextUrl +import dev.inmo.tgbotapi.types.update.BotSubscriptionUpdatedUpdate import dev.inmo.tgbotapi.types.update.BusinessConnectionUpdate import dev.inmo.tgbotapi.types.update.BusinessMessageUpdate import dev.inmo.tgbotapi.types.update.CallbackQueryUpdate @@ -4096,6 +4098,12 @@ public inline fun Update.chatMessageReactionsCountUpdatedUpdateOrThrow(): ChatMe public inline fun Update.ifChatMessageReactionsCountUpdatedUpdate(block: (ChatMessageReactionsCountUpdatedUpdate) -> T): T? = chatMessageReactionsCountUpdatedUpdateOrNull() ?.let(block) +public inline fun Update.botSubscriptionUpdatedUpdateOrNull(): BotSubscriptionUpdatedUpdate? = this as? dev.inmo.tgbotapi.types.update.BotSubscriptionUpdatedUpdate + +public inline fun Update.botSubscriptionUpdatedUpdateOrThrow(): BotSubscriptionUpdatedUpdate = this as dev.inmo.tgbotapi.types.update.BotSubscriptionUpdatedUpdate + +public inline fun Update.ifBotSubscriptionUpdatedUpdate(block: (BotSubscriptionUpdatedUpdate) -> T): T? = botSubscriptionUpdatedUpdateOrNull() ?.let(block) + public inline fun Update.chatJoinRequestUpdateOrNull(): ChatJoinRequestUpdate? = this as? dev.inmo.tgbotapi.types.update.ChatJoinRequestUpdate public inline fun Update.chatJoinRequestUpdateOrThrow(): ChatJoinRequestUpdate = this as dev.inmo.tgbotapi.types.update.ChatJoinRequestUpdate @@ -4930,6 +4938,12 @@ public inline fun OptionallyWithUser.shippingQueryOrThrow(): ShippingQuery = thi public inline fun OptionallyWithUser.ifShippingQuery(block: (ShippingQuery) -> T): T? = shippingQueryOrNull() ?.let(block) +public inline fun OptionallyWithUser.botSubscriptionUpdatedOrNull(): BotSubscriptionUpdated? = this as? dev.inmo.tgbotapi.types.payments.BotSubscriptionUpdated + +public inline fun OptionallyWithUser.botSubscriptionUpdatedOrThrow(): BotSubscriptionUpdated = this as dev.inmo.tgbotapi.types.payments.BotSubscriptionUpdated + +public inline fun OptionallyWithUser.ifBotSubscriptionUpdated(block: (BotSubscriptionUpdated) -> T): T? = botSubscriptionUpdatedOrNull() ?.let(block) + public inline fun OptionallyWithUser.chatInviteLinkOrNull(): ChatInviteLink? = this as? dev.inmo.tgbotapi.types.ChatInviteLink public inline fun OptionallyWithUser.chatInviteLinkOrThrow(): ChatInviteLink = this as dev.inmo.tgbotapi.types.ChatInviteLink