mirror of
				https://github.com/InsanusMokrassar/TelegramBotAPI.git
				synced 2025-11-03 21:50:13 +00:00 
			
		
		
		
	start separate channel direct messages thread id insttead of one merged message thread id
This commit is contained in:
		@@ -0,0 +1,7 @@
 | 
			
		||||
package dev.inmo.tgbotapi.requests.send.abstracts
 | 
			
		||||
 | 
			
		||||
import dev.inmo.tgbotapi.types.DirectMessageThreadId
 | 
			
		||||
 | 
			
		||||
interface OptionallyChannelDirectMessageThreadRequest {
 | 
			
		||||
    val directMessageThreadId: DirectMessageThreadId?
 | 
			
		||||
}
 | 
			
		||||
@@ -7,4 +7,5 @@ interface SendMessageRequest<T: Any> : SendChatMessageRequest<T>,
 | 
			
		||||
    DisableNotification,
 | 
			
		||||
    ProtectContent,
 | 
			
		||||
    AllowPaidBroadcast,
 | 
			
		||||
    OptionallyMessageThreadRequest
 | 
			
		||||
    OptionallyMessageThreadRequest,
 | 
			
		||||
    OptionallyChannelDirectMessageThreadRequest
 | 
			
		||||
 
 | 
			
		||||
