diff --git a/.github/workflows/regular-build.yml b/.github/workflows/regular-build.yml deleted file mode 100644 index ceab9f2734..0000000000 --- a/.github/workflows/regular-build.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Build - -on: [push] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 1.8 - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - name: Build with Gradle - run: ./gradlew build diff --git a/CHANGELOG.md b/CHANGELOG.md index b7c298b0f2..4d5a5d1710 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,39 @@ # TelegramBotAPI changelog +## 0.33.0 + +**UPDATE UP TO Telegram Bot API 5.1** +_**ALL DEPRECATIONS WERE REMOVED**_ + +* `Common`: + * `Version`: + * `MicroUtils`: `0.4.28` -> `0.4.29` +* `Core`: + * `AdministratorChatMemberSerializer` and `ChatMemberSerializer` has changed their visibility: they are public for now + * Add `ChatInviteLinkRequest` with subrequests like `KnownChatInviteLinkRequest` + * Add `CreateChatInviteLink`/`EditChatInviteLink`/`RevokeChatInviteLink` requests + * Update `KickChatMember` to include `revokeMessages` flag + * Update `PromoteChatMember` to include `canManageVoiceChats` and `canManageChat` flags + * Add `ChatInviteLink` object + * Add `PrimaryInviteLink` for `ChatInviteLink` with `isPrimary == true` + * Add `CommonInviteLink` for `ChatInviteLink` with `isPrimary == false` + * `AdministratorChatMemberSerializer` has been set as public for several versions + * `ChatMemberSerializer` has been set as public for several versions + * Add `ChatMemberUpdated` + * Add `MessageAutoDeleteTimerChanged` + * Add `VoiceChatEvent` + * Add `VoiceChatEnded` + * Add `VoiceChatParticipantsInvited` + * Add `VoiceChatStarted` + * Add `ChatMemberUpdatedUpdate` + * Add `CommonChatMemberUpdatedUpdate` + * Add `MyChatMemberUpdatedUpdate` +* `API`: + * All API extensions has been updated +* `Behaviour Builder`: + * Now content triggers and expectators will wait for channel posts too + * New waiters and triggers for `ChatMemberUpdated` and its variations + ## 0.32.9 * `Common`: diff --git a/gradle.properties b/gradle.properties index 07767190a1..d338fd8535 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,11 +12,11 @@ klock_version=2.0.6 uuid_version=0.2.3 ktor_version=1.5.2 -micro_utils_version=0.4.28 +micro_utils_version=0.4.29 javax_activation_version=1.1.1 library_group=dev.inmo -library_version=0.32.9 +library_version=0.33.0 github_release_plugin_version=2.2.12 diff --git a/tgbotapi.core/README.md b/tgbotapi.core/README.md index 0b8ed3f0d4..344aeace98 100644 --- a/tgbotapi.core/README.md +++ b/tgbotapi.core/README.md @@ -10,7 +10,7 @@ moments are describing by official [Telegram Bot API](https://core.telegram.org/ ## Compatibility -This version compatible with [4th of November 2020 update of TelegramBotAPI (version 5.0)](https://core.telegram.org/bots/api#november-4-2020). +This version compatible with [9th of March 2021 update of TelegramBotAPI (version 5.1)](https://core.telegram.org/bots/api#march-9-2021). ## How to implement library? diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/SetPassportDataErrors.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/SetPassportDataErrors.kt index 80a039fd40..34a6deb85f 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/SetPassportDataErrors.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/SetPassportDataErrors.kt @@ -1,6 +1,5 @@ package dev.inmo.tgbotapi.requests -import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.passport.PassportElementError diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/abstracts/ChatInviteLinkRequest.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/abstracts/ChatInviteLinkRequest.kt new file mode 100644 index 0000000000..a45d428a8d --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/abstracts/ChatInviteLinkRequest.kt @@ -0,0 +1,20 @@ +package dev.inmo.tgbotapi.requests.chat.abstracts + +import com.soywiz.klock.DateTime +import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest +import dev.inmo.tgbotapi.types.* +import kotlinx.serialization.DeserializationStrategy + +interface ChatInviteLinkRequest : SimpleRequest { + val chatId: ChatIdentifier + + override val resultDeserializer: DeserializationStrategy + get() = CommonInviteLink.serializer() +} +interface KnownChatInviteLinkRequest : ChatInviteLinkRequest { + val inviteLink: String +} +interface EditChatInviteLinkRequest : ChatInviteLinkRequest { + val expireDate: DateTime? + val membersLimit: MembersLimit? +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/invite_links/CreateChatInviteLink.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/invite_links/CreateChatInviteLink.kt new file mode 100644 index 0000000000..4a87ef49c7 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/invite_links/CreateChatInviteLink.kt @@ -0,0 +1,31 @@ +package dev.inmo.tgbotapi.requests.chat.invite_links + +import com.soywiz.klock.DateTime +import dev.inmo.tgbotapi.requests.chat.abstracts.EditChatInviteLinkRequest +import dev.inmo.tgbotapi.types.* +import kotlinx.serialization.* + +@Serializable +data class CreateChatInviteLink( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(expireDateField) + private val expirationUnixTimeStamp: TelegramDate? = null, + @SerialName(memberLimitField) + override val membersLimit: MembersLimit? = null +) : EditChatInviteLinkRequest { + override val expireDate: DateTime? + get() = expirationUnixTimeStamp ?.asDate + override val requestSerializer: SerializationStrategy<*> + get() = serializer() + + override fun method(): String = "createChatInviteLink" +} + +fun CreateChatInviteLink( + chatId: ChatId, + expireDate: DateTime, + membersLimit: MembersLimit? = null +): CreateChatInviteLink = CreateChatInviteLink( + chatId, expireDate.toTelegramDate(), membersLimit +) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/invite_links/EditChatInviteLink.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/invite_links/EditChatInviteLink.kt new file mode 100644 index 0000000000..fdeb3b55e1 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/invite_links/EditChatInviteLink.kt @@ -0,0 +1,35 @@ +package dev.inmo.tgbotapi.requests.chat.invite_links + +import com.soywiz.klock.DateTime +import dev.inmo.tgbotapi.requests.chat.abstracts.EditChatInviteLinkRequest +import dev.inmo.tgbotapi.requests.chat.abstracts.KnownChatInviteLinkRequest +import dev.inmo.tgbotapi.types.* +import kotlinx.serialization.* + +@Serializable +data class EditChatInviteLink( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(inviteLinkField) + override val inviteLink: String, + @SerialName(expireDateField) + private val expirationUnixTimeStamp: TelegramDate? = null, + @SerialName(memberLimitField) + override val membersLimit: MembersLimit? = null +) : EditChatInviteLinkRequest, KnownChatInviteLinkRequest { + override val expireDate: DateTime? + get() = expirationUnixTimeStamp ?.asDate + override val requestSerializer: SerializationStrategy<*> + get() = serializer() + + override fun method(): String = "editChatInviteLink" +} + +fun EditChatInviteLink( + chatId: ChatIdentifier, + inviteLink: String, + expireDate: DateTime, + membersLimit: MembersLimit? = null +): EditChatInviteLink = EditChatInviteLink( + chatId, inviteLink, expireDate.toTelegramDate(), membersLimit +) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/invite_links/RevokeChatInviteLink.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/invite_links/RevokeChatInviteLink.kt new file mode 100644 index 0000000000..31a8993666 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/invite_links/RevokeChatInviteLink.kt @@ -0,0 +1,18 @@ +package dev.inmo.tgbotapi.requests.chat.invite_links + +import dev.inmo.tgbotapi.requests.chat.abstracts.KnownChatInviteLinkRequest +import dev.inmo.tgbotapi.types.* +import kotlinx.serialization.* + +@Serializable +data class RevokeChatInviteLink( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(inviteLinkField) + override val inviteLink: String +) : KnownChatInviteLinkRequest { + override val requestSerializer: SerializationStrategy<*> + get() = serializer() + + override fun method(): String = "revokeChatInviteLink" +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/KickChatMember.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/KickChatMember.kt index 6074de0d79..58d62c3359 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/KickChatMember.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/KickChatMember.kt @@ -13,7 +13,9 @@ data class KickChatMember( @SerialName(userIdField) override val userId: UserId, @SerialName(untilDateField) - override val untilDate: TelegramDate? = null + override val untilDate: TelegramDate? = null, + @SerialName(revokeMessagesField) + val revokeMessages: Boolean? = null ) : ChatMemberRequest, UntilDate { override fun method(): String = "kickChatMember" override val resultDeserializer: DeserializationStrategy diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/PromoteChatMember.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/PromoteChatMember.kt index b878b0cd6a..91e18f7381 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/PromoteChatMember.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/chat/members/PromoteChatMember.kt @@ -31,7 +31,11 @@ data class PromoteChatMember( @SerialName(canPinMessagesField) private val canPinMessages: Boolean? = null, @SerialName(canPromoteMembersField) - private val canPromoteMembers: Boolean? = null + private val canPromoteMembers: Boolean? = null, + @SerialName(canManageVoiceChatsField) + private val canManageVoiceChats: Boolean? = null, + @SerialName(canManageChatField) + private val canManageChat: Boolean? = null ) : ChatMemberRequest, UntilDate { override fun method(): String = "promoteChatMember" override val resultDeserializer: DeserializationStrategy diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/polls/SendPoll.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/polls/SendPoll.kt index d4bfd445cf..2af52017ef 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/polls/SendPoll.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/polls/SendPoll.kt @@ -1,7 +1,6 @@ package dev.inmo.tgbotapi.requests.send.polls import com.soywiz.klock.DateTime -import com.soywiz.klock.TimeSpan import dev.inmo.tgbotapi.CommonAbstracts.* import dev.inmo.tgbotapi.requests.send.abstracts.ReplyingMarkupSendMessageRequest import dev.inmo.tgbotapi.requests.send.abstracts.SendMessageRequest diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt index bdd251b7ed..3633593f94 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt @@ -1,7 +1,6 @@ package dev.inmo.tgbotapi.types import dev.inmo.micro_utils.common.Warning -import dev.inmo.tgbotapi.types.chat.abstracts.Chat import kotlinx.serialization.* import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatInviteLink.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatInviteLink.kt new file mode 100644 index 0000000000..fe4bc031e7 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatInviteLink.kt @@ -0,0 +1,104 @@ +package dev.inmo.tgbotapi.types + +import com.soywiz.klock.DateTime +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +@Serializable +private data class RawChatInviteLink( + @SerialName(inviteLinkField) + val inviteLink: String, + @SerialName(creatorField) + val creator: User, + @SerialName(isPrimaryField) + val isPrimary: Boolean, + @SerialName(isRevokedField) + val isRevoked: Boolean, + @SerialName(expireDateField) + val expirationDateTime: TelegramDate? = null, + @SerialName(memberLimitField) + val membersLimit: MembersLimit ?= null +) + +private fun ChatInviteLink.toRawChatInviteLink() = RawChatInviteLink( + inviteLink, + creator, + isPrimary, + isRevoked, + expirationDateTime ?.toTelegramDate(), + membersLimit +) + +@Serializable(ChatInviteLinkSerializer::class) +sealed class ChatInviteLink { + abstract val inviteLink: String + abstract val creator: User + abstract val isPrimary: Boolean + abstract val isRevoked: Boolean + abstract val expirationDateTime: DateTime? + abstract val membersLimit: MembersLimit? +} + +@Serializable +data class PrimaryInviteLink( + @SerialName(inviteLinkField) + override val inviteLink: String, + @SerialName(creatorField) + override val creator: User, + @SerialName(isRevokedField) + override val isRevoked: Boolean = false, + @SerialName(expireDateField) + private val expireDate: TelegramDate? = null, + @SerialName(memberLimitField) + override val membersLimit: MembersLimit? = null +) : ChatInviteLink() { + override val isPrimary: Boolean + get() = true + override val expirationDateTime: DateTime? + get() = expireDate ?.asDate +} + +@Serializable +data class CommonInviteLink( + @SerialName(inviteLinkField) + override val inviteLink: String, + @SerialName(creatorField) + override val creator: User, + @SerialName(isRevokedField) + override val isRevoked: Boolean = false, + @SerialName(expireDateField) + private val expireDate: TelegramDate? = null, + @SerialName(memberLimitField) + override val membersLimit: MembersLimit? = null +) : ChatInviteLink() { + override val isPrimary: Boolean + get() = false + override val expirationDateTime: DateTime? + get() = expireDate ?.asDate +} + +@Serializer(ChatInviteLink::class) +object ChatInviteLinkSerializer : KSerializer { + override val descriptor: SerialDescriptor + get() = RawChatInviteLink.serializer().descriptor + + override fun deserialize(decoder: Decoder): ChatInviteLink { + val deserializedRaw = RawChatInviteLink.serializer().deserialize(decoder) + return deserializedRaw.run { + when { + deserializedRaw.isPrimary -> PrimaryInviteLink( + inviteLink, creator, isRevoked, expirationDateTime, membersLimit + ) + else -> CommonInviteLink( + inviteLink, creator, isRevoked, expirationDateTime, membersLimit + ) + } + } + } + + override fun serialize(encoder: Encoder, value: ChatInviteLink) { + RawChatInviteLink.serializer().serialize(encoder, value.toRawChatInviteLink()) + } +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/AdministratorChatMemberImpl.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/AdministratorChatMemberImpl.kt index dd16ba76de..b3bfd4cd18 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/AdministratorChatMemberImpl.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/AdministratorChatMemberImpl.kt @@ -26,6 +26,10 @@ data class AdministratorChatMemberImpl( override val canPinMessages: Boolean = false, @SerialName(canPromoteMembersField) override val canPromoteMembers: Boolean = false, + @SerialName(canManageVoiceChatsField) + override val canManageVoiceChats: Boolean = false, + @SerialName(canManageChatField) + override val canManageChat: Boolean = false, @SerialName(isAnonymousField) override val isAnonymous: Boolean = false, @SerialName(customTitleField) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/CreatorChatMember.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/CreatorChatMember.kt index 014ac9c952..8344c7bb22 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/CreatorChatMember.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/CreatorChatMember.kt @@ -30,6 +30,10 @@ data class CreatorChatMember( override val canPinMessages: Boolean = true @Transient override val canPromoteMembers: Boolean = true + @Transient + override val canManageVoiceChats: Boolean = true + @Transient + override val canManageChat: Boolean = true @SerialName(statusField) @Required private val type: String = "creator" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/abstracts/AdministratorChatMember.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/abstracts/AdministratorChatMember.kt index 7a7c9d0944..cd05b4e9c9 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/abstracts/AdministratorChatMember.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/abstracts/AdministratorChatMember.kt @@ -1,5 +1,6 @@ package dev.inmo.tgbotapi.types.ChatMember.abstracts +import dev.inmo.tgbotapi.utils.RiskFeature import kotlinx.serialization.* import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder @@ -13,12 +14,15 @@ interface AdministratorChatMember : SpecialRightsChatMember { val canRemoveMessages: Boolean val canRestrictMembers: Boolean val canPromoteMembers: Boolean + val canManageVoiceChats: Boolean + val canManageChat: Boolean val isAnonymous: Boolean val customTitle: String? } @Serializer(AdministratorChatMember::class) -internal object AdministratorChatMemberSerializer : KSerializer { +@RiskFeature +object AdministratorChatMemberSerializer : KSerializer { override val descriptor: SerialDescriptor = ChatMemberSerializer.descriptor override fun deserialize(decoder: Decoder): AdministratorChatMember = ChatMemberSerializer.deserialize(decoder) as AdministratorChatMember diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/abstracts/ChatMember.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/abstracts/ChatMember.kt index 8f4b9a88d1..d7c3f9b0ce 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/abstracts/ChatMember.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMember/abstracts/ChatMember.kt @@ -3,6 +3,7 @@ package dev.inmo.tgbotapi.types.ChatMember.abstracts import dev.inmo.tgbotapi.types.ChatMember.* import dev.inmo.tgbotapi.types.User import dev.inmo.tgbotapi.types.statusField +import dev.inmo.tgbotapi.utils.RiskFeature import dev.inmo.tgbotapi.utils.nonstrictJsonFormat import kotlinx.serialization.* import kotlinx.serialization.descriptors.SerialDescriptor @@ -17,7 +18,8 @@ interface ChatMember { } @Serializer(ChatMember::class) -internal object ChatMemberSerializer : KSerializer { +@RiskFeature +object ChatMemberSerializer : KSerializer { override val descriptor: SerialDescriptor = JsonObject.serializer().descriptor override fun deserialize(decoder: Decoder): ChatMember { diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMemberUpdated.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMemberUpdated.kt new file mode 100644 index 0000000000..856e113ac0 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatMemberUpdated.kt @@ -0,0 +1,22 @@ +package dev.inmo.tgbotapi.types + +import dev.inmo.tgbotapi.types.ChatMember.abstracts.ChatMember +import dev.inmo.tgbotapi.types.chat.abstracts.Chat +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ChatMemberUpdated( + @SerialName(chatField) + val chat: Chat, + @SerialName(fromField) + val user: User, + @SerialName(dateField) + val date: TelegramDate, + @SerialName(oldChatMemberField) + val oldChatMemberState: ChatMember, + @SerialName(newChatMemberField) + val newChatMemberState: ChatMember, + @SerialName(inviteLinkField) + val inviteLink: ChatInviteLink? = null +) 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 819fb35587..8fc47f2a24 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 @@ -26,10 +26,12 @@ typealias FoursquareId = String typealias FoursquareType = String typealias GooglePlaceId = String typealias GooglePlaceType = String +typealias MembersLimit = Int typealias Seconds = Int typealias MilliSeconds = Long typealias LongSeconds = Long +typealias UnixTimeStamp = LongSeconds typealias Meters = Float typealias Degrees = Int @@ -76,6 +78,8 @@ val explanationLimit = 0 .. 200 val openPeriodPollSecondsLimit = 5 .. 600 +val membersLimit = 1 .. 99999 + // Made as lazy for correct work in K/JS val telegramInlineModeGifPermittedMimeTypes by lazy { listOf( @@ -162,6 +166,12 @@ const val optionIdsField = "option_ids" const val ipAddressField = "ip_address" const val linkedChatIdField = "linked_chat_id" const val horizontalAccuracyField = "horizontal_accuracy" +const val revokeMessagesField = "revoke_messages" +const val messageAutoDeleteTimeField = "message_auto_delete_time" +const val isPrimaryField = "is_primary" +const val isRevokedField = "is_revoked" +const val expireDateField = "expire_date" +const val memberLimitField = "member_limit" const val requestContactField = "request_contact" const val requestLocationField = "request_location" @@ -239,8 +249,12 @@ const val canInviteUsersField = "can_invite_users" const val canRestrictMembersField = "can_restrict_members" const val canPinMessagesField = "can_pin_messages" const val canPromoteMembersField = "can_promote_members" +const val canManageVoiceChatsField = "can_manage_voice_chats" +const val canManageChatField = "can_manage_chat" const val pngStickerField = "png_sticker" const val tgsStickerField = "tgs_sticker" +const val oldChatMemberField = "old_chat_member" +const val newChatMemberField = "new_chat_member" const val okField = "ok" const val captionField = "caption" @@ -292,6 +306,7 @@ const val payField = "pay" const val permissionsField = "permissions" const val typeField = "type" const val valueField = "value" +const val creatorField = "creator" const val pointField = "point" const val xShiftField = "x_shift" @@ -331,6 +346,7 @@ const val telegramPaymentChargeIdField = "telegram_payment_charge_id" const val providerPaymentChargeIdField = "provider_payment_charge_id" const val providerTokenField = "provider_token" const val providerDataField = "provider_data" +const val usersField = "users" const val requireNameField = "need_name" const val requirePhoneNumberField = "need_phone_number" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/UpdateTypes.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/UpdateTypes.kt index 0c2be08534..1606ea6ed4 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/UpdateTypes.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/UpdateTypes.kt @@ -11,6 +11,8 @@ const val UPDATE_SHIPPING_QUERY = "shipping_query" const val UPDATE_PRE_CHECKOUT_QUERY = "pre_checkout_query" const val UPDATE_POLL = "poll" const val UPDATE_POLL_ANSWER = "poll_answer" +const val MY_CHAT_MEMBER = "my_chat_member" +const val CHAT_MEMBER = "chat_member" val ALL_UPDATES_LIST = listOf( UPDATE_MESSAGE, @@ -23,5 +25,7 @@ val ALL_UPDATES_LIST = listOf( UPDATE_SHIPPING_QUERY, UPDATE_PRE_CHECKOUT_QUERY, UPDATE_POLL, - UPDATE_POLL_ANSWER + UPDATE_POLL_ANSWER, + MY_CHAT_MEMBER, + CHAT_MEMBER ) 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 index bf173782c8..6a0552ac1e 100644 --- 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 @@ -20,5 +20,3 @@ data class ChannelContentMessageImpl( override val senderBot: CommonBot?, override val authorSignature: AuthorSignature? ) : ChannelContentMessage -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("ChannelContentMessageImpl", "dev.inmo.tgbotapi.types.message.ChannelContentMessageImpl")) -typealias ChannelMessageImpl = ChannelContentMessageImpl diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/MessageAutoDeleteTimerChanged.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/MessageAutoDeleteTimerChanged.kt new file mode 100644 index 0000000000..3144e466cc --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/MessageAutoDeleteTimerChanged.kt @@ -0,0 +1,25 @@ +package dev.inmo.tgbotapi.types.message.ChatEvents + +import dev.inmo.tgbotapi.types.Seconds +import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* +import dev.inmo.tgbotapi.types.messageAutoDeleteTimeField +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +private const val seconds24Hours: Seconds = 60 * 60 * 24 +private const val seconds7Days: Seconds = seconds24Hours * 7 + +@Serializable +data class MessageAutoDeleteTimerChanged( + @SerialName(messageAutoDeleteTimeField) + val newAutoDeleteTime: Seconds // TODO:: check that it is seconds +) : ChannelEvent, GroupEvent, SupergroupEvent + +val MessageAutoDeleteTimerChanged.isOff + get() = newAutoDeleteTime == 0 + +val MessageAutoDeleteTimerChanged.is24Hours + get() = newAutoDeleteTime == seconds24Hours + +val MessageAutoDeleteTimerChanged.is7Days + get() = newAutoDeleteTime == seconds7Days diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/abstracts/VoiceChatEvent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/abstracts/VoiceChatEvent.kt new file mode 100644 index 0000000000..54bb629cde --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/abstracts/VoiceChatEvent.kt @@ -0,0 +1,3 @@ +package dev.inmo.tgbotapi.types.message.ChatEvents.abstracts + +interface VoiceChatEvent : SupergroupEvent diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/voice/VoiceChatEnded.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/voice/VoiceChatEnded.kt new file mode 100644 index 0000000000..3969e603fd --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/voice/VoiceChatEnded.kt @@ -0,0 +1,18 @@ +package dev.inmo.tgbotapi.types.message.ChatEvents.voice + +import com.soywiz.klock.TimeSpan +import com.soywiz.klock.seconds +import dev.inmo.tgbotapi.types.Seconds +import dev.inmo.tgbotapi.types.durationField +import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.VoiceChatEvent +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class VoiceChatEnded( + @SerialName(durationField) + val duration: Seconds +) : VoiceChatEvent { + val timeSpan: TimeSpan + get() = TimeSpan(duration.seconds.milliseconds) +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/voice/VoiceChatParticipantsInvited.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/voice/VoiceChatParticipantsInvited.kt new file mode 100644 index 0000000000..3df3f3d711 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/voice/VoiceChatParticipantsInvited.kt @@ -0,0 +1,13 @@ +package dev.inmo.tgbotapi.types.message.ChatEvents.voice + +import dev.inmo.tgbotapi.types.User +import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.VoiceChatEvent +import dev.inmo.tgbotapi.types.usersField +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class VoiceChatParticipantsInvited( + @SerialName(usersField) + val users: List = emptyList() +) : VoiceChatEvent diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/voice/VoiceChatStarted.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/voice/VoiceChatStarted.kt new file mode 100644 index 0000000000..9b72796ac1 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/ChatEvents/voice/VoiceChatStarted.kt @@ -0,0 +1,7 @@ +package dev.inmo.tgbotapi.types.message.ChatEvents.voice + +import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.VoiceChatEvent +import kotlinx.serialization.Serializable + +@Serializable +object VoiceChatStarted : VoiceChatEvent 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 061eae0a99..e24405ba79 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 @@ -21,8 +21,6 @@ data class FromChannelGroupContentMessageImpl( override val senderBot: CommonBot?, override val authorSignature: AuthorSignature? ) : FromChannelGroupContentMessage -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("FromChannelGroupContentMessageImpl", "dev.inmo.tgbotapi.types.message.FromChannelGroupContentMessageImpl")) -typealias FromChannelGroupMessageImpl = FromChannelGroupContentMessageImpl data class AnonymousGroupContentMessageImpl( override val chat: GroupChat, @@ -36,8 +34,6 @@ data class AnonymousGroupContentMessageImpl( override val senderBot: CommonBot?, override val authorSignature: AuthorSignature? ) : AnonymousGroupContentMessage -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("AnonymousGroupContentMessageImpl", "dev.inmo.tgbotapi.types.message.AnonymousGroupContentMessageImpl")) -typealias AnonymousGroupMessageImpl = AnonymousGroupContentMessageImpl data class CommonGroupContentMessageImpl( override val chat: GroupChat, @@ -51,5 +47,3 @@ data class CommonGroupContentMessageImpl( override val content: T, override val senderBot: CommonBot? ) : CommonGroupContentMessage -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("CommonGroupContentMessageImpl", "dev.inmo.tgbotapi.types.message.CommonGroupContentMessageImpl")) -typealias CommonGroupMessageImpl = CommonGroupContentMessageImpl 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 94438537e2..75a928c049 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 @@ -4,7 +4,8 @@ import com.soywiz.klock.DateTime import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup import dev.inmo.tgbotapi.types.chat.abstracts.Chat -import dev.inmo.tgbotapi.types.message.abstracts.* +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.SuccessfulPaymentInfo @@ -21,5 +22,3 @@ data class PrivateContentMessageImpl( override val senderBot: CommonBot?, val paymentInfo: SuccessfulPaymentInfo? ) : PrivateContentMessage -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("PrivateContentMessageImpl", "dev.inmo.tgbotapi.types.message.PrivateContentMessageImpl")) -typealias PrivateMessageImpl = PrivateContentMessageImpl 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 e10f88de8b..2d3ebdc703 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 @@ -11,6 +11,7 @@ import dev.inmo.tgbotapi.types.games.RawGame import dev.inmo.tgbotapi.types.location.Location import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* +import dev.inmo.tgbotapi.types.message.ChatEvents.voice.* import dev.inmo.tgbotapi.types.message.abstracts.Message import dev.inmo.tgbotapi.types.message.abstracts.UnknownMessageType import dev.inmo.tgbotapi.types.message.content.* @@ -81,6 +82,14 @@ internal data class RawMessage( private val dice: Dice? = null, private val successful_payment: SuccessfulPayment? = null, + // Voice Chat Service Messages + private val voice_chat_started: VoiceChatStarted? = null, + private val voice_chat_ended: VoiceChatEnded? = null, + private val voice_chat_participants_invited: VoiceChatParticipantsInvited? = null, + + // AutoDelete Message time changed + private val message_auto_delete_timer_changed: MessageAutoDeleteTimerChanged? = null, + // login property private val connected_website: String? = null, @@ -172,6 +181,10 @@ internal data class RawMessage( left_chat_member != null -> LeftChatMember(left_chat_member) new_chat_title != null -> NewChatTitle(new_chat_title) new_chat_photo != null -> NewChatPhoto(new_chat_photo.toList()) + voice_chat_started != null -> voice_chat_started + message_auto_delete_timer_changed != null -> message_auto_delete_timer_changed + voice_chat_ended != null -> voice_chat_ended + voice_chat_participants_invited != null -> voice_chat_participants_invited delete_chat_photo -> DeleteChatPhoto() group_chat_created -> GroupChatCreated( migrate_to_chat_id 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/ChannelMessage.kt index b9bbbec871..a7ddbc6e66 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/ChannelMessage.kt @@ -9,5 +9,3 @@ interface ChannelContentMessage : PossiblySentViaBotCommonMes override val senderChat: ChannelChat get() = chat } -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("ChannelContentMessage", "dev.inmo.tgbotapi.types.message.abstracts.ChannelContentMessage")) -typealias ChannelMessage = ChannelContentMessage diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/GroupMessages.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/GroupMessages.kt index 6167a0ca1d..d5a91e20c1 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/GroupMessages.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/GroupMessages.kt @@ -7,8 +7,6 @@ import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent interface GroupContentMessage : PublicContentMessage { override val chat: GroupChat } -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("GroupContentMessage", "dev.inmo.tgbotapi.types.message.abstracts.GroupContentMessage")) -typealias GroupMessage = GroupContentMessage interface FromChannelGroupContentMessage : GroupContentMessage, SignedMessage, WithSenderChatMessage { @@ -16,16 +14,10 @@ interface FromChannelGroupContentMessage : GroupContentMessa override val senderChat: ChannelChat get() = channel } -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("FromChannelGroupContentMessage", "dev.inmo.tgbotapi.types.message.abstracts.FromChannelGroupContentMessage")) -typealias FromChannelGroupMessage = FromChannelGroupContentMessage interface AnonymousGroupContentMessage : GroupContentMessage, SignedMessage, WithSenderChatMessage { override val senderChat: GroupChat get() = chat } -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("AnonymousGroupContentMessage", "dev.inmo.tgbotapi.types.message.abstracts.AnonymousGroupContentMessage")) -typealias AnonymousGroupMessage = AnonymousGroupContentMessage interface CommonGroupContentMessage : GroupContentMessage, FromUserMessage -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("CommonGroupContentMessage", "dev.inmo.tgbotapi.types.message.abstracts.CommonGroupContentMessage")) -typealias CommonGroupMessage = CommonGroupContentMessage diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/PrivateMessage.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/PrivateMessage.kt index 27a6c23614..767cef23ca 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/PrivateMessage.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/PrivateMessage.kt @@ -4,5 +4,3 @@ import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent import dev.inmo.tgbotapi.types.message.content.abstracts.PossiblySentViaBotCommonMessage interface PrivateContentMessage : PossiblySentViaBotCommonMessage, FromUserMessage -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("PrivateContentMessage", "dev.inmo.tgbotapi.types.message.abstracts.PrivateContentMessage")) -typealias PrivateMessage = PrivateContentMessage diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/PublicMessage.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/PublicMessage.kt index 4b409815c7..d965cc2db9 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/PublicMessage.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/abstracts/PublicMessage.kt @@ -7,5 +7,3 @@ import dev.inmo.tgbotapi.types.message.content.abstracts.PossiblySentViaBotCommo interface PublicContentMessage : PossiblySentViaBotCommonMessage { override val chat: PublicChat } -@Deprecated("Renamed due to ambiguity of naming", ReplaceWith("PublicContentMessage", "dev.inmo.tgbotapi.types.message.PublicContentMessage")) -typealias PublicMessage = PublicContentMessage diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/TextContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/TextContent.kt index 2d098ebc64..abc204e63e 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/TextContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/TextContent.kt @@ -5,7 +5,8 @@ import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.send.SendTextMessage import dev.inmo.tgbotapi.types.ChatIdentifier import dev.inmo.tgbotapi.types.MessageIdentifier -import dev.inmo.tgbotapi.types.ParseMode.* +import dev.inmo.tgbotapi.types.ParseMode.ParseMode +import dev.inmo.tgbotapi.types.ParseMode.defaultParseMode import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent @@ -29,37 +30,4 @@ data class TextContent( allowSendingWithoutReply, replyMarkup ) - - @Deprecated( - "Useless due to fact that createResend currently use textSource and that will guarantee correct sending of message", - ReplaceWith("createResend") - ) - override fun createResends( - chatId: ChatIdentifier, - disableNotification: Boolean, - replyToMessageId: MessageIdentifier?, - allowSendingWithoutReply: Boolean?, - replyMarkup: KeyboardMarkup? - ): List>> = listOf( - createResend( - chatId, - disableNotification, - replyToMessageId, - allowSendingWithoutReply, - replyMarkup - ) - ) - - @Deprecated( - "Useless due to fact that createResend currently use textSource and that will guarantee correct sending of message", - ReplaceWith("createResend") - ) - fun createResends( - chatId: ChatIdentifier, - disableNotification: Boolean, - replyToMessageId: MessageIdentifier?, - allowSendingWithoutReply: Boolean?, - replyMarkup: KeyboardMarkup?, - parseMode: ParseMode = defaultParseMode - ): List>> = createResends(chatId, disableNotification, replyToMessageId, allowSendingWithoutReply, replyMarkup) } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/ResendableContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/ResendableContent.kt index f0b1993573..895c312eb9 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/ResendableContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/ResendableContent.kt @@ -14,12 +14,4 @@ interface ResendableContent { allowSendingWithoutReply: Boolean? = null, replyMarkup: KeyboardMarkup? = null ): Request - - fun createResends( - chatId: ChatIdentifier, - disableNotification: Boolean = false, - replyToMessageId: MessageIdentifier? = null, - allowSendingWithoutReply: Boolean? = null, - replyMarkup: KeyboardMarkup? = null - ): List> = listOf(createResend(chatId, disableNotification, replyToMessageId, allowSendingWithoutReply, replyMarkup)) } \ No newline at end of file diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/Email.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/Email.kt index a8ed36220e..707a87f62f 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/Email.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/Email.kt @@ -3,8 +3,8 @@ package dev.inmo.tgbotapi.types.passport.encrypted import dev.inmo.micro_utils.serialization.base64.Base64BytesToFromStringSerializer import dev.inmo.tgbotapi.types.emailField import dev.inmo.tgbotapi.types.hashField -import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.PassportElementHash import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.EncryptedPassportElementWithEmail +import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.PassportElementHash import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/EncryptedAddress.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/EncryptedAddress.kt index 3e3f1d2010..5b2cec3eb1 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/EncryptedAddress.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/EncryptedAddress.kt @@ -3,8 +3,8 @@ package dev.inmo.tgbotapi.types.passport.encrypted import dev.inmo.micro_utils.serialization.base64.Base64BytesToFromStringSerializer import dev.inmo.tgbotapi.types.dataField import dev.inmo.tgbotapi.types.passport.credentials.EncryptedData -import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.PassportElementHash import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.EncryptedPassportElementWithData +import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.PassportElementHash import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/EncryptedPersonalDetails.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/EncryptedPersonalDetails.kt index fe1142a7e4..1df8d90be5 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/EncryptedPersonalDetails.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/EncryptedPersonalDetails.kt @@ -3,8 +3,8 @@ package dev.inmo.tgbotapi.types.passport.encrypted import dev.inmo.micro_utils.serialization.base64.Base64BytesToFromStringSerializer import dev.inmo.tgbotapi.types.dataField import dev.inmo.tgbotapi.types.passport.credentials.EncryptedData -import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.PassportElementHash import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.EncryptedPassportElementWithData +import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.PassportElementHash import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/PhoneNumber.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/PhoneNumber.kt index 88dc723765..d6cc0df603 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/PhoneNumber.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/passport/encrypted/PhoneNumber.kt @@ -2,8 +2,8 @@ package dev.inmo.tgbotapi.types.passport.encrypted import dev.inmo.micro_utils.serialization.base64.Base64BytesToFromStringSerializer import dev.inmo.tgbotapi.types.hashField -import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.PassportElementHash import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.EncryptedPassportElementWithPhoneNumber +import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.PassportElementHash import dev.inmo.tgbotapi.types.phoneNumberField import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/CommonChatMemberUpdatedUpdate.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/CommonChatMemberUpdatedUpdate.kt new file mode 100644 index 0000000000..4811ebaa74 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/CommonChatMemberUpdatedUpdate.kt @@ -0,0 +1,10 @@ +package dev.inmo.tgbotapi.types.update + +import dev.inmo.tgbotapi.types.ChatMemberUpdated +import dev.inmo.tgbotapi.types.UpdateIdentifier +import dev.inmo.tgbotapi.types.update.abstracts.ChatMemberUpdatedUpdate + +data class CommonChatMemberUpdatedUpdate( + override val updateId: UpdateIdentifier, + override val data: ChatMemberUpdated +) : ChatMemberUpdatedUpdate diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/MyChatMemberUpdatedUpdate.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/MyChatMemberUpdatedUpdate.kt new file mode 100644 index 0000000000..3dabbbb017 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/MyChatMemberUpdatedUpdate.kt @@ -0,0 +1,10 @@ +package dev.inmo.tgbotapi.types.update + +import dev.inmo.tgbotapi.types.ChatMemberUpdated +import dev.inmo.tgbotapi.types.UpdateIdentifier +import dev.inmo.tgbotapi.types.update.abstracts.ChatMemberUpdatedUpdate + +data class MyChatMemberUpdatedUpdate( + override val updateId: UpdateIdentifier, + override val data: ChatMemberUpdated +) : ChatMemberUpdatedUpdate diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/RawUpdate.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/RawUpdate.kt index 60080dac74..87e46b45d3 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/RawUpdate.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/RawUpdate.kt @@ -1,9 +1,9 @@ package dev.inmo.tgbotapi.types.update +import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.CallbackQuery.RawCallbackQuery import dev.inmo.tgbotapi.types.InlineQueries.ChosenInlineResult.RawChosenInlineResult import dev.inmo.tgbotapi.types.InlineQueries.query.RawInlineQuery -import dev.inmo.tgbotapi.types.UpdateIdentifier import dev.inmo.tgbotapi.types.message.abstracts.* import dev.inmo.tgbotapi.types.payments.PreCheckoutQuery import dev.inmo.tgbotapi.types.payments.ShippingQuery @@ -11,7 +11,6 @@ import dev.inmo.tgbotapi.types.polls.Poll import dev.inmo.tgbotapi.types.polls.PollAnswer import dev.inmo.tgbotapi.types.update.abstracts.UnknownUpdate import dev.inmo.tgbotapi.types.update.abstracts.Update -import dev.inmo.tgbotapi.types.updateIdField import kotlinx.serialization.* import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.jsonObject @@ -34,7 +33,9 @@ internal data class RawUpdate constructor( private val shipping_query: ShippingQuery? = null, private val pre_checkout_query: PreCheckoutQuery? = null, private val poll: Poll? = null, - private val poll_answer: PollAnswer? = null + private val poll_answer: PollAnswer? = null, + private val my_chat_member: ChatMemberUpdated? = null, + private val chat_member: ChatMemberUpdated? = null ) { private var initedUpdate: Update? = null /** @@ -58,6 +59,8 @@ internal data class RawUpdate constructor( pre_checkout_query != null -> PreCheckoutQueryUpdate(updateId, pre_checkout_query) poll != null -> PollUpdate(updateId, poll) poll_answer != null -> PollAnswerUpdate(updateId, poll_answer) + my_chat_member != null -> MyChatMemberUpdatedUpdate(updateId, my_chat_member) + chat_member != null -> CommonChatMemberUpdatedUpdate(updateId, chat_member) else -> UnknownUpdate( updateId, raw.toString(), diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/abstracts/ChatMemberUpdatedUpdate.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/abstracts/ChatMemberUpdatedUpdate.kt new file mode 100644 index 0000000000..44c11da4d3 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/abstracts/ChatMemberUpdatedUpdate.kt @@ -0,0 +1,7 @@ +package dev.inmo.tgbotapi.types.update.abstracts + +import dev.inmo.tgbotapi.types.ChatMemberUpdated + +interface ChatMemberUpdatedUpdate : Update { + override val data: ChatMemberUpdated +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/updateshandlers/FlowsUpdatesFilter.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/updateshandlers/FlowsUpdatesFilter.kt index b07bc97cf6..9b86454801 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/updateshandlers/FlowsUpdatesFilter.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/updateshandlers/FlowsUpdatesFilter.kt @@ -28,6 +28,8 @@ interface FlowsUpdatesFilter : UpdatesFilter { val preCheckoutQueryFlow: Flow val pollFlow: Flow val pollAnswerFlow: Flow + val chatMemberUpdatedFlow: Flow + val myChatMemberUpdatedFlow: Flow val unknownUpdateTypeFlow: Flow } @@ -74,5 +76,7 @@ class DefaultFlowsUpdatesFilter( override val preCheckoutQueryFlow: Flow = allUpdatesFlow.filterIsInstance() override val pollFlow: Flow = allUpdatesFlow.filterIsInstance() override val pollAnswerFlow: Flow = allUpdatesFlow.filterIsInstance() + override val chatMemberUpdatedFlow: Flow = allUpdatesFlow.filterIsInstance() + override val myChatMemberUpdatedFlow: Flow = allUpdatesFlow.filterIsInstance() override val unknownUpdateTypeFlow: Flow = allUpdatesFlow.filterIsInstance() } \ No newline at end of file diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/Annotations.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/Annotations.kt index 2d516c712a..421b12ba5b 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/Annotations.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/Annotations.kt @@ -35,4 +35,4 @@ const val lowLevelRiskFeatureMessage = "This method is low-level and not recomme AnnotationTarget.TYPEALIAS, AnnotationTarget.TYPE_PARAMETER ) -annotation class RiskFeature(val message: String) +annotation class RiskFeature(val message: String = lowLevelRiskFeatureMessage) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/StorageFile.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/StorageFile.kt index 167f6b80b8..6db07683ee 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/StorageFile.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/StorageFile.kt @@ -37,8 +37,6 @@ data class StorageFile( ) { val input: Input get() = inputSource() - @Deprecated("This method will be fully replaced with input property", ReplaceWith("input")) - fun asInput() = input } @Suppress("NOTHING_TO_INLINE") diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/passport/DecryptionContext.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/passport/DecryptionContext.kt index f179e3f627..57654fcfb7 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/passport/DecryptionContext.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/passport/DecryptionContext.kt @@ -1,14 +1,7 @@ package dev.inmo.tgbotapi.utils.passport import dev.inmo.micro_utils.crypto.SourceBytes -import dev.inmo.tgbotapi.bot.TelegramBot -import dev.inmo.tgbotapi.requests.DownloadFile -import dev.inmo.tgbotapi.requests.get.GetFile -import dev.inmo.tgbotapi.types.passport.credentials.EncryptedCredentials import dev.inmo.tgbotapi.types.passport.credentials.EncryptedData -import dev.inmo.tgbotapi.types.passport.encrypted.PassportFile -import dev.inmo.tgbotapi.utils.nonstrictJsonFormat -import kotlinx.serialization.json.JsonObject interface Decryptor { fun decrypt(data: EncryptedData): SourceBytes diff --git a/tgbotapi.core/src/jvmMain/kotlin/dev/inmo/tgbotapi/utils/passport/CredentialsDecrypting.kt b/tgbotapi.core/src/jvmMain/kotlin/dev/inmo/tgbotapi/utils/passport/CredentialsDecrypting.kt index 7639ee5845..e150cc7f78 100644 --- a/tgbotapi.core/src/jvmMain/kotlin/dev/inmo/tgbotapi/utils/passport/CredentialsDecrypting.kt +++ b/tgbotapi.core/src/jvmMain/kotlin/dev/inmo/tgbotapi/utils/passport/CredentialsDecrypting.kt @@ -4,11 +4,10 @@ import dev.inmo.micro_utils.crypto.decodeBase64 import dev.inmo.tgbotapi.types.passport.credentials.DecryptedCredentials import dev.inmo.tgbotapi.types.passport.credentials.EncryptedCredentials import dev.inmo.tgbotapi.utils.nonstrictJsonFormat -import java.security.* +import java.security.KeyFactory +import java.security.PrivateKey import java.security.spec.PKCS8EncodedKeySpec import javax.crypto.Cipher -import javax.crypto.spec.IvParameterSpec -import javax.crypto.spec.SecretKeySpec private val regexToRemoveFromKey = Regex("(-----(BEGIN|END) ((?:.*? KEY)|CERTIFICATE)-----|[\\s])") diff --git a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/invite_links/CreateChatInviteLink.kt b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/invite_links/CreateChatInviteLink.kt new file mode 100644 index 0000000000..93ed35d244 --- /dev/null +++ b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/invite_links/CreateChatInviteLink.kt @@ -0,0 +1,31 @@ +package dev.inmo.tgbotapi.extensions.api.chat.invite_links + +import com.soywiz.klock.DateTime +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.requests.chat.invite_links.CreateChatInviteLink +import dev.inmo.tgbotapi.types.* +import dev.inmo.tgbotapi.types.chat.abstracts.PublicChat + +suspend fun TelegramBot.createChatInviteLink( + chatId: ChatIdentifier, + expiration: TelegramDate? = null, + membersLimit: MembersLimit? = null +) = execute(CreateChatInviteLink(chatId, expiration, membersLimit)) + +suspend fun TelegramBot.createChatInviteLink( + chat: PublicChat, + expiration: TelegramDate? = null, + membersLimit: MembersLimit? = null +) = createChatInviteLink(chat.id, expiration, membersLimit) + +suspend fun TelegramBot.createChatInviteLink( + chatId: ChatIdentifier, + expiration: DateTime, + membersLimit: MembersLimit? = null +) = createChatInviteLink(chatId, expiration.toTelegramDate(), membersLimit) + +suspend fun TelegramBot.createChatInviteLink( + chat: PublicChat, + expiration: DateTime, + membersLimit: MembersLimit? = null +) = createChatInviteLink(chat.id, expiration.toTelegramDate(), membersLimit) diff --git a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/invite_links/EditChatInviteLink.kt b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/invite_links/EditChatInviteLink.kt new file mode 100644 index 0000000000..027a54360f --- /dev/null +++ b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/invite_links/EditChatInviteLink.kt @@ -0,0 +1,63 @@ +package dev.inmo.tgbotapi.extensions.api.chat.invite_links + +import com.soywiz.klock.DateTime +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.requests.chat.invite_links.EditChatInviteLink +import dev.inmo.tgbotapi.types.* +import dev.inmo.tgbotapi.types.chat.abstracts.PublicChat + +suspend fun TelegramBot.editChatInviteLink( + chatId: ChatIdentifier, + previousLink: String, + expiration: TelegramDate? = null, + membersLimit: MembersLimit? = null +) = execute(EditChatInviteLink(chatId, previousLink, expiration, membersLimit)) + +suspend fun TelegramBot.editChatInviteLink( + chat: PublicChat, + previousLink: String, + expiration: TelegramDate? = null, + membersLimit: MembersLimit? = null +) = editChatInviteLink(chat.id, previousLink, expiration, membersLimit) + +suspend fun TelegramBot.editChatInviteLink( + chatId: ChatIdentifier, + previousLink: String, + expiration: DateTime, + membersLimit: MembersLimit? = null +) = editChatInviteLink(chatId, previousLink, expiration.toTelegramDate(), membersLimit) + +suspend fun TelegramBot.editChatInviteLink( + chat: PublicChat, + previousLink: String, + expiration: DateTime, + membersLimit: MembersLimit? = null +) = editChatInviteLink(chat.id, previousLink, expiration.toTelegramDate(), membersLimit) + +suspend fun TelegramBot.editChatInviteLink( + chat: ChatIdentifier, + previousLink: ChatInviteLink, + expiration: TelegramDate? = previousLink.expirationDateTime ?.toTelegramDate(), + membersLimit: MembersLimit? = previousLink.membersLimit +) = editChatInviteLink(chat, previousLink.inviteLink, expiration, membersLimit) + +suspend fun TelegramBot.editChatInviteLink( + chat: ChatIdentifier, + previousLink: ChatInviteLink, + expiration: DateTime, + membersLimit: MembersLimit? = previousLink.membersLimit +) = editChatInviteLink(chat, previousLink.inviteLink, expiration, membersLimit) + +suspend fun TelegramBot.editChatInviteLink( + chat: PublicChat, + previousLink: ChatInviteLink, + expiration: TelegramDate? = previousLink.expirationDateTime ?.toTelegramDate(), + membersLimit: MembersLimit? = previousLink.membersLimit +) = editChatInviteLink(chat, previousLink.inviteLink, expiration, membersLimit) + +suspend fun TelegramBot.editChatInviteLink( + chat: PublicChat, + previousLink: ChatInviteLink, + expiration: DateTime, + membersLimit: MembersLimit? = previousLink.membersLimit +) = editChatInviteLink(chat, previousLink.inviteLink, expiration, membersLimit) diff --git a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/invite_links/RevokeChatInviteLink.kt b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/invite_links/RevokeChatInviteLink.kt new file mode 100644 index 0000000000..320e29fa08 --- /dev/null +++ b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/invite_links/RevokeChatInviteLink.kt @@ -0,0 +1,27 @@ +package dev.inmo.tgbotapi.extensions.api.chat.invite_links + +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.requests.chat.invite_links.RevokeChatInviteLink +import dev.inmo.tgbotapi.types.ChatIdentifier +import dev.inmo.tgbotapi.types.ChatInviteLink +import dev.inmo.tgbotapi.types.chat.abstracts.PublicChat + +suspend fun TelegramBot.revokeChatInviteLink( + chatId: ChatIdentifier, + previousLink: String +) = execute(RevokeChatInviteLink(chatId, previousLink)) + +suspend fun TelegramBot.revokeChatInviteLink( + chat: PublicChat, + previousLink: String +) = revokeChatInviteLink(chat.id, previousLink) + +suspend fun TelegramBot.revokeChatInviteLink( + chatId: ChatIdentifier, + previousLink: ChatInviteLink +) = revokeChatInviteLink(chatId, previousLink.inviteLink) + +suspend fun TelegramBot.revokeChatInviteLink( + chat: PublicChat, + previousLink: ChatInviteLink +) = revokeChatInviteLink(chat, previousLink.inviteLink) diff --git a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/KickChatMember.kt b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/KickChatMember.kt index 4fb0049d5c..f924443d8b 100644 --- a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/KickChatMember.kt +++ b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/KickChatMember.kt @@ -8,23 +8,27 @@ import dev.inmo.tgbotapi.types.chat.abstracts.PublicChat suspend fun TelegramBot.kickChatMember( chatId: ChatIdentifier, userId: UserId, - untilDate: TelegramDate? = null -) = execute(KickChatMember(chatId, userId, untilDate)) + untilDate: TelegramDate? = null, + revokeMessages: Boolean? = null +) = execute(KickChatMember(chatId, userId, untilDate, revokeMessages)) suspend fun TelegramBot.kickChatMember( chat: PublicChat, userId: UserId, - untilDate: TelegramDate? = null -) = kickChatMember(chat.id, userId, untilDate) + untilDate: TelegramDate? = null, + revokeMessages: Boolean? = null +) = kickChatMember(chat.id, userId, untilDate, revokeMessages) suspend fun TelegramBot.kickChatMember( chatId: ChatId, user: User, - untilDate: TelegramDate? = null -) = kickChatMember(chatId, user.id, untilDate) + untilDate: TelegramDate? = null, + revokeMessages: Boolean? = null +) = kickChatMember(chatId, user.id, untilDate, revokeMessages) suspend fun TelegramBot.kickChatMember( chat: PublicChat, user: User, - untilDate: TelegramDate? = null -) = kickChatMember(chat.id, user.id, untilDate) + untilDate: TelegramDate? = null, + revokeMessages: Boolean? = null +) = kickChatMember(chat.id, user.id, untilDate, revokeMessages) diff --git a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/PromoteChatMember.kt b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/PromoteChatMember.kt index e3f1dc9721..865fc0ee80 100644 --- a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/PromoteChatMember.kt +++ b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/chat/members/PromoteChatMember.kt @@ -17,7 +17,9 @@ suspend fun TelegramBot.promoteChatMember( canInviteUsers: Boolean? = null, canRestrictMembers: Boolean? = null, canPinMessages: Boolean? = null, - canPromoteMembers: Boolean? = null + canPromoteMembers: Boolean? = null, + canManageVoiceChats: Boolean? = null, + canManageChat: Boolean? ) = execute( PromoteChatMember( chatId, @@ -31,7 +33,9 @@ suspend fun TelegramBot.promoteChatMember( canInviteUsers, canRestrictMembers, canPinMessages, - canPromoteMembers + canPromoteMembers, + canManageVoiceChats, + canManageChat ) ) @@ -47,7 +51,9 @@ suspend fun TelegramBot.promoteChatMember( canInviteUsers: Boolean? = null, canRestrictMembers: Boolean? = null, canPinMessages: Boolean? = null, - canPromoteMembers: Boolean? = null + canPromoteMembers: Boolean? = null, + canManageVoiceChats: Boolean? = null, + canManageChat: Boolean? = null ) = promoteChatMember( chat.id, userId, @@ -60,7 +66,9 @@ suspend fun TelegramBot.promoteChatMember( canInviteUsers, canRestrictMembers, canPinMessages, - canPromoteMembers + canPromoteMembers, + canManageVoiceChats, + canManageChat ) suspend fun TelegramBot.promoteChatMember( @@ -75,7 +83,9 @@ suspend fun TelegramBot.promoteChatMember( canInviteUsers: Boolean? = null, canRestrictMembers: Boolean? = null, canPinMessages: Boolean? = null, - canPromoteMembers: Boolean? = null + canPromoteMembers: Boolean? = null, + canManageVoiceChats: Boolean? = null, + canManageChat: Boolean? = null ) = promoteChatMember( chatId, user.id, @@ -88,7 +98,9 @@ suspend fun TelegramBot.promoteChatMember( canInviteUsers, canRestrictMembers, canPinMessages, - canPromoteMembers + canPromoteMembers, + canManageVoiceChats, + canManageChat ) suspend fun TelegramBot.promoteChatMember( @@ -103,7 +115,9 @@ suspend fun TelegramBot.promoteChatMember( canInviteUsers: Boolean? = null, canRestrictMembers: Boolean? = null, canPinMessages: Boolean? = null, - canPromoteMembers: Boolean? = null + canPromoteMembers: Boolean? = null, + canManageVoiceChats: Boolean? = null, + canManageChat: Boolean? = null ) = promoteChatMember( chat.id, user.id, @@ -116,5 +130,7 @@ suspend fun TelegramBot.promoteChatMember( canInviteUsers, canRestrictMembers, canPinMessages, - canPromoteMembers + canPromoteMembers, + canManageVoiceChats, + canManageChat ) diff --git a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/send/media/SendMediaGroup.kt b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/send/media/SendMediaGroup.kt index e8cf10588f..01b8bb5077 100644 --- a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/send/media/SendMediaGroup.kt +++ b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/send/media/SendMediaGroup.kt @@ -8,7 +8,6 @@ import dev.inmo.tgbotapi.types.MessageIdentifier import dev.inmo.tgbotapi.types.chat.abstracts.Chat import dev.inmo.tgbotapi.types.message.abstracts.Message import dev.inmo.tgbotapi.types.message.content.abstracts.MediaGroupContent -import dev.inmo.tgbotapi.types.message.content.abstracts.VisualMediaGroupContent import dev.inmo.tgbotapi.utils.RiskFeature /** diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatMemberUpdated.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatMemberUpdated.kt new file mode 100644 index 0000000000..8e69298190 --- /dev/null +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatMemberUpdated.kt @@ -0,0 +1,65 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations + +import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.utils.asCallbackQueryUpdate +import dev.inmo.tgbotapi.requests.abstracts.Request +import dev.inmo.tgbotapi.types.CallbackQuery.CallbackQuery +import dev.inmo.tgbotapi.types.CallbackQuery.DataCallbackQuery +import dev.inmo.tgbotapi.types.ChatMemberUpdated +import dev.inmo.tgbotapi.types.update.CommonChatMemberUpdatedUpdate +import dev.inmo.tgbotapi.types.update.MyChatMemberUpdatedUpdate +import dev.inmo.tgbotapi.types.update.abstracts.ChatMemberUpdatedUpdate +import kotlinx.coroutines.flow.toList + +typealias ChatMemberUpdatedMapper = T.() -> T? + +private suspend inline fun BehaviourContext.waitChatMemberUpdated( + count: Int = 1, + initRequest: Request<*>? = null, + noinline errorFactory: NullableRequestBuilder<*> = { null }, + noinline mapper: ChatMemberUpdatedMapper +): List = expectFlow( + initRequest, + count, + errorFactory +) { + (it as? T) ?.data.let(::listOfNotNull) +}.toList().toList() + +private suspend inline fun BehaviourContext.waitChatMemberUpdatedWithFilter( + count: Int = 1, + initRequest: Request<*>? = null, + noinline errorFactory: NullableRequestBuilder<*> = { null }, + noinline filter: ChatMemberUpdatedMapper? = null +) : List = waitChatMemberUpdated( + count, + initRequest, + errorFactory +) { + if (filter == null) { + this + } else { + filter(this) + } +} + +suspend fun BehaviourContext.waitChatMemberUpdated( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + count: Int = 1, + filter: ChatMemberUpdatedMapper? = null +) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) + +suspend fun BehaviourContext.waitCommonChatMemberUpdated( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + count: Int = 1, + filter: ChatMemberUpdatedMapper? = null +) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) + +suspend fun BehaviourContext.waitMyChatMemberUpdated( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + count: Int = 1, + filter: ChatMemberUpdatedMapper? = null +) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt index fe5cdbf153..67b3746a09 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt @@ -31,7 +31,7 @@ private suspend fun BehaviourContext.waitCommonMessage( (it as CommonMessage).mapper() } ?.let { return@expectFlow it } } - it.asMessageUpdate() ?.data ?.asCommonMessage() ?.mapper().let(::listOfNotNull) + it.asBaseSentMessageUpdate() ?.data ?.asCommonMessage() ?.mapper().let(::listOfNotNull) }.toList().toList() private suspend inline fun BehaviourContext.waitContent( diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt index 0093fa5111..53fee66475 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt @@ -3,11 +3,12 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.utils.asBaseSentMessageUpdate import dev.inmo.tgbotapi.extensions.utils.asChatEventMessage -import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* +import dev.inmo.tgbotapi.types.message.ChatEvents.voice.* import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage import kotlinx.coroutines.flow.toList @@ -23,7 +24,7 @@ private suspend fun BehaviourContext.waitEventMessages( count, errorFactory ) { - it.asMessageUpdate() ?.data ?.asChatEventMessage() ?.mapper().let(::listOfNotNull) + it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage() ?.mapper().let(::listOfNotNull) }.toList().toList() @@ -63,6 +64,39 @@ suspend fun BehaviourContext.waitChatEvents( count: Int = 1, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) + +suspend fun BehaviourContext.waitVoiceChatEvents( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + count: Int = 1, + filter: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter) +suspend fun BehaviourContext.waitVoiceChatStartedEvents( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + count: Int = 1, + filter: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter) +suspend fun BehaviourContext.waitVoiceChatEndedEvents( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + count: Int = 1, + filter: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter) +suspend fun BehaviourContext.waitVoiceChatParticipantsInvitedEvents( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + count: Int = 1, + filter: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter) + +suspend fun BehaviourContext.waitMessageAutoDeleteTimerChangedEvents( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + count: Int = 1, + filter: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter) + suspend fun BehaviourContext.waitCommonEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt index 009af3d38a..1e34de13eb 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt @@ -1,10 +1,8 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext -import dev.inmo.tgbotapi.extensions.utils.asCallbackQueryUpdate import dev.inmo.tgbotapi.extensions.utils.asInlineQueryUpdate import dev.inmo.tgbotapi.requests.abstracts.Request -import dev.inmo.tgbotapi.types.CallbackQuery.* import dev.inmo.tgbotapi.types.InlineQueries.abstracts.InlineQuery import dev.inmo.tgbotapi.types.InlineQueries.query.BaseInlineQuery import dev.inmo.tgbotapi.types.InlineQueries.query.LocationInlineQuery diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt index 309a4705d0..c77cd0381b 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt @@ -1,7 +1,8 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext -import dev.inmo.tgbotapi.extensions.utils.* +import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate +import dev.inmo.tgbotapi.extensions.utils.asPassportMessage import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.message.PassportMessage import dev.inmo.tgbotapi.types.passport.PassportData diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/CallbackQueryTriggers.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/CallbackQueryTriggers.kt index d66c64eab8..8e0f9724f8 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/CallbackQueryTriggers.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/CallbackQueryTriggers.kt @@ -4,7 +4,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions import dev.inmo.tgbotapi.extensions.behaviour_builder.* import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow -import dev.inmo.tgbotapi.extensions.utils.* +import dev.inmo.tgbotapi.extensions.utils.asCallbackQueryUpdate import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat import dev.inmo.tgbotapi.types.CallbackQuery.* diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/ChatMemberUpdatedTriggers.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/ChatMemberUpdatedTriggers.kt new file mode 100644 index 0000000000..1156af2648 --- /dev/null +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/ChatMemberUpdatedTriggers.kt @@ -0,0 +1,61 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling + +import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions +import dev.inmo.tgbotapi.extensions.behaviour_builder.* +import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow +import dev.inmo.tgbotapi.extensions.utils.asChatMemberUpdatedUpdate +import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat +import dev.inmo.tgbotapi.types.ChatMemberUpdated +import dev.inmo.tgbotapi.types.update.CommonChatMemberUpdatedUpdate +import dev.inmo.tgbotapi.types.update.MyChatMemberUpdatedUpdate +import dev.inmo.tgbotapi.types.update.abstracts.ChatMemberUpdatedUpdate + +internal suspend inline fun BehaviourContext.onChatMemberUpdatedInternal( + includeFilterByChatInBehaviourSubContext: Boolean = true, + noinline additionalFilter: (suspend (ChatMemberUpdated) -> Boolean)? = null, + noinline scenarioReceiver: BehaviourContextAndTypeReceiver +) = flowsUpdatesFilter.expectFlow(bot) { + (it as? U) ?.data ?.let { chatMemberUpdated -> + if (additionalFilter == null || additionalFilter(chatMemberUpdated)) chatMemberUpdated else null + }.let(::listOfNotNull) +}.subscribeSafelyWithoutExceptions(scope) { triggerChatMemberUpdated -> + doInSubContextWithUpdatesFilter( + updatesFilter = if (includeFilterByChatInBehaviourSubContext) { + { it.sourceChat() ?.id ?.chatId == triggerChatMemberUpdated.chat.id.chatId } + } else { + null + } + ) { + scenarioReceiver(triggerChatMemberUpdated) + } +} + +suspend fun BehaviourContext.onChatMemberUpdated( + includeFilterByChatInBehaviourSubContext: Boolean = true, + additionalFilter: (suspend (ChatMemberUpdated) -> Boolean)? = null, + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onChatMemberUpdatedInternal( + includeFilterByChatInBehaviourSubContext, + additionalFilter, + scenarioReceiver +) + +suspend fun BehaviourContext.onCommonChatMemberUpdated( + includeFilterByChatInBehaviourSubContext: Boolean = true, + additionalFilter: (suspend (ChatMemberUpdated) -> Boolean)? = null, + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onChatMemberUpdatedInternal( + includeFilterByChatInBehaviourSubContext, + additionalFilter, + scenarioReceiver +) + +suspend fun BehaviourContext.onMyChatMemberUpdated( + includeFilterByChatInBehaviourSubContext: Boolean = true, + additionalFilter: (suspend (ChatMemberUpdated) -> Boolean)? = null, + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onChatMemberUpdatedInternal( + includeFilterByChatInBehaviourSubContext, + additionalFilter, + scenarioReceiver +) diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/ContentTriggers.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/ContentTriggers.kt index 591686026e..493b58f0ee 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/ContentTriggers.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/ContentTriggers.kt @@ -36,7 +36,7 @@ internal suspend inline fun BehaviourContext.onCont return@expectFlow it } } - it.asMessageUpdate() ?.data ?.asCommonMessage() ?.let { message -> + it.asBaseSentMessageUpdate() ?.data ?.asCommonMessage() ?.let { message -> if (message.content is T) { val adaptedMessage = message as CommonMessage if (additionalFilter == null || additionalFilter(adaptedMessage)) adaptedMessage else null diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt index d5b9404550..6940426c78 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt @@ -4,10 +4,12 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions import dev.inmo.tgbotapi.extensions.behaviour_builder.* import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow -import dev.inmo.tgbotapi.extensions.utils.* +import dev.inmo.tgbotapi.extensions.utils.asBaseSentMessageUpdate +import dev.inmo.tgbotapi.extensions.utils.asChatEventMessage import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* +import dev.inmo.tgbotapi.types.message.ChatEvents.voice.* import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage internal suspend inline fun BehaviourContext.onEvent( @@ -15,7 +17,7 @@ internal suspend inline fun BehaviourContext.onEvent( noinline additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, noinline scenarioReceiver: BehaviourContextAndTypeReceiver> ) = flowsUpdatesFilter.expectFlow(bot) { - it.asMessageUpdate() ?.data ?.asChatEventMessage() ?.let { message -> + it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage() ?.let { message -> if (message.chatEvent is T) { val adaptedMessage = message as ChatEventMessage if (additionalFilter == null || additionalFilter(adaptedMessage)) adaptedMessage else null @@ -43,6 +45,31 @@ suspend fun BehaviourContext.onChatEvent( additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, scenarioReceiver: BehaviourContextAndTypeReceiver> ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onVoiceChatEvent( + includeFilterByChatInBehaviourSubContext: Boolean = true, + additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onVoiceChatStartedEvent( + includeFilterByChatInBehaviourSubContext: Boolean = true, + additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onVoiceChatEndedEvent( + includeFilterByChatInBehaviourSubContext: Boolean = true, + additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onVoiceChatParticipantsInvitedEvent( + includeFilterByChatInBehaviourSubContext: Boolean = true, + additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onMessageAutoDeleteTimerChangedEvent( + includeFilterByChatInBehaviourSubContext: Boolean = true, + additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) suspend fun BehaviourContext.onCommonEvent( includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/InlineQueryTriggers.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/InlineQueryTriggers.kt index e85f2cee37..317943df52 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/InlineQueryTriggers.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/InlineQueryTriggers.kt @@ -5,8 +5,6 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.* import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow import dev.inmo.tgbotapi.extensions.utils.asInlineQueryUpdate import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat -import dev.inmo.tgbotapi.types.CallbackQuery.DataCallbackQuery -import dev.inmo.tgbotapi.types.CallbackQuery.GameShortNameCallbackQuery import dev.inmo.tgbotapi.types.InlineQueries.abstracts.InlineQuery import dev.inmo.tgbotapi.types.InlineQueries.query.BaseInlineQuery import dev.inmo.tgbotapi.types.InlineQueries.query.LocationInlineQuery diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/MediaGroupTriggers.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/MediaGroupTriggers.kt index 639f2cbeff..31a9b9d11c 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/MediaGroupTriggers.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/MediaGroupTriggers.kt @@ -5,12 +5,13 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions import dev.inmo.tgbotapi.extensions.behaviour_builder.* import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow -import dev.inmo.tgbotapi.extensions.utils.* +import dev.inmo.tgbotapi.extensions.utils.asSentMediaGroupUpdate import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat import dev.inmo.tgbotapi.extensions.utils.shortcuts.chat import dev.inmo.tgbotapi.types.message.abstracts.MediaGroupMessage import dev.inmo.tgbotapi.types.message.content.abstracts.* -import dev.inmo.tgbotapi.types.message.content.media.* +import dev.inmo.tgbotapi.types.message.content.media.PhotoContent +import dev.inmo.tgbotapi.types.message.content.media.VideoContent import dev.inmo.tgbotapi.utils.PreviewFeature @PreviewFeature diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/PassportTriggers.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/PassportTriggers.kt index 971a55419f..e954526b0e 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/PassportTriggers.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/PassportTriggers.kt @@ -3,7 +3,8 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions import dev.inmo.tgbotapi.extensions.behaviour_builder.* import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow -import dev.inmo.tgbotapi.extensions.utils.* +import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate +import dev.inmo.tgbotapi.extensions.utils.asPassportMessage import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat import dev.inmo.tgbotapi.types.message.PassportMessage import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.EncryptedPassportElement diff --git a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt index 5e27c2c544..999f165c15 100644 --- a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt +++ b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt @@ -32,7 +32,10 @@ import dev.inmo.tgbotapi.types.dice.* import dev.inmo.tgbotapi.types.files.* import dev.inmo.tgbotapi.types.files.abstracts.* import dev.inmo.tgbotapi.types.message.* +import dev.inmo.tgbotapi.types.message.ChatEvents.* +import dev.inmo.tgbotapi.types.message.ChatEvents.LeftChatMember import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* +import dev.inmo.tgbotapi.types.message.ChatEvents.voice.* import dev.inmo.tgbotapi.types.message.abstracts.* import dev.inmo.tgbotapi.types.message.content.* import dev.inmo.tgbotapi.types.message.content.abstracts.* @@ -395,40 +398,24 @@ inline fun SecureValue.asSecureValueWithTranslations(): SecureValueWithTranslati inline fun SecureValue.requireSecureValueWithTranslations(): SecureValueWithTranslations = this as SecureValueWithTranslations @PreviewFeature inline fun Message.asAnonymousGroupContentMessageImpl(): AnonymousGroupContentMessageImpl? = this as? AnonymousGroupContentMessageImpl -@Deprecated("Renamed", ReplaceWith("asAnonymousGroupContentMessageImpl", "dev.inmo.tgbotapi.extensions.utils.asAnonymousGroupContentMessageImpl")) -inline fun Message.asAnonymousGroupMessageImpl() = asAnonymousGroupContentMessageImpl() @PreviewFeature inline fun Message.requireAnonymousGroupContentMessageImpl(): AnonymousGroupContentMessageImpl = this as AnonymousGroupContentMessageImpl -@Deprecated("Renamed", ReplaceWith("requireAnonymousGroupContentMessageImpl", "dev.inmo.tgbotapi.extensions.utils.requireAnonymousGroupContentMessageImpl")) -inline fun Message.requireAnonymousGroupMessageImpl() = requireAnonymousGroupContentMessageImpl() @PreviewFeature inline fun Message.asChannelContentMessageImpl(): ChannelContentMessageImpl? = this as? ChannelContentMessageImpl -@Deprecated("Renamed", ReplaceWith("asChannelContentMessageImpl", "dev.inmo.tgbotapi.extensions.utils.asChannelContentMessageImpl")) -inline fun Message.asChannelMessageImpl() = asChannelContentMessageImpl() @PreviewFeature inline fun Message.requireChannelContentMessageImpl(): ChannelContentMessageImpl = this as ChannelContentMessageImpl -@Deprecated("Renamed", ReplaceWith("requireChannelContentMessageImpl", "dev.inmo.tgbotapi.extensions.utils.requireChannelContentMessageImpl")) -inline fun Message.requireChannelMessageImpl() = requireChannelContentMessageImpl() @PreviewFeature inline fun Message.asFromChannelGroupContentMessageImpl(): FromChannelGroupContentMessageImpl? = this as? FromChannelGroupContentMessageImpl -@Deprecated("Renamed", ReplaceWith("asFromChannelGroupContentMessageImpl", "dev.inmo.tgbotapi.extensions.utils.asFromChannelGroupContentMessageImpl")) -inline fun Message.asFromChannelGroupMessageImpl() = asFromChannelGroupContentMessageImpl() @PreviewFeature inline fun Message.requireFromChannelGroupContentMessageImpl(): FromChannelGroupContentMessageImpl = this as FromChannelGroupContentMessageImpl -@Deprecated("Renamed", ReplaceWith("requireFromChannelGroupContentMessageImpl", "dev.inmo.tgbotapi.extensions.utils.requireFromChannelGroupContentMessageImpl")) -inline fun Message.requireFromChannelGroupMessageImpl() = requireFromChannelGroupContentMessageImpl() @PreviewFeature inline fun Message.asPassportMessage(): PassportMessage? = this as? PassportMessage @PreviewFeature inline fun Message.requirePassportMessage(): PassportMessage = this as PassportMessage @PreviewFeature inline fun Message.asPrivateContentMessageImpl(): PrivateContentMessageImpl? = this as? PrivateContentMessageImpl -@Deprecated("Renamed", ReplaceWith("asPrivateContentMessageImpl", "dev.inmo.tgbotapi.extensions.utils.asPrivateContentMessageImpl")) -inline fun Message.asPrivateMessageImpl() = asPrivateContentMessageImpl() @PreviewFeature inline fun Message.requirePrivateContentMessageImpl(): PrivateContentMessageImpl = this as PrivateContentMessageImpl -@Deprecated("Renamed", ReplaceWith("requirePrivateContentMessageImpl", "dev.inmo.tgbotapi.extensions.utils.requirePrivateContentMessageImpl")) -inline fun Message.requirePrivateMessageImpl() = requirePrivateContentMessageImpl() @PreviewFeature inline fun Message.asChannelEventMessage(): ChannelEventMessage? = this as? ChannelEventMessage @PreviewFeature @@ -451,32 +438,20 @@ inline fun Message.asCommonSupergroupEventMessage(): CommonSupergroupEventMessag inline fun Message.requireCommonSupergroupEventMessage(): CommonSupergroupEventMessage = this as CommonSupergroupEventMessage @PreviewFeature inline fun Message.asAnonymousGroupContentMessage(): AnonymousGroupContentMessage? = this as? AnonymousGroupContentMessage -@Deprecated("Renamed", ReplaceWith("asAnonymousGroupContentMessage", "dev.inmo.tgbotapi.extensions.utils.asAnonymousGroupContentMessage")) -inline fun Message.asAnonymousGroupMessage() = asAnonymousGroupContentMessage() @PreviewFeature inline fun Message.requireAnonymousGroupContentMessage(): AnonymousGroupContentMessage = this as AnonymousGroupContentMessage -@Deprecated("Renamed", ReplaceWith("requireAnonymousGroupContentMessage", "dev.inmo.tgbotapi.extensions.utils.requireAnonymousGroupContentMessage")) -inline fun Message.requireAnonymousGroupMessage() = requireAnonymousGroupContentMessage() @PreviewFeature inline fun Message.asChannelContentMessage(): ChannelContentMessageImpl? = this as? ChannelContentMessageImpl -@Deprecated("Renamed", ReplaceWith("asChannelContentMessage", "dev.inmo.tgbotapi.extensions.utils.asChannelContentMessage")) -inline fun Message.asChannelMessage() = asChannelContentMessage() @PreviewFeature inline fun Message.requireChannelContentMessage(): ChannelContentMessageImpl = this as ChannelContentMessageImpl -@Deprecated("Renamed", ReplaceWith("requireChannelContentMessage", "dev.inmo.tgbotapi.extensions.utils.requireChannelContentMessage")) -inline fun Message.requireChannelMessage() = requireChannelContentMessage() @PreviewFeature inline fun Message.asChatEventMessage(): ChatEventMessage? = this as? ChatEventMessage @PreviewFeature inline fun Message.requireChatEventMessage(): ChatEventMessage = this as ChatEventMessage @PreviewFeature inline fun Message.asCommonGroupContentMessage(): CommonGroupContentMessage? = this as? CommonGroupContentMessage -@Deprecated("Renamed", ReplaceWith("asCommonGroupContentMessage", "dev.inmo.tgbotapi.extensions.utils.asCommonGroupContentMessage")) -inline fun Message.asCommonGroupMessage() = asCommonGroupContentMessage() @PreviewFeature inline fun Message.requireCommonGroupContentMessage(): CommonGroupContentMessage = this as CommonGroupContentMessage -@Deprecated("Renamed", ReplaceWith("requireCommonGroupContentMessage", "dev.inmo.tgbotapi.extensions.utils.requireCommonGroupContentMessage")) -inline fun Message.requireCommonGroupMessage() = requireCommonGroupContentMessage() @PreviewFeature inline fun Message.asCommonMessage(): CommonMessage? = this as? CommonMessage @PreviewFeature @@ -487,24 +462,16 @@ inline fun Message.asContentMessage(): ContentMessage? = this as inline fun Message.requireContentMessage(): ContentMessage = this as ContentMessage @PreviewFeature inline fun Message.asFromChannelGroupContentMessage(): FromChannelGroupContentMessage? = this as? FromChannelGroupContentMessage -@Deprecated("Renamed", ReplaceWith("asFromChannelGroupContentMessage", "dev.inmo.tgbotapi.extensions.utils.asFromChannelGroupContentMessage")) -inline fun Message.asFromChannelGroupMessage() = asFromChannelGroupContentMessage() @PreviewFeature inline fun Message.requireFromChannelGroupContentMessage(): FromChannelGroupContentMessage = this as FromChannelGroupContentMessage -@Deprecated("Renamed", ReplaceWith("requireFromChannelGroupContentMessage", "dev.inmo.tgbotapi.extensions.utils.requireFromChannelGroupContentMessage")) -inline fun Message.requireFromChannelGroupMessage() = requireFromChannelGroupContentMessage() @PreviewFeature inline fun Message.asGroupEventMessage(): GroupEventMessage? = this as? GroupEventMessage @PreviewFeature inline fun Message.requireGroupEventMessage(): GroupEventMessage = this as GroupEventMessage @PreviewFeature inline fun Message.asGroupContentMessage(): GroupContentMessage? = this as? GroupContentMessage -@Deprecated("Renamed", ReplaceWith("asGroupContentMessage", "dev.inmo.tgbotapi.extensions.utils.asGroupContentMessage")) -inline fun Message.asGroupMessage() = asGroupContentMessage() @PreviewFeature inline fun Message.requireGroupContentMessage(): GroupContentMessage = this as GroupContentMessage -@Deprecated("Renamed", ReplaceWith("requireGroupContentMessage", "dev.inmo.tgbotapi.extensions.utils.requireGroupContentMessage")) -inline fun Message.requireGroupMessage() = requireGroupContentMessage() @PreviewFeature inline fun Message.asMediaGroupMessage(): MediaGroupMessage? = this as? MediaGroupMessage @PreviewFeature @@ -523,20 +490,12 @@ inline fun Message.asPossiblyPaymentMessage(): PossiblyPaymentMessage? = this as inline fun Message.requirePossiblyPaymentMessage(): PossiblyPaymentMessage = this as PossiblyPaymentMessage @PreviewFeature inline fun Message.asPrivateContentMessage(): PrivateContentMessage? = this as? PrivateContentMessage -@Deprecated("Renamed", ReplaceWith("asPrivateContentMessage", "dev.inmo.tgbotapi.extensions.utils.asPrivateContentMessage")) -inline fun Message.asPrivateMessage() = asPrivateContentMessage() @PreviewFeature inline fun Message.requirePrivateContentMessage(): PrivateContentMessage = this as PrivateContentMessage -@Deprecated("Renamed", ReplaceWith("requirePrivateContentMessage", "dev.inmo.tgbotapi.extensions.utils.requirePrivateContentMessage")) -inline fun Message.requirePrivateMessage() = requirePrivateContentMessage() @PreviewFeature inline fun Message.asPublicContentMessage(): PublicContentMessage? = this as? PublicContentMessage -@Deprecated("Renamed", ReplaceWith("asPublicContentMessage", "dev.inmo.tgbotapi.extensions.utils.asPublicContentMessage")) -inline fun Message.asPublicMessage() = asPublicContentMessage() @PreviewFeature inline fun Message.requirePublicContentMessage(): PublicContentMessage = this as PublicContentMessage -@Deprecated("Renamed", ReplaceWith("requirePublicContentMessage", "dev.inmo.tgbotapi.extensions.utils.requirePublicContentMessage")) -inline fun Message.requirePublicMessage() = requirePublicContentMessage() @PreviewFeature inline fun Message.asSignedMessage(): SignedMessage? = this as? SignedMessage @PreviewFeature @@ -938,6 +897,18 @@ inline fun Update.asUnknownUpdate(): UnknownUpdate? = this as? UnknownUpdate @PreviewFeature inline fun Update.requireUnknownUpdate(): UnknownUpdate = this as UnknownUpdate @PreviewFeature +inline fun Update.asCommonChatMemberUpdatedUpdate(): CommonChatMemberUpdatedUpdate? = this as? CommonChatMemberUpdatedUpdate +@PreviewFeature +inline fun Update.requireCommonChatMemberUpdatedUpdate(): CommonChatMemberUpdatedUpdate = this as CommonChatMemberUpdatedUpdate +@PreviewFeature +inline fun Update.asMyChatMemberUpdatedUpdate(): MyChatMemberUpdatedUpdate? = this as? MyChatMemberUpdatedUpdate +@PreviewFeature +inline fun Update.requireMyChatMemberUpdatedUpdate(): MyChatMemberUpdatedUpdate = this as MyChatMemberUpdatedUpdate +@PreviewFeature +inline fun Update.asChatMemberUpdatedUpdate(): ChatMemberUpdatedUpdate? = this as? ChatMemberUpdatedUpdate +@PreviewFeature +inline fun Update.requireChatMemberUpdatedUpdate(): ChatMemberUpdatedUpdate = this as ChatMemberUpdatedUpdate +@PreviewFeature inline fun TelegramMediaFile.asAnimationFile(): AnimationFile? = this as? AnimationFile @PreviewFeature inline fun TelegramMediaFile.requireAnimationFile(): AnimationFile = this as AnimationFile @@ -1245,3 +1216,79 @@ inline fun DiceAnimationType.requireFootballDiceAnimationType(): FootballDiceAni inline fun DiceAnimationType.asSlotMachineDiceAnimationType(): SlotMachineDiceAnimationType? = this as? SlotMachineDiceAnimationType @PreviewFeature inline fun DiceAnimationType.requireSlotMachineDiceAnimationType(): SlotMachineDiceAnimationType = this as SlotMachineDiceAnimationType +@PreviewFeature +inline fun ChatEvent.asChannelChatCreated(): ChannelChatCreated? = this as? ChannelChatCreated +@PreviewFeature +inline fun ChatEvent.requireChannelChatCreated(): ChannelChatCreated = this as ChannelChatCreated +@PreviewFeature +inline fun ChatEvent.asDeleteChatPhoto(): DeleteChatPhoto? = this as? DeleteChatPhoto +@PreviewFeature +inline fun ChatEvent.requireDeleteChatPhoto(): DeleteChatPhoto = this as DeleteChatPhoto +@PreviewFeature +inline fun ChatEvent.asGroupChatCreated(): GroupChatCreated? = this as? GroupChatCreated +@PreviewFeature +inline fun ChatEvent.requireGroupChatCreated(): GroupChatCreated = this as GroupChatCreated +@PreviewFeature +inline fun ChatEvent.asLeftChatMember(): LeftChatMember? = this as? LeftChatMember +@PreviewFeature +inline fun ChatEvent.requireLeftChatMember(): LeftChatMember = this as LeftChatMember +@PreviewFeature +inline fun ChatEvent.asMessageAutoDeleteTimerChanged(): MessageAutoDeleteTimerChanged? = this as? MessageAutoDeleteTimerChanged +@PreviewFeature +inline fun ChatEvent.requireMessageAutoDeleteTimerChanged(): MessageAutoDeleteTimerChanged = this as MessageAutoDeleteTimerChanged +@PreviewFeature +inline fun ChatEvent.asNewChatMembers(): NewChatMembers? = this as? NewChatMembers +@PreviewFeature +inline fun ChatEvent.requireNewChatMembers(): NewChatMembers = this as NewChatMembers +@PreviewFeature +inline fun ChatEvent.asNewChatPhoto(): NewChatPhoto? = this as? NewChatPhoto +@PreviewFeature +inline fun ChatEvent.requireNewChatPhoto(): NewChatPhoto = this as NewChatPhoto +@PreviewFeature +inline fun ChatEvent.asNewChatTitle(): NewChatTitle? = this as? NewChatTitle +@PreviewFeature +inline fun ChatEvent.requireNewChatTitle(): NewChatTitle = this as NewChatTitle +@PreviewFeature +inline fun ChatEvent.asPinnedMessage(): PinnedMessage? = this as? PinnedMessage +@PreviewFeature +inline fun ChatEvent.requirePinnedMessage(): PinnedMessage = this as PinnedMessage +@PreviewFeature +inline fun ChatEvent.asProximityAlertTriggered(): ProximityAlertTriggered? = this as? ProximityAlertTriggered +@PreviewFeature +inline fun ChatEvent.requireProximityAlertTriggered(): ProximityAlertTriggered = this as ProximityAlertTriggered +@PreviewFeature +inline fun ChatEvent.asSupergroupChatCreated(): SupergroupChatCreated? = this as? SupergroupChatCreated +@PreviewFeature +inline fun ChatEvent.requireSupergroupChatCreated(): SupergroupChatCreated = this as SupergroupChatCreated +@PreviewFeature +inline fun ChatEvent.asChannelEvent(): ChannelEvent? = this as? ChannelEvent +@PreviewFeature +inline fun ChatEvent.requireChannelEvent(): ChannelEvent = this as ChannelEvent +@PreviewFeature +inline fun ChatEvent.asCommonEvent(): CommonEvent? = this as? CommonEvent +@PreviewFeature +inline fun ChatEvent.requireCommonEvent(): CommonEvent = this as CommonEvent +@PreviewFeature +inline fun ChatEvent.asGroupEvent(): GroupEvent? = this as? GroupEvent +@PreviewFeature +inline fun ChatEvent.requireGroupEvent(): GroupEvent = this as GroupEvent +@PreviewFeature +inline fun ChatEvent.asSupergroupEvent(): SupergroupEvent? = this as? SupergroupEvent +@PreviewFeature +inline fun ChatEvent.requireSupergroupEvent(): SupergroupEvent = this as SupergroupEvent +@PreviewFeature +inline fun ChatEvent.asVoiceChatEvent(): VoiceChatEvent? = this as? VoiceChatEvent +@PreviewFeature +inline fun ChatEvent.requireVoiceChatEvent(): VoiceChatEvent = this as VoiceChatEvent +@PreviewFeature +inline fun ChatEvent.asVoiceChatEnded(): VoiceChatEnded? = this as? VoiceChatEnded +@PreviewFeature +inline fun ChatEvent.requireVoiceChatEnded(): VoiceChatEnded = this as VoiceChatEnded +@PreviewFeature +inline fun ChatEvent.asVoiceChatParticipantsInvited(): VoiceChatParticipantsInvited? = this as? VoiceChatParticipantsInvited +@PreviewFeature +inline fun ChatEvent.requireVoiceChatParticipantsInvited(): VoiceChatParticipantsInvited = this as VoiceChatParticipantsInvited +@PreviewFeature +inline fun ChatEvent.asVoiceChatStarted(): VoiceChatStarted? = this as? VoiceChatStarted +@PreviewFeature +inline fun ChatEvent.requireVoiceChatStarted(): VoiceChatStarted = this as VoiceChatStarted diff --git a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ContentMessageConversations.kt b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ContentMessageConversations.kt index bcdff2ce59..37841333c7 100644 --- a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ContentMessageConversations.kt +++ b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ContentMessageConversations.kt @@ -13,16 +13,6 @@ private inline fun Flow>.withCont it.withContent() } -@Deprecated("This method will be removed in next major update") -fun Flow>.withContentType(contentType: KClass) = mapNotNull { - if (contentType.isInstance(it.content)) { - @Suppress("UNCHECKED_CAST") - it as ContentMessage - } else { - null - } -} - fun Flow>.onlyAnimationContentMessages() = withContentType() fun Flow>.onlyAudioContentMessages() = withContentType() fun Flow>.onlyContactContentMessages() = withContentType() diff --git a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/SlotMachineUtils.kt b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/SlotMachineUtils.kt index 82fcdb7e77..9fae120809 100644 --- a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/SlotMachineUtils.kt +++ b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/SlotMachineUtils.kt @@ -16,8 +16,6 @@ enum class SlotMachineReelImage(val text: String, val number: Int) { LEMON("\uD83C\uDF4B", 2), SEVEN("7", 3) } -@Deprecated("Renamed", ReplaceWith("SlotMachineReelImage", "dev.inmo.tgbotapi.extensions.utils.SlotMachineReelImage")) -typealias SlotMachineReelImages = SlotMachineReelImage /** * @return First [SlotMachineReelImage] with [SlotMachineReelImage.number] equal to receiver OR [SlotMachineReelImage.SEVEN] diff --git a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/updates/retrieving/LongPolling.kt b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/updates/retrieving/LongPolling.kt index 5e6057d576..6cb849335e 100644 --- a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/updates/retrieving/LongPolling.kt +++ b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/updates/retrieving/LongPolling.kt @@ -14,10 +14,8 @@ import dev.inmo.tgbotapi.types.update.abstracts.Update import dev.inmo.tgbotapi.updateshandlers.* import dev.inmo.tgbotapi.utils.* import io.ktor.client.features.HttpRequestTimeoutException -import io.ktor.utils.io.core.use import kotlinx.coroutines.* import kotlinx.coroutines.flow.* -import kotlin.coroutines.coroutineContext fun TelegramBot.startGettingOfUpdatesByLongPolling( timeoutSeconds: Seconds = 30, @@ -160,26 +158,6 @@ fun TelegramBot.longPolling( flowUpdatesPreset: FlowsUpdatesFilter.() -> Unit ): Job = longPolling(FlowsUpdatesFilter(flowsUpdatesFilterUpdatesKeeperCount).apply(flowUpdatesPreset), timeoutSeconds, scope, exceptionsHandler) -/** - * This method will create a new one [FlowsUpdatesFilter]. This method could be unsafe due to the fact that it will start - * getting updates IMMEDIATELY. That means that your bot will be able to skip some of them until you will call - * [kotlinx.coroutines.flow.Flow.collect] on one of [FlowsUpdatesFilter] flows. To avoid it, you can pass - * [flowUpdatesPreset] lambda - it will be called BEFORE starting updates getting - */ -@FlowPreview -@Deprecated("Will be removed soon", ReplaceWith("longPolling", "dev.inmo.tgbotapi.extensions.utils.updates.retrieving.longPolling")) -@Suppress("unused") -fun RequestsExecutor.startGettingFlowsUpdatesByLongPolling( - timeoutSeconds: Seconds = 30, - scope: CoroutineScope = CoroutineScope(Dispatchers.Default), - exceptionsHandler: ExceptionHandler? = null, - flowsUpdatesFilterUpdatesKeeperCount: Int = 100, - flowUpdatesPreset: FlowsUpdatesFilter.() -> Unit = {} -): FlowsUpdatesFilter = FlowsUpdatesFilter(flowsUpdatesFilterUpdatesKeeperCount).apply { - flowUpdatesPreset() - startGettingOfUpdatesByLongPolling(timeoutSeconds, scope, exceptionsHandler, allowedUpdates, asUpdateReceiver) -} - fun RequestsExecutor.startGettingOfUpdatesByLongPolling( updatesFilter: UpdatesFilter, timeoutSeconds: Seconds = 30, @@ -192,88 +170,3 @@ fun RequestsExecutor.startGettingOfUpdatesByLongPolling( updatesFilter.allowedUpdates, updatesFilter.asUpdateReceiver ) - -@Deprecated("Will be removed soon", ReplaceWith("longPolling", "dev.inmo.tgbotapi.extensions.utils.updates.retrieving.longPolling")) -fun RequestsExecutor.startGettingOfUpdatesByLongPolling( - messageCallback: UpdateReceiver? = null, - messageMediaGroupCallback: UpdateReceiver? = null, - editedMessageCallback: UpdateReceiver? = null, - editedMessageMediaGroupCallback: UpdateReceiver? = null, - channelPostCallback: UpdateReceiver? = null, - channelPostMediaGroupCallback: UpdateReceiver? = null, - editedChannelPostCallback: UpdateReceiver? = null, - editedChannelPostMediaGroupCallback: UpdateReceiver? = null, - chosenInlineResultCallback: UpdateReceiver? = null, - inlineQueryCallback: UpdateReceiver? = null, - callbackQueryCallback: UpdateReceiver? = null, - shippingQueryCallback: UpdateReceiver? = null, - preCheckoutQueryCallback: UpdateReceiver? = null, - pollCallback: UpdateReceiver? = null, - pollAnswerCallback: UpdateReceiver? = null, - timeoutSeconds: Seconds = 30, - exceptionsHandler: ExceptionHandler? = null, - scope: CoroutineScope = CoroutineScope(Dispatchers.Default) -): Job { - return startGettingOfUpdatesByLongPolling( - SimpleUpdatesFilter( - messageCallback, - messageMediaGroupCallback, - editedMessageCallback, - editedMessageMediaGroupCallback, - channelPostCallback, - channelPostMediaGroupCallback, - editedChannelPostCallback, - editedChannelPostMediaGroupCallback, - chosenInlineResultCallback, - inlineQueryCallback, - callbackQueryCallback, - shippingQueryCallback, - preCheckoutQueryCallback, - pollCallback, - pollAnswerCallback - ), - timeoutSeconds, - exceptionsHandler, - scope - ) -} - -@Deprecated("Will be removed soon", ReplaceWith("longPolling", "dev.inmo.tgbotapi.extensions.utils.updates.retrieving.longPolling")) -@Suppress("unused") -fun RequestsExecutor.startGettingOfUpdatesByLongPolling( - messageCallback: UpdateReceiver? = null, - mediaGroupCallback: UpdateReceiver? = null, - editedMessageCallback: UpdateReceiver? = null, - channelPostCallback: UpdateReceiver? = null, - editedChannelPostCallback: UpdateReceiver? = null, - chosenInlineResultCallback: UpdateReceiver? = null, - inlineQueryCallback: UpdateReceiver? = null, - callbackQueryCallback: UpdateReceiver? = null, - shippingQueryCallback: UpdateReceiver? = null, - preCheckoutQueryCallback: UpdateReceiver? = null, - pollCallback: UpdateReceiver? = null, - pollAnswerCallback: UpdateReceiver? = null, - timeoutSeconds: Seconds = 30, - exceptionsHandler: ExceptionHandler? = null, - scope: CoroutineScope = CoroutineScope(Dispatchers.Default) -): Job = startGettingOfUpdatesByLongPolling( - messageCallback = messageCallback, - messageMediaGroupCallback = mediaGroupCallback, - editedMessageCallback = editedMessageCallback, - editedMessageMediaGroupCallback = mediaGroupCallback, - channelPostCallback = channelPostCallback, - channelPostMediaGroupCallback = mediaGroupCallback, - editedChannelPostCallback = editedChannelPostCallback, - editedChannelPostMediaGroupCallback = mediaGroupCallback, - chosenInlineResultCallback = chosenInlineResultCallback, - inlineQueryCallback = inlineQueryCallback, - callbackQueryCallback = callbackQueryCallback, - shippingQueryCallback = shippingQueryCallback, - preCheckoutQueryCallback = preCheckoutQueryCallback, - pollCallback = pollCallback, - pollAnswerCallback = pollAnswerCallback, - timeoutSeconds = timeoutSeconds, - exceptionsHandler = exceptionsHandler, - scope = scope -) - diff --git a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/updates/retrieving/MediaGroupsIncluder.kt b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/updates/retrieving/MediaGroupsIncluder.kt index bae30b47ce..c369e14c16 100644 --- a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/updates/retrieving/MediaGroupsIncluder.kt +++ b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/updates/retrieving/MediaGroupsIncluder.kt @@ -2,7 +2,6 @@ package dev.inmo.tgbotapi.extensions.utils.updates.retrieving import dev.inmo.tgbotapi.extensions.utils.updates.convertWithMediaGroupUpdates import dev.inmo.tgbotapi.types.message.abstracts.MediaGroupMessage -import dev.inmo.tgbotapi.types.message.content.abstracts.MediaGroupContent import dev.inmo.tgbotapi.types.update.abstracts.BaseMessageUpdate import dev.inmo.tgbotapi.types.update.abstracts.Update import dev.inmo.tgbotapi.updateshandlers.UpdateReceiver