1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2025-12-12 09:15:42 +00:00

improve messages hierarchy

This commit is contained in:
2025-09-22 12:19:34 +06:00
parent 2695b03968
commit 2ff11ad73c
11 changed files with 445 additions and 83 deletions

View File

@@ -1,6 +1,5 @@
package dev.inmo.tgbotapi.types.message.ChatEvents.suggested
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChannelDirectMessagesEvent
import dev.inmo.tgbotapi.types.payments.SuggestedPostPrice
import dev.inmo.tgbotapi.types.priceField
import dev.inmo.tgbotapi.types.sendDateField
@@ -23,7 +22,7 @@ data class SuggestedPostInfo(
val price: SuggestedPostPrice? = null,
@SerialName(sendDateField)
val sendDate: Int? = null
) : ChannelDirectMessagesEvent {
) {
@Serializable(State.Companion::class)
sealed interface State {
val name: String

View File

@@ -6,6 +6,7 @@ import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
import dev.inmo.tgbotapi.types.chat.*
import dev.inmo.tgbotapi.types.chat.CommonBot
import dev.inmo.tgbotapi.types.chat.User
import dev.inmo.tgbotapi.types.message.ChatEvents.suggested.SuggestedPostInfo
import dev.inmo.tgbotapi.types.message.abstracts.*
import dev.inmo.tgbotapi.types.message.content.MessageContent
import kotlinx.serialization.SerialName
@@ -332,6 +333,65 @@ data class FromChannelChannelDirectMessagesContentMessageImpl<T: MessageContent>
)
}
data class FromChannelSuggestedChannelDirectMessagesContentMessageImpl<T: MessageContent>(
override val chat: PreviewChannelDirectMessagesChat,
override val channel: PreviewChannelChat,
override val messageId: MessageId,
override val date: DateTime,
override val directMessageTopic: DirectMessagesTopic,
override val forwardOrigin: MessageOrigin?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyInfo: ReplyInfo?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?,
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupId?,
override val fromOffline: Boolean,
override val suggestedPostInfo: SuggestedPostInfo,
@SerialName(paidMessageStarCountField)
override val cost: Int? = null,
) : FromChannelSuggestedChannelDirectMessagesContentMessage<T> {
constructor(
chat: PreviewChannelDirectMessagesChat,
channel: PreviewChannelChat,
messageId: MessageId,
date: DateTime,
directMessageTopic: DirectMessagesTopic,
forwardInfo: ForwardInfo,
editDate: DateTime?,
hasProtectedContent: Boolean,
replyTo: AccessibleMessage?,
replyMarkup: InlineKeyboardMarkup?,
content: T,
senderBot: CommonBot?,
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupId?,
fromOffline: Boolean,
suggestedPostInfo: SuggestedPostInfo,
cost: Int? = null,
) : this(
chat = chat,
channel = channel,
messageId = messageId,
date = date,
directMessageTopic = directMessageTopic,
forwardOrigin = forwardInfo.messageOrigin(),
editDate = editDate,
hasProtectedContent = hasProtectedContent,
replyInfo = replyTo ?.let { ReplyInfo.Internal(it) },
replyMarkup = replyMarkup,
content = content,
senderBot = senderBot,
authorSignature = authorSignature,
mediaGroupId = mediaGroupId,
fromOffline = fromOffline,
suggestedPostInfo = suggestedPostInfo,
cost = cost,
)
}
data class AnonymousForumContentMessageImpl<T : MessageContent>(
override val chat: PreviewForumChat,
override val messageId: MessageId,
@@ -497,3 +557,63 @@ data class CommonChannelDirectMessagesContentMessageImpl<T : MessageContent>(
cost = cost,
)
}
data class CommonSuggestedChannelDirectMessagesContentMessageImpl<T : MessageContent>(
override val chat: PreviewChannelDirectMessagesChat,
override val messageId: MessageId,
override val from: User,
override val date: DateTime,
override val directMessageTopic: DirectMessagesTopic,
override val forwardOrigin: MessageOrigin?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyInfo: ReplyInfo?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?,
override val mediaGroupId: MediaGroupId?,
override val senderBoostsCount: Int?,
override val fromOffline: Boolean,
override val suggestedPostInfo: SuggestedPostInfo,
@SerialName(paidMessageStarCountField)
override val cost: Int? = null
) : CommonSuggestedChannelDirectMessagesContentMessage<T> {
constructor(
chat: PreviewChannelDirectMessagesChat,
messageId: MessageId,
from: User,
date: DateTime,
directMessageTopic: DirectMessagesTopic,
forwardInfo: ForwardInfo,
editDate: DateTime?,
hasProtectedContent: Boolean,
replyTo: AccessibleMessage?,
replyMarkup: InlineKeyboardMarkup?,
content: T,
senderBot: CommonBot?,
mediaGroupId: MediaGroupId?,
senderBoostsCount: Int?,
fromOffline: Boolean,
suggestedPostInfo: SuggestedPostInfo,
cost: Int? = null,
) : this(
chat = chat,
messageId = messageId,
from = from,
date = date,
directMessageTopic = directMessageTopic,
forwardOrigin = forwardInfo.messageOrigin(),
editDate = editDate,
hasProtectedContent = hasProtectedContent,
replyInfo = replyTo ?.let { ReplyInfo.Internal(it) },
replyMarkup = replyMarkup,
content = content,
senderBot = senderBot,
mediaGroupId = mediaGroupId,
senderBoostsCount = senderBoostsCount,
fromOffline = fromOffline,
suggestedPostInfo = suggestedPostInfo,
cost = cost,
)
}

