From cd596cc66d8cf3cd1e409eee97c2cdc7605194e8 Mon Sep 17 00:00:00 2001 From: madhead Date: Fri, 3 Feb 2023 22:14:35 +0100 Subject: [PATCH 1/2] Replaced the fields `can_send_media_messages` in the classes `RestrictedChatMember` and `ChatPermissions` with separate fields `can_send_audios`, `can_send_documents`, `can_send_photos`, `can_send_videos`, `can_send_video_notes`, and `can_send_voice_notes` for different media types. --- CHANGELOG.md | 4 +++ .../kotlin/dev/inmo/tgbotapi/types/Common.kt | 7 ++++- .../tgbotapi/types/chat/ChatPermissions.kt | 28 ++++++++++++++++--- .../types/chat/member/RestrictedChatMember.kt | 14 ++++++++-- 4 files changed, 46 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 454365a007..3697567e16 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 + * Replaced the fields `can_send_media_messages` in the classes `ChatMemberRestricted` and `ChatPermissions` with separate fields `can_send_audios`, `can_send_documents`, `can_send_photos`, `can_send_videos`, `can_send_video_notes`, and `can_send_voice_notes` for different media types. + ## 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..7a768ba8ab 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 @@ -327,7 +327,12 @@ const val scopeField = "scope" const val isMemberField = "is_member" const val isForumField = "is_forum" const val canSendMessagesField = "can_send_messages" -const val canSendMediaMessagesField = "can_send_media_messages" +const val canSendAudiosField = "can_send_audios" +const val canSendDocumentsField = "can_send_documents" +const val canSendPhotosField = "can_send_photos" +const val canSendVideosField = "can_send_videos" +const val canSendVideoNotesField = "can_send_video_notes" +const val canSendVoiceNotesField = "can_send_voice_notes" const val canSendOtherMessagesField = "can_send_other_messages" const val canSendPollsField = "can_send_polls" const val canAddWebPagePreviewsField = "can_add_web_page_previews" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatPermissions.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatPermissions.kt index 67091d9bd4..1813594891 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatPermissions.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatPermissions.kt @@ -8,8 +8,18 @@ import kotlinx.serialization.Serializable data class ChatPermissions( @SerialName(canSendMessagesField) val canSendMessages: Boolean = false, - @SerialName(canSendMediaMessagesField) - val canSendMediaMessages: Boolean = false, + @SerialName(canSendAudiosField) + val canSendAudios: Boolean = false, + @SerialName(canSendDocumentsField) + val canSendDocuments: Boolean = false, + @SerialName(canSendPhotosField) + val canSendPhotos: Boolean = false, + @SerialName(canSendVideosField) + val canSendVideos: Boolean = false, + @SerialName(canSendVideoNotesField) + val canSendVideoNotes: Boolean = false, + @SerialName(canSendVoiceNotesField) + val canSendVoiceNotes: Boolean = false, @SerialName(canSendPollsField) val canSendPolls: Boolean = false, @SerialName(canSendOtherMessagesField) @@ -26,7 +36,12 @@ data class ChatPermissions( val LeftRestrictionsChatPermissions = ChatPermissions( canSendMessages = true, - canSendMediaMessages = true, + canSendAudios = true, + canSendDocuments = true, + canSendPhotos = true, + canSendVideos = true, + canSendVideoNotes = true, + canSendVoiceNotes = true, canSendPolls = true, canSendOtherMessages = true, canAddWebPagePreviews = true, @@ -37,7 +52,12 @@ val LeftRestrictionsChatPermissions = ChatPermissions( val RestrictionsChatPermissions = ChatPermissions( canSendMessages = false, - canSendMediaMessages = false, + canSendAudios = false, + canSendDocuments = false, + canSendPhotos = false, + canSendVideos = false, + canSendVideoNotes = false, + canSendVoiceNotes = false, canSendPolls = false, canSendOtherMessages = false, canAddWebPagePreviews = false, diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/member/RestrictedChatMember.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/member/RestrictedChatMember.kt index c3449784c8..610ef1ca7a 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/member/RestrictedChatMember.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/member/RestrictedChatMember.kt @@ -14,8 +14,18 @@ data class RestrictedChatMember( val isMember: Boolean = false, @SerialName(canSendMessagesField) val canSendMessages: Boolean = false, - @SerialName(canSendMediaMessagesField) - val canSendMediaMessages: Boolean = false, + @SerialName(canSendAudiosField) + val canSendAudios: Boolean = false, + @SerialName(canSendDocumentsField) + val canSendDocuments: Boolean = false, + @SerialName(canSendPhotosField) + val canSendPhotos: Boolean = false, + @SerialName(canSendVideosField) + val canSendVideos: Boolean = false, + @SerialName(canSendVideoNotesField) + val canSendVideoNotes: Boolean = false, + @SerialName(canSendVoiceNotesField) + val canSendVoiceNotes: Boolean = false, @SerialName(canSendPollsField) val canSendPolls: Boolean = false, @SerialName(canSendOtherMessagesField) From 1e4a78c812d4f376742f915a00fc8b6d34014225 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 6 Feb 2023 00:21:46 +0600 Subject: [PATCH 2/2] add support for independent chat permissions --- .../api/chat/members/RestrictChatMember.kt | 20 ++-- .../api/chat/modify/SetChatPermissions.kt | 10 +- .../chat/members/RestrictChatMember.kt | 4 +- .../chat/modify/SetChatPermissions.kt | 4 +- .../kotlin/dev/inmo/tgbotapi/types/Common.kt | 1 + .../tgbotapi/types/chat/ChatPermissions.kt | 94 ++++++++++++++++--- 6 files changed, 105 insertions(+), 28 deletions(-) diff --git a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/RestrictChatMember.kt b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/RestrictChatMember.kt index 10ef93a219..2ebf2e47b5 100644 --- a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/RestrictChatMember.kt +++ b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/RestrictChatMember.kt @@ -14,27 +14,31 @@ suspend fun TelegramBot.restrictChatMember( chatId: ChatIdentifier, userId: UserId, untilDate: TelegramDate? = null, - permissions: ChatPermissions = ChatPermissions() -) = execute(RestrictChatMember(chatId, userId, untilDate, permissions)) + permissions: ChatPermissions = ChatPermissions(), + useIndependentChatPermissions: Boolean? = permissions.isGranular.takeIf { it } +) = execute(RestrictChatMember(chatId, userId, untilDate, permissions, useIndependentChatPermissions)) suspend fun TelegramBot.restrictChatMember( chat: PublicChat, userId: UserId, untilDate: TelegramDate? = null, - permissions: ChatPermissions = ChatPermissions() -) = restrictChatMember(chat.id, userId, untilDate, permissions) + permissions: ChatPermissions = ChatPermissions(), + useIndependentChatPermissions: Boolean? = permissions.isGranular.takeIf { it } +) = restrictChatMember(chat.id, userId, untilDate, permissions, useIndependentChatPermissions) suspend fun TelegramBot.restrictChatMember( chatId: IdChatIdentifier, user: User, untilDate: TelegramDate? = null, - permissions: ChatPermissions = ChatPermissions() -) = restrictChatMember(chatId, user.id, untilDate, permissions) + permissions: ChatPermissions = ChatPermissions(), + useIndependentChatPermissions: Boolean? = permissions.isGranular.takeIf { it } +) = restrictChatMember(chatId, user.id, untilDate, permissions, useIndependentChatPermissions) suspend fun TelegramBot.restrictChatMember( chat: PublicChat, user: User, untilDate: TelegramDate? = null, - permissions: ChatPermissions = ChatPermissions() -) = restrictChatMember(chat.id, user.id, untilDate, permissions) + permissions: ChatPermissions = ChatPermissions(), + useIndependentChatPermissions: Boolean? = permissions.isGranular.takeIf { it } +) = restrictChatMember(chat.id, user.id, untilDate, permissions, useIndependentChatPermissions) diff --git a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/modify/SetChatPermissions.kt b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/modify/SetChatPermissions.kt index 1c6e3cb7db..1efc595e20 100644 --- a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/modify/SetChatPermissions.kt +++ b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/modify/SetChatPermissions.kt @@ -8,10 +8,12 @@ import dev.inmo.tgbotapi.types.chat.PublicChat suspend fun TelegramBot.setDefaultChatMembersPermissions( chatId: ChatIdentifier, - permissions: ChatPermissions -) = execute(SetChatPermissions(chatId, permissions)) + permissions: ChatPermissions, + useIndependentChatPermissions: Boolean? = permissions.isGranular.takeIf { it } +) = execute(SetChatPermissions(chatId, permissions, useIndependentChatPermissions)) suspend fun TelegramBot.setDefaultChatMembersPermissions( chat: PublicChat, - permissions: ChatPermissions -) = setDefaultChatMembersPermissions(chat.id, permissions) + permissions: ChatPermissions, + useIndependentChatPermissions: Boolean? = permissions.isGranular.takeIf { it } +) = setDefaultChatMembersPermissions(chat.id, permissions, useIndependentChatPermissions) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/RestrictChatMember.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/RestrictChatMember.kt index 92e3dc2458..bdb9cc5afe 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/RestrictChatMember.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/RestrictChatMember.kt @@ -16,7 +16,9 @@ data class RestrictChatMember( @SerialName(untilDateField) override val untilDate: TelegramDate? = null, @SerialName(permissionsField) - val permissions: ChatPermissions = ChatPermissions() + val permissions: ChatPermissions = ChatPermissions(), + @SerialName(useIndependentChatPermissionsField) + val useIndependentChatPermissions: Boolean? = permissions.isGranular.takeIf { it } ) : ChatMemberRequest, UntilDate { override fun method(): String = "restrictChatMember" override val resultDeserializer: DeserializationStrategy diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/modify/SetChatPermissions.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/modify/SetChatPermissions.kt index 04e292771b..6d854aa572 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/modify/SetChatPermissions.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/modify/SetChatPermissions.kt @@ -12,7 +12,9 @@ data class SetChatPermissions ( @SerialName(chatIdField) override val chatId: ChatIdentifier, @SerialName(permissionsField) - val permissions: ChatPermissions + val permissions: ChatPermissions, + @SerialName(useIndependentChatPermissionsField) + val useIndependentChatPermissions: Boolean? = permissions.isGranular.takeIf { it } ): ChatRequest, SimpleRequest { override fun method(): String = "setChatPermissions" override val resultDeserializer: DeserializationStrategy 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 7a768ba8ab..fd27601da9 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 @@ -350,6 +350,7 @@ const val canPinMessagesField = "can_pin_messages" const val canPromoteMembersField = "can_promote_members" const val canManageVoiceChatsField = "can_manage_voice_chats" const val canManageVideoChatsField = "can_manage_video_chats" +const val useIndependentChatPermissionsField = "use_independent_chat_permissions" const val rightsField = "rights" const val forChannelsField = "for_channels" const val canManageChatField = "can_manage_chat" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatPermissions.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatPermissions.kt index 1813594891..cdccdf2e65 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatPermissions.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/ChatPermissions.kt @@ -1,38 +1,104 @@ package dev.inmo.tgbotapi.types.chat import dev.inmo.tgbotapi.types.* +import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @Serializable data class ChatPermissions( @SerialName(canSendMessagesField) - val canSendMessages: Boolean = false, + val canSendMessages: Boolean? = null, @SerialName(canSendAudiosField) - val canSendAudios: Boolean = false, + val canSendAudios: Boolean? = null, @SerialName(canSendDocumentsField) - val canSendDocuments: Boolean = false, + val canSendDocuments: Boolean? = null, @SerialName(canSendPhotosField) - val canSendPhotos: Boolean = false, + val canSendPhotos: Boolean? = null, @SerialName(canSendVideosField) - val canSendVideos: Boolean = false, + val canSendVideos: Boolean? = null, @SerialName(canSendVideoNotesField) - val canSendVideoNotes: Boolean = false, + val canSendVideoNotes: Boolean? = null, @SerialName(canSendVoiceNotesField) - val canSendVoiceNotes: Boolean = false, + val canSendVoiceNotes: Boolean? = null, @SerialName(canSendPollsField) - val canSendPolls: Boolean = false, + val canSendPolls: Boolean? = null, @SerialName(canSendOtherMessagesField) - val canSendOtherMessages: Boolean = false, + val canSendOtherMessages: Boolean? = null, @SerialName(canAddWebPagePreviewsField) - val canAddWebPagePreviews: Boolean = false, + val canAddWebPagePreviews: Boolean? = null, @SerialName(canChangeInfoField) - val canChangeInfo: Boolean = false, + val canChangeInfo: Boolean? = null, @SerialName(canInviteUsersField) - val canInviteUsers: Boolean = false, + val canInviteUsers: Boolean? = null, @SerialName(canPinMessagesField) - val canPinMessages: Boolean = false -) + val canPinMessages: Boolean? = null +) { + @Transient + val isGranular + get() = canSendAudios != null || + canSendDocuments != null || + canSendVideoNotes != null || + canSendPhotos != null || + canSendVideos != null || + canSendVoiceNotes != null + + companion object { + fun Granular( + canSendMessages: Boolean? = null, + canSendAudios: Boolean? = null, + canSendDocuments: Boolean? = null, + canSendPhotos: Boolean? = null, + canSendVideos: Boolean? = null, + canSendVideoNotes: Boolean? = null, + canSendVoiceNotes: Boolean? = null, + canSendPolls: Boolean? = null, + canSendOtherMessages: Boolean? = null, + canAddWebPagePreviews: Boolean? = null, + canChangeInfo: Boolean? = null, + canInviteUsers: Boolean? = null, + canPinMessages: Boolean? = null + ) = ChatPermissions( + canSendMessages = canSendMessages, + canSendAudios = canSendAudios, + canSendDocuments = canSendDocuments, + canSendPhotos = canSendPhotos, + canSendVideos = canSendVideos, + canSendVideoNotes = canSendVideoNotes, + canSendVoiceNotes = canSendVoiceNotes, + canSendPolls = canSendPolls, + canSendOtherMessages = canSendOtherMessages, + canAddWebPagePreviews = canAddWebPagePreviews, + canChangeInfo = canChangeInfo, + canInviteUsers = canInviteUsers, + canPinMessages = canPinMessages + ) + + fun Commonized( + canSendPolls: Boolean? = null, + canSendOtherMessages: Boolean? = null, + canAddWebPagePreviews: Boolean? = null, + canChangeInfo: Boolean? = null, + canInviteUsers: Boolean? = null, + canPinMessages: Boolean? = null + ) = ChatPermissions( + canSendMessages = canSendPolls, + canSendAudios = null, + canSendDocuments = null, + canSendPhotos = null, + canSendVideos = null, + canSendVideoNotes = null, + canSendVoiceNotes = null, + canSendPolls = canSendPolls, + canSendOtherMessages = canSendOtherMessages, + canAddWebPagePreviews = canAddWebPagePreviews, + canChangeInfo = canChangeInfo, + canInviteUsers = canInviteUsers, + canPinMessages = canPinMessages + ) + } +} val LeftRestrictionsChatPermissions = ChatPermissions( canSendMessages = true,