1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2026-07-03 16:46:06 +00:00

improve richblocks api and let rich message content to be correctly resendable if there are no any media block inside

This commit is contained in:
2026-07-01 14:25:39 +06:00
parent 5341b2eccf
commit 68987feabb
6 changed files with 139 additions and 34 deletions

View File

@@ -34515,7 +34515,7 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockAnchor$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer; public final fun serializer ()Lkotlinx/serialization/KSerializer;
} }
public final class dev/inmo/tgbotapi/types/rich/RichBlockAnimation : dev/inmo/tgbotapi/types/rich/RichBlock { public final class dev/inmo/tgbotapi/types/rich/RichBlockAnimation : dev/inmo/tgbotapi/types/rich/RichBlockMedia {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockAnimation$Companion; public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockAnimation$Companion;
public static final field TYPE Ljava/lang/String; public static final field TYPE Ljava/lang/String;
public fun <init> (Ldev/inmo/tgbotapi/types/files/AnimationFile;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)V public fun <init> (Ldev/inmo/tgbotapi/types/files/AnimationFile;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)V
@@ -34527,10 +34527,11 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockAnimation : dev/inmo/tg
public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/rich/RichBlockAnimation;Ldev/inmo/tgbotapi/types/files/AnimationFile;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockAnimation; public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/rich/RichBlockAnimation;Ldev/inmo/tgbotapi/types/files/AnimationFile;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockAnimation;
public fun equals (Ljava/lang/Object;)Z public fun equals (Ljava/lang/Object;)Z
public final fun getAnimation ()Ldev/inmo/tgbotapi/types/files/AnimationFile; public final fun getAnimation ()Ldev/inmo/tgbotapi/types/files/AnimationFile;
public final fun getCaption ()Ldev/inmo/tgbotapi/types/rich/RichBlockCaption; public fun getCaption ()Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;
public final fun getHasSpoiler ()Ljava/lang/Boolean; public final fun getHasSpoiler ()Ljava/lang/Boolean;
public fun getHtml ()Ljava/lang/String; public fun getHtml ()Ljava/lang/String;
public fun getMarkdown ()Ljava/lang/String; public fun getMarkdown ()Ljava/lang/String;
public fun getMedia ()Ldev/inmo/tgbotapi/types/files/TelegramMediaFile;
public fun getType ()Ljava/lang/String; public fun getType ()Ljava/lang/String;
public fun hashCode ()I public fun hashCode ()I
public fun toString ()Ljava/lang/String; public fun toString ()Ljava/lang/String;
@@ -34553,7 +34554,7 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockAnimation$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer; public final fun serializer ()Lkotlinx/serialization/KSerializer;
} }
public final class dev/inmo/tgbotapi/types/rich/RichBlockAudio : dev/inmo/tgbotapi/types/rich/RichBlock { public final class dev/inmo/tgbotapi/types/rich/RichBlockAudio : dev/inmo/tgbotapi/types/rich/RichBlockMedia {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockAudio$Companion; public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockAudio$Companion;
public static final field TYPE Ljava/lang/String; public static final field TYPE Ljava/lang/String;
public fun <init> (Ldev/inmo/tgbotapi/types/files/AudioFile;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)V public fun <init> (Ldev/inmo/tgbotapi/types/files/AudioFile;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)V
@@ -34564,9 +34565,10 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockAudio : dev/inmo/tgbota
public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/rich/RichBlockAudio;Ldev/inmo/tgbotapi/types/files/AudioFile;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockAudio; public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/rich/RichBlockAudio;Ldev/inmo/tgbotapi/types/files/AudioFile;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockAudio;
public fun equals (Ljava/lang/Object;)Z public fun equals (Ljava/lang/Object;)Z
public final fun getAudio ()Ldev/inmo/tgbotapi/types/files/AudioFile; public final fun getAudio ()Ldev/inmo/tgbotapi/types/files/AudioFile;
public final fun getCaption ()Ldev/inmo/tgbotapi/types/rich/RichBlockCaption; public fun getCaption ()Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;
public fun getHtml ()Ljava/lang/String; public fun getHtml ()Ljava/lang/String;
public fun getMarkdown ()Ljava/lang/String; public fun getMarkdown ()Ljava/lang/String;
public fun getMedia ()Ldev/inmo/tgbotapi/types/files/TelegramMediaFile;
public fun getType ()Ljava/lang/String; public fun getType ()Ljava/lang/String;
public fun hashCode ()I public fun hashCode ()I
public fun toString ()Ljava/lang/String; public fun toString ()Ljava/lang/String;
@@ -34798,6 +34800,11 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockFormattingKt {
public static final fun toRichMarkdown (Ljava/util/List;)Ljava/lang/String; public static final fun toRichMarkdown (Ljava/util/List;)Ljava/lang/String;
} }
public final class dev/inmo/tgbotapi/types/rich/RichBlockKt {
public static final fun getSubBlocks (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ljava/util/List;
public static final fun search (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ldev/inmo/tgbotapi/types/rich/RichBlock;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockList : dev/inmo/tgbotapi/types/rich/RichBlock { public final class dev/inmo/tgbotapi/types/rich/RichBlockList : dev/inmo/tgbotapi/types/rich/RichBlock {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockList$Companion; public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockList$Companion;
public static final field TYPE Ljava/lang/String; public static final field TYPE Ljava/lang/String;
@@ -34952,6 +34959,16 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockMathematicalExpression$
public final fun serializer ()Lkotlinx/serialization/KSerializer; public final fun serializer ()Lkotlinx/serialization/KSerializer;
} }
public abstract interface class dev/inmo/tgbotapi/types/rich/RichBlockMedia : dev/inmo/tgbotapi/types/rich/RichBlock {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockMedia$Companion;
public abstract fun getCaption ()Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;
public abstract fun getMedia ()Ldev/inmo/tgbotapi/types/files/TelegramMediaFile;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockMedia$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockParagraph : dev/inmo/tgbotapi/types/rich/RichBlock { public final class dev/inmo/tgbotapi/types/rich/RichBlockParagraph : dev/inmo/tgbotapi/types/rich/RichBlock {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockParagraph$Companion; public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockParagraph$Companion;
public static final field TYPE Ljava/lang/String; public static final field TYPE Ljava/lang/String;
@@ -34985,7 +35002,7 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockParagraph$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer; public final fun serializer ()Lkotlinx/serialization/KSerializer;
} }
public final class dev/inmo/tgbotapi/types/rich/RichBlockPhoto : dev/inmo/tgbotapi/types/rich/RichBlock { public final class dev/inmo/tgbotapi/types/rich/RichBlockPhoto : dev/inmo/tgbotapi/types/rich/RichBlockMedia {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockPhoto$Companion; public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockPhoto$Companion;
public static final field TYPE Ljava/lang/String; public static final field TYPE Ljava/lang/String;
public synthetic fun <init> (Ljava/util/List;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/util/List;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
@@ -34996,10 +35013,11 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockPhoto : dev/inmo/tgbota
public final fun copy-OKnyJrA (Ljava/util/List;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)Ldev/inmo/tgbotapi/types/rich/RichBlockPhoto; public final fun copy-OKnyJrA (Ljava/util/List;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)Ldev/inmo/tgbotapi/types/rich/RichBlockPhoto;
public static synthetic fun copy-OKnyJrA$default (Ldev/inmo/tgbotapi/types/rich/RichBlockPhoto;Ljava/util/List;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockPhoto; public static synthetic fun copy-OKnyJrA$default (Ldev/inmo/tgbotapi/types/rich/RichBlockPhoto;Ljava/util/List;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockPhoto;
public fun equals (Ljava/lang/Object;)Z public fun equals (Ljava/lang/Object;)Z
public final fun getCaption ()Ldev/inmo/tgbotapi/types/rich/RichBlockCaption; public fun getCaption ()Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;
public final fun getHasSpoiler ()Ljava/lang/Boolean; public final fun getHasSpoiler ()Ljava/lang/Boolean;
public fun getHtml ()Ljava/lang/String; public fun getHtml ()Ljava/lang/String;
public fun getMarkdown ()Ljava/lang/String; public fun getMarkdown ()Ljava/lang/String;
public fun getMedia ()Ldev/inmo/tgbotapi/types/files/TelegramMediaFile;
public final fun getPhoto-bGlShw4 ()Ljava/util/List; public final fun getPhoto-bGlShw4 ()Ljava/util/List;
public fun getType ()Ljava/lang/String; public fun getType ()Ljava/lang/String;
public fun hashCode ()I public fun hashCode ()I
@@ -35281,7 +35299,7 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockThinking$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer; public final fun serializer ()Lkotlinx/serialization/KSerializer;
} }
public final class dev/inmo/tgbotapi/types/rich/RichBlockVideo : dev/inmo/tgbotapi/types/rich/RichBlock { public final class dev/inmo/tgbotapi/types/rich/RichBlockVideo : dev/inmo/tgbotapi/types/rich/RichBlockMedia {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockVideo$Companion; public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockVideo$Companion;
public static final field TYPE Ljava/lang/String; public static final field TYPE Ljava/lang/String;
public fun <init> (Ldev/inmo/tgbotapi/types/files/VideoFile;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)V public fun <init> (Ldev/inmo/tgbotapi/types/files/VideoFile;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)V
@@ -35292,10 +35310,11 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockVideo : dev/inmo/tgbota
public final fun copy (Ldev/inmo/tgbotapi/types/files/VideoFile;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)Ldev/inmo/tgbotapi/types/rich/RichBlockVideo; public final fun copy (Ldev/inmo/tgbotapi/types/files/VideoFile;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)Ldev/inmo/tgbotapi/types/rich/RichBlockVideo;
public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/rich/RichBlockVideo;Ldev/inmo/tgbotapi/types/files/VideoFile;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockVideo; public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/rich/RichBlockVideo;Ldev/inmo/tgbotapi/types/files/VideoFile;Ljava/lang/Boolean;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockVideo;
public fun equals (Ljava/lang/Object;)Z public fun equals (Ljava/lang/Object;)Z
public final fun getCaption ()Ldev/inmo/tgbotapi/types/rich/RichBlockCaption; public fun getCaption ()Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;
public final fun getHasSpoiler ()Ljava/lang/Boolean; public final fun getHasSpoiler ()Ljava/lang/Boolean;
public fun getHtml ()Ljava/lang/String; public fun getHtml ()Ljava/lang/String;
public fun getMarkdown ()Ljava/lang/String; public fun getMarkdown ()Ljava/lang/String;
public fun getMedia ()Ldev/inmo/tgbotapi/types/files/TelegramMediaFile;
public fun getType ()Ljava/lang/String; public fun getType ()Ljava/lang/String;
public final fun getVideo ()Ldev/inmo/tgbotapi/types/files/VideoFile; public final fun getVideo ()Ldev/inmo/tgbotapi/types/files/VideoFile;
public fun hashCode ()I public fun hashCode ()I
@@ -35319,7 +35338,7 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockVideo$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer; public final fun serializer ()Lkotlinx/serialization/KSerializer;
} }
public final class dev/inmo/tgbotapi/types/rich/RichBlockVoiceNote : dev/inmo/tgbotapi/types/rich/RichBlock { public final class dev/inmo/tgbotapi/types/rich/RichBlockVoiceNote : dev/inmo/tgbotapi/types/rich/RichBlockMedia {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockVoiceNote$Companion; public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockVoiceNote$Companion;
public static final field TYPE Ljava/lang/String; public static final field TYPE Ljava/lang/String;
public fun <init> (Ldev/inmo/tgbotapi/types/files/VoiceFile;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)V public fun <init> (Ldev/inmo/tgbotapi/types/files/VoiceFile;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)V
@@ -35329,9 +35348,10 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockVoiceNote : dev/inmo/tg
public final fun copy (Ldev/inmo/tgbotapi/types/files/VoiceFile;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)Ldev/inmo/tgbotapi/types/rich/RichBlockVoiceNote; public final fun copy (Ldev/inmo/tgbotapi/types/files/VoiceFile;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;)Ldev/inmo/tgbotapi/types/rich/RichBlockVoiceNote;
public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/rich/RichBlockVoiceNote;Ldev/inmo/tgbotapi/types/files/VoiceFile;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockVoiceNote; public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/rich/RichBlockVoiceNote;Ldev/inmo/tgbotapi/types/files/VoiceFile;Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockVoiceNote;
public fun equals (Ljava/lang/Object;)Z public fun equals (Ljava/lang/Object;)Z
public final fun getCaption ()Ldev/inmo/tgbotapi/types/rich/RichBlockCaption; public fun getCaption ()Ldev/inmo/tgbotapi/types/rich/RichBlockCaption;
public fun getHtml ()Ljava/lang/String; public fun getHtml ()Ljava/lang/String;
public fun getMarkdown ()Ljava/lang/String; public fun getMarkdown ()Ljava/lang/String;
public fun getMedia ()Ldev/inmo/tgbotapi/types/files/TelegramMediaFile;
public fun getType ()Ljava/lang/String; public fun getType ()Ljava/lang/String;
public final fun getVoiceNote ()Ldev/inmo/tgbotapi/types/files/VoiceFile; public final fun getVoiceNote ()Ldev/inmo/tgbotapi/types/files/VoiceFile;
public fun hashCode ()I public fun hashCode ()I

View File

@@ -1,6 +1,8 @@
package dev.inmo.tgbotapi.types.message.content package dev.inmo.tgbotapi.types.message.content
import dev.inmo.tgbotapi.requests.ForwardMessage
import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.abstracts.Request
import dev.inmo.tgbotapi.requests.send.CopyMessage
import dev.inmo.tgbotapi.requests.send.SendRichMessage import dev.inmo.tgbotapi.requests.send.SendRichMessage
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
@@ -9,8 +11,14 @@ import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.SuggestedPostParameters import dev.inmo.tgbotapi.types.message.SuggestedPostParameters
import dev.inmo.tgbotapi.types.message.abstracts.ChatContentMessage import dev.inmo.tgbotapi.types.message.abstracts.ChatContentMessage
import dev.inmo.tgbotapi.types.rich.InputRichMessageMarkdown import dev.inmo.tgbotapi.types.rich.InputRichMessageMarkdown
import dev.inmo.tgbotapi.types.rich.RichBlock
import dev.inmo.tgbotapi.types.rich.RichBlockAudio
import dev.inmo.tgbotapi.types.rich.RichBlockMedia
import dev.inmo.tgbotapi.types.rich.RichBlockPhoto
import dev.inmo.tgbotapi.types.rich.RichBlockVideo
import dev.inmo.tgbotapi.types.rich.RichTextInfo import dev.inmo.tgbotapi.types.rich.RichTextInfo
import dev.inmo.tgbotapi.types.rich.markdown import dev.inmo.tgbotapi.types.rich.markdown
import dev.inmo.tgbotapi.types.rich.search
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
@@ -32,7 +40,26 @@ data class RichMessageContent(
replyParameters: ReplyParameters?, replyParameters: ReplyParameters?,
replyMarkup: KeyboardMarkup? replyMarkup: KeyboardMarkup?
): Request<ChatContentMessage<RichMessageContent>> { ): Request<ChatContentMessage<RichMessageContent>> {
return SendRichMessage( val isThereMedia = richMessage.blocks.any {
it.search {
this is RichBlockMedia
} != null
}
return if (isThereMedia) {
@Suppress("UNCHECKED_CAST")
ForwardMessage(
chat.id,
toChatId = chatId,
messageId = messageId,
threadId = messageThreadId,
directMessageThreadId = directMessageThreadId,
disableNotification = disableNotification,
protectContent = protectContent,
effectId = effectId,
suggestedPostParameters = suggestedPostParameters,
) as Request<ChatContentMessage<RichMessageContent>>
} else {
SendRichMessage(
chatId = chatId, chatId = chatId,
richMessage = InputRichMessageMarkdown(richMessage.markdown, isRtl = richMessage.isRtl), richMessage = InputRichMessageMarkdown(richMessage.markdown, isRtl = richMessage.isRtl),
threadId = messageThreadId, threadId = messageThreadId,
@@ -48,3 +75,4 @@ data class RichMessageContent(
) )
} }
} }
}

View File

@@ -1,5 +1,7 @@
package dev.inmo.tgbotapi.types.rich package dev.inmo.tgbotapi.types.rich
import dev.inmo.tgbotapi.requests.abstracts.FileId
import dev.inmo.tgbotapi.types.files.TelegramMediaFile
import dev.inmo.tgbotapi.types.typeField import dev.inmo.tgbotapi.types.typeField
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.DeserializationStrategy
@@ -30,6 +32,39 @@ sealed interface RichBlock {
val html: String val html: String
} }
@Serializable(RichBlockSerializer::class)
sealed interface RichBlockMedia : RichBlock {
val media: TelegramMediaFile
val caption: RichBlockCaption?
}
/**
* The nested [RichBlock]s directly contained by this block, or an empty list for leaf blocks. Container blocks
* ([RichBlockList] via its [RichBlockListItem.blocks], [RichBlockBlockQuotation], [RichBlockCollage],
* [RichBlockSlideshow] and [RichBlockDetails]) expose their children here.
*/
val RichBlock.subBlocks: List<RichBlock>
get() = when (this) {
is RichBlockList -> items.flatMap { it.blocks }
is RichBlockBlockQuotation -> blocks
is RichBlockCollage -> blocks
is RichBlockSlideshow -> blocks
is RichBlockDetails -> blocks
else -> emptyList()
}
/**
* Walks this [RichBlock] and all of its [subBlocks] recursively (depth-first, this block first) and returns the first
* block for which [block] returns `true`, or `null` if none matches.
*/
fun RichBlock.search(block: RichBlock.() -> Boolean): RichBlock? {
if (block()) return this
for (child in subBlocks) {
child.search(block)?.let { return it }
}
return null
}
object RichBlockSerializer : JsonContentPolymorphicSerializer<RichBlock>(RichBlock::class) { object RichBlockSerializer : JsonContentPolymorphicSerializer<RichBlock>(RichBlock::class) {
override fun selectDeserializer(element: JsonElement): DeserializationStrategy<RichBlock> { override fun selectDeserializer(element: JsonElement): DeserializationStrategy<RichBlock> {
return when (val type = element.jsonObject[typeField]?.jsonPrimitive?.content) { return when (val type = element.jsonObject[typeField]?.jsonPrimitive?.content) {

View File

@@ -10,6 +10,7 @@ import dev.inmo.tgbotapi.types.expressionField
import dev.inmo.tgbotapi.types.files.AnimationFile import dev.inmo.tgbotapi.types.files.AnimationFile
import dev.inmo.tgbotapi.types.files.AudioFile import dev.inmo.tgbotapi.types.files.AudioFile
import dev.inmo.tgbotapi.types.files.PhotoFile import dev.inmo.tgbotapi.types.files.PhotoFile
import dev.inmo.tgbotapi.types.files.TelegramMediaFile
import dev.inmo.tgbotapi.types.files.VideoFile import dev.inmo.tgbotapi.types.files.VideoFile
import dev.inmo.tgbotapi.types.files.VoiceFile import dev.inmo.tgbotapi.types.files.VoiceFile
import dev.inmo.tgbotapi.types.hasSpoilerField import dev.inmo.tgbotapi.types.hasSpoilerField
@@ -537,8 +538,8 @@ data class RichBlockAnimation(
@SerialName(hasSpoilerField) @SerialName(hasSpoilerField)
val hasSpoiler: Boolean? = null, val hasSpoiler: Boolean? = null,
@SerialName(captionField) @SerialName(captionField)
val caption: RichBlockCaption? = null override val caption: RichBlockCaption? = null
) : RichBlock { ) : RichBlockMedia {
@EncodeDefault @EncodeDefault
@SerialName(typeField) @SerialName(typeField)
override val type: String = TYPE override val type: String = TYPE
@@ -546,6 +547,9 @@ data class RichBlockAnimation(
override val markdown: String = markdown(animation, caption) override val markdown: String = markdown(animation, caption)
override val html: String = html(animation, hasSpoiler, caption) override val html: String = html(animation, hasSpoiler, caption)
override val media: TelegramMediaFile
get() = animation
companion object { companion object {
const val TYPE = "animation" const val TYPE = "animation"
fun markdown(animation: AnimationFile, caption: RichBlockCaption?): String = fun markdown(animation: AnimationFile, caption: RichBlockCaption?): String =
@@ -565,14 +569,16 @@ data class RichBlockAudio(
@SerialName(audioField) @SerialName(audioField)
val audio: AudioFile, val audio: AudioFile,
@SerialName(captionField) @SerialName(captionField)
val caption: RichBlockCaption? = null override val caption: RichBlockCaption? = null
) : RichBlock { ) : RichBlockMedia {
@EncodeDefault @EncodeDefault
@SerialName(typeField) @SerialName(typeField)
override val type: String = TYPE override val type: String = TYPE
override val markdown: String = markdown(audio, caption) override val markdown: String = markdown(audio, caption)
override val html: String = html(audio, caption) override val html: String = html(audio, caption)
override val media: TelegramMediaFile
get() = audio
companion object { companion object {
const val TYPE = "audio" const val TYPE = "audio"
@@ -595,14 +601,16 @@ data class RichBlockPhoto(
@SerialName(hasSpoilerField) @SerialName(hasSpoilerField)
val hasSpoiler: Boolean? = null, val hasSpoiler: Boolean? = null,
@SerialName(captionField) @SerialName(captionField)
val caption: RichBlockCaption? = null override val caption: RichBlockCaption? = null
) : RichBlock { ) : RichBlockMedia {
@EncodeDefault @EncodeDefault
@SerialName(typeField) @SerialName(typeField)
override val type: String = TYPE override val type: String = TYPE
override val markdown: String = markdown(photo, caption) override val markdown: String = markdown(photo, caption)
override val html: String = html(photo, hasSpoiler, caption) override val html: String = html(photo, hasSpoiler, caption)
override val media: TelegramMediaFile
get() = photo
companion object { companion object {
const val TYPE = "photo" const val TYPE = "photo"
@@ -625,14 +633,16 @@ data class RichBlockVideo(
@SerialName(hasSpoilerField) @SerialName(hasSpoilerField)
val hasSpoiler: Boolean? = null, val hasSpoiler: Boolean? = null,
@SerialName(captionField) @SerialName(captionField)
val caption: RichBlockCaption? = null override val caption: RichBlockCaption? = null
) : RichBlock { ) : RichBlockMedia {
@EncodeDefault @EncodeDefault
@SerialName(typeField) @SerialName(typeField)
override val type: String = TYPE override val type: String = TYPE
override val markdown: String = markdown(video, caption) override val markdown: String = markdown(video, caption)
override val html: String = html(video, hasSpoiler, caption) override val html: String = html(video, hasSpoiler, caption)
override val media: TelegramMediaFile
get() = video
companion object { companion object {
const val TYPE = "video" const val TYPE = "video"
@@ -653,14 +663,16 @@ data class RichBlockVoiceNote(
@SerialName(voiceNoteField) @SerialName(voiceNoteField)
val voiceNote: VoiceFile, val voiceNote: VoiceFile,
@SerialName(captionField) @SerialName(captionField)
val caption: RichBlockCaption? = null override val caption: RichBlockCaption? = null
) : RichBlock { ) : RichBlockMedia {
@EncodeDefault @EncodeDefault
@SerialName(typeField) @SerialName(typeField)
override val type: String = TYPE override val type: String = TYPE
override val markdown: String = markdown(voiceNote, caption) override val markdown: String = markdown(voiceNote, caption)
override val html: String = html(voiceNote, caption) override val html: String = html(voiceNote, caption)
override val media: TelegramMediaFile
get() = voiceNote
companion object { companion object {
const val TYPE = "voice_note" const val TYPE = "voice_note"

View File

@@ -2094,6 +2094,7 @@ public final class dev/inmo/tgbotapi/extensions/utils/ClassCastsNewKt {
public static final fun ifRichBlockList (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun ifRichBlockList (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun ifRichBlockMap (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun ifRichBlockMap (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun ifRichBlockMathematicalExpression (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun ifRichBlockMathematicalExpression (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun ifRichBlockMedia (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun ifRichBlockParagraph (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun ifRichBlockParagraph (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun ifRichBlockPhoto (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun ifRichBlockPhoto (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun ifRichBlockPreformatted (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun ifRichBlockPreformatted (Ldev/inmo/tgbotapi/types/rich/RichBlock;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
@@ -2769,6 +2770,8 @@ public final class dev/inmo/tgbotapi/extensions/utils/ClassCastsNewKt {
public static final fun richBlockMapOrThrow (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockMap; public static final fun richBlockMapOrThrow (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockMap;
public static final fun richBlockMathematicalExpressionOrNull (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockMathematicalExpression; public static final fun richBlockMathematicalExpressionOrNull (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockMathematicalExpression;
public static final fun richBlockMathematicalExpressionOrThrow (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockMathematicalExpression; public static final fun richBlockMathematicalExpressionOrThrow (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockMathematicalExpression;
public static final fun richBlockMediaOrNull (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockMedia;
public static final fun richBlockMediaOrThrow (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockMedia;
public static final fun richBlockParagraphOrNull (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockParagraph; public static final fun richBlockParagraphOrNull (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockParagraph;
public static final fun richBlockParagraphOrThrow (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockParagraph; public static final fun richBlockParagraphOrThrow (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockParagraph;
public static final fun richBlockPhotoOrNull (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockPhoto; public static final fun richBlockPhotoOrNull (Ldev/inmo/tgbotapi/types/rich/RichBlock;)Ldev/inmo/tgbotapi/types/rich/RichBlockPhoto;

View File

@@ -562,6 +562,7 @@ import dev.inmo.tgbotapi.types.rich.RichBlockFooter
import dev.inmo.tgbotapi.types.rich.RichBlockList import dev.inmo.tgbotapi.types.rich.RichBlockList
import dev.inmo.tgbotapi.types.rich.RichBlockMap import dev.inmo.tgbotapi.types.rich.RichBlockMap
import dev.inmo.tgbotapi.types.rich.RichBlockMathematicalExpression import dev.inmo.tgbotapi.types.rich.RichBlockMathematicalExpression
import dev.inmo.tgbotapi.types.rich.RichBlockMedia
import dev.inmo.tgbotapi.types.rich.RichBlockParagraph import dev.inmo.tgbotapi.types.rich.RichBlockParagraph
import dev.inmo.tgbotapi.types.rich.RichBlockPhoto import dev.inmo.tgbotapi.types.rich.RichBlockPhoto
import dev.inmo.tgbotapi.types.rich.RichBlockPreformatted import dev.inmo.tgbotapi.types.rich.RichBlockPreformatted
@@ -3629,6 +3630,12 @@ public inline fun RichBlock.richBlockThinkingOrThrow(): RichBlockThinking = this
public inline fun <T> RichBlock.ifRichBlockThinking(block: (RichBlockThinking) -> T): T? = richBlockThinkingOrNull() ?.let(block) public inline fun <T> RichBlock.ifRichBlockThinking(block: (RichBlockThinking) -> T): T? = richBlockThinkingOrNull() ?.let(block)
public inline fun RichBlock.richBlockMediaOrNull(): RichBlockMedia? = this as? dev.inmo.tgbotapi.types.rich.RichBlockMedia
public inline fun RichBlock.richBlockMediaOrThrow(): RichBlockMedia = this as dev.inmo.tgbotapi.types.rich.RichBlockMedia
public inline fun <T> RichBlock.ifRichBlockMedia(block: (RichBlockMedia) -> T): T? = richBlockMediaOrNull() ?.let(block)
public inline fun BotAction.typingActionOrNull(): TypingAction? = this as? dev.inmo.tgbotapi.types.actions.TypingAction public inline fun BotAction.typingActionOrNull(): TypingAction? = this as? dev.inmo.tgbotapi.types.actions.TypingAction
public inline fun BotAction.typingActionOrThrow(): TypingAction = this as dev.inmo.tgbotapi.types.actions.TypingAction public inline fun BotAction.typingActionOrThrow(): TypingAction = this as dev.inmo.tgbotapi.types.actions.TypingAction