1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2026-03-05 10:22:24 +00:00

make chats to support private forums

This commit is contained in:
2026-01-07 23:19:12 +06:00
parent 9713a668e2
commit cc5056b685
12 changed files with 373 additions and 22 deletions

View File

@@ -18,6 +18,15 @@ sealed interface PrivateChat : Chat, UsernameChat {
val lastName: String
}
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(ChatSerializer::class)
sealed interface PrivateUserChat : PrivateChat
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(ChatSerializer::class)
sealed interface PrivateForumChat : PrivateUserChat, ForumChat {
}
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(ChatSerializer::class)
sealed interface BusinessChat : Chat {
@@ -51,7 +60,11 @@ sealed interface SupergroupChat : GroupChat, SuperPublicChat
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(ChatSerializer::class)
sealed interface ForumChat : SupergroupChat
sealed interface ForumChat : Chat
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(ChatSerializer::class)
sealed interface SupergroupForumChat : SupergroupChat, ForumChat
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(ChatSerializer::class)

View File

@@ -81,8 +81,16 @@ object ChatSerializer : KSerializer<Chat> {
val original = decodedJson[originField]
when (type) {
ChatType.Sender -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
ChatType.Private -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
ChatType.Sender -> if (isForum) {
formatter.decodeFromJsonElement(PrivateForumChatImpl.serializer(), decodedJson)
} else {
formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
}
ChatType.Private -> if (isForum) {
formatter.decodeFromJsonElement(PrivateForumChatImpl.serializer(), decodedJson)
} else {
formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
}
ChatType.Group -> formatter.decodeFromJsonElement(GroupChatImpl.serializer(), decodedJson)
ChatType.Supergroup -> when {
isForum -> formatter.decodeFromJsonElement(ForumChatImpl.serializer(), decodedJson)
@@ -128,8 +136,16 @@ object PreviewChatSerializer : KSerializer<PreviewChat> {
val original = decodedJson[originField]
return when (type) {
ChatType.Sender -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
ChatType.Private -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
ChatType.Sender -> if (isForum) {
formatter.decodeFromJsonElement(PrivateForumChatImpl.serializer(), decodedJson)
} else {
formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
}
ChatType.Private -> if (isForum) {
formatter.decodeFromJsonElement(PrivateForumChatImpl.serializer(), decodedJson)
} else {
formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
}
ChatType.Group -> formatter.decodeFromJsonElement(GroupChatImpl.serializer(), decodedJson)
ChatType.Supergroup -> {
when {
@@ -156,6 +172,7 @@ object PreviewChatSerializer : KSerializer<PreviewChat> {
override fun serialize(encoder: Encoder, value: PreviewChat) {
when (value) {
is PrivateChatImpl -> PrivateChatImpl.serializer().serialize(encoder, value)
is PrivateForumChatImpl -> PrivateForumChatImpl.serializer().serialize(encoder, value)
is BusinessChatImpl -> BusinessChatImpl.serializer().serialize(encoder, value)
is GroupChatImpl -> GroupChatImpl.serializer().serialize(encoder, value)
is SupergroupChatImpl -> SupergroupChatImpl.serializer().serialize(encoder, value)
@@ -183,8 +200,16 @@ sealed class ExtendedChatSerializer : KSerializer<ExtendedChat> {
val original = decodedJson[originField]
return when (type) {
ChatType.Sender -> formatter.decodeFromJsonElement(ExtendedPrivateChatImpl.serializer(), decodedJson)
ChatType.Private -> formatter.decodeFromJsonElement(ExtendedPrivateChatImpl.serializer(), decodedJson)
ChatType.Sender -> if (isForum) {
formatter.decodeFromJsonElement(ExtendedPrivateForumChatImpl.serializer(), decodedJson)
} else {
formatter.decodeFromJsonElement(ExtendedPrivateChatImpl.serializer(), decodedJson)
}
ChatType.Private -> if (isForum) {
formatter.decodeFromJsonElement(ExtendedPrivateForumChatImpl.serializer(), decodedJson)
} else {
formatter.decodeFromJsonElement(ExtendedPrivateChatImpl.serializer(), decodedJson)
}
ChatType.Group -> formatter.decodeFromJsonElement(ExtendedGroupChatImpl.serializer(), decodedJson)
ChatType.Supergroup -> {
when {
@@ -212,6 +237,7 @@ sealed class ExtendedChatSerializer : KSerializer<ExtendedChat> {
when (value) {
is ExtendedBusinessChatImpl -> ExtendedBusinessChatImpl.serializer().serialize(encoder, value)
is ExtendedPrivateChatImpl -> ExtendedPrivateChatImpl.serializer().serialize(encoder, value)
is ExtendedPrivateForumChatImpl -> ExtendedPrivateForumChatImpl.serializer().serialize(encoder, value)
is ExtendedGroupChatImpl -> ExtendedGroupChatImpl.serializer().serialize(encoder, value)
is ExtendedSupergroupChatImpl -> ExtendedSupergroupChatImpl.serializer().serialize(encoder, value)
is ExtendedForumChatImpl -> ExtendedForumChatImpl.serializer().serialize(encoder, value)
@@ -238,7 +264,7 @@ sealed class ExtendedChatSerializer : KSerializer<ExtendedChat> {
class BasedOnBusinessConnection(private val businessConnectionId: BusinessConnectionId) : ExtendedChatSerializer() {
override fun deserialize(decoder: Decoder): ExtendedChat {
return super.deserialize(decoder).let {
if (it is ExtendedPrivateChatImpl) {
if (it is ExtendedPrivateChatImpl || it is ExtendedPrivateForumChatImpl) {
ExtendedBusinessChatImpl(
BusinessChatId(it.id.chatId, businessConnectionId),
it

View File

@@ -165,7 +165,61 @@ data class ExtendedPrivateChatImpl(
override val acceptedGiftTypes: AcceptedGiftTypes = AcceptedGiftTypes(),
) : ExtendedPrivateChat
typealias ExtendedUser = ExtendedPrivateChatImpl
@Serializable
@RiskFeature("This class is a subject of changes. It is better to use ExtendedPrivateChat due")
data class ExtendedPrivateForumChatImpl(
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@SerialName(idField)
override val id: UserId,
@SerialName(photoField)
override val chatPhoto: ChatPhoto? = null,
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@SerialName(usernameField)
override val username: Username? = null,
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@SerialName(activeUsernamesField)
override val activeUsernames: List<Username> = emptyList(),
@SerialName(firstNameField)
override val firstName: String = "",
@SerialName(lastNameField)
override val lastName: String = "",
@SerialName(bioField)
override val bio: String = "",
@SerialName(hasPrivateForwardsField)
override val hasPrivateForwards: Boolean = false,
@SerialName(hasRestrictedVoiceAndVideoMessagesField)
override val hasRestrictedVoiceAndVideoMessages: Boolean = false,
@SerialName(emojiStatusCustomEmojiIdField)
override val statusEmojiId: CustomEmojiId? = null,
@SerialName(emojiStatusExpirationDateField)
override val statusEmojiExpiration: TelegramDate? = null,
@SerialName(accentColorIdField)
override val accentColorId: ColorId = ColorId(0),
@SerialName(profileAccentColorIdField)
override val profileAccentColorId: ColorId? = null,
@SerialName(backgroundCustomEmojiIdField)
override val backgroundCustomEmojiId: CustomEmojiId? = null,
@SerialName(profileBackgroundCustomEmojiIdField)
override val profileBackgroundCustomEmojiId: CustomEmojiId? = null,
@SerialName(businessIntroField)
override val businessIntro: BusinessIntro? = null,
@SerialName(businessLocationField)
override val businessLocation: BusinessLocation? = null,
@SerialName(businessOpeningHoursField)
override val businessOpeningHours: BusinessOpeningHours? = null,
@SerialName(birthdateField)
override val birthdate: Birthdate? = null,
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@SerialName(personalChatField)
@Serializable(PreviewChatSerializer::class)
override val personalChat: PreviewChannelChat? = null,
@SerialName(maxReactionCountField)
override val maxReactionsCount: Int = 3,
@SerialName(acceptedGiftTypesField)
override val acceptedGiftTypes: AcceptedGiftTypes = AcceptedGiftTypes(),
) : ExtendedPrivateForumChat
typealias ExtendedUser = ExtendedPrivateChat
@Serializable
@RiskFeature("This class is a subject of changes. It is better to use ExtendedSupergroupChat due")

View File

@@ -56,7 +56,7 @@ sealed interface ExtendedGroupChat : GroupChat, ExtendedPublicChat {
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(ExtendedChatSerializer.Companion::class)
sealed interface ExtendedPrivateChat : PrivateChat, ExtendedChatWithUsername, ExtendedNonBotChat {
sealed interface ExtendedPrivateChat : PrivateUserChat, ExtendedChatWithUsername, ExtendedNonBotChat {
val bio: String
val hasPrivateForwards: Boolean
val hasRestrictedVoiceAndVideoMessages: Boolean
@@ -72,6 +72,10 @@ sealed interface ExtendedPrivateChat : PrivateChat, ExtendedChatWithUsername, Ex
get() = hasPrivateForwards
}
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(ExtendedChatSerializer.Companion::class)
sealed interface ExtendedPrivateForumChat : ExtendedPrivateChat, PrivateForumChat
sealed interface ExtendedPublicChat : ExtendedChat, PublicChat, ExtendedNonBotChat {
val description: String
val inviteLink: String?
@@ -112,7 +116,7 @@ sealed interface ExtendedSupergroupChat : SupergroupChat, ExtendedGroupChat, Ext
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(ExtendedChatSerializer.Companion::class)
sealed interface ExtendedForumChat : ExtendedSupergroupChat, ForumChat
sealed interface ExtendedForumChat : ExtendedSupergroupChat, SupergroupForumChat
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(PreviewChatSerializer::class)

View File

@@ -33,6 +33,20 @@ data class PrivateChatImpl(
@SerialName(lastNameField)
override val lastName: String = ""
) : PreviewPrivateChat
@Serializable
@RiskFeature("This class is a subject of changes. It is better to use PrivateChat due")
data class PrivateForumChatImpl(
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@SerialName(idField)
override val id: UserId,
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@SerialName(usernameField)
override val username: Username? = null,
@SerialName(firstNameField)
override val firstName: String = "",
@SerialName(lastNameField)
override val lastName: String = ""
) : PreviewPrivateForumChat
@Serializable
@RiskFeature("This class is a subject of changes. It is better to use PrivateChat due")
@@ -115,7 +129,7 @@ sealed class Bot : User()
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(UserSerializer::class)
sealed class PreviewBot : PreviewUser()
sealed class PreviewBot : PrivateChat, PreviewChat, User()
@Serializable
data class CommonBot(

View File

@@ -11,7 +11,11 @@ sealed interface PreviewUsernameChat : PreviewChat, UsernameChat
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewPrivateChat : PreviewUsernameChat, PrivateChat
sealed interface PreviewPrivateChat : PreviewUsernameChat, PrivateUserChat
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewPrivateForumChat : PreviewPrivateChat, PrivateForumChat
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(PreviewChatSerializer::class)
@@ -39,7 +43,7 @@ sealed interface PreviewSupergroupChat : PreviewGroupChat, PreviewSuperPublicCha
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(PreviewChatSerializer::class)
sealed interface PreviewForumChat : PreviewSupergroupChat, ForumChat
sealed interface PreviewForumChat : PreviewSupergroupChat, SupergroupForumChat
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(PreviewChatSerializer::class)

View File

@@ -13,9 +13,11 @@ import dev.inmo.tgbotapi.types.chat.*
* language)
*/
fun PrivateChat.toUser(): User = when (this) {
is ExtendedPrivateChatImpl -> CommonUser(id, firstName, lastName, username)
is CommonUser -> this
is CommonBot -> this
is PrivateChatImpl -> CommonUser(id, firstName, lastName, username)
is ExtendedBot -> this
is ExtendedPrivateChatImpl -> CommonUser(id, firstName, lastName, username)
is PrivateChatImpl -> CommonUser(id, firstName, lastName, username)
is ExtendedPrivateForumChatImpl -> CommonUser(id, firstName, lastName, username)
is PrivateForumChatImpl -> CommonUser(id, firstName, lastName, username)
}