1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2024-11-22 08:13:47 +00:00

add support of forum chats

This commit is contained in:
InsanusMokrassar 2022-11-06 12:51:53 +06:00
parent 8f4eb74e39
commit 867a46d397
10 changed files with 432 additions and 43 deletions

View File

@ -11,6 +11,7 @@ import kotlin.jvm.JvmInline
typealias Identifier = Long typealias Identifier = Long
typealias MessageId = Long typealias MessageId = Long
typealias MessageThreadId = Long
typealias MessageIdentifier = MessageId typealias MessageIdentifier = MessageId
typealias InlineQueryIdentifier = String typealias InlineQueryIdentifier = String
typealias UpdateIdentifier = Long typealias UpdateIdentifier = Long
@ -148,6 +149,7 @@ const val tgWebAppStartParamField = "tgWebAppStartParam"
const val chatIdField = "chat_id" const val chatIdField = "chat_id"
const val senderChatIdField = "sender_chat_id" const val senderChatIdField = "sender_chat_id"
const val messageIdField = "message_id" const val messageIdField = "message_id"
const val messageThreadIdField = "message_thread_id"
const val updateIdField = "update_id" const val updateIdField = "update_id"
const val fromChatIdField = "from_chat_id" const val fromChatIdField = "from_chat_id"
const val disableWebPagePreviewField = "disable_web_page_preview" const val disableWebPagePreviewField = "disable_web_page_preview"
@ -313,6 +315,7 @@ const val botCommandsField = "commands"
const val scopeField = "scope" const val scopeField = "scope"
const val isMemberField = "is_member" const val isMemberField = "is_member"
const val isForumField = "is_forum"
const val canSendMessagesField = "can_send_messages" const val canSendMessagesField = "can_send_messages"
const val canSendMediaMessagesField = "can_send_media_messages" const val canSendMediaMessagesField = "can_send_media_messages"
const val canSendOtherMessagesField = "can_send_other_messages" const val canSendOtherMessagesField = "can_send_other_messages"

View File