View File

@@ -331,7 +331,6 @@ internal data class RawMessage(
checklist_tasks_done != null -> checklist_tasks_done
checklist_tasks_added != null -> checklist_tasks_added
direct_message_price_changed != null -> direct_message_price_changed
suggested_post_info != null -> suggested_post_info
suggested_post_approved != null -> suggested_post_approved
suggested_post_approval_failed != null -> suggested_post_approval_failed
suggested_post_declined != null -> suggested_post_declined
@@ -408,44 +407,91 @@ internal data class RawMessage(
val actualForumChat = when (chat) {
is ChannelDirectMessagesChatImpl -> chat.copy(id = chatId)
}
when (sender_chat) {
is PreviewChannelChat -> FromChannelChannelDirectMessagesContentMessageImpl(
chat = actualForumChat,
channel = sender_chat,
messageId = messageId,
date = date.asDate,
directMessageTopic = direct_messages_topic,
forwardOrigin = forward_origin,
editDate = edit_date ?.asDate,
hasProtectedContent = has_protected_content == true,
replyInfo = replyInfo,
replyMarkup = reply_markup,
content = content,
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline,
cost = paid_star_count,
)
is PreviewGroupChat,
null -> CommonChannelDirectMessagesContentMessageImpl(
chat = actualForumChat,
messageId = messageId,
from = checkedFrom ?: from ?: error("It is expected that in direct channel messages from non anonymous channels user must be specified"),
date = date.asDate,
directMessageTopic = direct_messages_topic,
forwardOrigin = forward_origin,
editDate = edit_date ?.asDate,
hasProtectedContent = has_protected_content == true,
replyInfo = replyInfo,
replyMarkup = reply_markup,
content = content,
senderBot = via_bot,
mediaGroupId = media_group_id,
senderBoostsCount = sender_boost_count,
fromOffline = is_from_offline,
cost = paid_star_count,
)
when (suggested_post_info) {
null -> {
when (sender_chat) {
is PreviewChannelChat -> FromChannelChannelDirectMessagesContentMessageImpl(
chat = actualForumChat,
channel = sender_chat,
messageId = messageId,
date = date.asDate,
directMessageTopic = direct_messages_topic,
forwardOrigin = forward_origin,
editDate = edit_date ?.asDate,
hasProtectedContent = has_protected_content == true,
replyInfo = replyInfo,
replyMarkup = reply_markup,
content = content,
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline,
cost = paid_star_count,
)
is PreviewGroupChat,
null -> CommonChannelDirectMessagesContentMessageImpl(
chat = actualForumChat,
messageId = messageId,
from = checkedFrom ?: from ?: error("It is expected that in direct channel messages from non anonymous channels user must be specified"),
date = date.asDate,
directMessageTopic = direct_messages_topic,
forwardOrigin = forward_origin,
editDate = edit_date ?.asDate,
hasProtectedContent = has_protected_content == true,
replyInfo = replyInfo,
replyMarkup = reply_markup,
content = content,
senderBot = via_bot,
mediaGroupId = media_group_id,
senderBoostsCount = sender_boost_count,
fromOffline = is_from_offline,
cost = paid_star_count,
)
}
}
else -> {
when (sender_chat) {
is PreviewChannelChat -> FromChannelSuggestedChannelDirectMessagesContentMessageImpl(
chat = actualForumChat,
channel = sender_chat,
messageId = messageId,
date = date.asDate,
directMessageTopic = direct_messages_topic,
forwardOrigin = forward_origin,
editDate = edit_date ?.asDate,
hasProtectedContent = has_protected_content == true,
replyInfo = replyInfo,
replyMarkup = reply_markup,
content = content,
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline,
suggestedPostInfo = suggested_post_info,
cost = paid_star_count,
)
is PreviewGroupChat,
null -> CommonSuggestedChannelDirectMessagesContentMessageImpl(
chat = actualForumChat,
messageId = messageId,
from = checkedFrom ?: from ?: error("It is expected that in direct channel messages from non anonymous channels user must be specified"),
date = date.asDate,
directMessageTopic = direct_messages_topic,
forwardOrigin = forward_origin,
editDate = edit_date ?.asDate,
hasProtectedContent = has_protected_content == true,
replyInfo = replyInfo,
replyMarkup = reply_markup,
content = content,
senderBot = via_bot,
mediaGroupId = media_group_id,
senderBoostsCount = sender_boost_count,
fromOffline = is_from_offline,
suggestedPostInfo = suggested_post_info,
cost = paid_star_count,
)
}
}
}
}
is PreviewPublicChat -> when (chat) {

View File

@@ -5,6 +5,7 @@ import dev.inmo.tgbotapi.types.DirectMessageThreadId
import dev.inmo.tgbotapi.types.MessageThreadId
import dev.inmo.tgbotapi.types.chat.*
import dev.inmo.tgbotapi.types.message.ChatEvents.forum.ForumTopicCreated
import dev.inmo.tgbotapi.types.message.ChatEvents.suggested.SuggestedPostInfo
import dev.inmo.tgbotapi.types.message.content.MessageContent
sealed interface GroupContentMessage<T : MessageContent> : PublicContentMessage<T> {
@@ -29,6 +30,9 @@ sealed interface ChannelDirectMessagesContentMessage<T : MessageContent> : Group
val directMessageThreadId: DirectMessageThreadId
get() = directMessageTopic.threadId
}
sealed interface SuggestedChannelDirectMessagesContentMessage<T : MessageContent> : ChannelDirectMessagesContentMessage<T> {
val suggestedPostInfo: SuggestedPostInfo
}
sealed interface FromChannelGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, SignedMessage, WithSenderChatMessage {
val channel: PreviewChannelChat
@@ -50,6 +54,8 @@ interface FromChannelForumContentMessage<T: MessageContent> : FromChannelGroupCo
interface FromChannelChannelDirectMessagesContentMessage<T: MessageContent> : FromChannelGroupContentMessage<T>, ChannelDirectMessagesContentMessage<T>
interface FromChannelSuggestedChannelDirectMessagesContentMessage<T: MessageContent> : FromChannelGroupContentMessage<T>, SuggestedChannelDirectMessagesContentMessage<T>
interface AnonymousForumContentMessage<T : MessageContent> : ForumContentMessage<T>, SignedMessage, WithSenderChatMessage {
override val senderChat: PreviewGroupChat
get() = chat
@@ -58,3 +64,5 @@ interface AnonymousForumContentMessage<T : MessageContent> : ForumContentMessage
interface CommonForumContentMessage<T : MessageContent> : ForumContentMessage<T>, PotentiallyFromUserGroupContentMessage<T>, FromUserMessage
interface CommonChannelDirectMessagesContentMessage<T : MessageContent> : ChannelDirectMessagesContentMessage<T>, PotentiallyFromUserGroupContentMessage<T>, FromUserMessage
interface CommonSuggestedChannelDirectMessagesContentMessage<T : MessageContent> : SuggestedChannelDirectMessagesContentMessage<T>, PotentiallyFromUserGroupContentMessage<T>, FromUserMessage

View File

@@ -224,5 +224,44 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
fromOffline = sourceMessage.fromOffline,
cost = sourceMessage.cost,
)
is CommonSuggestedChannelDirectMessagesContentMessage<*> -> CommonSuggestedChannelDirectMessagesContentMessageImpl(
chat = sourceMessage.chat,
messageId = sourceMessage.messageId,
from = sourceMessage.user,
date = sourceMessage.date,
directMessageTopic = sourceMessage.directMessageTopic,
forwardOrigin = sourceMessage.forwardOrigin,
editDate = sourceMessage.editDate,
hasProtectedContent = sourceMessage.hasProtectedContent,
replyInfo = sourceMessage.replyInfo,
replyMarkup = sourceMessage.replyMarkup,
content = content,
senderBot = sourceMessage.senderBot,
mediaGroupId = sourceMessage.mediaGroupId,
senderBoostsCount = sourceMessage.senderBoostsCount,
fromOffline = sourceMessage.fromOffline,
suggestedPostInfo = sourceMessage.suggestedPostInfo,
cost = sourceMessage.cost,
)
is FromChannelSuggestedChannelDirectMessagesContentMessage<*> -> FromChannelSuggestedChannelDirectMessagesContentMessageImpl(
chat = sourceMessage.chat,
channel = sourceMessage.channel,
messageId = sourceMessage.messageId,
date = sourceMessage.date,
directMessageTopic = sourceMessage.directMessageTopic,
forwardOrigin = sourceMessage.forwardOrigin,
editDate = sourceMessage.editDate,
hasProtectedContent = sourceMessage.hasProtectedContent,
replyInfo = sourceMessage.replyInfo,
replyMarkup = sourceMessage.replyMarkup,
content = content,
senderBot = sourceMessage.senderBot,
authorSignature = sourceMessage.authorSignature,
mediaGroupId = sourceMessage.mediaGroupId,
fromOffline = sourceMessage.fromOffline,
suggestedPostInfo = sourceMessage.suggestedPostInfo,
cost = sourceMessage.cost,
)
}
}