diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e9201fc30..266b1ce541 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # TelegramBotAPI changelog +## 0.37.2 Telegram Bot API 5.5 + +* `Common`: + * `Version`: + * `MicroUtils`: `0.8.2` -> `0.8.7` +* `Core`: + * New request type: `ChatSenderRequest` + * New request `BanChatSenderChat` + * New request `UnbanChatSenderChat` + * `ExtendedPrivateChat` got new properties: `hasPrivateForwards` and `allowCreateUserIdLink` (same as `hasPrivateForwards`) + * All `ContentMessage` got field `forwardable` (old constructors marked as `Deprecated`) + * `ChannelContentMessage` has been divided for two interfaces (and corresponding classes): + * `ConnectedChannelContentMessage` (and `ConnectedChannelContentMessageImpl`) for connected to the group channels messages + * `UnconnectedChannelContentMessage` (and `UnconnectedChannelContentMessageImpl`) for unconnected channels +* `API`: + * New extensions `TelegramBot#banChatSenderChat` + * New extensions `TelegramBot#unbanChatSenderChat` +* `Utils`: + * Fix of `EntitiesBuilder#linkln` + ## 0.37.1 * `Common`: diff --git a/README.md b/README.md index 947bfe1a7d..e53c782287 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# TelegramBotAPI [![Maven Central](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi) [![Supported version](https://img.shields.io/badge/Telegram%20Bot%20API-5.4-blue)](https://core.telegram.org/bots/api-changelog#november-5-2021) +# TelegramBotAPI [![Maven Central](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi) [![Supported version](https://img.shields.io/badge/Telegram%20Bot%20API-5.5-blue)](https://core.telegram.org/bots/api-changelog#december-7-2021) | [![Awesome Kotlin Badge](https://kotlin.link/awesome-kotlin.svg)](https://github.com/KotlinBy/awesome-kotlin) [![Build Status](https://github.com/InsanusMokrassar/TelegramBotAPI/workflows/Build/badge.svg)](https://github.com/InsanusMokrassar/TelegramBotAPI/actions) [![Small survey](https://img.shields.io/static/v1?label=Google&message=Survey&color=blue)](https://forms.gle/2Hex2ynbHWHhi1KY7) [![Chat in Telegram](https://img.shields.io/static/v1?label=Telegram&message=Chat&color=blue)](https://t.me/InMoTelegramBotAPI) | |:---:| diff --git a/gradle.properties b/gradle.properties index c3db7650a8..6311dfe804 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,11 +12,11 @@ klock_version=2.4.8 uuid_version=0.3.1 ktor_version=1.6.5 -micro_utils_version=0.8.2 +micro_utils_version=0.8.7 javax_activation_version=1.1.1 library_group=dev.inmo -library_version=0.37.1 +library_version=0.37.2 github_release_plugin_version=2.2.12 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e7fa36715f..87aa9bcb36 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip diff --git a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/BanChatSenderChat.kt b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/BanChatSenderChat.kt new file mode 100644 index 0000000000..c8300aba8e --- /dev/null +++ b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/BanChatSenderChat.kt @@ -0,0 +1,27 @@ +package dev.inmo.tgbotapi.extensions.api.chat.members + +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.requests.chat.members.BanChatMember +import dev.inmo.tgbotapi.requests.chat.members.BanChatSenderChat +import dev.inmo.tgbotapi.types.* +import dev.inmo.tgbotapi.types.chat.abstracts.PublicChat + +suspend fun TelegramBot.banChatSenderChat( + chatId: ChatIdentifier, + senderChatId: ChatId +) = execute(BanChatSenderChat(chatId, senderChatId)) + +suspend fun TelegramBot.banChatSenderChat( + chat: PublicChat, + senderChatId: ChatId +) = banChatSenderChat(chat.id, senderChatId) + +suspend fun TelegramBot.banChatSenderChat( + chatId: ChatId, + senderChat: PublicChat +) = banChatSenderChat(chatId, senderChat.id) + +suspend fun TelegramBot.banChatSenderChat( + chat: PublicChat, + senderChat: PublicChat, +) = banChatSenderChat(chat.id, senderChat) diff --git a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/UnbanChatSenderChat.kt b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/UnbanChatSenderChat.kt new file mode 100644 index 0000000000..683e4f37c7 --- /dev/null +++ b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/UnbanChatSenderChat.kt @@ -0,0 +1,26 @@ +package dev.inmo.tgbotapi.extensions.api.chat.members + +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.requests.chat.members.* +import dev.inmo.tgbotapi.types.* +import dev.inmo.tgbotapi.types.chat.abstracts.PublicChat + +suspend fun TelegramBot.unbanChatSenderChat( + chatId: ChatIdentifier, + senderChatId: ChatId +) = execute(UnbanChatSenderChat(chatId, senderChatId)) + +suspend fun TelegramBot.unbanChatSenderChat( + chat: PublicChat, + senderChatId: ChatId +) = unbanChatSenderChat(chat.id, senderChatId) + +suspend fun TelegramBot.unbanChatSenderChat( + chatId: ChatId, + senderChat: PublicChat +) = unbanChatSenderChat(chatId, senderChat.id) + +suspend fun TelegramBot.unbanChatSenderChat( + chat: PublicChat, + senderChat: PublicChat, +) = unbanChatSenderChat(chat.id, senderChat) diff --git a/tgbotapi.core/README.md b/tgbotapi.core/README.md index 23dd292ba0..b90216021c 100644 --- a/tgbotapi.core/README.md +++ b/tgbotapi.core/README.md @@ -26,9 +26,9 @@ moments are describing by official [Telegram Bot API](https://core.telegram.org/ Common ways to implement this library are presented here. In some cases it will require additional steps like inserting of additional libraries (like `kotlin stdlib`). In the examples will be used variable `telegrambotapi.version`, which must be set up by developer. Available versions are presented on -[bintray](https://bintray.com/insanusmokrassar/TelegramBotAPI/tgbotapi.core), next version is last published: +maven central, next version is last published: -[![Download](https://api.bintray.com/packages/insanusmokrassar/TelegramBotAPI/tgbotapi.core/images/download.svg) ](https://bintray.com/insanusmokrassar/TelegramBotAPI/tgbotapi.core/_latestVersion) +[![Maven Central](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi.core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi.core) Currently, last versions of library can be available from the Maven repository with errors (for the reason difficult in publishing of signed artifacts in Bintray). You can: diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/abstracts/ChatSenderRequest.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/abstracts/ChatSenderRequest.kt new file mode 100644 index 0000000000..9e036d772a --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/abstracts/ChatSenderRequest.kt @@ -0,0 +1,10 @@ +package dev.inmo.tgbotapi.requests.chat.abstracts + +import dev.inmo.tgbotapi.CommonAbstracts.types.ChatRequest +import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest +import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.UserId + +interface ChatSenderRequest : ChatRequest, SimpleRequest { + val senderChatId: ChatId +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/BanChatSenderChat.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/BanChatSenderChat.kt new file mode 100644 index 0000000000..6587275422 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/BanChatSenderChat.kt @@ -0,0 +1,23 @@ +package dev.inmo.tgbotapi.requests.chat.members + +import dev.inmo.tgbotapi.requests.chat.abstracts.ChatSenderRequest +import dev.inmo.tgbotapi.types.* +import kotlinx.serialization.* +import kotlinx.serialization.builtins.serializer + +/** + * Representation of [banChatSenderChat](https://core.telegram.org/bots/api#banchatsenderchat) request + */ +@Serializable +data class BanChatSenderChat( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(senderChatIdField) + override val senderChatId: ChatId +) : ChatSenderRequest { + override fun method(): String = "banChatSenderChat" + override val resultDeserializer: DeserializationStrategy + get() = Boolean.serializer() + override val requestSerializer: SerializationStrategy<*> + get() = serializer() +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/UnbanChatSenderChat.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/UnbanChatSenderChat.kt new file mode 100644 index 0000000000..8b43d5f038 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/UnbanChatSenderChat.kt @@ -0,0 +1,23 @@ +package dev.inmo.tgbotapi.requests.chat.members + +import dev.inmo.tgbotapi.requests.chat.abstracts.ChatSenderRequest +import dev.inmo.tgbotapi.types.* +import kotlinx.serialization.* +import kotlinx.serialization.builtins.serializer + +/** + * Representation of [unbanChatSenderChat](https://core.telegram.org/bots/api#unbanchatsenderchat) request + */ +@Serializable +data class UnbanChatSenderChat( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(senderChatIdField) + override val senderChatId: ChatId +) : ChatSenderRequest { + override fun method(): String = "unbanChatSenderChat" + override val resultDeserializer: DeserializationStrategy + get() = Boolean.serializer() + override val requestSerializer: SerializationStrategy<*> + get() = serializer() +} 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 7d864b5820..3b0116f2a9 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 @@ -96,6 +96,7 @@ val telegramInlineModeGifPermittedMimeTypes by lazy { } const val chatIdField = "chat_id" +const val senderChatIdField = "sender_chat_id" const val messageIdField = "message_id" const val updateIdField = "update_id" const val fromChatIdField = "from_chat_id" @@ -112,6 +113,7 @@ const val isBotField = "is_bot" const val firstNameField = "first_name" const val lastNameField = "last_name" const val languageCodeField = "language_code" +const val hasPrivateForwardsField = "has_private_forwards" const val canJoinGroupsField = "can_join_groups" const val canReadAllGroupMessagesField = "can_read_all_group_messages" const val supportInlineQueriesField = "supports_inline_queries" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/abstracts/extended/ExtendedPrivateChat.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/abstracts/extended/ExtendedPrivateChat.kt index 55a03723a5..8fb6617a95 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/abstracts/extended/ExtendedPrivateChat.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/abstracts/extended/ExtendedPrivateChat.kt @@ -7,4 +7,8 @@ import kotlinx.serialization.Serializable @Serializable(ExtendedChatSerializer::class) interface ExtendedPrivateChat : PrivateChat, ExtendedChat { val bio: String + val hasPrivateForwards: Boolean + + val allowCreateUserIdLink: Boolean + get() = hasPrivateForwards } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/extended/ExtendedPrivateChatImpl.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/extended/ExtendedPrivateChatImpl.kt index 4c1d9702de..4f1d86d55d 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/extended/ExtendedPrivateChatImpl.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/chat/extended/ExtendedPrivateChatImpl.kt @@ -18,5 +18,7 @@ data class ExtendedPrivateChatImpl( @SerialName(lastNameField) override val lastName: String = "", @SerialName(bioField) - override val bio: String = "" + override val bio: String = "", + @SerialName(hasPrivateForwardsField) + override val hasPrivateForwards: Boolean = false ) : ExtendedPrivateChat diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChannelMediaGroupMessage.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChannelMediaGroupMessage.kt index 3f3688e702..2bcad5e3ac 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChannelMediaGroupMessage.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChannelMediaGroupMessage.kt @@ -16,7 +16,21 @@ data class ChannelMediaGroupMessage( override val mediaGroupId: MediaGroupIdentifier, override val content: T, override val editDate: DateTime?, + override val forwardable: Boolean, override val forwardInfo: ForwardInfo?, override val replyTo: Message?, override val replyMarkup: InlineKeyboardMarkup? -) : MediaGroupMessage +) : MediaGroupMessage { + @Deprecated("Use the constructor with forwardable field") + constructor( + messageId: MessageIdentifier, + chat: Chat, + date: DateTime, + mediaGroupId: MediaGroupIdentifier, + content: T, + editDate: DateTime?, + forwardInfo: ForwardInfo?, + replyTo: Message?, + replyMarkup: InlineKeyboardMarkup? + ) : this(messageId, chat, date, mediaGroupId, content, editDate, true, forwardInfo, replyTo, replyMarkup) +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChannelMessageImpl.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChannelMessageImpl.kt deleted file mode 100644 index 6a0552ac1e..0000000000 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChannelMessageImpl.kt +++ /dev/null @@ -1,22 +0,0 @@ -package dev.inmo.tgbotapi.types.message - -import com.soywiz.klock.DateTime -import dev.inmo.tgbotapi.types.* -import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup -import dev.inmo.tgbotapi.types.chat.abstracts.ChannelChat -import dev.inmo.tgbotapi.types.message.abstracts.ChannelContentMessage -import dev.inmo.tgbotapi.types.message.abstracts.Message -import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent - -data class ChannelContentMessageImpl( - override val messageId: MessageIdentifier, - override val chat: ChannelChat, - override val content: T, - override val date: DateTime, - override val editDate: DateTime?, - override val forwardInfo: ForwardInfo?, - override val replyTo: Message?, - override val replyMarkup: InlineKeyboardMarkup?, - override val senderBot: CommonBot?, - override val authorSignature: AuthorSignature? -) : ChannelContentMessage diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/CommonMediaGroupMessage.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/CommonMediaGroupMessage.kt index 28bbacf8bc..af08de46f1 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/CommonMediaGroupMessage.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/CommonMediaGroupMessage.kt @@ -15,7 +15,22 @@ data class CommonMediaGroupMessage( override val mediaGroupId: MediaGroupIdentifier, override val content: T, override val editDate: DateTime?, + override val forwardable: Boolean, override val forwardInfo: ForwardInfo?, override val replyTo: Message?, override val replyMarkup: InlineKeyboardMarkup? -) : MediaGroupMessage, FromUserMessage +) : MediaGroupMessage, FromUserMessage { + @Deprecated("Use the constructor with forwardable field") + constructor( + messageId: MessageIdentifier, + from: User, + chat: Chat, + date: DateTime, + mediaGroupId: MediaGroupIdentifier, + content: T, + editDate: DateTime?, + forwardInfo: ForwardInfo?, + replyTo: Message?, + replyMarkup: InlineKeyboardMarkup? + ) : this(messageId, from, chat, date, mediaGroupId, content, editDate, true, forwardInfo, replyTo, replyMarkup) +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ConnectedChannelContentMessageImpl.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ConnectedChannelContentMessageImpl.kt new file mode 100644 index 0000000000..fcd348bbbe --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ConnectedChannelContentMessageImpl.kt @@ -0,0 +1,36 @@ +package dev.inmo.tgbotapi.types.message + +import com.soywiz.klock.DateTime +import dev.inmo.tgbotapi.types.* +import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup +import dev.inmo.tgbotapi.types.chat.abstracts.ChannelChat +import dev.inmo.tgbotapi.types.message.abstracts.* +import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent + +data class ConnectedChannelContentMessageImpl( + override val messageId: MessageIdentifier, + override val chat: ChannelChat, + override val content: T, + override val date: DateTime, + override val editDate: DateTime?, + override val forwardable: Boolean, + override val forwardInfo: ForwardInfo?, + override val replyTo: Message?, + override val replyMarkup: InlineKeyboardMarkup?, + override val senderBot: CommonBot?, + override val authorSignature: AuthorSignature? +) : ConnectedChannelContentMessage { + @Deprecated("Use the constructor with forwardable field") + constructor( + messageId: MessageIdentifier, + chat: ChannelChat, + content: T, + date: DateTime, + editDate: DateTime?, + forwardInfo: ForwardInfo?, + replyTo: Message?, + replyMarkup: InlineKeyboardMarkup?, + senderBot: CommonBot?, + authorSignature: AuthorSignature? + ) : this(messageId, chat, content, date, editDate, true, forwardInfo, replyTo, replyMarkup, senderBot, authorSignature) +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/GroupMessages.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/GroupMessages.kt index 0fee420bf2..296f64fae2 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/GroupMessages.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/GroupMessages.kt @@ -15,12 +15,28 @@ data class FromChannelGroupContentMessageImpl( override val date: DateTime, override val forwardInfo: ForwardInfo?, override val editDate: DateTime?, + override val forwardable: Boolean, override val replyTo: Message?, override val replyMarkup: InlineKeyboardMarkup?, override val content: T, override val senderBot: CommonBot?, override val authorSignature: AuthorSignature? -) : FromChannelGroupContentMessage +) : FromChannelGroupContentMessage { + @Deprecated("Use the constructor with forwardable field") + constructor( + chat: GroupChat, + channel: ChannelChat, + messageId: MessageIdentifier, + date: DateTime, + forwardInfo: ForwardInfo?, + editDate: DateTime?, + replyTo: Message?, + replyMarkup: InlineKeyboardMarkup?, + content: T, + senderBot: CommonBot?, + authorSignature: AuthorSignature? + ) : this(chat, channel, messageId, date, forwardInfo, editDate, true, replyTo, replyMarkup, content, senderBot, authorSignature) +} data class AnonymousGroupContentMessageImpl( override val chat: GroupChat, @@ -28,12 +44,27 @@ data class AnonymousGroupContentMessageImpl( override val date: DateTime, override val forwardInfo: ForwardInfo?, override val editDate: DateTime?, + override val forwardable: Boolean, override val replyTo: Message?, override val replyMarkup: InlineKeyboardMarkup?, override val content: T, override val senderBot: CommonBot?, override val authorSignature: AuthorSignature? -) : AnonymousGroupContentMessage +) : AnonymousGroupContentMessage { + @Deprecated("Use the constructor with forwardable field") + constructor( + chat: GroupChat, + messageId: MessageIdentifier, + date: DateTime, + forwardInfo: ForwardInfo?, + editDate: DateTime?, + replyTo: Message?, + replyMarkup: InlineKeyboardMarkup?, + content: T, + senderBot: CommonBot?, + authorSignature: AuthorSignature? + ) : this(chat, messageId, date, forwardInfo, editDate, true, replyTo, replyMarkup, content, senderBot, authorSignature) +} data class CommonGroupContentMessageImpl( override val chat: GroupChat, @@ -42,8 +73,23 @@ data class CommonGroupContentMessageImpl( override val date: DateTime, override val forwardInfo: ForwardInfo?, override val editDate: DateTime?, + override val forwardable: Boolean, override val replyTo: Message?, override val replyMarkup: InlineKeyboardMarkup?, override val content: T, override val senderBot: CommonBot? -) : CommonGroupContentMessage +) : CommonGroupContentMessage { + @Deprecated("Use the constructor with forwardable field") + constructor( + chat: GroupChat, + messageId: MessageIdentifier, + from: User, + date: DateTime, + forwardInfo: ForwardInfo?, + editDate: DateTime?, + replyTo: Message?, + replyMarkup: InlineKeyboardMarkup?, + content: T, + senderBot: CommonBot? + ) : this(chat, messageId, from, date, forwardInfo, editDate, true, replyTo, replyMarkup, content, senderBot) +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/PrivateMessageImpl.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/PrivateMessageImpl.kt index e8c0db2a94..00699bcfc9 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/PrivateMessageImpl.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/PrivateMessageImpl.kt @@ -7,7 +7,6 @@ import dev.inmo.tgbotapi.types.chat.abstracts.Chat import dev.inmo.tgbotapi.types.message.abstracts.Message import dev.inmo.tgbotapi.types.message.abstracts.PrivateContentMessage import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent -import dev.inmo.tgbotapi.types.message.payments.SuccessfulPaymentEvent data class PrivateContentMessageImpl( override val messageId: MessageIdentifier, @@ -16,8 +15,23 @@ data class PrivateContentMessageImpl( override val content: T, override val date: DateTime, override val editDate: DateTime?, + override val forwardable: Boolean, override val forwardInfo: ForwardInfo?, override val replyTo: Message?, override val replyMarkup: InlineKeyboardMarkup?, - override val senderBot: CommonBot?, -) : PrivateContentMessage + override val senderBot: CommonBot? +) : PrivateContentMessage { + @Deprecated("Use the constructor with forwardable field") + constructor( + messageId: MessageIdentifier, + from: User, + chat: Chat, + content: T, + date: DateTime, + editDate: DateTime?, + forwardInfo: ForwardInfo?, + replyTo: Message?, + replyMarkup: InlineKeyboardMarkup?, + senderBot: CommonBot? + ) : this(messageId, from, chat, content, date, editDate, true, forwardInfo, replyTo, replyMarkup, senderBot) +} 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 c17051fd19..26916b327b 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 @@ -42,9 +42,11 @@ internal data class RawMessage( private val forward_signature: ForwardSignature? = null, private val forward_sender_name: ForwardSenderName? = null, private val forward_date: TelegramDate? = null, + private val is_automatic_forward: Boolean? = null, private val reply_to_message: RawMessage? = null, private val via_bot: CommonBot? = null, private val edit_date: TelegramDate? = null, + private val has_protected_content: Boolean? = null, private val media_group_id: MediaGroupIdentifier? = null, private val author_signature: AuthorSignature? = null, private val text: String? = null, @@ -250,6 +252,7 @@ internal data class RawMessage( it, checkedContent, edit_date?.asDate, + has_protected_content != true, forwarded, reply_to_message?.asMessage, reply_markup @@ -262,6 +265,7 @@ internal data class RawMessage( it, checkedContent, edit_date?.asDate, + has_protected_content != true, forwarded, reply_to_message?.asMessage, reply_markup @@ -269,18 +273,35 @@ internal data class RawMessage( } } ?: when (chat) { is PublicChat -> when (chat) { - is ChannelChat -> ChannelContentMessageImpl( - messageId, - chat, - content, - date.asDate, - edit_date?.asDate, - forwarded, - reply_to_message?.asMessage, - reply_markup, - via_bot, - author_signature - ) + is ChannelChat -> if (is_automatic_forward == true) { + ConnectedChannelContentMessageImpl( + messageId, + chat, + content, + date.asDate, + edit_date?.asDate, + has_protected_content != true, + forwarded, + reply_to_message?.asMessage, + reply_markup, + via_bot, + author_signature + ) + } else { + UnconnectedChannelContentMessageImpl( + messageId, + chat, + content, + date.asDate, + edit_date?.asDate, + has_protected_content != true, + forwarded, + reply_to_message?.asMessage, + reply_markup, + via_bot, + author_signature + ) + } is GroupChat -> when (sender_chat) { is ChannelChat -> FromChannelGroupContentMessageImpl( chat, @@ -289,6 +310,7 @@ internal data class RawMessage( date.asDate, forwarded, edit_date ?.asDate, + has_protected_content != true, reply_to_message ?.asMessage, reply_markup, content, @@ -301,6 +323,7 @@ internal data class RawMessage( date.asDate, forwarded, edit_date ?.asDate, + has_protected_content != true, reply_to_message ?.asMessage, reply_markup, content, @@ -314,6 +337,7 @@ internal data class RawMessage( date.asDate, forwarded, edit_date ?.asDate, + has_protected_content != true, reply_to_message ?.asMessage, reply_markup, content, @@ -330,6 +354,7 @@ internal data class RawMessage( content, date.asDate, edit_date?.asDate, + has_protected_content != true, forwarded, reply_to_message?.asMessage, reply_markup, diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/UnconnectedChannelContentMessageImpl.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/UnconnectedChannelContentMessageImpl.kt new file mode 100644 index 0000000000..3ffbb01241 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/UnconnectedChannelContentMessageImpl.kt @@ -0,0 +1,39 @@ +package dev.inmo.tgbotapi.types.message + +import com.soywiz.klock.DateTime +import dev.inmo.tgbotapi.types.* +import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup +import dev.inmo.tgbotapi.types.chat.abstracts.ChannelChat +import dev.inmo.tgbotapi.types.message.abstracts.* +import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent + +data class UnconnectedChannelContentMessageImpl( + override val messageId: MessageIdentifier, + override val chat: ChannelChat, + override val content: T, + override val date: DateTime, + override val editDate: DateTime?, + override val forwardable: Boolean, + override val forwardInfo: ForwardInfo?, + override val replyTo: Message?, + override val replyMarkup: InlineKeyboardMarkup?, + override val senderBot: CommonBot?, + override val authorSignature: AuthorSignature? +) : UnconnectedChannelContentMessage { + @Deprecated("Use the constructor with forwardable field") + constructor( + messageId: MessageIdentifier, + chat: ChannelChat, + content: T, + date: DateTime, + editDate: DateTime?, + forwardInfo: ForwardInfo?, + replyTo: Message?, + replyMarkup: InlineKeyboardMarkup?, + senderBot: CommonBot?, + authorSignature: AuthorSignature? + ) : this(messageId, chat, content, date, editDate, true, forwardInfo, replyTo, replyMarkup, senderBot, authorSignature) +} + +@Deprecated("Renamed to UnconnectedChannelContentMessage", ReplaceWith("UnconnectedChannelContentMessage", "dev.inmo.tgbotapi.types.message.UnconnectedChannelContentMessageImpl")) +typealias ChannelContentMessageImpl = UnconnectedChannelContentMessage diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ChannelMessage.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ChannelContentMessage.kt similarity index 73% rename from tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ChannelMessage.kt rename to tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ChannelContentMessage.kt index a7ddbc6e66..2cc958d347 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ChannelMessage.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ChannelContentMessage.kt @@ -4,7 +4,7 @@ import dev.inmo.tgbotapi.types.chat.abstracts.ChannelChat import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent import dev.inmo.tgbotapi.types.message.content.abstracts.PossiblySentViaBotCommonMessage -interface ChannelContentMessage : PossiblySentViaBotCommonMessage, SignedMessage, WithSenderChatMessage { +sealed interface ChannelContentMessage : PossiblySentViaBotCommonMessage, SignedMessage, WithSenderChatMessage { override val chat: ChannelChat override val senderChat: ChannelChat get() = chat diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ConnectedChannelContentMessage.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ConnectedChannelContentMessage.kt new file mode 100644 index 0000000000..27fa4dc2e6 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ConnectedChannelContentMessage.kt @@ -0,0 +1,5 @@ +package dev.inmo.tgbotapi.types.message.abstracts + +import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent + +interface ConnectedChannelContentMessage : ChannelContentMessage diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ContentMessage.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ContentMessage.kt index d9db0603c4..b27e7ab9ef 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ContentMessage.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/ContentMessage.kt @@ -3,5 +3,9 @@ package dev.inmo.tgbotapi.types.message.abstracts import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent interface ContentMessage: Message { + val forwardable: Boolean val content: T + + val hasProtectedContent: Boolean + get() = !forwardable } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/UnconnectedChannelContentMessage.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/UnconnectedChannelContentMessage.kt new file mode 100644 index 0000000000..c9b8b346cd --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/UnconnectedChannelContentMessage.kt @@ -0,0 +1,5 @@ +package dev.inmo.tgbotapi.types.message.abstracts + +import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent + +interface UnconnectedChannelContentMessage : ChannelContentMessage diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt index d10233d1e5..1d1d559479 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt @@ -915,15 +915,15 @@ inline fun Message.requireAnonymousGroupContentMessageImpl(): AnonymousGroupCont this as AnonymousGroupContentMessageImpl @PreviewFeature -inline fun Message.whenChannelContentMessageImpl(block: (ChannelContentMessageImpl) -> T) = asChannelContentMessageImpl() ?.let(block) +inline fun Message.whenChannelContentMessageImpl(block: (UnconnectedChannelContentMessageImpl) -> T) = asChannelContentMessageImpl() ?.let(block) @PreviewFeature -inline fun Message.asChannelContentMessageImpl(): ChannelContentMessageImpl? = - this as? ChannelContentMessageImpl +inline fun Message.asChannelContentMessageImpl(): UnconnectedChannelContentMessageImpl? = + this as? UnconnectedChannelContentMessageImpl @PreviewFeature -inline fun Message.requireChannelContentMessageImpl(): ChannelContentMessageImpl = - this as ChannelContentMessageImpl +inline fun Message.requireChannelContentMessageImpl(): UnconnectedChannelContentMessageImpl = + this as UnconnectedChannelContentMessageImpl @PreviewFeature inline fun Message.whenFromChannelGroupContentMessageImpl(block: (FromChannelGroupContentMessageImpl) -> T) = asFromChannelGroupContentMessageImpl() ?.let(block) @@ -1027,11 +1027,33 @@ inline fun Message.whenChannelContentMessage(block: (ChannelContentMessage? = - this as? ChannelContentMessageImpl + this as? ChannelContentMessage @PreviewFeature -inline fun Message.requireChannelContentMessage(): ChannelContentMessageImpl = - this as ChannelContentMessageImpl +inline fun Message.requireChannelContentMessage(): ChannelContentMessage = + this as ChannelContentMessage + +@PreviewFeature +inline fun Message.whenConnectedChannelContentMessage(block: (ConnectedChannelContentMessage) -> T) = asConnectedChannelContentMessage() ?.let(block) + +@PreviewFeature +inline fun Message.asConnectedChannelContentMessage(): ConnectedChannelContentMessage? = + this as? ConnectedChannelContentMessageImpl + +@PreviewFeature +inline fun Message.requireConnectedChannelContentMessage(): ConnectedChannelContentMessage = + this as ConnectedChannelContentMessage + +@PreviewFeature +inline fun Message.whenUnconnectedChannelContentMessage(block: (UnconnectedChannelContentMessage) -> T) = asUnconnectedChannelContentMessage() ?.let(block) + +@PreviewFeature +inline fun Message.asUnconnectedChannelContentMessage(): UnconnectedChannelContentMessage? = + this as? UnconnectedChannelContentMessage + +@PreviewFeature +inline fun Message.requireUnconnectedChannelContentMessage(): UnconnectedChannelContentMessage = + this as UnconnectedChannelContentMessage @PreviewFeature inline fun Message.whenChatEventMessage(block: (ChatEventMessage) -> T) = asChatEventMessage() ?.let(block) diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/formatting/EntitiesBuilder.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/formatting/EntitiesBuilder.kt index cc99735da8..9ebc816630 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/formatting/EntitiesBuilder.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/formatting/EntitiesBuilder.kt @@ -429,7 +429,7 @@ inline fun EntitiesBuilder.link(text: String, url: String) = add(dev.inmo.tgbota /** * Version of [EntitiesBuilder.link] with new line at the end */ -inline fun EntitiesBuilder.linkln(text: String, url: String) = link(text) + newLine +inline fun EntitiesBuilder.linkln(text: String, url: String) = link(text, url) + newLine /** * Add link using [EntitiesBuilder.add] with [dev.inmo.tgbotapi.types.MessageEntity.textsources.link] */