@ -5,10 +5,9 @@ import dev.inmo.tgbotapi.types.*
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable(PreviewChatSerializer::class) @Serializable(PreviewChatSerializer::class)
sealed interface ChannelChat : SuperPublicChat sealed interface UsernameChat : Chat {
val username: Username?
@Serializable(PreviewChatSerializer::class) }
sealed interface GroupChat : PublicChat
@Serializable(PreviewChatSerializer::class) @Serializable(PreviewChatSerializer::class)
sealed interface PrivateChat : Chat, UsernameChat { sealed interface PrivateChat : Chat, UsernameChat {
@ -22,16 +21,20 @@ sealed interface PublicChat : Chat {
val title: String val title: String
} }
@Serializable(PreviewChatSerializer::class)
sealed interface SupergroupChat : GroupChat, SuperPublicChat
@Serializable(PreviewChatSerializer::class) @Serializable(PreviewChatSerializer::class)
sealed interface SuperPublicChat : PublicChat, UsernameChat sealed interface SuperPublicChat : PublicChat, UsernameChat
@Serializable(PreviewChatSerializer::class) @Serializable(PreviewChatSerializer::class)
sealed interface UsernameChat : Chat { sealed interface ChannelChat : SuperPublicChat
val username: Username?
} @Serializable(PreviewChatSerializer::class)
sealed interface GroupChat : PublicChat
@Serializable(PreviewChatSerializer::class)
sealed interface SupergroupChat : GroupChat, SuperPublicChat
@Serializable(PreviewChatSerializer::class)
sealed interface ForumChat : SupergroupChat
@Serializable(PreviewChatSerializer::class) @Serializable(PreviewChatSerializer::class)
sealed interface PossiblyPremiumChat : Chat { sealed interface PossiblyPremiumChat : Chat {

View File

@ -57,11 +57,16 @@ object PreviewChatSerializer : KSerializer<Chat> {
val decodedJson = JsonObject.serializer().deserialize(decoder) 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
return when (type) { return when (type) {
ChatType.PrivateChatType -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson) ChatType.PrivateChatType -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
ChatType.GroupChatType -> formatter.decodeFromJsonElement(GroupChatImpl.serializer(), decodedJson) ChatType.GroupChatType -> formatter.decodeFromJsonElement(GroupChatImpl.serializer(), decodedJson)
ChatType.SupergroupChatType -> formatter.decodeFromJsonElement(SupergroupChatImpl.serializer(), decodedJson) ChatType.SupergroupChatType -> if (isForum) {
formatter.decodeFromJsonElement(ForumChatImpl.serializer(), decodedJson)
} else {
formatter.decodeFromJsonElement(SupergroupChatImpl.serializer(), decodedJson)
}
ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ChannelChatImpl.serializer(), decodedJson) ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ChannelChatImpl.serializer(), decodedJson)
is ChatType.UnknownChatType -> UnknownChatType( is ChatType.UnknownChatType -> UnknownChatType(
formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(), formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(),
@ -77,6 +82,7 @@ object PreviewChatSerializer : KSerializer<Chat> {
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 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 ExtendedBot -> ExtendedBot.serializer().serialize(encoder, value)
@ -95,12 +101,17 @@ object ExtendedChatSerializer : KSerializer<ExtendedChat> {
val decodedJson = JsonObject.serializer().deserialize(decoder) 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
return when (type) { return when (type) {
// else -> throw IllegalArgumentException("Unknown type of chat") // else -> throw IllegalArgumentException("Unknown type of chat")
ChatType.PrivateChatType -> formatter.decodeFromJsonElement(ExtendedPrivateChatImpl.serializer(), decodedJson) ChatType.PrivateChatType -> formatter.decodeFromJsonElement(ExtendedPrivateChatImpl.serializer(), decodedJson)
ChatType.GroupChatType -> formatter.decodeFromJsonElement(ExtendedGroupChatImpl.serializer(), decodedJson) ChatType.GroupChatType -> formatter.decodeFromJsonElement(ExtendedGroupChatImpl.serializer(), decodedJson)
ChatType.SupergroupChatType -> formatter.decodeFromJsonElement(ExtendedSupergroupChatImpl.serializer(), decodedJson) ChatType.SupergroupChatType -> if (isForum) {
formatter.decodeFromJsonElement(ExtendedForumChatImpl.serializer(), decodedJson)
} else {
formatter.decodeFromJsonElement(ExtendedSupergroupChatImpl.serializer(), decodedJson)
}
ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ExtendedChannelChatImpl.serializer(), decodedJson) ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ExtendedChannelChatImpl.serializer(), decodedJson)
is ChatType.UnknownChatType -> UnknownExtendedChat( is ChatType.UnknownChatType -> UnknownExtendedChat(
formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(), formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(),
@ -115,6 +126,7 @@ object ExtendedChatSerializer : KSerializer<ExtendedChat> {
is ExtendedPrivateChatImpl -> ExtendedPrivateChatImpl.serializer().serialize(encoder, value) is ExtendedPrivateChatImpl -> ExtendedPrivateChatImpl.serializer().serialize(encoder, value)
is ExtendedGroupChatImpl -> ExtendedGroupChatImpl.serializer().serialize(encoder, value) is ExtendedGroupChatImpl -> ExtendedGroupChatImpl.serializer().serialize(encoder, value)
is ExtendedSupergroupChatImpl -> ExtendedSupergroupChatImpl.serializer().serialize(encoder, value) is ExtendedSupergroupChatImpl -> ExtendedSupergroupChatImpl.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 UnknownExtendedChat -> JsonObject.serializer().serialize(encoder, value.rawJson) is UnknownExtendedChat -> JsonObject.serializer().serialize(encoder, value.rawJson)
} }

View File

@ -104,6 +104,41 @@ data class ExtendedSupergroupChatImpl(
override val requireAdminApproveToJoin: Boolean = false override val requireAdminApproveToJoin: Boolean = false
) : ExtendedSupergroupChat ) : ExtendedSupergroupChat
@Serializable
data class ExtendedForumChatImpl(
@SerialName(idField)
override val id: ChatId,
@SerialName(titleField)
override val title: String,
@SerialName(usernameField)
override val username: Username? = null,
@SerialName(photoField)
override val chatPhoto: ChatPhoto? = null,
@SerialName(permissionsField)
override val permissions: ChatPermissions,
@SerialName(descriptionField)
override val description: String = "",
@SerialName(inviteLinkField)
override val inviteLink: String? = null,
@SerialName(pinnedMessageField)
@Serializable(TelegramBotAPIMessageDeserializeOnlySerializer::class)
override val pinnedMessage: Message? = null,
@SerialName(stickerSetNameFullField)
override val stickerSetName: StickerSetName? = null,
@SerialName(slowModeDelayField)
override val slowModeDelay: Long? = null,
@SerialName(canSetStickerSetField)
override val canSetStickerSet: Boolean = false,
@SerialName(linkedChatIdField)
override val linkedChannelChatId: ChatId? = null,
@SerialName(locationField)
override val location: ChatLocation? = null,
@SerialName(joinToSendMessagesField)
override val requiresJoinForMessaging: Boolean = false,
@SerialName(joinByRequestField)
override val requireAdminApproveToJoin: Boolean = false
) : ExtendedForumChat
@Serializable @Serializable
data class ExtendedBot( data class ExtendedBot(
override val id: UserId, override val id: UserId,

View File

@ -51,6 +51,9 @@ sealed interface ExtendedSupergroupChat : SupergroupChat, ExtendedGroupChat {
val requireAdminApproveToJoin: Boolean val requireAdminApproveToJoin: Boolean
} }
@Serializable(ExtendedChatSerializer::class)
sealed interface ExtendedForumChat : ExtendedSupergroupChat
@Serializable(ExtendedChatSerializer::class) @Serializable(ExtendedChatSerializer::class)
sealed interface ExtendedChat : Chat { sealed interface ExtendedChat : Chat {
val chatPhoto: ChatPhoto? val chatPhoto: ChatPhoto?

View File

@ -37,6 +37,16 @@ data class SupergroupChatImpl(
override val username: Username? = null override val username: Username? = null
) : SupergroupChat ) : SupergroupChat
@Serializable
data class ForumChatImpl(
@SerialName(idField)
override val id: ChatId,
@SerialName(titleField)
override val title: String,
@SerialName(usernameField)
override val username: Username? = null
) : ForumChat
@Serializable @Serializable
data class ChannelChatImpl( data class ChannelChatImpl(
@SerialName(idField) @SerialName(idField)

View File

@ -66,3 +66,49 @@ data class CommonGroupContentMessageImpl<T : MessageContent>(
override val content: T, override val content: T,
override val senderBot: CommonBot? override val senderBot: CommonBot?
) : CommonGroupContentMessage<T> ) : CommonGroupContentMessage<T>
data class FromChannelForumContentMessageImpl<T: MessageContent>(
override val chat: ForumChat,
override val channel: ChannelChat,
override val messageId: MessageId,
override val threadId: MessageThreadId,
override val date: DateTime,
override val forwardInfo: ForwardInfo?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyTo: Message?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?,
override val authorSignature: AuthorSignature?
) : FromChannelForumContentMessage<T>
data class AnonymousForumContentMessageImpl<T : MessageContent>(
override val chat: ForumChat,
override val messageId: MessageId,
override val threadId: MessageThreadId,
override val date: DateTime,
override val forwardInfo: ForwardInfo?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyTo: Message?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?,
override val authorSignature: AuthorSignature?
) : AnonymousForumContentMessage<T>
data class CommonForumContentMessageImpl<T : MessageContent>(
override val chat: ForumChat,
override val messageId: MessageId,
override val threadId: MessageThreadId,
override val from: User,
override val date: DateTime,
override val forwardInfo: ForwardInfo?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyTo: Message?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?
) : CommonForumContentMessage<T>

View File

@ -34,6 +34,8 @@ internal data class RawMessage(
val messageId: MessageId, val messageId: MessageId,
val date: TelegramDate, val date: TelegramDate,
private val chat: Chat, private val chat: Chat,
@SerialName(messageThreadIdField)
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: PublicChat? = null,
private val forward_from: User? = null, private val forward_from: User? = null,
@ -307,6 +309,113 @@ internal data class RawMessage(
via_bot, via_bot,
author_signature author_signature
) )
is ForumChat -> if (messageThreadId != null) {
when (sender_chat) {
is ChannelChat -> FromChannelForumContentMessageImpl(
chat,
sender_chat,
messageId,
messageThreadId,
date.asDate,
forwarded,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
reply_markup,
content,
via_bot,
author_signature
)
is GroupChat -> AnonymousForumContentMessageImpl(
chat,
messageId,
messageThreadId,
date.asDate,
forwarded,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
reply_markup,
content,
via_bot,
author_signature
)
null -> CommonForumContentMessageImpl(
chat,
messageId,
messageThreadId,
from ?: error("It is expected that in messages from non anonymous users and channels user must be specified"),
date.asDate,
forwarded,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
reply_markup,
content,
via_bot
)
}
} else {
when (sender_chat) {
is ChannelChat -> if (is_automatic_forward == true) {
ConnectedFromChannelGroupContentMessageImpl(
chat,
sender_chat,
messageId,
date.asDate,
forwarded,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
reply_markup,
content,
via_bot,
author_signature
)
} else {
UnconnectedFromChannelGroupContentMessageImpl(
chat,
sender_chat,
messageId,
date.asDate,
forwarded,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
reply_markup,
content,
via_bot,
author_signature
)
}
is GroupChat -> AnonymousGroupContentMessageImpl(
chat,
messageId,
date.asDate,
forwarded,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
reply_markup,
content,
via_bot,
author_signature
)
null -> CommonGroupContentMessageImpl(
chat,
messageId,
from ?: error("It is expected that in messages from non anonymous users and channels user must be specified"),
date.asDate,
forwarded,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
reply_markup,
content,
via_bot
)
}
}
is GroupChat -> when (sender_chat) { is GroupChat -> when (sender_chat) {
is ChannelChat -> if (is_automatic_forward == true) { is ChannelChat -> if (is_automatic_forward == true) {
ConnectedFromChannelGroupContentMessageImpl( ConnectedFromChannelGroupContentMessageImpl(
@ -365,9 +474,7 @@ internal data class RawMessage(
content, content,
via_bot via_bot
) )
else -> error("Currently in groups supported only fields \"sender_chat\" with channel, group or null, but was $sender_chat")
} }
else -> error("Unknown type of public chat: $chat")
} }
is PrivateChat -> PrivateContentMessageImpl( is PrivateChat -> PrivateContentMessageImpl(
messageId, messageId,

View File

@ -1,15 +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.chat.ChannelChat import dev.inmo.tgbotapi.types.chat.ChannelChat
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.message.content.MessageContent import dev.inmo.tgbotapi.types.message.content.MessageContent
interface GroupContentMessage<T : MessageContent> : PublicContentMessage<T> { sealed interface GroupContentMessage<T : MessageContent> : PublicContentMessage<T> {
override val chat: GroupChat override val chat: GroupChat
} }
sealed interface ForumContentMessage<T : MessageContent> : GroupContentMessage<T> {
override val chat: ForumChat
val threadId: MessageThreadId
}
interface FromChannelGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, SignedMessage, WithSenderChatMessage {
sealed interface FromChannelGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, SignedMessage, WithSenderChatMessage {
val channel: ChannelChat val channel: ChannelChat
override val senderChat: ChannelChat override val senderChat: ChannelChat
get() = channel get() = channel
@ -24,3 +31,12 @@ interface AnonymousGroupContentMessage<T : MessageContent> : GroupContentMessage
} }
interface CommonGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, FromUserMessage interface CommonGroupContentMessage<T : MessageContent> : GroupContentMessage<T>, FromUserMessage
interface FromChannelForumContentMessage<T: MessageContent> : FromChannelGroupContentMessage<T>, ForumContentMessage<T>
interface AnonymousForumContentMessage<T : MessageContent> : ForumContentMessage<T>, SignedMessage, WithSenderChatMessage {
override val senderChat: GroupChat
get() = chat
}
interface CommonForumContentMessage<T : MessageContent> : ForumContentMessage<T>, FromUserMessage

View File

@ -124,6 +124,8 @@ import dev.inmo.tgbotapi.types.chat.ExtendedBot
import dev.inmo.tgbotapi.types.chat.ExtendedChannelChat import dev.inmo.tgbotapi.types.chat.ExtendedChannelChat
import dev.inmo.tgbotapi.types.chat.ExtendedChannelChatImpl import dev.inmo.tgbotapi.types.chat.ExtendedChannelChatImpl
import dev.inmo.tgbotapi.types.chat.ExtendedChat import dev.inmo.tgbotapi.types.chat.ExtendedChat
import dev.inmo.tgbotapi.types.chat.ExtendedForumChat
import dev.inmo.tgbotapi.types.chat.ExtendedForumChatImpl
import dev.inmo.tgbotapi.types.chat.ExtendedGroupChat import dev.inmo.tgbotapi.types.chat.ExtendedGroupChat
import dev.inmo.tgbotapi.types.chat.ExtendedGroupChatImpl import dev.inmo.tgbotapi.types.chat.ExtendedGroupChatImpl
import dev.inmo.tgbotapi.types.chat.ExtendedPrivateChat import dev.inmo.tgbotapi.types.chat.ExtendedPrivateChat
@ -131,6 +133,8 @@ import dev.inmo.tgbotapi.types.chat.ExtendedPrivateChatImpl
import dev.inmo.tgbotapi.types.chat.ExtendedPublicChat import dev.inmo.tgbotapi.types.chat.ExtendedPublicChat
import dev.inmo.tgbotapi.types.chat.ExtendedSupergroupChat import dev.inmo.tgbotapi.types.chat.ExtendedSupergroupChat
import dev.inmo.tgbotapi.types.chat.ExtendedSupergroupChatImpl import dev.inmo.tgbotapi.types.chat.ExtendedSupergroupChatImpl
import dev.inmo.tgbotapi.types.chat.ForumChat
import dev.inmo.tgbotapi.types.chat.ForumChatImpl
import dev.inmo.tgbotapi.types.chat.GroupChat import dev.inmo.tgbotapi.types.chat.GroupChat
import dev.inmo.tgbotapi.types.chat.GroupChatImpl import dev.inmo.tgbotapi.types.chat.GroupChatImpl
import dev.inmo.tgbotapi.types.chat.PossiblyPremiumChat import dev.inmo.tgbotapi.types.chat.PossiblyPremiumChat
@ -212,6 +216,7 @@ import dev.inmo.tgbotapi.types.media.TelegramMediaVideo
import dev.inmo.tgbotapi.types.media.ThumbedTelegramMedia import dev.inmo.tgbotapi.types.media.ThumbedTelegramMedia
import dev.inmo.tgbotapi.types.media.TitledTelegramMedia import dev.inmo.tgbotapi.types.media.TitledTelegramMedia
import dev.inmo.tgbotapi.types.media.VisualMediaGroupMemberTelegramMedia import dev.inmo.tgbotapi.types.media.VisualMediaGroupMemberTelegramMedia
import dev.inmo.tgbotapi.types.message.AnonymousForumContentMessageImpl
import dev.inmo.tgbotapi.types.message.AnonymousGroupContentMessageImpl import dev.inmo.tgbotapi.types.message.AnonymousGroupContentMessageImpl
import dev.inmo.tgbotapi.types.message.ChannelContentMessageImpl import dev.inmo.tgbotapi.types.message.ChannelContentMessageImpl
import dev.inmo.tgbotapi.types.message.ChannelEventMessage import dev.inmo.tgbotapi.types.message.ChannelEventMessage
@ -242,23 +247,29 @@ import dev.inmo.tgbotapi.types.message.ChatEvents.voice.VideoChatEnded
import dev.inmo.tgbotapi.types.message.ChatEvents.voice.VideoChatParticipantsInvited import dev.inmo.tgbotapi.types.message.ChatEvents.voice.VideoChatParticipantsInvited
import dev.inmo.tgbotapi.types.message.ChatEvents.voice.VideoChatScheduled import dev.inmo.tgbotapi.types.message.ChatEvents.voice.VideoChatScheduled
import dev.inmo.tgbotapi.types.message.ChatEvents.voice.VideoChatStarted import dev.inmo.tgbotapi.types.message.ChatEvents.voice.VideoChatStarted
import dev.inmo.tgbotapi.types.message.CommonForumContentMessageImpl
import dev.inmo.tgbotapi.types.message.CommonGroupContentMessageImpl import dev.inmo.tgbotapi.types.message.CommonGroupContentMessageImpl
import dev.inmo.tgbotapi.types.message.CommonGroupEventMessage import dev.inmo.tgbotapi.types.message.CommonGroupEventMessage
import dev.inmo.tgbotapi.types.message.CommonMediaGroupMessage import dev.inmo.tgbotapi.types.message.CommonMediaGroupMessage
import dev.inmo.tgbotapi.types.message.CommonSupergroupEventMessage import dev.inmo.tgbotapi.types.message.CommonSupergroupEventMessage
import dev.inmo.tgbotapi.types.message.ConnectedFromChannelGroupContentMessageImpl import dev.inmo.tgbotapi.types.message.ConnectedFromChannelGroupContentMessageImpl
import dev.inmo.tgbotapi.types.message.ForwardInfo import dev.inmo.tgbotapi.types.message.ForwardInfo
import dev.inmo.tgbotapi.types.message.FromChannelForumContentMessageImpl
import dev.inmo.tgbotapi.types.message.PassportMessage import dev.inmo.tgbotapi.types.message.PassportMessage
import dev.inmo.tgbotapi.types.message.PrivateContentMessageImpl import dev.inmo.tgbotapi.types.message.PrivateContentMessageImpl
import dev.inmo.tgbotapi.types.message.PrivateEventMessage import dev.inmo.tgbotapi.types.message.PrivateEventMessage
import dev.inmo.tgbotapi.types.message.UnconnectedFromChannelGroupContentMessageImpl import dev.inmo.tgbotapi.types.message.UnconnectedFromChannelGroupContentMessageImpl
import dev.inmo.tgbotapi.types.message.abstracts.AnonymousForumContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.AnonymousGroupContentMessage import dev.inmo.tgbotapi.types.message.abstracts.AnonymousGroupContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.ChannelContentMessage import dev.inmo.tgbotapi.types.message.abstracts.ChannelContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage
import dev.inmo.tgbotapi.types.message.abstracts.CommonForumContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.CommonGroupContentMessage import dev.inmo.tgbotapi.types.message.abstracts.CommonGroupContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
import dev.inmo.tgbotapi.types.message.abstracts.ConnectedFromChannelGroupContentMessage import dev.inmo.tgbotapi.types.message.abstracts.ConnectedFromChannelGroupContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.ForumContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.FromChannelForumContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.FromChannelGroupContentMessage import dev.inmo.tgbotapi.types.message.abstracts.FromChannelGroupContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.FromUserMessage import dev.inmo.tgbotapi.types.message.abstracts.FromUserMessage
import dev.inmo.tgbotapi.types.message.abstracts.GroupContentMessage import dev.inmo.tgbotapi.types.message.abstracts.GroupContentMessage
@ -761,6 +772,18 @@ public inline fun <T>
WithUser.ifCommonGroupContentMessageImpl(block: (CommonGroupContentMessageImpl<MessageContent>) -> T): WithUser.ifCommonGroupContentMessageImpl(block: (CommonGroupContentMessageImpl<MessageContent>) -> T):
T? = commonGroupContentMessageImplOrNull() ?.let(block) T? = commonGroupContentMessageImplOrNull() ?.let(block)
public inline fun WithUser.commonForumContentMessageImplOrNull():
CommonForumContentMessageImpl<MessageContent>? = this as?
dev.inmo.tgbotapi.types.message.CommonForumContentMessageImpl<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun WithUser.commonForumContentMessageImplOrThrow():
CommonForumContentMessageImpl<MessageContent> = this as
dev.inmo.tgbotapi.types.message.CommonForumContentMessageImpl<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T>
WithUser.ifCommonForumContentMessageImpl(block: (CommonForumContentMessageImpl<MessageContent>) -> T):
T? = commonForumContentMessageImplOrNull() ?.let(block)
public inline fun WithUser.passportMessageOrNull(): PassportMessage? = this as? public inline fun WithUser.passportMessageOrNull(): PassportMessage? = this as?
dev.inmo.tgbotapi.types.message.PassportMessage dev.inmo.tgbotapi.types.message.PassportMessage
@ -812,6 +835,18 @@ public inline fun <T>
WithUser.ifCommonGroupContentMessage(block: (CommonGroupContentMessage<MessageContent>) -> T): WithUser.ifCommonGroupContentMessage(block: (CommonGroupContentMessage<MessageContent>) -> T):
T? = commonGroupContentMessageOrNull() ?.let(block) T? = commonGroupContentMessageOrNull() ?.let(block)
public inline fun WithUser.commonForumContentMessageOrNull():
CommonForumContentMessage<MessageContent>? = this as?
dev.inmo.tgbotapi.types.message.abstracts.CommonForumContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun WithUser.commonForumContentMessageOrThrow():
CommonForumContentMessage<MessageContent> = this as
dev.inmo.tgbotapi.types.message.abstracts.CommonForumContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T>
WithUser.ifCommonForumContentMessage(block: (CommonForumContentMessage<MessageContent>) -> T):
T? = commonForumContentMessageOrNull() ?.let(block)
public inline fun WithUser.privateContentMessageOrNull(): PrivateContentMessage<MessageContent>? = public inline fun WithUser.privateContentMessageOrNull(): PrivateContentMessage<MessageContent>? =
this as? this as?
dev.inmo.tgbotapi.types.message.abstracts.PrivateContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent> dev.inmo.tgbotapi.types.message.abstracts.PrivateContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
@ -1848,23 +1883,15 @@ public inline fun KeyboardMarkup.replyKeyboardRemoveOrThrow(): ReplyKeyboardRemo
public inline fun <T> KeyboardMarkup.ifReplyKeyboardRemove(block: (ReplyKeyboardRemove) -> T): T? = public inline fun <T> KeyboardMarkup.ifReplyKeyboardRemove(block: (ReplyKeyboardRemove) -> T): T? =
replyKeyboardRemoveOrNull() ?.let(block) replyKeyboardRemoveOrNull() ?.let(block)
public inline fun Chat.channelChatOrNull(): ChannelChat? = this as? public inline fun Chat.usernameChatOrNull(): UsernameChat? = this as?
dev.inmo.tgbotapi.types.chat.ChannelChat dev.inmo.tgbotapi.types.chat.UsernameChat
public inline fun Chat.channelChatOrThrow(): ChannelChat = this as public inline fun Chat.usernameChatOrThrow(): UsernameChat = this as
dev.inmo.tgbotapi.types.chat.ChannelChat dev.inmo.tgbotapi.types.chat.UsernameChat
public inline fun <T> Chat.ifChannelChat(block: (ChannelChat) -> T): T? = channelChatOrNull() public inline fun <T> Chat.ifUsernameChat(block: (UsernameChat) -> T): T? = usernameChatOrNull()
?.let(block) ?.let(block)
public inline fun Chat.groupChatOrNull(): GroupChat? = this as?
dev.inmo.tgbotapi.types.chat.GroupChat
public inline fun Chat.groupChatOrThrow(): GroupChat = this as
dev.inmo.tgbotapi.types.chat.GroupChat
public inline fun <T> Chat.ifGroupChat(block: (GroupChat) -> T): T? = groupChatOrNull() ?.let(block)
public inline fun Chat.privateChatOrNull(): PrivateChat? = this as? public inline fun Chat.privateChatOrNull(): PrivateChat? = this as?
dev.inmo.tgbotapi.types.chat.PrivateChat dev.inmo.tgbotapi.types.chat.PrivateChat
@ -1883,15 +1910,6 @@ public inline fun Chat.publicChatOrThrow(): PublicChat = this as
public inline fun <T> Chat.ifPublicChat(block: (PublicChat) -> T): T? = publicChatOrNull() public inline fun <T> Chat.ifPublicChat(block: (PublicChat) -> T): T? = publicChatOrNull()
?.let(block) ?.let(block)
public inline fun Chat.supergroupChatOrNull(): SupergroupChat? = this as?
dev.inmo.tgbotapi.types.chat.SupergroupChat
public inline fun Chat.supergroupChatOrThrow(): SupergroupChat = this as
dev.inmo.tgbotapi.types.chat.SupergroupChat
public inline fun <T> Chat.ifSupergroupChat(block: (SupergroupChat) -> T): T? =
supergroupChatOrNull() ?.let(block)
public inline fun Chat.superPublicChatOrNull(): SuperPublicChat? = this as? public inline fun Chat.superPublicChatOrNull(): SuperPublicChat? = this as?
dev.inmo.tgbotapi.types.chat.SuperPublicChat dev.inmo.tgbotapi.types.chat.SuperPublicChat
@ -1901,15 +1919,40 @@ public inline fun Chat.superPublicChatOrThrow(): SuperPublicChat = this as
public inline fun <T> Chat.ifSuperPublicChat(block: (SuperPublicChat) -> T): T? = public inline fun <T> Chat.ifSuperPublicChat(block: (SuperPublicChat) -> T): T? =
superPublicChatOrNull() ?.let(block) superPublicChatOrNull() ?.let(block)
public inline fun Chat.usernameChatOrNull(): UsernameChat? = this as? public inline fun Chat.channelChatOrNull(): ChannelChat? = this as?
dev.inmo.tgbotapi.types.chat.UsernameChat dev.inmo.tgbotapi.types.chat.ChannelChat
public inline fun Chat.usernameChatOrThrow(): UsernameChat = this as public inline fun Chat.channelChatOrThrow(): ChannelChat = this as
dev.inmo.tgbotapi.types.chat.UsernameChat dev.inmo.tgbotapi.types.chat.ChannelChat
public inline fun <T> Chat.ifUsernameChat(block: (UsernameChat) -> T): T? = usernameChatOrNull() public inline fun <T> Chat.ifChannelChat(block: (ChannelChat) -> T): T? = channelChatOrNull()
?.let(block) ?.let(block)
public inline fun Chat.groupChatOrNull(): GroupChat? = this as?
dev.inmo.tgbotapi.types.chat.GroupChat
public inline fun Chat.groupChatOrThrow(): GroupChat = this as
dev.inmo.tgbotapi.types.chat.GroupChat
public inline fun <T> Chat.ifGroupChat(block: (GroupChat) -> T): T? = groupChatOrNull() ?.let(block)
public inline fun Chat.supergroupChatOrNull(): SupergroupChat? = this as?
dev.inmo.tgbotapi.types.chat.SupergroupChat
public inline fun Chat.supergroupChatOrThrow(): SupergroupChat = this as
dev.inmo.tgbotapi.types.chat.SupergroupChat
public inline fun <T> Chat.ifSupergroupChat(block: (SupergroupChat) -> T): T? =
supergroupChatOrNull() ?.let(block)
public inline fun Chat.forumChatOrNull(): ForumChat? = this as?
dev.inmo.tgbotapi.types.chat.ForumChat
public inline fun Chat.forumChatOrThrow(): ForumChat = this as
dev.inmo.tgbotapi.types.chat.ForumChat
public inline fun <T> Chat.ifForumChat(block: (ForumChat) -> T): T? = forumChatOrNull() ?.let(block)
public inline fun Chat.possiblyPremiumChatOrNull(): PossiblyPremiumChat? = this as? public inline fun Chat.possiblyPremiumChatOrNull(): PossiblyPremiumChat? = this as?
dev.inmo.tgbotapi.types.chat.PossiblyPremiumChat dev.inmo.tgbotapi.types.chat.PossiblyPremiumChat
@ -1965,6 +2008,15 @@ public inline fun Chat.extendedSupergroupChatImplOrThrow(): ExtendedSupergroupCh
public inline fun <T> Chat.ifExtendedSupergroupChatImpl(block: (ExtendedSupergroupChatImpl) -> T): public inline fun <T> Chat.ifExtendedSupergroupChatImpl(block: (ExtendedSupergroupChatImpl) -> T):
T? = extendedSupergroupChatImplOrNull() ?.let(block) T? = extendedSupergroupChatImplOrNull() ?.let(block)
public inline fun Chat.extendedForumChatImplOrNull(): ExtendedForumChatImpl? = this as?
dev.inmo.tgbotapi.types.chat.ExtendedForumChatImpl
public inline fun Chat.extendedForumChatImplOrThrow(): ExtendedForumChatImpl = this as
dev.inmo.tgbotapi.types.chat.ExtendedForumChatImpl
public inline fun <T> Chat.ifExtendedForumChatImpl(block: (ExtendedForumChatImpl) -> T): T? =
extendedForumChatImplOrNull() ?.let(block)
public inline fun Chat.extendedBotOrNull(): ExtendedBot? = this as? public inline fun Chat.extendedBotOrNull(): ExtendedBot? = this as?
dev.inmo.tgbotapi.types.chat.ExtendedBot dev.inmo.tgbotapi.types.chat.ExtendedBot
@ -2028,6 +2080,15 @@ public inline fun Chat.extendedSupergroupChatOrThrow(): ExtendedSupergroupChat =
public inline fun <T> Chat.ifExtendedSupergroupChat(block: (ExtendedSupergroupChat) -> T): T? = public inline fun <T> Chat.ifExtendedSupergroupChat(block: (ExtendedSupergroupChat) -> T): T? =
extendedSupergroupChatOrNull() ?.let(block) extendedSupergroupChatOrNull() ?.let(block)
public inline fun Chat.extendedForumChatOrNull(): ExtendedForumChat? = this as?
dev.inmo.tgbotapi.types.chat.ExtendedForumChat
public inline fun Chat.extendedForumChatOrThrow(): ExtendedForumChat = this as
dev.inmo.tgbotapi.types.chat.ExtendedForumChat
public inline fun <T> Chat.ifExtendedForumChat(block: (ExtendedForumChat) -> T): T? =
extendedForumChatOrNull() ?.let(block)
public inline fun Chat.extendedChatOrNull(): ExtendedChat? = this as? public inline fun Chat.extendedChatOrNull(): ExtendedChat? = this as?
dev.inmo.tgbotapi.types.chat.ExtendedChat dev.inmo.tgbotapi.types.chat.ExtendedChat
@ -2064,6 +2125,15 @@ public inline fun Chat.supergroupChatImplOrThrow(): SupergroupChatImpl = this as
public inline fun <T> Chat.ifSupergroupChatImpl(block: (SupergroupChatImpl) -> T): T? = public inline fun <T> Chat.ifSupergroupChatImpl(block: (SupergroupChatImpl) -> T): T? =
supergroupChatImplOrNull() ?.let(block) supergroupChatImplOrNull() ?.let(block)
public inline fun Chat.forumChatImplOrNull(): ForumChatImpl? = this as?
dev.inmo.tgbotapi.types.chat.ForumChatImpl
public inline fun Chat.forumChatImplOrThrow(): ForumChatImpl = this as
dev.inmo.tgbotapi.types.chat.ForumChatImpl
public inline fun <T> Chat.ifForumChatImpl(block: (ForumChatImpl) -> T): T? = forumChatImplOrNull()
?.let(block)
public inline fun Chat.channelChatImplOrNull(): ChannelChatImpl? = this as? public inline fun Chat.channelChatImplOrNull(): ChannelChatImpl? = this as?
dev.inmo.tgbotapi.types.chat.ChannelChatImpl dev.inmo.tgbotapi.types.chat.ChannelChatImpl
@ -3011,6 +3081,42 @@ public inline fun <T>
Message.ifCommonGroupContentMessageImpl(block: (CommonGroupContentMessageImpl<MessageContent>) -> T): Message.ifCommonGroupContentMessageImpl(block: (CommonGroupContentMessageImpl<MessageContent>) -> T):
T? = commonGroupContentMessageImplOrNull() ?.let(block) T? = commonGroupContentMessageImplOrNull() ?.let(block)
public inline fun Message.fromChannelForumContentMessageImplOrNull():
FromChannelForumContentMessageImpl<MessageContent>? = this as?
dev.inmo.tgbotapi.types.message.FromChannelForumContentMessageImpl<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.fromChannelForumContentMessageImplOrThrow():
FromChannelForumContentMessageImpl<MessageContent> = this as
dev.inmo.tgbotapi.types.message.FromChannelForumContentMessageImpl<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T>
Message.ifFromChannelForumContentMessageImpl(block: (FromChannelForumContentMessageImpl<MessageContent>) -> T):
T? = fromChannelForumContentMessageImplOrNull() ?.let(block)
public inline fun Message.anonymousForumContentMessageImplOrNull():
AnonymousForumContentMessageImpl<MessageContent>? = this as?
dev.inmo.tgbotapi.types.message.AnonymousForumContentMessageImpl<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.anonymousForumContentMessageImplOrThrow():
AnonymousForumContentMessageImpl<MessageContent> = this as
dev.inmo.tgbotapi.types.message.AnonymousForumContentMessageImpl<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T>
Message.ifAnonymousForumContentMessageImpl(block: (AnonymousForumContentMessageImpl<MessageContent>) -> T):
T? = anonymousForumContentMessageImplOrNull() ?.let(block)
public inline fun Message.commonForumContentMessageImplOrNull():
CommonForumContentMessageImpl<MessageContent>? = this as?
dev.inmo.tgbotapi.types.message.CommonForumContentMessageImpl<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.commonForumContentMessageImplOrThrow():
CommonForumContentMessageImpl<MessageContent> = this as
dev.inmo.tgbotapi.types.message.CommonForumContentMessageImpl<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T>
Message.ifCommonForumContentMessageImpl(block: (CommonForumContentMessageImpl<MessageContent>) -> T):
T? = commonForumContentMessageImplOrNull() ?.let(block)
public inline fun Message.passportMessageOrNull(): PassportMessage? = this as? public inline fun Message.passportMessageOrNull(): PassportMessage? = this as?
dev.inmo.tgbotapi.types.message.PassportMessage dev.inmo.tgbotapi.types.message.PassportMessage
@ -3111,6 +3217,18 @@ public inline fun <T>
Message.ifGroupContentMessage(block: (GroupContentMessage<MessageContent>) -> T): T? = Message.ifGroupContentMessage(block: (GroupContentMessage<MessageContent>) -> T): T? =
groupContentMessageOrNull() ?.let(block) groupContentMessageOrNull() ?.let(block)
public inline fun Message.forumContentMessageOrNull(): ForumContentMessage<MessageContent>? = this
as?
dev.inmo.tgbotapi.types.message.abstracts.ForumContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.forumContentMessageOrThrow(): ForumContentMessage<MessageContent> = this
as
dev.inmo.tgbotapi.types.message.abstracts.ForumContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T>
Message.ifForumContentMessage(block: (ForumContentMessage<MessageContent>) -> T): T? =
forumContentMessageOrNull() ?.let(block)
public inline fun Message.fromChannelGroupContentMessageOrNull(): public inline fun Message.fromChannelGroupContentMessageOrNull():
FromChannelGroupContentMessage<MessageContent>? = this as? FromChannelGroupContentMessage<MessageContent>? = this as?
dev.inmo.tgbotapi.types.message.abstracts.FromChannelGroupContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent> dev.inmo.tgbotapi.types.message.abstracts.FromChannelGroupContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
@ -3171,6 +3289,42 @@ public inline fun <T>
Message.ifCommonGroupContentMessage(block: (CommonGroupContentMessage<MessageContent>) -> T): T? Message.ifCommonGroupContentMessage(block: (CommonGroupContentMessage<MessageContent>) -> T): T?
= commonGroupContentMessageOrNull() ?.let(block) = commonGroupContentMessageOrNull() ?.let(block)
public inline fun Message.fromChannelForumContentMessageOrNull():
FromChannelForumContentMessage<MessageContent>? = this as?
dev.inmo.tgbotapi.types.message.abstracts.FromChannelForumContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.fromChannelForumContentMessageOrThrow():
FromChannelForumContentMessage<MessageContent> = this as
dev.inmo.tgbotapi.types.message.abstracts.FromChannelForumContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T>
Message.ifFromChannelForumContentMessage(block: (FromChannelForumContentMessage<MessageContent>) -> T):
T? = fromChannelForumContentMessageOrNull() ?.let(block)
public inline fun Message.anonymousForumContentMessageOrNull():
AnonymousForumContentMessage<MessageContent>? = this as?
dev.inmo.tgbotapi.types.message.abstracts.AnonymousForumContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.anonymousForumContentMessageOrThrow():
AnonymousForumContentMessage<MessageContent> = this as
dev.inmo.tgbotapi.types.message.abstracts.AnonymousForumContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T>
Message.ifAnonymousForumContentMessage(block: (AnonymousForumContentMessage<MessageContent>) -> T):
T? = anonymousForumContentMessageOrNull() ?.let(block)
public inline fun Message.commonForumContentMessageOrNull():
CommonForumContentMessage<MessageContent>? = this as?
dev.inmo.tgbotapi.types.message.abstracts.CommonForumContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.commonForumContentMessageOrThrow():
CommonForumContentMessage<MessageContent> = this as
dev.inmo.tgbotapi.types.message.abstracts.CommonForumContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T>
Message.ifCommonForumContentMessage(block: (CommonForumContentMessage<MessageContent>) -> T): T?
= commonForumContentMessageOrNull() ?.let(block)
public inline fun Message.mediaGroupMessageOrNull(): MediaGroupMessage<MediaGroupContent>? = this public inline fun Message.mediaGroupMessageOrNull(): MediaGroupMessage<MediaGroupContent>? = this
as? as?
dev.inmo.tgbotapi.types.message.abstracts.MediaGroupMessage<dev.inmo.tgbotapi.types.message.content.MediaGroupContent> dev.inmo.tgbotapi.types.message.abstracts.MediaGroupMessage<dev.inmo.tgbotapi.types.message.content.MediaGroupContent>