Merge branch 'master' into 9.3.0

This commit is contained in:
InsanusMokrassar 2023-10-15 18:04:44 +06:00
commit 8cf7b349df
36 changed files with 350 additions and 106 deletions

View File

@ -4,6 +4,18 @@
This release become possible thanks to [Anton Lakotka](https://youtrack.jetbrains.com/users/anton.lakotka) This release become possible thanks to [Anton Lakotka](https://youtrack.jetbrains.com/users/anton.lakotka)
## 9.2.2
* `Core`:
* Fix of [#793](https://github.com/InsanusMokrassar/ktgbotapi/issues/793): Add `PreviewChat`
## 9.2.1
* `Version`:
* `Ktor`: `2.3.3` -> `2.3.4`
* `Core`:
* All `ChatMember` inheritors have fixes `status` field
## 9.2.0 ## 9.2.0
**Add support of [Telegram Bots API 6.9](https://core.telegram.org/bots/api-changelog#september-22-2023)** **Add support of [Telegram Bots API 6.9](https://core.telegram.org/bots/api-changelog#september-22-2023)**

View File

@ -1,10 +1,17 @@
package dev.inmo.tgbotapi.abstracts package dev.inmo.tgbotapi.abstracts
import dev.inmo.tgbotapi.types.chat.Chat import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.chat.PreviewChat
/** /**
* All inheritors of this interface have [chat] field and related to this [chat] * All inheritors of this interface have [chat] field and related to this [chat]
*/ */
interface WithChat { interface WithPreviewChat {
val chat: Chat val chat: PreviewChat
} }
/**
* All inheritors of this interface have [chat] field and related to this [chat]
*/
@Deprecated("Renamed", ReplaceWith("WithPreviewChat", "dev.inmo.tgbotapi.abstracts.WithPreviewChat"))
typealias WithChat = WithPreviewChat

View File

@ -4,51 +4,51 @@ import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable(PreviewChatSerializer::class) @Serializable(ChatSerializer::class)
sealed interface UsernameChat : Chat { sealed interface UsernameChat : Chat {
val username: Username? val username: Username?
} }
@Serializable(PreviewChatSerializer::class) @Serializable(ChatSerializer::class)
sealed interface PrivateChat : Chat, UsernameChat { sealed interface PrivateChat : Chat, UsernameChat {
override val id: UserId override val id: UserId
val firstName: String val firstName: String
val lastName: String val lastName: String
} }
@Serializable(PreviewChatSerializer::class) @Serializable(ChatSerializer::class)
sealed interface PublicChat : Chat { sealed interface PublicChat : Chat {
val title: String val title: String
} }
@Serializable(PreviewChatSerializer::class) @Serializable(ChatSerializer::class)
sealed interface SuperPublicChat : PublicChat, UsernameChat sealed interface SuperPublicChat : PublicChat, UsernameChat
@Serializable(PreviewChatSerializer::class) @Serializable(ChatSerializer::class)
sealed interface ChannelChat : SuperPublicChat { sealed interface ChannelChat : SuperPublicChat {
override val id: ChatId override val id: ChatId
} }
@Serializable(PreviewChatSerializer::class) @Serializable(ChatSerializer::class)
sealed interface GroupChat : PublicChat sealed interface GroupChat : PublicChat
@Serializable(PreviewChatSerializer::class) @Serializable(ChatSerializer::class)
sealed interface SupergroupChat : GroupChat, SuperPublicChat sealed interface SupergroupChat : GroupChat, SuperPublicChat
@Serializable(PreviewChatSerializer::class) @Serializable(ChatSerializer::class)
sealed interface ForumChat : SupergroupChat sealed interface ForumChat : SupergroupChat
@Serializable(PreviewChatSerializer::class) @Serializable(ChatSerializer::class)
sealed interface PossiblyPremiumChat : Chat { sealed interface PossiblyPremiumChat : Chat {
val isPremium: Boolean val isPremium: Boolean
} }
@Serializable(PreviewChatSerializer::class) @Serializable(ChatSerializer::class)
sealed interface AbleToAddInAttachmentMenuChat : Chat { sealed interface AbleToAddInAttachmentMenuChat : Chat {
val addedToAttachmentMenu: Boolean val addedToAttachmentMenu: Boolean
} }
@Serializable(PreviewChatSerializer::class) @Serializable(ChatSerializer::class)
@ClassCastsIncluded(excludeRegex = ".*Impl") @ClassCastsIncluded(excludeRegex = ".*Impl")
sealed interface Chat { sealed interface Chat {
val id: IdChatIdentifier val id: IdChatIdentifier

View File

@ -49,13 +49,54 @@ object ChatTypeSerializer : KSerializer<ChatType> {
} }
@RiskFeature @RiskFeature
object PreviewChatSerializer : KSerializer<Chat> { object ChatSerializer : KSerializer<Chat> {
@OptIn(InternalSerializationApi::class) @OptIn(InternalSerializationApi::class)
override val descriptor: SerialDescriptor = buildSerialDescriptor("PreviewChatSerializer", PolymorphicKind.OPEN) override val descriptor: SerialDescriptor = buildSerialDescriptor("PreviewChatSerializer", PolymorphicKind.OPEN)
override fun deserialize(decoder: Decoder): Chat { override fun deserialize(decoder: Decoder): Chat {
val decodedJson = JsonObject.serializer().deserialize(decoder) val decodedJson = JsonObject.serializer().deserialize(decoder)
return try {
formatter.decodeFromJsonElement(ExtendedChatSerializer, decodedJson)
} catch (e: SerializationException) {
val type = decodedJson[typeField] ?.jsonPrimitive ?.content ?.asChatType ?: error("Field $typeField must be presented, but absent in $decodedJson")
val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true
when (type) {
ChatType.PrivateChatType -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
ChatType.GroupChatType -> formatter.decodeFromJsonElement(GroupChatImpl.serializer(), decodedJson)
ChatType.SupergroupChatType -> if (isForum) {
formatter.decodeFromJsonElement(ForumChatImpl.serializer(), decodedJson)
} else {
formatter.decodeFromJsonElement(SupergroupChatImpl.serializer(), decodedJson)
}
ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ChannelChatImpl.serializer(), decodedJson)
is ChatType.UnknownChatType -> UnknownChatType(
formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(),
decodedJson.toString(),
decodedJson
)
}
}
}
override fun serialize(encoder: Encoder, value: Chat) {
when (value) {
is ExtendedChat -> ExtendedChatSerializer.serialize(encoder, value)
is PreviewChat -> PreviewChatSerializer.serialize(encoder, value)
is ExtendedBot -> ExtendedBot.serializer().serialize(encoder, value)
}
}
}
@RiskFeature
object PreviewChatSerializer : KSerializer<PreviewChat> {
@OptIn(InternalSerializationApi::class)
override val descriptor: SerialDescriptor = buildSerialDescriptor("PreviewChatSerializer", PolymorphicKind.OPEN)
override fun deserialize(decoder: Decoder): PreviewChat {
val decodedJson = JsonObject.serializer().deserialize(decoder)
val type = decodedJson[typeField] ?.jsonPrimitive ?.content ?.asChatType ?: error("Field $typeField must be presented, but absent in $decodedJson") val type = decodedJson[typeField] ?.jsonPrimitive ?.content ?.asChatType ?: error("Field $typeField must be presented, but absent in $decodedJson")
val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true
@ -76,16 +117,14 @@ object PreviewChatSerializer : KSerializer<Chat> {
} }
} }
override fun serialize(encoder: Encoder, value: Chat) { override fun serialize(encoder: Encoder, value: PreviewChat) {
when (value) { when (value) {
is ExtendedChat -> ExtendedChatSerializer.serialize(encoder, value)
is PrivateChatImpl -> PrivateChatImpl.serializer().serialize(encoder, value) is PrivateChatImpl -> PrivateChatImpl.serializer().serialize(encoder, value)
is GroupChatImpl -> GroupChatImpl.serializer().serialize(encoder, value) is GroupChatImpl -> GroupChatImpl.serializer().serialize(encoder, value)
is SupergroupChatImpl -> SupergroupChatImpl.serializer().serialize(encoder, value) is SupergroupChatImpl -> SupergroupChatImpl.serializer().serialize(encoder, value)
is ForumChatImpl -> ForumChatImpl.serializer().serialize(encoder, value) is ForumChatImpl -> ForumChatImpl.serializer().serialize(encoder, value)
is ChannelChatImpl -> ChannelChatImpl.serializer().serialize(encoder, value) is ChannelChatImpl -> ChannelChatImpl.serializer().serialize(encoder, value)
is CommonBot -> CommonBot.serializer().serialize(encoder, value) is CommonBot -> CommonBot.serializer().serialize(encoder, value)
is ExtendedBot -> ExtendedBot.serializer().serialize(encoder, value)
is CommonUser -> CommonUser.serializer().serialize(encoder, value) is CommonUser -> CommonUser.serializer().serialize(encoder, value)
is UnknownChatType -> JsonObject.serializer().serialize(encoder, value.rawJson) is UnknownChatType -> JsonObject.serializer().serialize(encoder, value.rawJson)
} }
@ -128,6 +167,7 @@ sealed class ExtendedChatSerializer : KSerializer<ExtendedChat> {
is ExtendedSupergroupChatImpl -> ExtendedSupergroupChatImpl.serializer().serialize(encoder, value) is ExtendedSupergroupChatImpl -> ExtendedSupergroupChatImpl.serializer().serialize(encoder, value)
is ExtendedForumChatImpl -> ExtendedForumChatImpl.serializer().serialize(encoder, value) is ExtendedForumChatImpl -> ExtendedForumChatImpl.serializer().serialize(encoder, value)
is ExtendedChannelChatImpl -> ExtendedChannelChatImpl.serializer().serialize(encoder, value) is ExtendedChannelChatImpl -> ExtendedChannelChatImpl.serializer().serialize(encoder, value)
is ExtendedBot -> ExtendedBot.serializer().serialize(encoder, value)
is UnknownExtendedChat -> JsonObject.serializer().serialize(encoder, value.rawJson) is UnknownExtendedChat -> JsonObject.serializer().serialize(encoder, value.rawJson)
} }
} }

View File

@ -184,8 +184,10 @@ data class ExtendedBot(
@SerialName(canReadAllGroupMessagesField) @SerialName(canReadAllGroupMessagesField)
val canReadAllGroupMessages: Boolean = false, val canReadAllGroupMessages: Boolean = false,
@SerialName(supportInlineQueriesField) @SerialName(supportInlineQueriesField)
val supportsInlineQueries: Boolean = false val supportsInlineQueries: Boolean = false,
) : Bot() { @SerialName(photoField)
override val chatPhoto: ChatPhoto? = null
) : Bot(), ExtendedChat {
@SerialName(isBotField) @SerialName(isBotField)
private val isBot = true private val isBot = true
} }

View File

@ -15,7 +15,7 @@ data class GroupChatImpl(
override val id: ChatId, override val id: ChatId,
@SerialName(titleField) @SerialName(titleField)
override val title: String override val title: String
) : GroupChat ) : PreviewGroupChat
@Serializable @Serializable
@RiskFeature("This class is a subject of changes. It is better to use PrivateChat due") @RiskFeature("This class is a subject of changes. It is better to use PrivateChat due")
@ -28,7 +28,7 @@ data class PrivateChatImpl(
override val firstName: String = "", override val firstName: String = "",
@SerialName(lastNameField) @SerialName(lastNameField)
override val lastName: String = "" override val lastName: String = ""
) : PrivateChat ) : PreviewPrivateChat
@Serializable @Serializable
@RiskFeature("This class is a subject of changes. It is better to use SupergroupChat due") @RiskFeature("This class is a subject of changes. It is better to use SupergroupChat due")
@ -39,7 +39,7 @@ data class SupergroupChatImpl(
override val title: String, override val title: String,
@SerialName(usernameField) @SerialName(usernameField)
override val username: Username? = null override val username: Username? = null
) : SupergroupChat ) : PreviewSupergroupChat
@Serializable @Serializable
@RiskFeature("This class is a subject of changes. It is better to use ForumChat due") @RiskFeature("This class is a subject of changes. It is better to use ForumChat due")
@ -50,7 +50,7 @@ data class ForumChatImpl(
override val title: String, override val title: String,
@SerialName(usernameField) @SerialName(usernameField)
override val username: Username? = null override val username: Username? = null
) : ForumChat ) : PreviewForumChat
@Serializable @Serializable
@RiskFeature("This class is a subject of changes. It is better to use ChannelChat due") @RiskFeature("This class is a subject of changes. It is better to use ChannelChat due")
@ -61,14 +61,20 @@ data class ChannelChatImpl(
override val title: String, override val title: String,
@SerialName(usernameField) @SerialName(usernameField)
override val username: Username? = null override val username: Username? = null
) : ChannelChat ) : PreviewChannelChat
@Serializable(UserSerializer::class) @Serializable(UserSerializer::class)
sealed class User : PrivateChat sealed class User : PrivateChat
@Serializable(UserSerializer::class)
sealed class PreviewUser : PreviewPrivateChat, User()
@Serializable(UserSerializer::class) @Serializable(UserSerializer::class)
sealed class Bot : User() sealed class Bot : User()
@Serializable(UserSerializer::class)
sealed class PreviewBot : PreviewUser()
@Serializable @Serializable
data class CommonBot( data class CommonBot(
override val id: UserId, override val id: UserId,
@ -78,7 +84,7 @@ data class CommonBot(
override val lastName: String = "", override val lastName: String = "",
@SerialName(usernameField) @SerialName(usernameField)
override val username: Username? = null, override val username: Username? = null,
) : Bot() { ) : PreviewBot() {
@SerialName(isBotField) @SerialName(isBotField)
private val isBot = true private val isBot = true
} }
@ -99,7 +105,7 @@ data class CommonUser(
override val isPremium: Boolean = false, override val isPremium: Boolean = false,
@SerialName(addedToAttachmentMenuField) @SerialName(addedToAttachmentMenuField)
override val addedToAttachmentMenu: Boolean = false override val addedToAttachmentMenu: Boolean = false
) : User(), WithOptionalLanguageCode, PossiblyPremiumChat, AbleToAddInAttachmentMenuChat { ) : PreviewUser(), WithOptionalLanguageCode, PossiblyPremiumChat, AbleToAddInAttachmentMenuChat {
constructor( constructor(
id: UserId, id: UserId,
firstName: String, firstName: String,

View File

@ -0,0 +1,30 @@
package dev.inmo.tgbotapi.types.chat
import kotlinx.serialization.Serializable
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewChat : Chat
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewUsernameChat : PreviewChat, UsernameChat
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewPrivateChat : PreviewUsernameChat, PrivateChat
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewPublicChat : PreviewChat, PublicChat
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewSuperPublicChat : PreviewPublicChat, PreviewUsernameChat, SuperPublicChat
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewChannelChat : PreviewSuperPublicChat, ChannelChat
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewGroupChat : PreviewPublicChat, GroupChat
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewSupergroupChat : PreviewGroupChat, PreviewSuperPublicChat, SupergroupChat
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewForumChat : PreviewSupergroupChat, ForumChat

View File

@ -7,4 +7,4 @@ data class UnknownChatType(
override val id: IdChatIdentifier, override val id: IdChatIdentifier,
val raw: String, val raw: String,
val rawJson: JsonObject val rawJson: JsonObject
) : Chat ) : Chat, PreviewChat

View File

@ -45,6 +45,5 @@ data class AdministratorChatMemberImpl(
) : AdministratorChatMember { ) : AdministratorChatMember {
@SerialName(statusField) @SerialName(statusField)
@Required @Required
override val status: ChatMember.Status override val status: ChatMember.Status = ChatMember.Status.Administrator
get() = ChatMember.Status.Administrator
} }

View File

@ -7,6 +7,7 @@ import dev.inmo.tgbotapi.utils.nonstrictJsonFormat
import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.KSerializer import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.encoding.Encoder
@ -15,8 +16,11 @@ import kotlinx.serialization.json.jsonPrimitive
@Serializable(ChatMemberSerializer::class) @Serializable(ChatMemberSerializer::class)
sealed interface ChatMember : WithUser { sealed interface ChatMember : WithUser {
@Serializable @Serializable(StatusSerializer::class)
enum class Status(val status: String, val deserializationStrategy: DeserializationStrategy<ChatMember>) { enum class Status(
val status: String,
val deserializationStrategy: DeserializationStrategy<ChatMember>
) {
Creator("creator", OwnerChatMember.serializer()), Creator("creator", OwnerChatMember.serializer()),
Administrator("administrator", AdministratorChatMemberImpl.serializer()), Administrator("administrator", AdministratorChatMemberImpl.serializer()),
Member("member", MemberChatMemberImpl.serializer()), Member("member", MemberChatMemberImpl.serializer()),
@ -24,6 +28,23 @@ sealed interface ChatMember : WithUser {
Left("left", LeftChatMemberImpl.serializer()), Left("left", LeftChatMemberImpl.serializer()),
Kicked("kicked", KickedChatMember.serializer()) Kicked("kicked", KickedChatMember.serializer())
} }
object StatusSerializer : KSerializer<Status> {
override val descriptor: SerialDescriptor
get() = String.serializer().descriptor
override fun deserialize(decoder: Decoder): Status {
val status = decoder.decodeString()
return Status.values().first {
it.status == status
}
}
override fun serialize(encoder: Encoder, value: Status) {
encoder.encodeString(value.status)
}
}
val status: Status val status: Status
} }

View File

@ -1,9 +1,10 @@
package dev.inmo.tgbotapi.types.chat.member package dev.inmo.tgbotapi.types.chat.member
import dev.inmo.tgbotapi.abstracts.WithChat import dev.inmo.tgbotapi.abstracts.WithPreviewChat
import dev.inmo.tgbotapi.abstracts.WithUser import dev.inmo.tgbotapi.abstracts.WithUser
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.chat.Chat import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.chat.User import dev.inmo.tgbotapi.types.chat.User
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@ -11,7 +12,7 @@ import kotlinx.serialization.Serializable
@Serializable @Serializable
data class ChatMemberUpdated( data class ChatMemberUpdated(
@SerialName(chatField) @SerialName(chatField)
override val chat: Chat, override val chat: PreviewChat,
@SerialName(fromField) @SerialName(fromField)
override val user: User, override val user: User,
@SerialName(dateField) @SerialName(dateField)
@ -24,4 +25,4 @@ data class ChatMemberUpdated(
val inviteLink: ChatInviteLink? = null, val inviteLink: ChatInviteLink? = null,
@SerialName(viaChatFolderInviteLinkField) @SerialName(viaChatFolderInviteLinkField)
val viaChatFolderInviteLink: Boolean? = false val viaChatFolderInviteLink: Boolean? = false
) : WithChat, WithUser ) : WithPreviewChat, WithUser

View File

@ -13,6 +13,5 @@ data class KickedChatMember(
) : BannedChatMember { ) : BannedChatMember {
@SerialName(statusField) @SerialName(statusField)
@Required @Required
override val status: ChatMember.Status override val status: ChatMember.Status = ChatMember.Status.Kicked
get() = ChatMember.Status.Kicked
} }

View File

@ -11,6 +11,5 @@ data class LeftChatMemberImpl(
) : LeftChatMember { ) : LeftChatMember {
@SerialName(statusField) @SerialName(statusField)
@Required @Required
override val status: ChatMember.Status override val status: ChatMember.Status = ChatMember.Status.Left
get() = ChatMember.Status.Left
} }

View File

@ -11,6 +11,5 @@ data class MemberChatMemberImpl(
) : MemberChatMember { ) : MemberChatMember {
@SerialName(statusField) @SerialName(statusField)
@Required @Required
override val status: ChatMember.Status override val status: ChatMember.Status = ChatMember.Status.Member
get() = ChatMember.Status.Member
} }

View File

@ -45,6 +45,5 @@ data class OwnerChatMember(
@SerialName(statusField) @SerialName(statusField)
@Required @Required
override val status: ChatMember.Status override val status: ChatMember.Status = ChatMember.Status.Creator
get() = ChatMember.Status.Creator
} }

