From c332413e5aecf104bd5c32c2fcbcf7012caa586b Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Thu, 2 Feb 2023 09:21:57 +0600 Subject: [PATCH 01/19] start 5.0.2 --- CHANGELOG.md | 2 ++ gradle.properties | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f249287e8..52cb4d1fab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # TelegramBotAPI changelog +## 5.0.2 + ## 5.0.1 * `Versions`: diff --git a/gradle.properties b/gradle.properties index 6b365d17b3..d5f1dc3067 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,4 @@ kotlin.incremental=true kotlin.incremental.js=true library_group=dev.inmo -library_version=5.0.1 +library_version=5.0.2 From f083e94c05043186da573ea6b7620265c2c0c6d4 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Thu, 2 Feb 2023 09:24:16 +0600 Subject: [PATCH 02/19] fix in BehaviourContext.onEditedContentMessage --- CHANGELOG.md | 7 +++++-- .../triggers_handling/EditedContentTriggers.kt | 17 +---------------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52cb4d1fab..43f3d00c36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,14 @@ ## 5.0.2 +* `BehaviourBuilder`: + * Fixes in `BehaviourContext.onEditedContentMessage` - now it will trigger callback on channel post edits too + ## 5.0.1 * `Versions`: - * `MicroUtils`: `0.16.4` -> `0.16.6` - * `Ktor`: `2.2.1` -> `2.2.2` + * `MicroUtils`: `0.16.4` -> `0.16.6` + * `Ktor`: `2.2.1` -> `2.2.2` * `Core`: * Fixes in `SendMediaGroup` request * Fixes in `SetChatAdministratorCustomTitle` request (thanks to [@madhead](https://github.com/madhead)) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EditedContentTriggers.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EditedContentTriggers.kt index 0b6337d018..3141a57439 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EditedContentTriggers.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EditedContentTriggers.kt @@ -1,18 +1,3 @@ - - -/** - * @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] 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 - */@file:Suppress("unused", "UNCHECKED_CAST") - package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling import dev.inmo.tgbotapi.extensions.behaviour_builder.* @@ -35,7 +20,7 @@ internal suspend inline fun noinline scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = on(markerFactory, initialFilter, subcontextUpdatesFilter, scenarioReceiver) { when (it) { - is BaseEditMessageUpdate -> (it.editMessageUpdateOrNull() ?.data ?.withContent()) + is BaseEditMessageUpdate -> (it.data.withContent()) else -> null } ?.let(::listOfNotNull) } From a8c4879769b3e5bf422b3d15fe2555538eb0568b Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Thu, 2 Feb 2023 09:25:21 +0600 Subject: [PATCH 03/19] update dependencies --- CHANGELOG.md | 3 +++ gradle/libs.versions.toml | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43f3d00c36..0f7b361ad8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 5.0.2 +* `Versions`: + * `MicroUtils`: `0.16.6` -> `0.16.8` + * `Ktor`: `2.2.2` -> `2.2.3` * `BehaviourBuilder`: * Fixes in `BehaviourContext.onEditedContentMessage` - now it will trigger callback on channel post edits too diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 085f20bd54..56d27ad0d5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,12 +8,12 @@ javax-activation = "1.1.1" korlibs = "3.4.0" uuid = "0.6.0" -ktor = "2.2.2" +ktor = "2.2.3" ksp = "1.7.22-1.0.8" kotlin-poet = "1.12.0" -microutils = "0.16.6" +microutils = "0.16.8-branch_0.16.8-build346" github-release-plugin = "2.4.1" dokka = "1.7.20" From 5667ae8095fec428641569f7d94a14f972fee781 Mon Sep 17 00:00:00 2001 From: madhead Date: Fri, 3 Feb 2023 20:55:48 +0100 Subject: [PATCH 04/19] Added the field `user_chat_id` to the class `ChatJoinRequest`. --- CHANGELOG.md | 4 ++++ .../src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt | 1 + .../kotlin/dev/inmo/tgbotapi/types/chat/ChatJoinRequest.kt | 2 ++ 3 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 454365a007..396f60d8d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## 5.1.0 +* `Core`: + * [Bot API 6.5](https://core.telegram.org/bots/api#february-3-2023) support + * Added the field `user_chat_id` to the class `ChatJoinRequest`. + ## 5.0.1 * `Versions`: 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 8a3d8b8d85..b993b32d8b 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 @@ -375,6 +375,7 @@ const val latitudeField = "latitude" const val longitudeField = "longitude" const val headingField = "heading" const val fromField = "from" +const val userChatIdField = "user_chat_id" const val userField = "user" const val dateField = "date" const val chatField = "chat" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatJoinRequest.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatJoinRequest.kt index 738e95adc6..cad68fefe7 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatJoinRequest.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatJoinRequest.kt @@ -15,6 +15,8 @@ data class ChatJoinRequest( val chat: PublicChat, @SerialName(fromField) override val from: User, + @SerialName(userChatIdField) + val userChatId: Identifier, @SerialName(dateField) val date: TelegramDate, @SerialName(inviteLinkField) From 49851ee3d7edaea9ed4e467c345e311c76aa3887 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 16:22:33 +0600 Subject: [PATCH 05/19] update micro_utils version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 56d27ad0d5..caca9c0f70 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ ktor = "2.2.3" ksp = "1.7.22-1.0.8" kotlin-poet = "1.12.0" -microutils = "0.16.8-branch_0.16.8-build346" +microutils = "0.16.8" github-release-plugin = "2.4.1" dokka = "1.7.20" From 37b5af235a5218089e0f1bd9a34b2b2a341928ac Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 4 Feb 2023 00:55:46 +0600 Subject: [PATCH 06/19] start 5.1.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index d5f1dc3067..5290e27fd1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,4 @@ kotlin.incremental=true kotlin.incremental.js=true library_group=dev.inmo -library_version=5.0.2 +library_version=5.1.0 From db74b55c418ebf7bf54283a531840a49fea2d882 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 4 Feb 2023 00:56:06 +0600 Subject: [PATCH 07/19] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f7b361ad8..422c41c83b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # TelegramBotAPI changelog +## 5.1.0 + ## 5.0.2 * `Versions`: From b59d94d0a934f9fdf2093c461598e9d9cc8a7381 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 4 Feb 2023 00:56:47 +0600 Subject: [PATCH 08/19] Update libs.versions.toml --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index caca9c0f70..faa81a5246 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] -kotlin = "1.7.22" +kotlin = "1.8.10" kotlin-serialization = "1.4.1" kotlin-coroutines = "1.6.4" From 3c48dcb2a6854ef351116f797e36bb2152a7ca11 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 18:26:29 +0600 Subject: [PATCH 09/19] downgrade kotlin --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index faa81a5246..caca9c0f70 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] -kotlin = "1.8.10" +kotlin = "1.7.22" kotlin-serialization = "1.4.1" kotlin-coroutines = "1.6.4" From bdcba202c9dddffebaa3427fe4ddd57f4979e3f2 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 18:32:46 +0600 Subject: [PATCH 10/19] Update ChatJoinRequest.kt --- .../kotlin/dev/inmo/tgbotapi/types/chat/ChatJoinRequest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatJoinRequest.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatJoinRequest.kt index cad68fefe7..90a00b33f7 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatJoinRequest.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatJoinRequest.kt @@ -16,7 +16,7 @@ data class ChatJoinRequest( @SerialName(fromField) override val from: User, @SerialName(userChatIdField) - val userChatId: Identifier, + val userChatId: UserId, @SerialName(dateField) val date: TelegramDate, @SerialName(inviteLinkField) From a39a276299d9170f67d0ac335a8e1f59cfa10499 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 18:34:05 +0600 Subject: [PATCH 11/19] Update libs.versions.toml --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index faa81a5246..caca9c0f70 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] -kotlin = "1.8.10" +kotlin = "1.7.22" kotlin-serialization = "1.4.1" kotlin-coroutines = "1.6.4" From 687f9e95fad2ed3be7270bd9a36845548a6c2581 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 20:46:12 +0600 Subject: [PATCH 12/19] support of user shared/chat shared --- .../expectations/WaitEventAction.kt | 18 +++ .../expectations/WaitEventActionMessages.kt | 38 +++++++ .../triggers_handling/EventTriggers.kt | 65 +++++++++++ .../kotlin/dev/inmo/tgbotapi/types/Common.kt | 13 +++ .../tgbotapi/types/buttons/KeyboardButton.kt | 52 +++++++++ .../buttons/KeyboardButtonRequestChat.kt | 38 +++++++ .../buttons/KeyboardButtonRequestUser.kt | 89 +++++++++++++++ .../reply/ReplyKeyboardButtonsShortcuts.kt | 98 +++++++++++++++++ .../inmo/tgbotapi/types/message/RawMessage.kt | 7 ++ .../inmo/tgbotapi/types/request/ChatShared.kt | 17 +++ .../types/request/ChatSharedRequest.kt | 8 ++ .../inmo/tgbotapi/types/request/RequestId.kt | 10 ++ .../tgbotapi/types/request/RequestResponse.kt | 5 + .../inmo/tgbotapi/types/request/UserShared.kt | 19 ++++ .../types/buttons/ReplyKeyboardBuilder.kt | 104 ++++++++++++++++++ 15 files changed, 581 insertions(+) create mode 100644 tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt create mode 100644 tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestUser.kt create mode 100644 tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/ChatShared.kt create mode 100644 tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/ChatSharedRequest.kt create mode 100644 tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt create mode 100644 tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestResponse.kt create mode 100644 tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/UserShared.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 ec6e5f8572..2fb21d12f3 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 @@ -17,6 +17,9 @@ import dev.inmo.tgbotapi.types.message.ChatEvents.forum.WriteAccessAllowed import dev.inmo.tgbotapi.types.message.ChatEvents.voice.* import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage import dev.inmo.tgbotapi.types.message.payments.SuccessfulPaymentEvent +import dev.inmo.tgbotapi.types.request.ChatShared +import dev.inmo.tgbotapi.types.request.ChatSharedRequest +import dev.inmo.tgbotapi.types.request.UserShared import dev.inmo.tgbotapi.utils.RiskFeature import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage import kotlinx.coroutines.flow.Flow @@ -171,3 +174,18 @@ suspend fun BehaviourContext.waitWriteAccessAllowed( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEvents(initRequest, errorFactory) + +suspend fun BehaviourContext.waitChatSharedRequest( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) + +suspend fun BehaviourContext.waitUserShared( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) + +suspend fun BehaviourContext.waitChatShared( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt index a26a4215ad..9539f3d2fd 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt @@ -9,10 +9,17 @@ import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* import dev.inmo.tgbotapi.types.message.ChatEvents.forum.ForumTopicClosed import dev.inmo.tgbotapi.types.message.ChatEvents.forum.ForumTopicCreated +import dev.inmo.tgbotapi.types.message.ChatEvents.forum.ForumTopicEdited import dev.inmo.tgbotapi.types.message.ChatEvents.forum.ForumTopicReopened +import dev.inmo.tgbotapi.types.message.ChatEvents.forum.GeneralForumTopicHidden +import dev.inmo.tgbotapi.types.message.ChatEvents.forum.GeneralForumTopicUnhidden +import dev.inmo.tgbotapi.types.message.ChatEvents.forum.WriteAccessAllowed import dev.inmo.tgbotapi.types.message.ChatEvents.voice.* import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage import dev.inmo.tgbotapi.types.message.payments.SuccessfulPaymentEvent +import dev.inmo.tgbotapi.types.request.ChatShared +import dev.inmo.tgbotapi.types.request.ChatSharedRequest +import dev.inmo.tgbotapi.types.request.UserShared import dev.inmo.tgbotapi.utils.RiskFeature import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage import kotlinx.coroutines.flow.Flow @@ -148,3 +155,34 @@ suspend fun BehaviourContext.waitForumTopicReopenedEventsMessages( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitForumTopicEditedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitGeneralForumTopicHiddenEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitGeneralForumTopicUnhiddenEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitWriteAccessAllowedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) + +suspend fun BehaviourContext.waitChatSharedRequestEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) + +suspend fun BehaviourContext.waitUserSharedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) + +suspend fun BehaviourContext.waitChatSharedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) 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 06662e8a59..645ac7effb 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 @@ -23,6 +23,9 @@ import dev.inmo.tgbotapi.types.message.PrivateEventMessage import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage import dev.inmo.tgbotapi.types.message.abstracts.SupergroupEventMessage import dev.inmo.tgbotapi.types.message.payments.SuccessfulPaymentEvent +import dev.inmo.tgbotapi.types.request.ChatShared +import dev.inmo.tgbotapi.types.request.ChatSharedRequest +import dev.inmo.tgbotapi.types.request.UserShared import dev.inmo.tgbotapi.types.update.abstracts.Update internal suspend inline fun BC.onEvent( @@ -657,3 +660,65 @@ suspend fun BC.onWriteAccessAllowed( markerFactory: MarkerFactory, Any> = ByChatMessageMarkerFactory, scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onEventWithCustomChatEventMessage(initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) + + + +/** + * @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 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 + */ +suspend fun BC.onChatSharedRequest( + initialFilter: SimpleFilter>? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = MessageFilterByChat, + markerFactory: MarkerFactory, Any> = ByChatMessageMarkerFactory, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver> +) = onEventWithCustomChatEventMessage(initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) + + +/** + * @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 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 + */ +suspend fun BC.onUserShared( + initialFilter: SimpleFilter>? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = MessageFilterByChat, + markerFactory: MarkerFactory, Any> = ByChatMessageMarkerFactory, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver> +) = onEventWithCustomChatEventMessage(initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) + + + +/** + * @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 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 + */ +suspend fun BC.onChatShared( + initialFilter: SimpleFilter>? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = MessageFilterByChat, + markerFactory: MarkerFactory, Any> = ByChatMessageMarkerFactory, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver> +) = onEventWithCustomChatEventMessage(initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) 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 b993b32d8b..de1bdcbf47 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 @@ -261,6 +261,19 @@ const val iconColorField = "icon_color" const val requestContactField = "request_contact" const val requestLocationField = "request_location" const val requestPollField = "request_poll" +const val requestUserField = "request_user" +const val requestChatField = "request_chat" +const val requestIdField = "request_id" + +const val userIsBotField = "user_is_bot" +const val userIsPremiumField = "user_is_premium" +const val chatIsChannelField = "chat_is_channel" +const val chatIsForumField = "chat_is_forum" +const val chatHasUsernameField = "chat_has_username" +const val chatIsCreatedField = "chat_is_created" +const val userAdministratorRightsField = "user_administrator_rights" +const val botAdministratorRightsField = "bot_administrator_rights" +const val botIsMemberField = "bot_is_member" const val fileNameField = "file_name" const val mimeTypeField = "mime_type" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt index 4226bc94d2..64c326637d 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt @@ -94,6 +94,42 @@ data class RequestPollKeyboardButton( val requestPoll: KeyboardButtonPollType ) : KeyboardButton +/** + * Private chats only. When user will tap on this button, he will be asked for the chat with [requestChat] options. You + * will be able to catch this [ChatId] in updates and data using + * [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUserShared] in case you are using Behaviour + * Builder OR with [dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter.messagesFlow] + * and [kotlinx.coroutines.flow.filterIsInstance]. + * + * In case you will use [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUserShared] it is + * recommended to use [kotlinx.coroutines.flow.Flow] [kotlinx.coroutines.flow.filter] with checking of incoming + * [dev.inmo.tgbotapi.types.request.UserShared.requestId] + */ +@Serializable +data class RequestUserKeyboardButton( + override val text: String, + @SerialName(requestUserField) + val requestUser: KeyboardButtonRequestUser +) : KeyboardButton + +/** + * Private chats only. When user will tap on this button, he will be asked for the chat with [requestChat] options. You + * will be able to catch this [ChatId] in updates and data using + * [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared] in case you are using Behaviour + * Builder OR with [dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter.messagesFlow] + * and [kotlinx.coroutines.flow.filterIsInstance]. + * + * In case you will use [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared] it is + * recommended to use [kotlinx.coroutines.flow.Flow] [kotlinx.coroutines.flow.filter] with checking of incoming + * [dev.inmo.tgbotapi.types.request.ChatShared.requestId] + */ +@Serializable +data class RequestChatKeyboardButton( + override val text: String, + @SerialName(requestChatField) + val requestChat: KeyboardButtonRequestChat +) : KeyboardButton + @RiskFeature object KeyboardButtonSerializer : KSerializer { private val internalSerializer = JsonElement.serializer() @@ -124,6 +160,20 @@ object KeyboardButtonSerializer : KSerializer { asJson[requestPollField] ?.jsonObject ?: buildJsonObject { } ) ) + asJson is JsonObject && asJson[requestUserField] != null -> RequestUserKeyboardButton( + asJson[textField]!!.jsonPrimitive.content, + nonstrictJsonFormat.decodeFromJsonElement( + KeyboardButtonRequestUser.serializer(), + asJson[requestUserField] ?.jsonObject ?: buildJsonObject { } + ) + ) + asJson is JsonObject && asJson[requestChatField] != null -> RequestChatKeyboardButton( + asJson[textField]!!.jsonPrimitive.content, + nonstrictJsonFormat.decodeFromJsonElement( + KeyboardButtonRequestChat.serializer(), + asJson[requestChatField] ?.jsonObject ?: buildJsonObject { } + ) + ) else -> UnknownKeyboardButton( when (asJson) { is JsonObject -> asJson[textField]!!.jsonPrimitive.content @@ -142,6 +192,8 @@ object KeyboardButtonSerializer : KSerializer { is WebAppKeyboardButton -> WebAppKeyboardButton.serializer().serialize(encoder, value) is RequestPollKeyboardButton -> RequestPollKeyboardButton.serializer().serialize(encoder, value) is SimpleKeyboardButton -> encoder.encodeString(value.text) + is RequestUserKeyboardButton -> RequestUserKeyboardButton.serializer().serialize(encoder, value) + is RequestChatKeyboardButton -> RequestChatKeyboardButton.serializer().serialize(encoder, value) is UnknownKeyboardButton -> JsonElement.serializer().serialize(encoder, nonstrictJsonFormat.parseToJsonElement(value.raw)) } } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt new file mode 100644 index 0000000000..e423daeb57 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt @@ -0,0 +1,38 @@ +package dev.inmo.tgbotapi.types.buttons + +import dev.inmo.tgbotapi.types.botAdministratorRightsField +import dev.inmo.tgbotapi.types.botIsMemberField +import dev.inmo.tgbotapi.types.chat.member.ChatAdministratorRights +import dev.inmo.tgbotapi.types.chatHasUsernameField +import dev.inmo.tgbotapi.types.chatIsChannelField +import dev.inmo.tgbotapi.types.chatIsCreatedField +import dev.inmo.tgbotapi.types.chatIsForumField +import dev.inmo.tgbotapi.types.request.RequestId +import dev.inmo.tgbotapi.types.requestIdField +import dev.inmo.tgbotapi.types.userAdministratorRightsField +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient + +@Serializable +data class KeyboardButtonRequestChat( + @SerialName(requestIdField) + val requestId: RequestId, + @SerialName(chatIsChannelField) + val isChannel: Boolean? = null, + @SerialName(chatIsForumField) + val isForum: Boolean? = null, + @SerialName(chatHasUsernameField) + val withUsername: Boolean? = null, + @SerialName(chatIsCreatedField) + val ownedBy: Boolean? = null, + @SerialName(userAdministratorRightsField) + val userRightsInChat: ChatAdministratorRights? = null, + @SerialName(botAdministratorRightsField) + val botRightsInChat: ChatAdministratorRights? = null, + @SerialName(botIsMemberField) + val botIsMember: Boolean = false +) + diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestUser.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestUser.kt new file mode 100644 index 0000000000..ff7483b011 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestUser.kt @@ -0,0 +1,89 @@ +package dev.inmo.tgbotapi.types.buttons + +import dev.inmo.tgbotapi.types.request.RequestId +import dev.inmo.tgbotapi.types.requestIdField +import dev.inmo.tgbotapi.types.userIsBotField +import dev.inmo.tgbotapi.types.userIsPremiumField +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Serializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +@Serializable(KeyboardButtonRequestUser.Companion::class) +sealed interface KeyboardButtonRequestUser { + val requestId: RequestId + val isBot: Boolean? + + @Serializable + data class Any( + @SerialName(requestIdField) + override val requestId: RequestId + ) : KeyboardButtonRequestUser { + @SerialName(userIsBotField) + @EncodeDefault + override val isBot: Boolean? = null + } + + @Serializable + data class Common( + @SerialName(requestIdField) + override val requestId: RequestId, + @SerialName(userIsPremiumField) + val isPremium: Boolean? = null + ) : KeyboardButtonRequestUser { + @SerialName(userIsBotField) + @EncodeDefault + override val isBot: Boolean = false + } + + @Serializable + data class Bot( + @SerialName(requestIdField) + override val requestId: RequestId + ) : KeyboardButtonRequestUser { + @SerialName(userIsBotField) + @EncodeDefault + override val isBot: Boolean = true + } + + @Serializer(KeyboardButtonRequestUser::class) + companion object : KSerializer { + @Serializable + private data class Surrogate( + @SerialName(requestIdField) + val requestId: RequestId, + @SerialName(userIsBotField) + val userIsBot: Boolean? = null, + @SerialName(userIsPremiumField) + val userIsPremium: Boolean? = null + ) + private val realSerializer = Surrogate.serializer() + + override val descriptor: SerialDescriptor = realSerializer.descriptor + + override fun deserialize(decoder: Decoder): KeyboardButtonRequestUser { + val surrogate = realSerializer.deserialize(decoder) + + return when (surrogate.userIsBot) { + true -> Bot(surrogate.requestId) + false -> Common(surrogate.requestId, surrogate.userIsPremium) + null -> Any(surrogate.requestId) + } + } + + override fun serialize(encoder: Encoder, value: KeyboardButtonRequestUser) { + realSerializer.serialize( + encoder, + Surrogate( + value.requestId, + value.isBot, + (value as? Common) ?.isPremium + ) + ) + } + } +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt index d87ed524f4..dba7cac982 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt @@ -2,6 +2,8 @@ package dev.inmo.tgbotapi.types.buttons.reply import dev.inmo.tgbotapi.types.buttons.* import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.* +import dev.inmo.tgbotapi.types.chat.member.ChatAdministratorRights +import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.webapps.WebAppInfo @@ -67,3 +69,99 @@ inline fun webAppReplyButton( text: String, url: String ) = webAppReplyButton(text, WebAppInfo(url)) + + +/** + * Creates and put [RequestUserKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestUserReplyButton( + text: String, + requestUser: KeyboardButtonRequestUser +) = RequestUserKeyboardButton( + text, + requestUser +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Bot] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestBotReplyButton( + text: String, + requestId: RequestId +) = requestUserReplyButton( + text, + KeyboardButtonRequestUser.Bot(requestId) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Common] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestUserReplyButton( + text: String, + requestId: RequestId, + premiumUser: Boolean? = null +) = requestUserReplyButton( + text, + KeyboardButtonRequestUser.Common(requestId, premiumUser) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Any] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestUserOrBotReplyButton( + text: String, + requestId: RequestId +) = requestUserReplyButton( + text, + KeyboardButtonRequestUser.Any(requestId) +) + + +/** + * Creates and put [RequestChatKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestChatReplyButton( + text: String, + requestChat: KeyboardButtonRequestChat +) = RequestChatKeyboardButton( + text, + requestChat +) + +/** + * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestChatReplyButton( + text: String, + requestId: RequestId, + isChannel: Boolean? = null, + isForum: Boolean? = null, + withUsername: Boolean? = null, + ownedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean = false +) = requestChatReplyButton( + text, + KeyboardButtonRequestChat( + requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember + ) +) 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 c5c6277daa..684b74757f 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 @@ -29,6 +29,8 @@ import dev.inmo.tgbotapi.types.passport.PassportData import dev.inmo.tgbotapi.types.payments.Invoice import dev.inmo.tgbotapi.types.payments.SuccessfulPayment import dev.inmo.tgbotapi.types.polls.Poll +import dev.inmo.tgbotapi.types.request.ChatShared +import dev.inmo.tgbotapi.types.request.UserShared import dev.inmo.tgbotapi.types.venue.Venue import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -93,6 +95,9 @@ internal data class RawMessage( private val dice: Dice? = null, private val successful_payment: SuccessfulPayment? = null, + private val user_shared: UserShared? = null, + private val chat_shared: ChatShared? = null, + // Voice Chat Service Messages private val video_chat_scheduled: VideoChatScheduled? = null, private val video_chat_started: VideoChatStarted? = null, @@ -249,6 +254,8 @@ internal data class RawMessage( successful_payment != null -> SuccessfulPaymentEvent(successful_payment) connected_website != null -> UserLoggedIn(connected_website) web_app_data != null -> web_app_data + user_shared != null -> user_shared + chat_shared != null -> chat_shared else -> null } } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/ChatShared.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/ChatShared.kt new file mode 100644 index 0000000000..f222e5b380 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/ChatShared.kt @@ -0,0 +1,17 @@ +package dev.inmo.tgbotapi.types.request + +import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.ChatIdentifier +import dev.inmo.tgbotapi.types.UserId +import dev.inmo.tgbotapi.types.chatIdField +import dev.inmo.tgbotapi.types.requestIdField +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ChatShared( + @SerialName(requestIdField) + override val requestId: RequestId, + @SerialName(chatIdField) + override val chatId: ChatId +) : ChatSharedRequest diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/ChatSharedRequest.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/ChatSharedRequest.kt new file mode 100644 index 0000000000..5dbe702013 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/ChatSharedRequest.kt @@ -0,0 +1,8 @@ +package dev.inmo.tgbotapi.types.request + +import dev.inmo.tgbotapi.types.ChatIdentifier +import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.PrivateEvent + +sealed interface ChatSharedRequest : RequestResponse, PrivateEvent { + val chatId: ChatIdentifier +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt new file mode 100644 index 0000000000..689db02a1d --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt @@ -0,0 +1,10 @@ +package dev.inmo.tgbotapi.types.request + +import kotlinx.serialization.Serializable +import kotlin.jvm.JvmInline + +@Serializable +@JvmInline +value class RequestId( + val long: Long +) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestResponse.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestResponse.kt new file mode 100644 index 0000000000..2c4c846942 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestResponse.kt @@ -0,0 +1,5 @@ +package dev.inmo.tgbotapi.types.request + +sealed interface RequestResponse { + val requestId: RequestId +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/UserShared.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/UserShared.kt new file mode 100644 index 0000000000..74b6f55667 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/UserShared.kt @@ -0,0 +1,19 @@ +package dev.inmo.tgbotapi.types.request + +import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.UserId +import dev.inmo.tgbotapi.types.requestIdField +import dev.inmo.tgbotapi.types.userIdField +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class UserShared( + @SerialName(requestIdField) + override val requestId: RequestId, + @SerialName(userIdField) + val userId: UserId +) : ChatSharedRequest { + override val chatId: ChatId + get() = userId +} diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt index 9bd0909aa1..3b8cce77cf 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt @@ -1,6 +1,10 @@ package dev.inmo.tgbotapi.extensions.utils.types.buttons import dev.inmo.tgbotapi.types.buttons.* +import dev.inmo.tgbotapi.types.buttons.reply.requestChatReplyButton +import dev.inmo.tgbotapi.types.buttons.reply.requestUserReplyButton +import dev.inmo.tgbotapi.types.chat.member.ChatAdministratorRights +import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.webapps.WebAppInfo import dev.inmo.tgbotapi.utils.* @@ -138,3 +142,103 @@ inline fun ReplyKeyboardRowBuilder.webAppButton( text: String, url: String ) = webAppButton(text, WebAppInfo(url)) + + +/** + * Creates and put [RequestUserKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestUserButton( + text: String, + requestUser: KeyboardButtonRequestUser +) = add( + requestUserReplyButton( + text, + requestUser + ) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Bot] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestBotButton( + text: String, + requestId: RequestId +) = requestUserButton( + text, + KeyboardButtonRequestUser.Bot(requestId) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Common] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestUserButton( + text: String, + requestId: RequestId, + premiumUser: Boolean? = null +) = requestUserButton( + text, + KeyboardButtonRequestUser.Common(requestId, premiumUser) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Any] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestUserOrBotButton( + text: String, + requestId: RequestId +) = requestUserButton( + text, + KeyboardButtonRequestUser.Any(requestId) +) + + +/** + * Creates and put [RequestChatKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestChatButton( + text: String, + requestChat: KeyboardButtonRequestChat +) = add( + requestChatReplyButton( + text, + requestChat + ) +) + +/** + * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestChatButton( + text: String, + requestId: RequestId, + isChannel: Boolean? = null, + isForum: Boolean? = null, + withUsername: Boolean? = null, + ownedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean = false +) = requestChatButton( + text, + KeyboardButtonRequestChat( + requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember + ) +) From ae8ef0dd3cacd5f8ef417166b90cee41d76f95b2 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 21:47:15 +0600 Subject: [PATCH 13/19] fixes in keyboards --- .../InlineKeyboardButton.kt | 39 +++++++ .../InlineKeyboardButtonSerializer.kt | 4 + .../tgbotapi/types/buttons/KeyboardButton.kt | 52 --------- .../inline/InlineKeyboardButtonsShortcuts.kt | 101 +++++++++++++++++ .../reply/ReplyKeyboardButtonsShortcuts.kt | 96 ---------------- .../types/buttons/InlineKeyboardBuilder.kt | 106 ++++++++++++++++++ .../types/buttons/ReplyKeyboardBuilder.kt | 104 ----------------- 7 files changed, 250 insertions(+), 252 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt index 6c31cdccee..bc0b89accd 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt @@ -2,6 +2,9 @@ package dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded import dev.inmo.tgbotapi.types.* +import dev.inmo.tgbotapi.types.buttons.KeyboardButton +import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestChat +import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestUser import dev.inmo.tgbotapi.types.games.CallbackGame import dev.inmo.tgbotapi.types.webapps.WebAppInfo import kotlinx.serialization.* @@ -134,3 +137,39 @@ data class WebAppInlineKeyboardButton( @SerialName(webAppField) val webApp: WebAppInfo ) : InlineKeyboardButton + +/** + * Private chats only. When user will tap on this button, he will be asked for the chat with [requestChat] options. You + * will be able to catch this [ChatId] in updates and data using + * [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUserShared] in case you are using Behaviour + * Builder OR with [dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter.messagesFlow] + * and [kotlinx.coroutines.flow.filterIsInstance]. + * + * In case you will use [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUserShared] it is + * recommended to use [kotlinx.coroutines.flow.Flow] [kotlinx.coroutines.flow.filter] with checking of incoming + * [dev.inmo.tgbotapi.types.request.UserShared.requestId] + */ +@Serializable +data class RequestUserInlineKeyboardButton( + override val text: String, + @SerialName(requestUserField) + val requestUser: KeyboardButtonRequestUser +) : InlineKeyboardButton + +/** + * Private chats only. When user will tap on this button, he will be asked for the chat with [requestChat] options. You + * will be able to catch this [ChatId] in updates and data using + * [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared] in case you are using Behaviour + * Builder OR with [dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter.messagesFlow] + * and [kotlinx.coroutines.flow.filterIsInstance]. + * + * In case you will use [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared] it is + * recommended to use [kotlinx.coroutines.flow.Flow] [kotlinx.coroutines.flow.filter] with checking of incoming + * [dev.inmo.tgbotapi.types.request.ChatShared.requestId] + */ +@Serializable +data class RequestChatInlineKeyboardButton( + override val text: String, + @SerialName(requestChatField) + val requestChat: KeyboardButtonRequestChat +) : InlineKeyboardButton diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButtonSerializer.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButtonSerializer.kt index 70005d12c7..ce9ae6a843 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButtonSerializer.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButtonSerializer.kt @@ -28,6 +28,8 @@ object InlineKeyboardButtonSerializer : KSerializer { json[switchInlineQueryField] != null -> SwitchInlineQueryInlineKeyboardButton.serializer() json[switchInlineQueryCurrentChatField] != null -> SwitchInlineQueryCurrentChatInlineKeyboardButton.serializer() json[urlField] != null -> URLInlineKeyboardButton.serializer() + json[requestUserField] != null -> RequestUserInlineKeyboardButton.serializer() + json[requestChatField] != null -> RequestChatInlineKeyboardButton.serializer() else -> null } } @@ -50,6 +52,8 @@ object InlineKeyboardButtonSerializer : KSerializer { is URLInlineKeyboardButton -> URLInlineKeyboardButton.serializer().serialize(encoder, value) is WebAppInlineKeyboardButton -> WebAppInlineKeyboardButton.serializer().serialize(encoder, value) is CallbackGameInlineKeyboardButton -> CallbackGameInlineKeyboardButton.serializer().serialize(encoder, value) + is RequestUserInlineKeyboardButton -> RequestUserInlineKeyboardButton.serializer().serialize(encoder, value) + is RequestChatInlineKeyboardButton -> RequestChatInlineKeyboardButton.serializer().serialize(encoder, value) is UnknownInlineKeyboardButton -> JsonElement.serializer().serialize(encoder, value.rawData) } } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt index 64c326637d..4226bc94d2 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt @@ -94,42 +94,6 @@ data class RequestPollKeyboardButton( val requestPoll: KeyboardButtonPollType ) : KeyboardButton -/** - * Private chats only. When user will tap on this button, he will be asked for the chat with [requestChat] options. You - * will be able to catch this [ChatId] in updates and data using - * [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUserShared] in case you are using Behaviour - * Builder OR with [dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter.messagesFlow] - * and [kotlinx.coroutines.flow.filterIsInstance]. - * - * In case you will use [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUserShared] it is - * recommended to use [kotlinx.coroutines.flow.Flow] [kotlinx.coroutines.flow.filter] with checking of incoming - * [dev.inmo.tgbotapi.types.request.UserShared.requestId] - */ -@Serializable -data class RequestUserKeyboardButton( - override val text: String, - @SerialName(requestUserField) - val requestUser: KeyboardButtonRequestUser -) : KeyboardButton - -/** - * Private chats only. When user will tap on this button, he will be asked for the chat with [requestChat] options. You - * will be able to catch this [ChatId] in updates and data using - * [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared] in case you are using Behaviour - * Builder OR with [dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter.messagesFlow] - * and [kotlinx.coroutines.flow.filterIsInstance]. - * - * In case you will use [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared] it is - * recommended to use [kotlinx.coroutines.flow.Flow] [kotlinx.coroutines.flow.filter] with checking of incoming - * [dev.inmo.tgbotapi.types.request.ChatShared.requestId] - */ -@Serializable -data class RequestChatKeyboardButton( - override val text: String, - @SerialName(requestChatField) - val requestChat: KeyboardButtonRequestChat -) : KeyboardButton - @RiskFeature object KeyboardButtonSerializer : KSerializer { private val internalSerializer = JsonElement.serializer() @@ -160,20 +124,6 @@ object KeyboardButtonSerializer : KSerializer { asJson[requestPollField] ?.jsonObject ?: buildJsonObject { } ) ) - asJson is JsonObject && asJson[requestUserField] != null -> RequestUserKeyboardButton( - asJson[textField]!!.jsonPrimitive.content, - nonstrictJsonFormat.decodeFromJsonElement( - KeyboardButtonRequestUser.serializer(), - asJson[requestUserField] ?.jsonObject ?: buildJsonObject { } - ) - ) - asJson is JsonObject && asJson[requestChatField] != null -> RequestChatKeyboardButton( - asJson[textField]!!.jsonPrimitive.content, - nonstrictJsonFormat.decodeFromJsonElement( - KeyboardButtonRequestChat.serializer(), - asJson[requestChatField] ?.jsonObject ?: buildJsonObject { } - ) - ) else -> UnknownKeyboardButton( when (asJson) { is JsonObject -> asJson[textField]!!.jsonPrimitive.content @@ -192,8 +142,6 @@ object KeyboardButtonSerializer : KSerializer { is WebAppKeyboardButton -> WebAppKeyboardButton.serializer().serialize(encoder, value) is RequestPollKeyboardButton -> RequestPollKeyboardButton.serializer().serialize(encoder, value) is SimpleKeyboardButton -> encoder.encodeString(value.text) - is RequestUserKeyboardButton -> RequestUserKeyboardButton.serializer().serialize(encoder, value) - is RequestChatKeyboardButton -> RequestChatKeyboardButton.serializer().serialize(encoder, value) is UnknownKeyboardButton -> JsonElement.serializer().serialize(encoder, nonstrictJsonFormat.parseToJsonElement(value.raw)) } } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/inline/InlineKeyboardButtonsShortcuts.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/inline/InlineKeyboardButtonsShortcuts.kt index 9f148a98fe..86854e8890 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/inline/InlineKeyboardButtonsShortcuts.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/inline/InlineKeyboardButtonsShortcuts.kt @@ -2,6 +2,10 @@ package dev.inmo.tgbotapi.types.buttons.inline import dev.inmo.tgbotapi.types.LoginURL import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.* +import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestChat +import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestUser +import dev.inmo.tgbotapi.types.chat.member.ChatAdministratorRights +import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.webapps.WebAppInfo /** @@ -100,3 +104,100 @@ inline fun webAppInlineButton( text: String, url: String ) = webAppInlineButton(text, WebAppInfo(url)) + + +/** + * Creates and put [RequestUserKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestUserInlineButton( + text: String, + requestUser: KeyboardButtonRequestUser +) = RequestUserInlineKeyboardButton( + text, + requestUser +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Bot] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestBotInlineButton( + text: String, + requestId: RequestId +) = requestUserInlineButton( + text, + KeyboardButtonRequestUser.Bot(requestId) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Common] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestUserInlineButton( + text: String, + requestId: RequestId, + premiumUser: Boolean? = null +) = requestUserInlineButton( + text, + KeyboardButtonRequestUser.Common(requestId, premiumUser) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Any] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestUserOrBotInlineButton( + text: String, + requestId: RequestId +) = requestUserInlineButton( + text, + KeyboardButtonRequestUser.Any(requestId) +) + + +/** + * Creates and put [RequestChatKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestChatInlineButton( + text: String, + requestChat: KeyboardButtonRequestChat +) = RequestChatInlineKeyboardButton( + text, + requestChat +) + +/** + * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestChatInlineButton( + text: String, + requestId: RequestId, + isChannel: Boolean? = null, + isForum: Boolean? = null, + withUsername: Boolean? = null, + ownedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean = false +) = requestChatInlineButton( + text, + KeyboardButtonRequestChat( + requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember + ) +) + diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt index dba7cac982..dd8debb4fe 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt @@ -69,99 +69,3 @@ inline fun webAppReplyButton( text: String, url: String ) = webAppReplyButton(text, WebAppInfo(url)) - - -/** - * Creates and put [RequestUserKeyboardButton] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestUserReplyButton( - text: String, - requestUser: KeyboardButtonRequestUser -) = RequestUserKeyboardButton( - text, - requestUser -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Bot] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestBotReplyButton( - text: String, - requestId: RequestId -) = requestUserReplyButton( - text, - KeyboardButtonRequestUser.Bot(requestId) -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Common] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestUserReplyButton( - text: String, - requestId: RequestId, - premiumUser: Boolean? = null -) = requestUserReplyButton( - text, - KeyboardButtonRequestUser.Common(requestId, premiumUser) -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Any] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestUserOrBotReplyButton( - text: String, - requestId: RequestId -) = requestUserReplyButton( - text, - KeyboardButtonRequestUser.Any(requestId) -) - - -/** - * Creates and put [RequestChatKeyboardButton] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestChatReplyButton( - text: String, - requestChat: KeyboardButtonRequestChat -) = RequestChatKeyboardButton( - text, - requestChat -) - -/** - * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestChatReplyButton( - text: String, - requestId: RequestId, - isChannel: Boolean? = null, - isForum: Boolean? = null, - withUsername: Boolean? = null, - ownedBy: Boolean? = null, - userRightsInChat: ChatAdministratorRights? = null, - botRightsInChat: ChatAdministratorRights? = null, - botIsMember: Boolean = false -) = requestChatReplyButton( - text, - KeyboardButtonRequestChat( - requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember - ) -) diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/InlineKeyboardBuilder.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/InlineKeyboardBuilder.kt index 69037b21e3..3b23df15fd 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/InlineKeyboardBuilder.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/InlineKeyboardBuilder.kt @@ -3,6 +3,12 @@ package dev.inmo.tgbotapi.extensions.utils.types.buttons import dev.inmo.tgbotapi.types.LoginURL import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.* import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup +import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestChat +import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestUser +import dev.inmo.tgbotapi.types.buttons.inline.requestChatInlineButton +import dev.inmo.tgbotapi.types.buttons.inline.requestUserInlineButton +import dev.inmo.tgbotapi.types.chat.member.ChatAdministratorRights +import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.webapps.WebAppInfo import dev.inmo.tgbotapi.utils.* @@ -161,3 +167,103 @@ inline fun InlineKeyboardRowBuilder.webAppButton( text: String, url: String ) = webAppButton(text, WebAppInfo(url)) + + +/** + * Creates and put [RequestUserKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun InlineKeyboardRowBuilder.requestUserButton( + text: String, + requestUser: KeyboardButtonRequestUser +) = add( + requestUserInlineButton( + text, + requestUser + ) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Bot] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun InlineKeyboardRowBuilder.requestBotButton( + text: String, + requestId: RequestId +) = requestUserButton( + text, + KeyboardButtonRequestUser.Bot(requestId) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Common] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun InlineKeyboardRowBuilder.requestUserButton( + text: String, + requestId: RequestId, + premiumUser: Boolean? = null +) = requestUserButton( + text, + KeyboardButtonRequestUser.Common(requestId, premiumUser) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Any] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun InlineKeyboardRowBuilder.requestUserOrBotButton( + text: String, + requestId: RequestId +) = requestUserButton( + text, + KeyboardButtonRequestUser.Any(requestId) +) + + +/** + * Creates and put [RequestChatKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun InlineKeyboardRowBuilder.requestChatButton( + text: String, + requestChat: KeyboardButtonRequestChat +) = add( + requestChatInlineButton( + text, + requestChat + ) +) + +/** + * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun InlineKeyboardRowBuilder.requestChatButton( + text: String, + requestId: RequestId, + isChannel: Boolean? = null, + isForum: Boolean? = null, + withUsername: Boolean? = null, + ownedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean = false +) = requestChatButton( + text, + KeyboardButtonRequestChat( + requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember + ) +) diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt index 3b8cce77cf..9bd0909aa1 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt @@ -1,10 +1,6 @@ package dev.inmo.tgbotapi.extensions.utils.types.buttons import dev.inmo.tgbotapi.types.buttons.* -import dev.inmo.tgbotapi.types.buttons.reply.requestChatReplyButton -import dev.inmo.tgbotapi.types.buttons.reply.requestUserReplyButton -import dev.inmo.tgbotapi.types.chat.member.ChatAdministratorRights -import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.webapps.WebAppInfo import dev.inmo.tgbotapi.utils.* @@ -142,103 +138,3 @@ inline fun ReplyKeyboardRowBuilder.webAppButton( text: String, url: String ) = webAppButton(text, WebAppInfo(url)) - - -/** - * Creates and put [RequestUserKeyboardButton] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun ReplyKeyboardRowBuilder.requestUserButton( - text: String, - requestUser: KeyboardButtonRequestUser -) = add( - requestUserReplyButton( - text, - requestUser - ) -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Bot] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun ReplyKeyboardRowBuilder.requestBotButton( - text: String, - requestId: RequestId -) = requestUserButton( - text, - KeyboardButtonRequestUser.Bot(requestId) -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Common] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun ReplyKeyboardRowBuilder.requestUserButton( - text: String, - requestId: RequestId, - premiumUser: Boolean? = null -) = requestUserButton( - text, - KeyboardButtonRequestUser.Common(requestId, premiumUser) -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Any] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun ReplyKeyboardRowBuilder.requestUserOrBotButton( - text: String, - requestId: RequestId -) = requestUserButton( - text, - KeyboardButtonRequestUser.Any(requestId) -) - - -/** - * Creates and put [RequestChatKeyboardButton] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun ReplyKeyboardRowBuilder.requestChatButton( - text: String, - requestChat: KeyboardButtonRequestChat -) = add( - requestChatReplyButton( - text, - requestChat - ) -) - -/** - * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun ReplyKeyboardRowBuilder.requestChatButton( - text: String, - requestId: RequestId, - isChannel: Boolean? = null, - isForum: Boolean? = null, - withUsername: Boolean? = null, - ownedBy: Boolean? = null, - userRightsInChat: ChatAdministratorRights? = null, - botRightsInChat: ChatAdministratorRights? = null, - botIsMember: Boolean = false -) = requestChatButton( - text, - KeyboardButtonRequestChat( - requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember - ) -) From 47f1509ecc8f714c21d8fefac07019ed7f5e85ec Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 22:01:43 +0600 Subject: [PATCH 14/19] add RequestId.random --- .../inmo/tgbotapi/types/request/RequestId.kt | 9 ++- .../extensions/utils/ClassCastsNew.kt | 56 +++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt index 689db02a1d..12f3685d2f 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt @@ -2,9 +2,14 @@ package dev.inmo.tgbotapi.types.request import kotlinx.serialization.Serializable import kotlin.jvm.JvmInline +import kotlin.random.Random @Serializable @JvmInline value class RequestId( - val long: Long -) + val float: Float +) { + companion object { + fun random() = RequestId(Random.nextFloat()) + } +} 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 500b28a94b..6f65a44f03 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 @@ -107,6 +107,8 @@ import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.CallbackGameInlineK import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.InlineKeyboardButton import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.LoginURLInlineKeyboardButton import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.PayInlineKeyboardButton +import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestChatInlineKeyboardButton +import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestUserInlineKeyboardButton import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.SwitchInlineQueryCurrentChatInlineKeyboardButton import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.SwitchInlineQueryInlineKeyboardButton import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.URLInlineKeyboardButton @@ -433,6 +435,9 @@ import dev.inmo.tgbotapi.types.queries.callback.MessageCallbackQuery import dev.inmo.tgbotapi.types.queries.callback.MessageDataCallbackQuery import dev.inmo.tgbotapi.types.queries.callback.MessageGameShortNameCallbackQuery import dev.inmo.tgbotapi.types.queries.callback.UnknownCallbackQueryType +import dev.inmo.tgbotapi.types.request.ChatShared +import dev.inmo.tgbotapi.types.request.ChatSharedRequest +import dev.inmo.tgbotapi.types.request.UserShared import dev.inmo.tgbotapi.types.update.CallbackQueryUpdate import dev.inmo.tgbotapi.types.update.ChannelPostUpdate import dev.inmo.tgbotapi.types.update.ChatJoinRequestUpdate @@ -1879,6 +1884,30 @@ public inline fun InlineKeyboardButton.ifWebAppInlineKeyboardButton(block: (WebAppInlineKeyboardButton) -> T): T? = webAppInlineKeyboardButtonOrNull() ?.let(block) +public inline fun InlineKeyboardButton.requestUserInlineKeyboardButtonOrNull(): + RequestUserInlineKeyboardButton? = this as? + dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestUserInlineKeyboardButton + +public inline fun InlineKeyboardButton.requestUserInlineKeyboardButtonOrThrow(): + RequestUserInlineKeyboardButton = this as + dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestUserInlineKeyboardButton + +public inline fun + InlineKeyboardButton.ifRequestUserInlineKeyboardButton(block: (RequestUserInlineKeyboardButton) -> T): + T? = requestUserInlineKeyboardButtonOrNull() ?.let(block) + +public inline fun InlineKeyboardButton.requestChatInlineKeyboardButtonOrNull(): + RequestChatInlineKeyboardButton? = this as? + dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestChatInlineKeyboardButton + +public inline fun InlineKeyboardButton.requestChatInlineKeyboardButtonOrThrow(): + RequestChatInlineKeyboardButton = this as + dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestChatInlineKeyboardButton + +public inline fun + InlineKeyboardButton.ifRequestChatInlineKeyboardButton(block: (RequestChatInlineKeyboardButton) -> T): + T? = requestChatInlineKeyboardButtonOrNull() ?.let(block) + public inline fun KeyboardMarkup.inlineKeyboardMarkupOrNull(): InlineKeyboardMarkup? = this as? dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup @@ -3031,6 +3060,33 @@ public inline fun ChatEvent.successfulPaymentEventOrThrow(): SuccessfulPaymentEv public inline fun ChatEvent.ifSuccessfulPaymentEvent(block: (SuccessfulPaymentEvent) -> T): T? = successfulPaymentEventOrNull() ?.let(block) +public inline fun ChatEvent.chatSharedOrNull(): ChatShared? = this as? + dev.inmo.tgbotapi.types.request.ChatShared + +public inline fun ChatEvent.chatSharedOrThrow(): ChatShared = this as + dev.inmo.tgbotapi.types.request.ChatShared + +public inline fun ChatEvent.ifChatShared(block: (ChatShared) -> T): T? = chatSharedOrNull() + ?.let(block) + +public inline fun ChatEvent.chatSharedRequestOrNull(): ChatSharedRequest? = this as? + dev.inmo.tgbotapi.types.request.ChatSharedRequest + +public inline fun ChatEvent.chatSharedRequestOrThrow(): ChatSharedRequest = this as + dev.inmo.tgbotapi.types.request.ChatSharedRequest + +public inline fun ChatEvent.ifChatSharedRequest(block: (ChatSharedRequest) -> T): T? = + chatSharedRequestOrNull() ?.let(block) + +public inline fun ChatEvent.userSharedOrNull(): UserShared? = this as? + dev.inmo.tgbotapi.types.request.UserShared + +public inline fun ChatEvent.userSharedOrThrow(): UserShared = this as + dev.inmo.tgbotapi.types.request.UserShared + +public inline fun ChatEvent.ifUserShared(block: (UserShared) -> T): T? = userSharedOrNull() + ?.let(block) + public inline fun ForwardInfo.byAnonymousOrNull(): ForwardInfo.ByAnonymous? = this as? dev.inmo.tgbotapi.types.message.ForwardInfo.ByAnonymous From 0da0c4e894d1da2784121128b74a68f65a7d0358 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 22:25:43 +0600 Subject: [PATCH 15/19] Revert "fixes in keyboards" This reverts commit ae8ef0dd3cacd5f8ef417166b90cee41d76f95b2. --- .../InlineKeyboardButton.kt | 39 ------- .../InlineKeyboardButtonSerializer.kt | 4 - .../tgbotapi/types/buttons/KeyboardButton.kt | 52 +++++++++ .../inline/InlineKeyboardButtonsShortcuts.kt | 101 ----------------- .../reply/ReplyKeyboardButtonsShortcuts.kt | 96 ++++++++++++++++ .../types/buttons/InlineKeyboardBuilder.kt | 106 ------------------ .../types/buttons/ReplyKeyboardBuilder.kt | 104 +++++++++++++++++ 7 files changed, 252 insertions(+), 250 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt index bc0b89accd..6c31cdccee 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt @@ -2,9 +2,6 @@ package dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded import dev.inmo.tgbotapi.types.* -import dev.inmo.tgbotapi.types.buttons.KeyboardButton -import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestChat -import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestUser import dev.inmo.tgbotapi.types.games.CallbackGame import dev.inmo.tgbotapi.types.webapps.WebAppInfo import kotlinx.serialization.* @@ -137,39 +134,3 @@ data class WebAppInlineKeyboardButton( @SerialName(webAppField) val webApp: WebAppInfo ) : InlineKeyboardButton - -/** - * Private chats only. When user will tap on this button, he will be asked for the chat with [requestChat] options. You - * will be able to catch this [ChatId] in updates and data using - * [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUserShared] in case you are using Behaviour - * Builder OR with [dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter.messagesFlow] - * and [kotlinx.coroutines.flow.filterIsInstance]. - * - * In case you will use [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUserShared] it is - * recommended to use [kotlinx.coroutines.flow.Flow] [kotlinx.coroutines.flow.filter] with checking of incoming - * [dev.inmo.tgbotapi.types.request.UserShared.requestId] - */ -@Serializable -data class RequestUserInlineKeyboardButton( - override val text: String, - @SerialName(requestUserField) - val requestUser: KeyboardButtonRequestUser -) : InlineKeyboardButton - -/** - * Private chats only. When user will tap on this button, he will be asked for the chat with [requestChat] options. You - * will be able to catch this [ChatId] in updates and data using - * [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared] in case you are using Behaviour - * Builder OR with [dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter.messagesFlow] - * and [kotlinx.coroutines.flow.filterIsInstance]. - * - * In case you will use [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared] it is - * recommended to use [kotlinx.coroutines.flow.Flow] [kotlinx.coroutines.flow.filter] with checking of incoming - * [dev.inmo.tgbotapi.types.request.ChatShared.requestId] - */ -@Serializable -data class RequestChatInlineKeyboardButton( - override val text: String, - @SerialName(requestChatField) - val requestChat: KeyboardButtonRequestChat -) : InlineKeyboardButton diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButtonSerializer.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButtonSerializer.kt index ce9ae6a843..70005d12c7 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButtonSerializer.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/InlineKeyboardButtons/InlineKeyboardButtonSerializer.kt @@ -28,8 +28,6 @@ object InlineKeyboardButtonSerializer : KSerializer { json[switchInlineQueryField] != null -> SwitchInlineQueryInlineKeyboardButton.serializer() json[switchInlineQueryCurrentChatField] != null -> SwitchInlineQueryCurrentChatInlineKeyboardButton.serializer() json[urlField] != null -> URLInlineKeyboardButton.serializer() - json[requestUserField] != null -> RequestUserInlineKeyboardButton.serializer() - json[requestChatField] != null -> RequestChatInlineKeyboardButton.serializer() else -> null } } @@ -52,8 +50,6 @@ object InlineKeyboardButtonSerializer : KSerializer { is URLInlineKeyboardButton -> URLInlineKeyboardButton.serializer().serialize(encoder, value) is WebAppInlineKeyboardButton -> WebAppInlineKeyboardButton.serializer().serialize(encoder, value) is CallbackGameInlineKeyboardButton -> CallbackGameInlineKeyboardButton.serializer().serialize(encoder, value) - is RequestUserInlineKeyboardButton -> RequestUserInlineKeyboardButton.serializer().serialize(encoder, value) - is RequestChatInlineKeyboardButton -> RequestChatInlineKeyboardButton.serializer().serialize(encoder, value) is UnknownInlineKeyboardButton -> JsonElement.serializer().serialize(encoder, value.rawData) } } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt index 4226bc94d2..64c326637d 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButton.kt @@ -94,6 +94,42 @@ data class RequestPollKeyboardButton( val requestPoll: KeyboardButtonPollType ) : KeyboardButton +/** + * Private chats only. When user will tap on this button, he will be asked for the chat with [requestChat] options. You + * will be able to catch this [ChatId] in updates and data using + * [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUserShared] in case you are using Behaviour + * Builder OR with [dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter.messagesFlow] + * and [kotlinx.coroutines.flow.filterIsInstance]. + * + * In case you will use [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUserShared] it is + * recommended to use [kotlinx.coroutines.flow.Flow] [kotlinx.coroutines.flow.filter] with checking of incoming + * [dev.inmo.tgbotapi.types.request.UserShared.requestId] + */ +@Serializable +data class RequestUserKeyboardButton( + override val text: String, + @SerialName(requestUserField) + val requestUser: KeyboardButtonRequestUser +) : KeyboardButton + +/** + * Private chats only. When user will tap on this button, he will be asked for the chat with [requestChat] options. You + * will be able to catch this [ChatId] in updates and data using + * [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared] in case you are using Behaviour + * Builder OR with [dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter.messagesFlow] + * and [kotlinx.coroutines.flow.filterIsInstance]. + * + * In case you will use [dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared] it is + * recommended to use [kotlinx.coroutines.flow.Flow] [kotlinx.coroutines.flow.filter] with checking of incoming + * [dev.inmo.tgbotapi.types.request.ChatShared.requestId] + */ +@Serializable +data class RequestChatKeyboardButton( + override val text: String, + @SerialName(requestChatField) + val requestChat: KeyboardButtonRequestChat +) : KeyboardButton + @RiskFeature object KeyboardButtonSerializer : KSerializer { private val internalSerializer = JsonElement.serializer() @@ -124,6 +160,20 @@ object KeyboardButtonSerializer : KSerializer { asJson[requestPollField] ?.jsonObject ?: buildJsonObject { } ) ) + asJson is JsonObject && asJson[requestUserField] != null -> RequestUserKeyboardButton( + asJson[textField]!!.jsonPrimitive.content, + nonstrictJsonFormat.decodeFromJsonElement( + KeyboardButtonRequestUser.serializer(), + asJson[requestUserField] ?.jsonObject ?: buildJsonObject { } + ) + ) + asJson is JsonObject && asJson[requestChatField] != null -> RequestChatKeyboardButton( + asJson[textField]!!.jsonPrimitive.content, + nonstrictJsonFormat.decodeFromJsonElement( + KeyboardButtonRequestChat.serializer(), + asJson[requestChatField] ?.jsonObject ?: buildJsonObject { } + ) + ) else -> UnknownKeyboardButton( when (asJson) { is JsonObject -> asJson[textField]!!.jsonPrimitive.content @@ -142,6 +192,8 @@ object KeyboardButtonSerializer : KSerializer { is WebAppKeyboardButton -> WebAppKeyboardButton.serializer().serialize(encoder, value) is RequestPollKeyboardButton -> RequestPollKeyboardButton.serializer().serialize(encoder, value) is SimpleKeyboardButton -> encoder.encodeString(value.text) + is RequestUserKeyboardButton -> RequestUserKeyboardButton.serializer().serialize(encoder, value) + is RequestChatKeyboardButton -> RequestChatKeyboardButton.serializer().serialize(encoder, value) is UnknownKeyboardButton -> JsonElement.serializer().serialize(encoder, nonstrictJsonFormat.parseToJsonElement(value.raw)) } } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/inline/InlineKeyboardButtonsShortcuts.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/inline/InlineKeyboardButtonsShortcuts.kt index 86854e8890..9f148a98fe 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/inline/InlineKeyboardButtonsShortcuts.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/inline/InlineKeyboardButtonsShortcuts.kt @@ -2,10 +2,6 @@ package dev.inmo.tgbotapi.types.buttons.inline import dev.inmo.tgbotapi.types.LoginURL import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.* -import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestChat -import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestUser -import dev.inmo.tgbotapi.types.chat.member.ChatAdministratorRights -import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.webapps.WebAppInfo /** @@ -104,100 +100,3 @@ inline fun webAppInlineButton( text: String, url: String ) = webAppInlineButton(text, WebAppInfo(url)) - - -/** - * Creates and put [RequestUserKeyboardButton] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestUserInlineButton( - text: String, - requestUser: KeyboardButtonRequestUser -) = RequestUserInlineKeyboardButton( - text, - requestUser -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Bot] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestBotInlineButton( - text: String, - requestId: RequestId -) = requestUserInlineButton( - text, - KeyboardButtonRequestUser.Bot(requestId) -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Common] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestUserInlineButton( - text: String, - requestId: RequestId, - premiumUser: Boolean? = null -) = requestUserInlineButton( - text, - KeyboardButtonRequestUser.Common(requestId, premiumUser) -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Any] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestUserOrBotInlineButton( - text: String, - requestId: RequestId -) = requestUserInlineButton( - text, - KeyboardButtonRequestUser.Any(requestId) -) - - -/** - * Creates and put [RequestChatKeyboardButton] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestChatInlineButton( - text: String, - requestChat: KeyboardButtonRequestChat -) = RequestChatInlineKeyboardButton( - text, - requestChat -) - -/** - * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun requestChatInlineButton( - text: String, - requestId: RequestId, - isChannel: Boolean? = null, - isForum: Boolean? = null, - withUsername: Boolean? = null, - ownedBy: Boolean? = null, - userRightsInChat: ChatAdministratorRights? = null, - botRightsInChat: ChatAdministratorRights? = null, - botIsMember: Boolean = false -) = requestChatInlineButton( - text, - KeyboardButtonRequestChat( - requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember - ) -) - diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt index dd8debb4fe..dba7cac982 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt @@ -69,3 +69,99 @@ inline fun webAppReplyButton( text: String, url: String ) = webAppReplyButton(text, WebAppInfo(url)) + + +/** + * Creates and put [RequestUserKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestUserReplyButton( + text: String, + requestUser: KeyboardButtonRequestUser +) = RequestUserKeyboardButton( + text, + requestUser +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Bot] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestBotReplyButton( + text: String, + requestId: RequestId +) = requestUserReplyButton( + text, + KeyboardButtonRequestUser.Bot(requestId) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Common] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestUserReplyButton( + text: String, + requestId: RequestId, + premiumUser: Boolean? = null +) = requestUserReplyButton( + text, + KeyboardButtonRequestUser.Common(requestId, premiumUser) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Any] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestUserOrBotReplyButton( + text: String, + requestId: RequestId +) = requestUserReplyButton( + text, + KeyboardButtonRequestUser.Any(requestId) +) + + +/** + * Creates and put [RequestChatKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestChatReplyButton( + text: String, + requestChat: KeyboardButtonRequestChat +) = RequestChatKeyboardButton( + text, + requestChat +) + +/** + * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestChatReplyButton( + text: String, + requestId: RequestId, + isChannel: Boolean? = null, + isForum: Boolean? = null, + withUsername: Boolean? = null, + ownedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean = false +) = requestChatReplyButton( + text, + KeyboardButtonRequestChat( + requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember + ) +) diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/InlineKeyboardBuilder.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/InlineKeyboardBuilder.kt index 3b23df15fd..69037b21e3 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/InlineKeyboardBuilder.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/InlineKeyboardBuilder.kt @@ -3,12 +3,6 @@ package dev.inmo.tgbotapi.extensions.utils.types.buttons import dev.inmo.tgbotapi.types.LoginURL import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.* import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup -import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestChat -import dev.inmo.tgbotapi.types.buttons.KeyboardButtonRequestUser -import dev.inmo.tgbotapi.types.buttons.inline.requestChatInlineButton -import dev.inmo.tgbotapi.types.buttons.inline.requestUserInlineButton -import dev.inmo.tgbotapi.types.chat.member.ChatAdministratorRights -import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.webapps.WebAppInfo import dev.inmo.tgbotapi.utils.* @@ -167,103 +161,3 @@ inline fun InlineKeyboardRowBuilder.webAppButton( text: String, url: String ) = webAppButton(text, WebAppInfo(url)) - - -/** - * Creates and put [RequestUserKeyboardButton] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun InlineKeyboardRowBuilder.requestUserButton( - text: String, - requestUser: KeyboardButtonRequestUser -) = add( - requestUserInlineButton( - text, - requestUser - ) -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Bot] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun InlineKeyboardRowBuilder.requestBotButton( - text: String, - requestId: RequestId -) = requestUserButton( - text, - KeyboardButtonRequestUser.Bot(requestId) -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Common] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun InlineKeyboardRowBuilder.requestUserButton( - text: String, - requestId: RequestId, - premiumUser: Boolean? = null -) = requestUserButton( - text, - KeyboardButtonRequestUser.Common(requestId, premiumUser) -) - -/** - * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Any] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun InlineKeyboardRowBuilder.requestUserOrBotButton( - text: String, - requestId: RequestId -) = requestUserButton( - text, - KeyboardButtonRequestUser.Any(requestId) -) - - -/** - * Creates and put [RequestChatKeyboardButton] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun InlineKeyboardRowBuilder.requestChatButton( - text: String, - requestChat: KeyboardButtonRequestChat -) = add( - requestChatInlineButton( - text, - requestChat - ) -) - -/** - * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat] - * - * @see replyKeyboard - * @see ReplyKeyboardBuilder.row - */ -inline fun InlineKeyboardRowBuilder.requestChatButton( - text: String, - requestId: RequestId, - isChannel: Boolean? = null, - isForum: Boolean? = null, - withUsername: Boolean? = null, - ownedBy: Boolean? = null, - userRightsInChat: ChatAdministratorRights? = null, - botRightsInChat: ChatAdministratorRights? = null, - botIsMember: Boolean = false -) = requestChatButton( - text, - KeyboardButtonRequestChat( - requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember - ) -) diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt index 9bd0909aa1..3b8cce77cf 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt @@ -1,6 +1,10 @@ package dev.inmo.tgbotapi.extensions.utils.types.buttons import dev.inmo.tgbotapi.types.buttons.* +import dev.inmo.tgbotapi.types.buttons.reply.requestChatReplyButton +import dev.inmo.tgbotapi.types.buttons.reply.requestUserReplyButton +import dev.inmo.tgbotapi.types.chat.member.ChatAdministratorRights +import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.webapps.WebAppInfo import dev.inmo.tgbotapi.utils.* @@ -138,3 +142,103 @@ inline fun ReplyKeyboardRowBuilder.webAppButton( text: String, url: String ) = webAppButton(text, WebAppInfo(url)) + + +/** + * Creates and put [RequestUserKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestUserButton( + text: String, + requestUser: KeyboardButtonRequestUser +) = add( + requestUserReplyButton( + text, + requestUser + ) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Bot] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestBotButton( + text: String, + requestId: RequestId +) = requestUserButton( + text, + KeyboardButtonRequestUser.Bot(requestId) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Common] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestUserButton( + text: String, + requestId: RequestId, + premiumUser: Boolean? = null +) = requestUserButton( + text, + KeyboardButtonRequestUser.Common(requestId, premiumUser) +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUser.Any] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestUserOrBotButton( + text: String, + requestId: RequestId +) = requestUserButton( + text, + KeyboardButtonRequestUser.Any(requestId) +) + + +/** + * Creates and put [RequestChatKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestChatButton( + text: String, + requestChat: KeyboardButtonRequestChat +) = add( + requestChatReplyButton( + text, + requestChat + ) +) + +/** + * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestChatButton( + text: String, + requestId: RequestId, + isChannel: Boolean? = null, + isForum: Boolean? = null, + withUsername: Boolean? = null, + ownedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean = false +) = requestChatButton( + text, + KeyboardButtonRequestChat( + requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember + ) +) From e235280253b3e51c5d3004a6164442d30e412186 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 22:29:21 +0600 Subject: [PATCH 16/19] fixes in RequestId --- .../inmo/tgbotapi/types/request/RequestId.kt | 4 +-- .../extensions/utils/ClassCastsNew.kt | 26 ------------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt index 12f3685d2f..5263de2366 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/request/RequestId.kt @@ -7,9 +7,9 @@ import kotlin.random.Random @Serializable @JvmInline value class RequestId( - val float: Float + val float: Int ) { companion object { - fun random() = RequestId(Random.nextFloat()) + fun random() = RequestId(Random.nextInt()) } } 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 6f65a44f03..ceb2d6ba00 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 @@ -107,8 +107,6 @@ import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.CallbackGameInlineK import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.InlineKeyboardButton import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.LoginURLInlineKeyboardButton import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.PayInlineKeyboardButton -import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestChatInlineKeyboardButton -import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestUserInlineKeyboardButton import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.SwitchInlineQueryCurrentChatInlineKeyboardButton import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.SwitchInlineQueryInlineKeyboardButton import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.URLInlineKeyboardButton @@ -1884,30 +1882,6 @@ public inline fun InlineKeyboardButton.ifWebAppInlineKeyboardButton(block: (WebAppInlineKeyboardButton) -> T): T? = webAppInlineKeyboardButtonOrNull() ?.let(block) -public inline fun InlineKeyboardButton.requestUserInlineKeyboardButtonOrNull(): - RequestUserInlineKeyboardButton? = this as? - dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestUserInlineKeyboardButton - -public inline fun InlineKeyboardButton.requestUserInlineKeyboardButtonOrThrow(): - RequestUserInlineKeyboardButton = this as - dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestUserInlineKeyboardButton - -public inline fun - InlineKeyboardButton.ifRequestUserInlineKeyboardButton(block: (RequestUserInlineKeyboardButton) -> T): - T? = requestUserInlineKeyboardButtonOrNull() ?.let(block) - -public inline fun InlineKeyboardButton.requestChatInlineKeyboardButtonOrNull(): - RequestChatInlineKeyboardButton? = this as? - dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestChatInlineKeyboardButton - -public inline fun InlineKeyboardButton.requestChatInlineKeyboardButtonOrThrow(): - RequestChatInlineKeyboardButton = this as - dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.RequestChatInlineKeyboardButton - -public inline fun - InlineKeyboardButton.ifRequestChatInlineKeyboardButton(block: (RequestChatInlineKeyboardButton) -> T): - T? = requestChatInlineKeyboardButtonOrNull() ?.let(block) - public inline fun KeyboardMarkup.inlineKeyboardMarkupOrNull(): InlineKeyboardMarkup? = this as? dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup From 12ac227d2d003c40e5cb7e80b20ca95d24f30c2b Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 23:18:14 +0600 Subject: [PATCH 17/19] small fix in request chat button --- .../inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt | 2 +- .../extensions/utils/types/buttons/ReplyKeyboardBuilder.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt index e423daeb57..a78ed9bb78 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt @@ -33,6 +33,6 @@ data class KeyboardButtonRequestChat( @SerialName(botAdministratorRightsField) val botRightsInChat: ChatAdministratorRights? = null, @SerialName(botIsMemberField) - val botIsMember: Boolean = false + val botIsMember: Boolean? = null ) diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt index 3b8cce77cf..a41a2cb0f1 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt @@ -235,7 +235,7 @@ inline fun ReplyKeyboardRowBuilder.requestChatButton( ownedBy: Boolean? = null, userRightsInChat: ChatAdministratorRights? = null, botRightsInChat: ChatAdministratorRights? = null, - botIsMember: Boolean = false + botIsMember: Boolean? = null ) = requestChatButton( text, KeyboardButtonRequestChat( From aca076381b4203af7fb686ec9913a58c1a4ca68f Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 23:26:41 +0600 Subject: [PATCH 18/19] renames in request buttons --- .../types/buttons/KeyboardButtonRequestChat.kt | 7 ++----- .../buttons/reply/ReplyKeyboardButtonsShortcuts.kt | 13 ++++++++++--- .../utils/types/buttons/ReplyKeyboardBuilder.kt | 13 ++++++++++--- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt index a78ed9bb78..487b9ad57f 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt @@ -10,11 +10,8 @@ import dev.inmo.tgbotapi.types.chatIsForumField import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.requestIdField import dev.inmo.tgbotapi.types.userAdministratorRightsField -import kotlinx.serialization.EncodeDefault -import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient @Serializable data class KeyboardButtonRequestChat( @@ -25,9 +22,9 @@ data class KeyboardButtonRequestChat( @SerialName(chatIsForumField) val isForum: Boolean? = null, @SerialName(chatHasUsernameField) - val withUsername: Boolean? = null, + val isPublic: Boolean? = null, @SerialName(chatIsCreatedField) - val ownedBy: Boolean? = null, + val isOwnedBy: Boolean? = null, @SerialName(userAdministratorRightsField) val userRightsInChat: ChatAdministratorRights? = null, @SerialName(botAdministratorRightsField) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt index dba7cac982..e6c495d990 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt @@ -154,14 +154,21 @@ inline fun requestChatReplyButton( requestId: RequestId, isChannel: Boolean? = null, isForum: Boolean? = null, - withUsername: Boolean? = null, - ownedBy: Boolean? = null, + isPublic: Boolean? = null, + isOwnedBy: Boolean? = null, userRightsInChat: ChatAdministratorRights? = null, botRightsInChat: ChatAdministratorRights? = null, botIsMember: Boolean = false ) = requestChatReplyButton( text, KeyboardButtonRequestChat( - requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember + requestId = requestId, + isChannel = isChannel, + isForum = isForum, + isPublic = isPublic, + isOwnedBy = isOwnedBy, + userRightsInChat = userRightsInChat, + botRightsInChat = botRightsInChat, + botIsMember = botIsMember ) ) diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt index a41a2cb0f1..12a6216558 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt @@ -231,14 +231,21 @@ inline fun ReplyKeyboardRowBuilder.requestChatButton( requestId: RequestId, isChannel: Boolean? = null, isForum: Boolean? = null, - withUsername: Boolean? = null, - ownedBy: Boolean? = null, + isPublic: Boolean? = null, + isOwnedBy: Boolean? = null, userRightsInChat: ChatAdministratorRights? = null, botRightsInChat: ChatAdministratorRights? = null, botIsMember: Boolean? = null ) = requestChatButton( text, KeyboardButtonRequestChat( - requestId, isChannel, isForum, withUsername, ownedBy, userRightsInChat, botRightsInChat, botIsMember + requestId = requestId, + isChannel = isChannel, + isForum = isForum, + isPublic = isPublic, + isOwnedBy = isOwnedBy, + userRightsInChat = userRightsInChat, + botRightsInChat = botRightsInChat, + botIsMember = botIsMember ) ) From 2a3ffd707ecf69f8763df1316891513663aa3d04 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 5 Feb 2023 23:41:02 +0600 Subject: [PATCH 19/19] improvements in KeyboardButtonRequestChat --- .../buttons/KeyboardButtonRequestChat.kt | 45 ++++++++++++++- .../reply/ReplyKeyboardButtonsShortcuts.kt | 55 +++++++++++++++++++ .../types/buttons/ReplyKeyboardBuilder.kt | 54 ++++++++++++++++++ 3 files changed, 153 insertions(+), 1 deletion(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt index 487b9ad57f..fccb2c64ce 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/KeyboardButtonRequestChat.kt @@ -13,6 +13,10 @@ import dev.inmo.tgbotapi.types.userAdministratorRightsField import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +/** + * @see Channel + * @see Group + */ @Serializable data class KeyboardButtonRequestChat( @SerialName(requestIdField) @@ -31,5 +35,44 @@ data class KeyboardButtonRequestChat( val botRightsInChat: ChatAdministratorRights? = null, @SerialName(botIsMemberField) val botIsMember: Boolean? = null -) +) { + companion object { + fun Channel( + requestId: RequestId, + isPublic: Boolean? = null, + isOwnedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean? = null + ) = KeyboardButtonRequestChat( + requestId = requestId, + isChannel = true, + isForum = null, + isPublic = isPublic, + isOwnedBy = isOwnedBy, + userRightsInChat = userRightsInChat, + botRightsInChat = botRightsInChat, + botIsMember = botIsMember + ) + + fun Group( + requestId: RequestId, + isForum: Boolean? = null, + isPublic: Boolean? = null, + isOwnedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean? = null + ) = KeyboardButtonRequestChat( + requestId = requestId, + isChannel = false, + isForum = isForum, + isPublic = isPublic, + isOwnedBy = isOwnedBy, + userRightsInChat = userRightsInChat, + botRightsInChat = botRightsInChat, + botIsMember = botIsMember + ) + } +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt index e6c495d990..434faf7723 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/buttons/reply/ReplyKeyboardButtonsShortcuts.kt @@ -172,3 +172,58 @@ inline fun requestChatReplyButton( botIsMember = botIsMember ) ) + +/** + * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat.Channel] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestChannelReplyButton( + text: String, + requestId: RequestId, + isPublic: Boolean? = null, + isOwnedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean = false +) = requestChatReplyButton( + text, + KeyboardButtonRequestChat.Channel( + requestId = requestId, + isPublic = isPublic, + isOwnedBy = isOwnedBy, + userRightsInChat = userRightsInChat, + botRightsInChat = botRightsInChat, + botIsMember = botIsMember + ) +) + + +/** + * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat.Group] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun requestChannelReplyButton( + text: String, + requestId: RequestId, + isForum: Boolean? = null, + isPublic: Boolean? = null, + isOwnedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean? = null +) = requestChatReplyButton( + text, + KeyboardButtonRequestChat.Group( + requestId = requestId, + isForum = isForum, + isPublic = isPublic, + isOwnedBy = isOwnedBy, + userRightsInChat = userRightsInChat, + botRightsInChat = botRightsInChat, + botIsMember = botIsMember + ) +) diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt index 12a6216558..22acc0e117 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt @@ -249,3 +249,57 @@ inline fun ReplyKeyboardRowBuilder.requestChatButton( botIsMember = botIsMember ) ) + +/** + * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat.Channel] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestChannelButton( + text: String, + requestId: RequestId, + isPublic: Boolean? = null, + isOwnedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean? = null +) = requestChatButton( + text, + KeyboardButtonRequestChat.Channel( + requestId = requestId, + isPublic = isPublic, + isOwnedBy = isOwnedBy, + userRightsInChat = userRightsInChat, + botRightsInChat = botRightsInChat, + botIsMember = botIsMember + ) +) + +/** + * Creates and put [RequestChatKeyboardButton] with [KeyboardButtonRequestChat.Group] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestGroupButton( + text: String, + requestId: RequestId, + isForum: Boolean? = null, + isPublic: Boolean? = null, + isOwnedBy: Boolean? = null, + userRightsInChat: ChatAdministratorRights? = null, + botRightsInChat: ChatAdministratorRights? = null, + botIsMember: Boolean? = null +) = requestChatButton( + text, + KeyboardButtonRequestChat.Group( + requestId = requestId, + isForum = isForum, + isPublic = isPublic, + isOwnedBy = isOwnedBy, + userRightsInChat = userRightsInChat, + botRightsInChat = botRightsInChat, + botIsMember = botIsMember + ) +)