@@ -63,6 +63,8 @@ data class SendInvoice(
 | 
			
		||||
    override val priceDependOnShipAddress: Boolean = false,
 | 
			
		||||
    @SerialName(messageThreadIdField)
 | 
			
		||||
    override val threadId: MessageThreadId? = chatId.threadId,
 | 
			
		||||
    @SerialName(directMessagesTopicIdField)
 | 
			
		||||
    override val directMessageThreadId: DirectMessageThreadId? = chatId.directMessageThreadId,
 | 
			
		||||
    @SerialName(disableNotificationField)
 | 
			
		||||
    override val disableNotification: Boolean = false,
 | 
			
		||||
    @SerialName(protectContentField)
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,8 @@ sealed interface IdChatIdentifier : ChatIdentifier {
 | 
			
		||||
        get() = null
 | 
			
		||||
    val businessConnectionId: BusinessConnectionId?
 | 
			
		||||
        get() = null
 | 
			
		||||
    val directMessageThreadId: DirectMessageThreadId?
 | 
			
		||||
        get() = null
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        operator fun invoke(chatId: RawChatId, threadId: MessageThreadId? = null, businessConnectionId: BusinessConnectionId? = null) = threadId ?.let {
 | 
			
		||||
@@ -64,6 +66,18 @@ value class ChatIdWithThreadId(val chatIdWithThreadId: Pair<RawChatId, MessageTh
 | 
			
		||||
 | 
			
		||||
    constructor(chatId: RawChatId, threadId: MessageThreadId): this(chatId to threadId)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 | 
			
		||||
@Serializable(ChatIdentifierSerializer::class)
 | 
			
		||||
@JvmInline
 | 
			
		||||
value class ChatIdWithChannelDirectMessageThreadId(val chatIdWithThreadId: Pair<RawChatId, DirectMessageThreadId>) : IdChatIdentifier {
 | 
			
		||||
    override val chatId: RawChatId
 | 
			
		||||
        get() = chatIdWithThreadId.first
 | 
			
		||||
    override val directMessageThreadId: DirectMessageThreadId
 | 
			
		||||
        get() = chatIdWithThreadId.second
 | 
			
		||||
 | 
			
		||||
    constructor(chatId: RawChatId, threadId: DirectMessageThreadId): this(chatId to threadId)
 | 
			
		||||
}
 | 
			
		||||
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 | 
			
		||||
@Serializable(ChatIdentifierSerializer::class)
 | 
			
		||||
@JvmInline
 | 
			
		||||
@@ -85,10 +99,12 @@ val ChatIdentifier.businessConnectionId: BusinessConnectionId?
 | 
			
		||||
fun IdChatIdentifier.toChatId() = when (this) {
 | 
			
		||||
    is ChatId -> this
 | 
			
		||||
    is ChatIdWithThreadId -> ChatId(chatId)
 | 
			
		||||
    is ChatIdWithChannelDirectMessageThreadId -> ChatId(chatId)
 | 
			
		||||
    is BusinessChatId -> ChatId(chatId)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun IdChatIdentifier.toChatWithThreadId(threadId: MessageThreadId) = IdChatIdentifier(chatId, threadId)
 | 
			
		||||
fun IdChatIdentifier.toChatIdWithChannelDirectMessageThreadId(threadId: DirectMessageThreadId) = ChatIdWithChannelDirectMessageThreadId(chatId, threadId)
 | 
			
		||||
fun IdChatIdentifier.toBusinessChatId(businessConnectionId: BusinessConnectionId) = IdChatIdentifier(chatId, businessConnectionId)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -221,11 +237,20 @@ object FullChatIdentifierSerializer : KSerializer<ChatIdentifier> {
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
                3 -> {
 | 
			
		||||
                    val (chatId, _, businessConnectionId) = splitted
 | 
			
		||||
                    BusinessChatId(
 | 
			
		||||
                        chatId.toLongOrNull() ?.let(::RawChatId) ?: return@let null,
 | 
			
		||||
                        businessConnectionId.let(::BusinessConnectionId)
 | 
			
		||||
                    )
 | 
			
		||||
                    val (chatId, intermediateDelimiter, additionalId) = splitted
 | 
			
		||||
                    val additionalIdAsLong by lazy {
 | 
			
		||||
                        additionalId.toLongOrNull()
 | 
			
		||||
                    }
 | 
			
		||||
                    when {
 | 
			
		||||
                        intermediateDelimiter == "cdm" && additionalIdAsLong != null -> ChatIdWithChannelDirectMessageThreadId(
 | 
			
		||||
                            chatId.toLongOrNull() ?.let(::RawChatId) ?: return@let null,
 | 
			
		||||
                            additionalIdAsLong ?.let(::DirectMessageThreadId) ?: return@let null
 | 
			
		||||
                        )
 | 
			
		||||
                        else -> BusinessChatId(
 | 
			
		||||
                            chatId.toLongOrNull() ?.let(::RawChatId) ?: return@let null,
 | 
			
		||||
                            additionalId.let(::BusinessConnectionId)
 | 
			
		||||
                        )
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else -> null
 | 
			
		||||
            }
 | 
			
		||||
@@ -239,6 +264,7 @@ object FullChatIdentifierSerializer : KSerializer<ChatIdentifier> {
 | 
			
		||||
            is ChatId -> encoder.encodeLong(value.chatId.long)
 | 
			
		||||
            is ChatIdWithThreadId -> encoder.encodeString("${value.chatId}/${value.threadId}")
 | 
			
		||||
            is BusinessChatId -> encoder.encodeString("${value.chatId}//${value.businessConnectionId}")
 | 
			
		||||
            is ChatIdWithChannelDirectMessageThreadId -> encoder.encodeString("${value.chatId}/cdm/${value.directMessageThreadId}")
 | 
			
		||||
            is Username -> encoder.encodeString(value.full)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -141,6 +141,7 @@ const val giveawayMessageIdField = "giveaway_message_id"
 | 
			
		||||
const val messageIdsField = "message_ids"
 | 
			
		||||
const val actorChatField = "actor_chat"
 | 
			
		||||
const val messageThreadIdField = "message_thread_id"
 | 
			
		||||
const val directMessagesTopicIdField = "direct_messages_topic_id"
 | 
			
		||||
const val mediaGroupIdField = "media_group_id"
 | 
			
		||||
const val updateIdField = "update_id"
 | 
			
		||||
const val fromChatIdField = "from_chat_id"
 | 
			
		||||
 
 | 
			
		||||
@@ -8,33 +8,33 @@ import kotlinx.serialization.encoding.Decoder
 | 
			
		||||
import kotlinx.serialization.encoding.Encoder
 | 
			
		||||
 | 
			
		||||
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 | 
			
		||||
@Serializable(ChannelDirectMessagesConfigurationChanged.Companion::class)
 | 
			
		||||
sealed interface ChannelDirectMessagesConfigurationChanged : ChannelEvent {
 | 
			
		||||
@Serializable(DirectMessagesConfigurationChanged.Companion::class)
 | 
			
		||||
sealed interface DirectMessagesConfigurationChanged : ChannelEvent {
 | 
			
		||||
    val enabled: Boolean
 | 
			
		||||
    val cost: Int?
 | 
			
		||||
    @Serializable(ChannelDirectMessagesConfigurationChanged.Companion::class)
 | 
			
		||||
    data object Disabled : ChannelDirectMessagesConfigurationChanged {
 | 
			
		||||
    @Serializable(DirectMessagesConfigurationChanged.Companion::class)
 | 
			
		||||
    data object Disabled : DirectMessagesConfigurationChanged {
 | 
			
		||||
        override val enabled: Boolean
 | 
			
		||||
            get() = false
 | 
			
		||||
        override val cost: Int?
 | 
			
		||||
            get() = null
 | 
			
		||||
    }
 | 
			
		||||
    @Serializable(ChannelDirectMessagesConfigurationChanged.Companion::class)
 | 
			
		||||
    data object Free : ChannelDirectMessagesConfigurationChanged {
 | 
			
		||||
    @Serializable(DirectMessagesConfigurationChanged.Companion::class)
 | 
			
		||||
    data object Free : DirectMessagesConfigurationChanged {
 | 
			
		||||
        override val enabled: Boolean
 | 
			
		||||
            get() = true
 | 
			
		||||
        override val cost: Int
 | 
			
		||||
            get() = 0
 | 
			
		||||
    }
 | 
			
		||||
    @Serializable(ChannelDirectMessagesConfigurationChanged.Companion::class)
 | 
			
		||||
    @Serializable(DirectMessagesConfigurationChanged.Companion::class)
 | 
			
		||||
    data class Paid(
 | 
			
		||||
        override val cost: Int
 | 
			
		||||
    ) : ChannelDirectMessagesConfigurationChanged {
 | 
			
		||||
    ) : DirectMessagesConfigurationChanged {
 | 
			
		||||
        override val enabled: Boolean
 | 
			
		||||
            get() = true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    companion object : KSerializer<ChannelDirectMessagesConfigurationChanged> {
 | 
			
		||||
    companion object : KSerializer<DirectMessagesConfigurationChanged> {
 | 
			
		||||
        @Serializable
 | 
			
		||||
        private data class RawDirectMessagePriceChanged(
 | 
			
		||||
            val are_direct_messages_enabled: Boolean = false,
 | 
			
		||||
@@ -45,7 +45,7 @@ sealed interface ChannelDirectMessagesConfigurationChanged : ChannelEvent {
 | 
			
		||||
 | 
			
		||||
        override fun serialize(
 | 
			
		||||
            encoder: Encoder,
 | 
			
		||||
            value: ChannelDirectMessagesConfigurationChanged
 | 
			
		||||
            value: DirectMessagesConfigurationChanged
 | 
			
		||||
        ) {
 | 
			
		||||
            RawDirectMessagePriceChanged.serializer().serialize(
 | 
			
		||||
                encoder,
 | 
			
		||||
@@ -56,7 +56,7 @@ sealed interface ChannelDirectMessagesConfigurationChanged : ChannelEvent {
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        override fun deserialize(decoder: Decoder): ChannelDirectMessagesConfigurationChanged {
 | 
			
		||||
        override fun deserialize(decoder: Decoder): DirectMessagesConfigurationChanged {
 | 
			
		||||
            val raw = RawDirectMessagePriceChanged.serializer().deserialize(decoder)
 | 
			
		||||
 | 
			
		||||
            return when {
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
package dev.inmo.tgbotapi.types
 | 
			
		||||
 | 
			
		||||
import kotlinx.serialization.Serializable
 | 
			
		||||
import kotlin.jvm.JvmInline
 | 
			
		||||
 | 
			
		||||
@Serializable
 | 
			
		||||
@JvmInline
 | 
			
		||||
value class DirectMessageThreadId(
 | 
			
		||||
    val long: Long
 | 
			
		||||
) {
 | 
			
		||||
    override fun toString(): String {
 | 
			
		||||
        return long.toString()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package dev.inmo.tgbotapi.types.chat
 | 
			
		||||
 | 
			
		||||
import dev.inmo.tgbotapi.abstracts.OptionallyWithUser
 | 
			
		||||
import dev.inmo.tgbotapi.types.MessageThreadId
 | 
			
		||||
import dev.inmo.tgbotapi.types.DirectMessageThreadId
 | 
			
		||||
import dev.inmo.tgbotapi.types.topicIdField
 | 
			
		||||
import dev.inmo.tgbotapi.types.userField
 | 
			
		||||
import kotlinx.serialization.SerialName
 | 
			
		||||
@@ -10,7 +10,7 @@ import kotlinx.serialization.Serializable
 | 
			
		||||
@Serializable
 | 
			
		||||
data class DirectMessagesTopic(
 | 
			
		||||
    @SerialName(topicIdField)
 | 
			
		||||
    val threadId: MessageThreadId,
 | 
			
		||||
    val threadId: DirectMessageThreadId,
 | 
			
		||||
    @Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 | 
			
		||||
    @SerialName(userField)
 | 
			
		||||
    override val user: PreviewUser? = null,
 | 
			
		||||
 
 | 
			
		||||
@@ -188,7 +188,7 @@ internal data class RawMessage(
 | 
			
		||||
    private val checklist_tasks_added: ChecklistTasksAdded? = null,
 | 
			
		||||
 | 
			
		||||
    // Channel direct messages
 | 
			
		||||
    private val direct_message_price_changed: ChannelDirectMessagesConfigurationChanged? = null,
 | 
			
		||||
    private val direct_message_price_changed: DirectMessagesConfigurationChanged? = null,
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    private val suggested_post_approved: SuggestedPostApproved? = null,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user