View File

@ -44,6 +44,5 @@ data class RestrictedChatMember(
) : BannedChatMember, SpecialRightsChatMember, ChatPermissions { ) : BannedChatMember, SpecialRightsChatMember, ChatPermissions {
@SerialName(statusField) @SerialName(statusField)
@Required @Required
override val status: ChatMember.Status override val status: ChatMember.Status = ChatMember.Status.Restricted
get() = ChatMember.Status.Restricted
} }

View File

@ -5,12 +5,13 @@ import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
import dev.inmo.tgbotapi.types.chat.ChannelChat import dev.inmo.tgbotapi.types.chat.ChannelChat
import dev.inmo.tgbotapi.types.chat.CommonBot import dev.inmo.tgbotapi.types.chat.CommonBot
import dev.inmo.tgbotapi.types.chat.PreviewChannelChat
import dev.inmo.tgbotapi.types.message.abstracts.* import dev.inmo.tgbotapi.types.message.abstracts.*
import dev.inmo.tgbotapi.types.message.content.MessageContent import dev.inmo.tgbotapi.types.message.content.MessageContent
data class ChannelContentMessageImpl<T: MessageContent>( data class ChannelContentMessageImpl<T: MessageContent>(
override val messageId: MessageId, override val messageId: MessageId,
override val chat: ChannelChat, override val chat: PreviewChannelChat,
override val content: T, override val content: T,
override val date: DateTime, override val date: DateTime,
override val editDate: DateTime?, override val editDate: DateTime?,

View File

@ -3,12 +3,13 @@ package dev.inmo.tgbotapi.types.message
import korlibs.time.DateTime import korlibs.time.DateTime
import dev.inmo.tgbotapi.types.MessageId import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.chat.ChannelChat import dev.inmo.tgbotapi.types.chat.ChannelChat
import dev.inmo.tgbotapi.types.chat.PreviewChannelChat
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChannelEvent import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChannelEvent
import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage
data class ChannelEventMessage<T : ChannelEvent>( data class ChannelEventMessage<T : ChannelEvent>(
override val messageId: MessageId, override val messageId: MessageId,
override val chat: ChannelChat, override val chat: PreviewChannelChat,
override val chatEvent: T, override val chatEvent: T,
override val date: DateTime override val date: DateTime
) : ChatEventMessage<T> ) : ChatEventMessage<T>

View File

@ -4,13 +4,14 @@ import korlibs.time.DateTime
import dev.inmo.tgbotapi.types.MessageId import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.chat.User import dev.inmo.tgbotapi.types.chat.User
import dev.inmo.tgbotapi.types.chat.GroupChat import dev.inmo.tgbotapi.types.chat.GroupChat
import dev.inmo.tgbotapi.types.chat.PreviewGroupChat
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.GroupEvent import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.GroupEvent
import dev.inmo.tgbotapi.types.message.abstracts.GroupEventMessage import dev.inmo.tgbotapi.types.message.abstracts.GroupEventMessage
data class CommonGroupEventMessage<T : GroupEvent>( data class CommonGroupEventMessage<T : GroupEvent>(
override val messageId: MessageId, override val messageId: MessageId,
override val from: User, override val from: User,
override val chat: GroupChat, override val chat: PreviewGroupChat,
override val chatEvent: T, override val chatEvent: T,
override val date: DateTime override val date: DateTime
) : GroupEventMessage<T> ) : GroupEventMessage<T>

View File

@ -2,6 +2,7 @@ package dev.inmo.tgbotapi.types.message
import korlibs.time.DateTime import korlibs.time.DateTime
import dev.inmo.tgbotapi.types.MessageId import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.chat.PreviewSupergroupChat
import dev.inmo.tgbotapi.types.chat.User import dev.inmo.tgbotapi.types.chat.User
import dev.inmo.tgbotapi.types.chat.SupergroupChat import dev.inmo.tgbotapi.types.chat.SupergroupChat
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.SupergroupEvent import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.SupergroupEvent
@ -10,7 +11,7 @@ import dev.inmo.tgbotapi.types.message.abstracts.SupergroupEventMessage
data class CommonSupergroupEventMessage<T : SupergroupEvent>( data class CommonSupergroupEventMessage<T : SupergroupEvent>(
override val messageId: MessageId, override val messageId: MessageId,
override val from: User, override val from: User,
override val chat: SupergroupChat, override val chat: PreviewSupergroupChat,
override val chatEvent: T, override val chatEvent: T,
override val date: DateTime override val date: DateTime
) : SupergroupEventMessage<T> ) : SupergroupEventMessage<T>

View File

@ -10,8 +10,8 @@ import dev.inmo.tgbotapi.types.message.abstracts.*
import dev.inmo.tgbotapi.types.message.content.MessageContent import dev.inmo.tgbotapi.types.message.content.MessageContent
data class ConnectedFromChannelGroupContentMessageImpl<T : MessageContent>( data class ConnectedFromChannelGroupContentMessageImpl<T : MessageContent>(
override val chat: GroupChat, override val chat: PreviewGroupChat,
override val channel: ChannelChat, override val channel: PreviewChannelChat,
override val messageId: MessageId, override val messageId: MessageId,
override val date: DateTime, override val date: DateTime,
override val forwardInfo: ForwardInfo?, override val forwardInfo: ForwardInfo?,
@ -26,8 +26,8 @@ data class ConnectedFromChannelGroupContentMessageImpl<T : MessageContent>(
) : ConnectedFromChannelGroupContentMessage<T> ) : ConnectedFromChannelGroupContentMessage<T>
data class UnconnectedFromChannelGroupContentMessageImpl<T: MessageContent>( data class UnconnectedFromChannelGroupContentMessageImpl<T: MessageContent>(
override val chat: GroupChat, override val chat: PreviewGroupChat,
override val channel: ChannelChat, override val channel: PreviewChannelChat,
override val messageId: MessageId, override val messageId: MessageId,
override val date: DateTime, override val date: DateTime,
override val forwardInfo: ForwardInfo?, override val forwardInfo: ForwardInfo?,
@ -42,7 +42,7 @@ data class UnconnectedFromChannelGroupContentMessageImpl<T: MessageContent>(
) : UnconnectedFromChannelGroupContentMessage<T> ) : UnconnectedFromChannelGroupContentMessage<T>
data class AnonymousGroupContentMessageImpl<T : MessageContent>( data class AnonymousGroupContentMessageImpl<T : MessageContent>(
override val chat: GroupChat, override val chat: PreviewGroupChat,
override val messageId: MessageId, override val messageId: MessageId,
override val date: DateTime, override val date: DateTime,
override val forwardInfo: ForwardInfo?, override val forwardInfo: ForwardInfo?,
@ -57,7 +57,7 @@ data class AnonymousGroupContentMessageImpl<T : MessageContent>(
) : AnonymousGroupContentMessage<T> ) : AnonymousGroupContentMessage<T>
data class CommonGroupContentMessageImpl<T : MessageContent>( data class CommonGroupContentMessageImpl<T : MessageContent>(
override val chat: GroupChat, override val chat: PreviewGroupChat,
override val messageId: MessageId, override val messageId: MessageId,
override val from: User, override val from: User,
override val date: DateTime, override val date: DateTime,
@ -72,8 +72,8 @@ data class CommonGroupContentMessageImpl<T : MessageContent>(
) : CommonGroupContentMessage<T> ) : CommonGroupContentMessage<T>
data class FromChannelForumContentMessageImpl<T: MessageContent>( data class FromChannelForumContentMessageImpl<T: MessageContent>(
override val chat: ForumChat, override val chat: PreviewForumChat,
override val channel: ChannelChat, override val channel: PreviewChannelChat,
override val messageId: MessageId, override val messageId: MessageId,
override val threadId: MessageThreadId, override val threadId: MessageThreadId,
override val date: DateTime, override val date: DateTime,
@ -89,7 +89,7 @@ data class FromChannelForumContentMessageImpl<T: MessageContent>(
) : FromChannelForumContentMessage<T> ) : FromChannelForumContentMessage<T>
data class AnonymousForumContentMessageImpl<T : MessageContent>( data class AnonymousForumContentMessageImpl<T : MessageContent>(
override val chat: ForumChat, override val chat: PreviewForumChat,
override val messageId: MessageId, override val messageId: MessageId,
override val threadId: MessageThreadId, override val threadId: MessageThreadId,
override val date: DateTime, override val date: DateTime,
@ -105,7 +105,7 @@ data class AnonymousForumContentMessageImpl<T : MessageContent>(
) : AnonymousForumContentMessage<T> ) : AnonymousForumContentMessage<T>
data class CommonForumContentMessageImpl<T : MessageContent>( data class CommonForumContentMessageImpl<T : MessageContent>(
override val chat: ForumChat, override val chat: PreviewForumChat,
override val messageId: MessageId, override val messageId: MessageId,
override val threadId: MessageThreadId, override val threadId: MessageThreadId,
override val from: User, override val from: User,

View File

@ -4,13 +4,14 @@ import korlibs.time.DateTime
import dev.inmo.tgbotapi.types.MessageId import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.chat.User import dev.inmo.tgbotapi.types.chat.User
import dev.inmo.tgbotapi.types.chat.Chat import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.message.abstracts.FromUserMessage import dev.inmo.tgbotapi.types.message.abstracts.FromUserMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.passport.PassportData import dev.inmo.tgbotapi.types.passport.PassportData
data class PassportMessage( data class PassportMessage(
override val messageId: MessageId, override val messageId: MessageId,
override val chat: Chat, override val chat: PreviewChat,
override val from: User, override val from: User,
override val date: DateTime, override val date: DateTime,
val passportData: PassportData val passportData: PassportData

View File

@ -13,7 +13,7 @@ import dev.inmo.tgbotapi.types.message.content.MessageContent
data class PrivateContentMessageImpl<T: MessageContent>( data class PrivateContentMessageImpl<T: MessageContent>(
override val messageId: MessageId, override val messageId: MessageId,
override val from: User, override val from: User,
override val chat: Chat, override val chat: PreviewPrivateChat,
override val content: T, override val content: T,
override val date: DateTime, override val date: DateTime,
override val editDate: DateTime?, override val editDate: DateTime?,

View File

@ -2,13 +2,14 @@ package dev.inmo.tgbotapi.types.message
import korlibs.time.DateTime import korlibs.time.DateTime
import dev.inmo.tgbotapi.types.MessageId import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.chat.PreviewPrivateChat
import dev.inmo.tgbotapi.types.chat.PrivateChat import dev.inmo.tgbotapi.types.chat.PrivateChat
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.PrivateEvent import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.PrivateEvent
import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage
data class PrivateEventMessage<T : PrivateEvent>( data class PrivateEventMessage<T : PrivateEvent>(
override val messageId: MessageId, override val messageId: MessageId,
override val chat: PrivateChat, override val chat: PreviewPrivateChat,
override val chatEvent: T, override val chatEvent: T,
override val date: DateTime override val date: DateTime
) : ChatEventMessage<T> ) : ChatEventMessage<T>

View File

@ -43,11 +43,11 @@ internal data class RawMessage(
@SerialName(messageIdField) @SerialName(messageIdField)
val messageId: MessageId, val messageId: MessageId,
val date: TelegramDate, val date: TelegramDate,
private val chat: Chat, private val chat: PreviewChat,
@SerialName(messageThreadIdField) @SerialName(messageThreadIdField)
private val messageThreadId: MessageThreadId? = null, private val messageThreadId: MessageThreadId? = null,
private val from: User? = null, private val from: User? = null,
private val sender_chat: PublicChat? = null, private val sender_chat: PreviewPublicChat? = null,
private val forward_from: User? = null, private val forward_from: User? = null,
private val forward_from_chat: Chat? = null, private val forward_from_chat: Chat? = null,
private val forward_from_message_id: MessageId? = null, private val forward_from_message_id: MessageId? = null,
@ -274,27 +274,27 @@ internal data class RawMessage(
try { try {
chatEvent?.let { chatEvent -> chatEvent?.let { chatEvent ->
when (chat) { when (chat) {
is SupergroupChat -> CommonSupergroupEventMessage( is PreviewSupergroupChat -> CommonSupergroupEventMessage(
messageId, messageId,
from ?: error("Supergroup events are expected to contain 'from' field"), from ?: error("Supergroup events are expected to contain 'from' field"),
chat, chat,
chatEvent as? SupergroupEvent ?: throwWrongChatEvent(SupergroupEvent::class, chatEvent), chatEvent as? SupergroupEvent ?: throwWrongChatEvent(SupergroupEvent::class, chatEvent),
date.asDate date.asDate
) )
is GroupChat -> CommonGroupEventMessage( is PreviewGroupChat -> CommonGroupEventMessage(
messageId, messageId,
from ?: error("Supergroup events are expected to contain 'from' field"), from ?: error("Supergroup events are expected to contain 'from' field"),
chat, chat,
chatEvent as? GroupEvent ?: throwWrongChatEvent(GroupChat::class, chatEvent), chatEvent as? GroupEvent ?: throwWrongChatEvent(GroupChat::class, chatEvent),
date.asDate date.asDate
) )
is ChannelChat -> ChannelEventMessage( is PreviewChannelChat -> ChannelEventMessage(
messageId, messageId,
chat, chat,
chatEvent as? ChannelEvent ?: throwWrongChatEvent(ChannelEvent::class, chatEvent), chatEvent as? ChannelEvent ?: throwWrongChatEvent(ChannelEvent::class, chatEvent),
date.asDate date.asDate
) )
is PrivateChat -> PrivateEventMessage( is PreviewPrivateChat -> PrivateEventMessage(
messageId, messageId,
chat, chat,
chatEvent as? PrivateEvent ?: throwWrongChatEvent(PrivateEvent::class, chatEvent), chatEvent as? PrivateEvent ?: throwWrongChatEvent(PrivateEvent::class, chatEvent),
@ -303,8 +303,8 @@ internal data class RawMessage(
else -> error("Expected one of the public chats, but was $chat (in extracting of chat event message)") else -> error("Expected one of the public chats, but was $chat (in extracting of chat event message)")
} }
} ?: content?.let { content -> when (chat) { } ?: content?.let { content -> when (chat) {
is PublicChat -> when (chat) { is PreviewPublicChat -> when (chat) {
is ChannelChat -> ChannelContentMessageImpl( is PreviewChannelChat -> ChannelContentMessageImpl(
messageId, messageId,
chat, chat,
content, content,
@ -318,17 +318,16 @@ internal data class RawMessage(
author_signature, author_signature,
media_group_id media_group_id
) )
is ForumChat -> if (messageThreadId != null) { is PreviewForumChat -> if (messageThreadId != null) {
val chatId = ChatIdWithThreadId( val chatId = ChatIdWithThreadId(
chat.id.chatId, chat.id.chatId,
messageThreadId messageThreadId
) )
val actualForumChat = when (chat) { val actualForumChat = when (chat) {
is ExtendedForumChatImpl -> chat.copy(id = chatId)
is ForumChatImpl -> chat.copy(id = chatId) is ForumChatImpl -> chat.copy(id = chatId)
} }
when (sender_chat) { when (sender_chat) {
is ChannelChat -> FromChannelForumContentMessageImpl( is PreviewChannelChat -> FromChannelForumContentMessageImpl(
actualForumChat, actualForumChat,
sender_chat, sender_chat,
messageId, messageId,
@ -344,7 +343,7 @@ internal data class RawMessage(
author_signature, author_signature,
media_group_id media_group_id
) )
is GroupChat -> AnonymousForumContentMessageImpl( is PreviewGroupChat -> AnonymousForumContentMessageImpl(
actualForumChat, actualForumChat,
messageId, messageId,
messageThreadId, messageThreadId,
@ -377,7 +376,7 @@ internal data class RawMessage(
} }
} else { } else {
when (sender_chat) { when (sender_chat) {
is ChannelChat -> if (is_automatic_forward == true) { is PreviewChannelChat -> if (is_automatic_forward == true) {
ConnectedFromChannelGroupContentMessageImpl( ConnectedFromChannelGroupContentMessageImpl(
chat, chat,
sender_chat, sender_chat,
@ -440,8 +439,8 @@ internal data class RawMessage(
) )
} }
} }
is GroupChat -> when (sender_chat) { is PreviewGroupChat -> when (sender_chat) {
is ChannelChat -> if (is_automatic_forward == true) { is PreviewChannelChat -> if (is_automatic_forward == true) {
ConnectedFromChannelGroupContentMessageImpl( ConnectedFromChannelGroupContentMessageImpl(
chat, chat,
sender_chat, sender_chat,
@ -474,7 +473,7 @@ internal data class RawMessage(
media_group_id media_group_id
) )
} }
is GroupChat -> AnonymousGroupContentMessageImpl( is PreviewGroupChat -> AnonymousGroupContentMessageImpl(
chat, chat,
messageId, messageId,
date.asDate, date.asDate,
@ -504,7 +503,7 @@ internal data class RawMessage(
) )
} }
} }
is PrivateChat -> PrivateContentMessageImpl( is PreviewPrivateChat -> PrivateContentMessageImpl(
messageId, messageId,
from ?: error("Was detected common message, but owner (sender) of the message was not found"), from ?: error("Was detected common message, but owner (sender) of the message was not found"),
chat, chat,

View File

@ -1,10 +1,11 @@
package dev.inmo.tgbotapi.types.message.abstracts package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.chat.ChannelChat import dev.inmo.tgbotapi.types.chat.ChannelChat
import dev.inmo.tgbotapi.types.chat.PreviewChannelChat
import dev.inmo.tgbotapi.types.message.content.MessageContent import dev.inmo.tgbotapi.types.message.content.MessageContent
interface ChannelContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T>, SignedMessage, WithSenderChatMessage { interface ChannelContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T>, SignedMessage, WithSenderChatMessage {
override val chat: ChannelChat override val chat: PreviewChannelChat
override val senderChat: ChannelChat override val senderChat: PreviewChannelChat
get() = chat get() = chat
} }

View File

@ -1,5 +1,9 @@
package dev.inmo.tgbotapi.types.message.abstracts package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.chat.PreviewGroupChat
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.GroupEvent import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.GroupEvent
interface GroupEventMessage<T : GroupEvent> : ChatEventMessage<T>, FromUserMessage interface GroupEventMessage<T : GroupEvent> : ChatEventMessage<T>, FromUserMessage {
override val chat: PreviewGroupChat
}

View File

@ -1,24 +1,22 @@
package dev.inmo.tgbotapi.types.message.abstracts package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.MessageThreadId import dev.inmo.tgbotapi.types.MessageThreadId
import dev.inmo.tgbotapi.types.chat.ChannelChat import dev.inmo.tgbotapi.types.chat.*
import dev.inmo.tgbotapi.types.chat.ForumChat
import dev.inmo.tgbotapi.types.chat.GroupChat
import dev.inmo.tgbotapi.types.message.content.MessageContent import dev.inmo.tgbotapi.types.message.content.MessageContent
sealed interface GroupContentMessage<T : MessageContent> : PublicContentMessage<T> { sealed interface GroupContentMessage<T : MessageContent> : PublicContentMessage<T> {
override val chat: GroupChat override val chat: PreviewGroupChat
} }
sealed interface ForumContentMessage<T : MessageContent> : GroupContentMessage<T>, PossiblyTopicMessage { sealed interface ForumContentMessage<T : MessageContent> : GroupContentMessage<T>, PossiblyTopicMessage {
override val chat: ForumChat override val chat: PreviewForumChat
override val threadId: MessageThreadId override val threadId: MessageThreadId
} }
sealed interface FromChannelGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, SignedMessage, WithSenderChatMessage { sealed interface FromChannelGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, SignedMessage, WithSenderChatMessage {
val channel: ChannelChat val channel: PreviewChannelChat
override val senderChat: ChannelChat override val senderChat: PreviewChannelChat
get() = channel get() = channel
} }
@ -26,7 +24,7 @@ interface ConnectedFromChannelGroupContentMessage<T: MessageContent> : FromChann
interface UnconnectedFromChannelGroupContentMessage<T: MessageContent> : FromChannelGroupContentMessage<T> interface UnconnectedFromChannelGroupContentMessage<T: MessageContent> : FromChannelGroupContentMessage<T>
interface AnonymousGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, SignedMessage, WithSenderChatMessage { interface AnonymousGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, SignedMessage, WithSenderChatMessage {
override val senderChat: GroupChat override val senderChat: PreviewGroupChat
get() = chat get() = chat
} }
@ -35,7 +33,7 @@ interface CommonGroupContentMessage<T : MessageContent> : GroupContentMessage<T>
interface FromChannelForumContentMessage<T: MessageContent> : FromChannelGroupContentMessage<T>, ForumContentMessage<T> interface FromChannelForumContentMessage<T: MessageContent> : FromChannelGroupContentMessage<T>, ForumContentMessage<T>
interface AnonymousForumContentMessage<T : MessageContent> : ForumContentMessage<T>, SignedMessage, WithSenderChatMessage { interface AnonymousForumContentMessage<T : MessageContent> : ForumContentMessage<T>, SignedMessage, WithSenderChatMessage {
override val senderChat: GroupChat override val senderChat: PreviewGroupChat
get() = chat get() = chat
} }

View File

@ -1,10 +1,11 @@
package dev.inmo.tgbotapi.types.message.abstracts package dev.inmo.tgbotapi.types.message.abstracts
import korlibs.time.DateTime import korlibs.time.DateTime
import dev.inmo.tgbotapi.abstracts.WithChat import dev.inmo.tgbotapi.abstracts.WithPreviewChat
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
import dev.inmo.tgbotapi.types.MessageId import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.chat.Chat import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.message.RawMessage import dev.inmo.tgbotapi.types.message.RawMessage
import kotlinx.serialization.* import kotlinx.serialization.*
import kotlinx.serialization.descriptors.* import kotlinx.serialization.descriptors.*
@ -12,14 +13,14 @@ import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.encoding.Encoder
@ClassCastsIncluded(excludeRegex = ".*Impl") @ClassCastsIncluded(excludeRegex = ".*Impl")
interface Message : WithChat { interface Message : WithPreviewChat {
val messageId: MessageId val messageId: MessageId
val date: DateTime val date: DateTime
} }
data class UnknownMessageType( data class UnknownMessageType(
override val messageId: MessageId, override val messageId: MessageId,
override val chat: Chat, override val chat: PreviewChat,
override val date: DateTime, override val date: DateTime,
val insideException: Exception val insideException: Exception
) : Message ) : Message

View File

@ -1,5 +1,9 @@
package dev.inmo.tgbotapi.types.message.abstracts package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.chat.PreviewPrivateChat
import dev.inmo.tgbotapi.types.message.content.MessageContent import dev.inmo.tgbotapi.types.message.content.MessageContent
interface PrivateContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T>, FromUserMessage interface PrivateContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T>, FromUserMessage {
override val chat: PreviewPrivateChat
}

View File

@ -1,8 +1,9 @@
package dev.inmo.tgbotapi.types.message.abstracts package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.chat.PreviewPublicChat
import dev.inmo.tgbotapi.types.chat.PublicChat import dev.inmo.tgbotapi.types.chat.PublicChat
import dev.inmo.tgbotapi.types.message.content.MessageContent import dev.inmo.tgbotapi.types.message.content.MessageContent
sealed interface PublicContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T> { sealed interface PublicContentMessage<T: MessageContent> : PossiblySentViaBotCommonMessage<T> {
override val chat: PublicChat override val chat: PreviewPublicChat
} }

View File

@ -1,5 +1,9 @@
package dev.inmo.tgbotapi.types.message.abstracts package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.chat.PreviewGroupChat
import dev.inmo.tgbotapi.types.chat.PreviewSupergroupChat
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.SupergroupEvent import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.SupergroupEvent
interface SupergroupEventMessage<T : SupergroupEvent> : GroupEventMessage<T> interface SupergroupEventMessage<T : SupergroupEvent> : GroupEventMessage<T> {
override val chat: PreviewSupergroupChat
}

View File

@ -1,7 +1,8 @@
package dev.inmo.tgbotapi.types.message.abstracts package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.chat.Chat import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.chat.PreviewChat
interface WithSenderChatMessage { interface WithSenderChatMessage {
val senderChat: Chat val senderChat: PreviewChat
} }

View File

@ -126,6 +126,17 @@ import dev.inmo.tgbotapi.types.chat.ExtendedSupergroupChat
import dev.inmo.tgbotapi.types.chat.ForumChat import dev.inmo.tgbotapi.types.chat.ForumChat
import dev.inmo.tgbotapi.types.chat.GroupChat import dev.inmo.tgbotapi.types.chat.GroupChat
import dev.inmo.tgbotapi.types.chat.PossiblyPremiumChat import dev.inmo.tgbotapi.types.chat.PossiblyPremiumChat
import dev.inmo.tgbotapi.types.chat.PreviewBot
import dev.inmo.tgbotapi.types.chat.PreviewChannelChat
import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.chat.PreviewForumChat
import dev.inmo.tgbotapi.types.chat.PreviewGroupChat
import dev.inmo.tgbotapi.types.chat.PreviewPrivateChat
import dev.inmo.tgbotapi.types.chat.PreviewPublicChat
import dev.inmo.tgbotapi.types.chat.PreviewSuperPublicChat
import dev.inmo.tgbotapi.types.chat.PreviewSupergroupChat
import dev.inmo.tgbotapi.types.chat.PreviewUser
import dev.inmo.tgbotapi.types.chat.PreviewUsernameChat
import dev.inmo.tgbotapi.types.chat.PrivateChat import dev.inmo.tgbotapi.types.chat.PrivateChat
import dev.inmo.tgbotapi.types.chat.PublicChat import dev.inmo.tgbotapi.types.chat.PublicChat
import dev.inmo.tgbotapi.types.chat.SuperPublicChat import dev.inmo.tgbotapi.types.chat.SuperPublicChat
@ -1969,12 +1980,30 @@ public inline fun Chat.userOrThrow(): User = this as dev.inmo.tgbotapi.types.cha
public inline fun <T> Chat.ifUser(block: (User) -> T): T? = userOrNull() ?.let(block) public inline fun <T> Chat.ifUser(block: (User) -> T): T? = userOrNull() ?.let(block)
public inline fun Chat.previewUserOrNull(): PreviewUser? = this as?
dev.inmo.tgbotapi.types.chat.PreviewUser
public inline fun Chat.previewUserOrThrow(): PreviewUser = this as
dev.inmo.tgbotapi.types.chat.PreviewUser
public inline fun <T> Chat.ifPreviewUser(block: (PreviewUser) -> T): T? = previewUserOrNull()
?.let(block)
public inline fun Chat.botOrNull(): Bot? = this as? dev.inmo.tgbotapi.types.chat.Bot public inline fun Chat.botOrNull(): Bot? = this as? dev.inmo.tgbotapi.types.chat.Bot
public inline fun Chat.botOrThrow(): Bot = this as dev.inmo.tgbotapi.types.chat.Bot public inline fun Chat.botOrThrow(): Bot = this as dev.inmo.tgbotapi.types.chat.Bot
public inline fun <T> Chat.ifBot(block: (Bot) -> T): T? = botOrNull() ?.let(block) public inline fun <T> Chat.ifBot(block: (Bot) -> T): T? = botOrNull() ?.let(block)
public inline fun Chat.previewBotOrNull(): PreviewBot? = this as?
dev.inmo.tgbotapi.types.chat.PreviewBot
public inline fun Chat.previewBotOrThrow(): PreviewBot = this as
dev.inmo.tgbotapi.types.chat.PreviewBot
public inline fun <T> Chat.ifPreviewBot(block: (PreviewBot) -> T): T? = previewBotOrNull()
?.let(block)
public inline fun Chat.commonBotOrNull(): CommonBot? = this as? public inline fun Chat.commonBotOrNull(): CommonBot? = this as?
dev.inmo.tgbotapi.types.chat.CommonBot dev.inmo.tgbotapi.types.chat.CommonBot
@ -1992,6 +2021,87 @@ public inline fun Chat.commonUserOrThrow(): CommonUser = this as
public inline fun <T> Chat.ifCommonUser(block: (CommonUser) -> T): T? = commonUserOrNull() public inline fun <T> Chat.ifCommonUser(block: (CommonUser) -> T): T? = commonUserOrNull()
?.let(block) ?.let(block)
public inline fun Chat.previewChatOrNull(): PreviewChat? = this as?
dev.inmo.tgbotapi.types.chat.PreviewChat
public inline fun Chat.previewChatOrThrow(): PreviewChat = this as
dev.inmo.tgbotapi.types.chat.PreviewChat
public inline fun <T> Chat.ifPreviewChat(block: (PreviewChat) -> T): T? = previewChatOrNull()
?.let(block)
public inline fun Chat.previewUsernameChatOrNull(): PreviewUsernameChat? = this as?
dev.inmo.tgbotapi.types.chat.PreviewUsernameChat
public inline fun Chat.previewUsernameChatOrThrow(): PreviewUsernameChat = this as
dev.inmo.tgbotapi.types.chat.PreviewUsernameChat
public inline fun <T> Chat.ifPreviewUsernameChat(block: (PreviewUsernameChat) -> T): T? =
previewUsernameChatOrNull() ?.let(block)
public inline fun Chat.previewPrivateChatOrNull(): PreviewPrivateChat? = this as?
dev.inmo.tgbotapi.types.chat.PreviewPrivateChat
public inline fun Chat.previewPrivateChatOrThrow(): PreviewPrivateChat = this as
dev.inmo.tgbotapi.types.chat.PreviewPrivateChat
public inline fun <T> Chat.ifPreviewPrivateChat(block: (PreviewPrivateChat) -> T): T? =
previewPrivateChatOrNull() ?.let(block)
public inline fun Chat.previewPublicChatOrNull(): PreviewPublicChat? = this as?
dev.inmo.tgbotapi.types.chat.PreviewPublicChat
public inline fun Chat.previewPublicChatOrThrow(): PreviewPublicChat = this as
dev.inmo.tgbotapi.types.chat.PreviewPublicChat
public inline fun <T> Chat.ifPreviewPublicChat(block: (PreviewPublicChat) -> T): T? =
previewPublicChatOrNull() ?.let(block)
public inline fun Chat.previewSuperPublicChatOrNull(): PreviewSuperPublicChat? = this as?
dev.inmo.tgbotapi.types.chat.PreviewSuperPublicChat
public inline fun Chat.previewSuperPublicChatOrThrow(): PreviewSuperPublicChat = this as
dev.inmo.tgbotapi.types.chat.PreviewSuperPublicChat
public inline fun <T> Chat.ifPreviewSuperPublicChat(block: (PreviewSuperPublicChat) -> T): T? =
previewSuperPublicChatOrNull() ?.let(block)
public inline fun Chat.previewChannelChatOrNull(): PreviewChannelChat? = this as?
dev.inmo.tgbotapi.types.chat.PreviewChannelChat
public inline fun Chat.previewChannelChatOrThrow(): PreviewChannelChat = this as
dev.inmo.tgbotapi.types.chat.PreviewChannelChat
public inline fun <T> Chat.ifPreviewChannelChat(block: (PreviewChannelChat) -> T): T? =
previewChannelChatOrNull() ?.let(block)
public inline fun Chat.previewGroupChatOrNull(): PreviewGroupChat? = this as?
dev.inmo.tgbotapi.types.chat.PreviewGroupChat
public inline fun Chat.previewGroupChatOrThrow(): PreviewGroupChat = this as
dev.inmo.tgbotapi.types.chat.PreviewGroupChat
public inline fun <T> Chat.ifPreviewGroupChat(block: (PreviewGroupChat) -> T): T? =
previewGroupChatOrNull() ?.let(block)
public inline fun Chat.previewSupergroupChatOrNull(): PreviewSupergroupChat? = this as?
dev.inmo.tgbotapi.types.chat.PreviewSupergroupChat
public inline fun Chat.previewSupergroupChatOrThrow(): PreviewSupergroupChat = this as
dev.inmo.tgbotapi.types.chat.PreviewSupergroupChat
public inline fun <T> Chat.ifPreviewSupergroupChat(block: (PreviewSupergroupChat) -> T): T? =
previewSupergroupChatOrNull() ?.let(block)
public inline fun Chat.previewForumChatOrNull(): PreviewForumChat? = this as?
dev.inmo.tgbotapi.types.chat.PreviewForumChat
public inline fun Chat.previewForumChatOrThrow(): PreviewForumChat = this as
dev.inmo.tgbotapi.types.chat.PreviewForumChat
public inline fun <T> Chat.ifPreviewForumChat(block: (PreviewForumChat) -> T): T? =
previewForumChatOrNull() ?.let(block)
public inline fun Chat.unknownChatTypeOrNull(): UnknownChatType? = this as? public inline fun Chat.unknownChatTypeOrNull(): UnknownChatType? = this as?
dev.inmo.tgbotapi.types.chat.UnknownChatType dev.inmo.tgbotapi.types.chat.UnknownChatType

View File

@ -1,7 +1,7 @@
package dev.inmo.tgbotapi.extensions.utils.extensions package dev.inmo.tgbotapi.extensions.utils.extensions
import dev.inmo.tgbotapi.abstracts.FromUser import dev.inmo.tgbotapi.abstracts.FromUser
import dev.inmo.tgbotapi.abstracts.WithChat import dev.inmo.tgbotapi.abstracts.WithPreviewChat
import dev.inmo.tgbotapi.types.ChatIdentifier import dev.inmo.tgbotapi.types.ChatIdentifier
import dev.inmo.tgbotapi.types.UserId import dev.inmo.tgbotapi.types.UserId
import dev.inmo.tgbotapi.types.chat.Chat import dev.inmo.tgbotapi.types.chat.Chat
@ -15,13 +15,13 @@ import kotlinx.coroutines.flow.transform
* Will pass only those [T] which have [sameChat] as [chatId] * Will pass only those [T] which have [sameChat] as [chatId]
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun <T : WithChat> Flow<T>.fromChat(chatId: ChatIdentifier): Flow<T> = filter { it.sameChat(chatId) } inline fun <T : WithPreviewChat> Flow<T>.fromChat(chatId: ChatIdentifier): Flow<T> = filter { it.sameChat(chatId) }
/** /**
* Will pass only those [T] which have [sameChat] as [chatId] * Will pass only those [T] which have [sameChat] as [chatId]
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun <T : WithChat> Flow<T>.fromChat(chat: Chat): Flow<T> = fromChat(chat.id) inline fun <T : WithPreviewChat> Flow<T>.fromChat(chat: Chat): Flow<T> = fromChat(chat.id)
/** /**
* @return [Flow] with the [FromUser.user] field [User.id] the same as [userId] * @return [Flow] with the [FromUser.user] field [User.id] the same as [userId]

View File

@ -1,6 +1,6 @@
package dev.inmo.tgbotapi.extensions.utils.extensions package dev.inmo.tgbotapi.extensions.utils.extensions
import dev.inmo.tgbotapi.abstracts.WithChat import dev.inmo.tgbotapi.abstracts.WithPreviewChat
import dev.inmo.tgbotapi.extensions.utils.usernameChatOrNull import dev.inmo.tgbotapi.extensions.utils.usernameChatOrNull
import dev.inmo.tgbotapi.extensions.utils.whenUsernameChat import dev.inmo.tgbotapi.extensions.utils.whenUsernameChat
import dev.inmo.tgbotapi.types.ChatIdentifier import dev.inmo.tgbotapi.types.ChatIdentifier
@ -16,21 +16,23 @@ import dev.inmo.tgbotapi.utils.extensions.threadIdOrNull
* @return true in case if [this] message is placed in the chat with id == [chatId] * @return true in case if [this] message is placed in the chat with id == [chatId]
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun WithChat.sameChat(chatId: ChatIdentifier) = chat.id == chatId || (chatId is Username && chat.whenUsernameChat { inline fun WithPreviewChat.sameChat(chatId: ChatIdentifier) =
it.username == chatId chat.id == chatId || (chatId is Username && chat.whenUsernameChat {
} ?: false) it.username == chatId
} ?: false)
/** /**
* @return true in case if [this] message is placed in the [chat] * @return true in case if [this] message is placed in the [chat]
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun WithChat.sameChat(chat: Chat) = sameChat(chat.id) || chat.usernameChatOrNull() ?.username ?.let { sameChat(it) } ?: false inline fun WithPreviewChat.sameChat(chat: Chat) =
sameChat(chat.id) || chat.usernameChatOrNull()?.username?.let { sameChat(it) } ?: false
/** /**
* @return true in case if [this] message is placed in the same chat that [other] * @return true in case if [this] message is placed in the same chat that [other]
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun WithChat.sameChat(other: Message) = sameChat(other.chat) inline fun WithPreviewChat.sameChat(other: Message) = sameChat(other.chat)
/** /**
* @return true in case if [this] message is from the same chat (with id == [chatId]) and [this] [Message.messageId] * @return true in case if [this] message is from the same chat (with id == [chatId]) and [this] [Message.messageId]