1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2026-08-17 14:46:46 +00:00

improvements in rich messages

This commit is contained in:
2026-08-17 17:35:03 +06:00
parent 5b6fe8eb96
commit 8bee8982bb
11 changed files with 721 additions and 68 deletions

View File

@@ -0,0 +1,402 @@
0.12.1
0.12.2
0.12.3
0.12.4
0.12.5
0.12.6
0.12.7
0.13.0
0.13.1
0.14.0
0.14.1
0.15.0
0.16.0
0.16.1
0.17.0
0.18.0
0.18.1
0.19.0
0.2.2
0.20.0
0.20.1
0.20.4
0.21.0
0.22.0
0.22.1
0.22.2
0.23.0
0.23.1
0.23.3
0.23.4
0.24.0
0.24.1
0.25.0
0.25.1
0.25.2
0.26.0
0.26.1
0.26.2
0.26.3
0.26.4
0.27.0
0.27.1
0.27.10
0.27.11
0.27.2
0.27.3
0.27.4
0.27.5
0.27.6
0.27.7
0.27.8
0.27.9
0.28.0
0.28.0-rc
0.28.1
0.28.2
0.28.3
0.28.4
0.28.5
0.29.0
0.29.1
0.29.2
0.29.3
0.29.4
0.29.5
0.3.12
0.30.0
0.30.1
0.30.10
0.30.11
0.30.12
0.30.13
0.30.2
0.30.3
0.30.4
0.30.5
0.30.6
0.30.7
0.30.8
0.30.9
0.31.0
0.31.1
0.32.0
0.32.1
0.32.10
0.32.2
0.32.3
0.32.4
0.32.5
0.32.6
0.32.7
0.32.8
0.32.9
0.33.0
0.33.1
0.33.2
0.33.3
0.33.4
0.34.0
0.34.1
0.35.0
0.35.1
0.35.2
0.35.3
0.35.4
0.35.5
0.35.6
0.35.7
0.35.8
0.35.9
0.36.0
0.36.1
0.36.2
0.37.0
0.37.1
0.37.2
0.37.3
0.37.4
0.38.0
0.38.1
0.38.10
0.38.11
0.38.12
0.38.13
0.38.14
0.38.15
0.38.16
0.38.17
0.38.18
0.38.19
0.38.2
0.38.20
0.38.21
0.38.22
0.38.23
0.38.3
0.38.33
0.38.4
0.38.5
0.38.6
0.38.7
0.38.8
0.38.9
0.39.0
0.5.1
1.0.0
1.0.1
1.1.0
1.1.1
1.1.2
1.1.3
1.1.4
1.2.0
10.0.0
10.0.1
10.1.0
10.1.1
10.1.2
11.0.0
12.0.0
12.0.1
12.1.0
13.0.0
13.1.0
14.0.0
14.0.1
14.0.2
14.1.0
15.0.0
15.1.0
15.1.1
15.2.0
15.3.0
16.0.0
17.0.0
17.1.0
18.0.0
18.1.0
18.2.0
18.2.1
18.2.2
18.2.3
19.0.0
19.1.0
2.0.0
2.0.1
2.0.2
2.0.3
2.1.0
2.1.1
2.1.2
2.1.3
2.2.0
2.2.1
2.2.2
20.0.0
20.0.1
20.1.0
21.0.0
21.0.1
22.0.0
23.0.0
23.1.0
23.1.1
23.1.2
23.2.0
23.2.1
24.0.0
24.0.1
24.0.2
25.0.0
25.0.1
25.0.2
26.0.0
26.1.0
26.2.0
27.0.0
27.1.0
27.1.1
27.1.2
28.0.0
28.0.1
28.0.2
28.0.3
29.0.0
29.0.1
29.1.0
3.0.0
3.0.1
3.0.2
3.0.3
3.1.0
3.1.1
3.1.2
3.2.0
3.2.1
3.2.2
3.2.3
3.2.4
3.2.5
3.2.6
3.2.7
3.3.0
3.3.1
30.0.0
30.0.1
30.0.2
31.0.0
31.0.1
31.1.0
31.2.0
32.0.0
33.0.0
33.1.0
33.2.0
34.0.0
35.0.0
35.0.1
35.1.0
35.1.1
36.0.0
4.0.0
4.1.0
4.1.1
4.1.2
4.1.3
4.2.0
4.2.1
4.2.2
4.2.3
4.2.4
5.0.0
5.0.1
5.0.2
5.1.0
5.1.1
5.2.0
5.2.1
6.0.0
6.0.1
6.0.2
6.0.3
6.1.0
6.2.0
7.0.0
7.0.1
7.0.2
7.1.0
7.1.1
7.1.2
7.1.3
8.0.0
8.0.1
8.0.2
8.1.0
8.1.1
9.0.0
9.1.0
9.1.1
9.1.2
9.2.0
9.2.1
9.2.2
9.2.3
9.2.4
9.3.0
9.3.0-RC
9.4.0
9.4.1
9.4.2
9.4.3
HEAD
feature/fsm
feature/passport
garbage
gradle-wrapper/6.9
implement_telegram_passport
init_kdocs
kdocs
klassindex
lib_to_common
master
new_branch
play_with_dependabot
renovate/com.benasher44-uuid-0.x
renovate/com.jfrog.bintray.gradle-gradle-bintray-plugin-1.x
renovate/com.soywiz.korlibs.klock-klock-1.x
renovate/com.soywiz.korlibs.klock-klock-2.x
renovate/dev.inmo-micro_utils.coroutines-0.x
renovate/dev.inmo-micro_utils.crypto-0.x
renovate/dev.inmo-micro_utils.serialization.base64-0.x
renovate/dev.inmo-micro_utils.serialization.encapsulator-0.x
renovate/dev.inmo-micro_utils.serialization.typed_serializer-0.x
renovate/dokka
renovate/dokka_version
renovate/github.release.plugin
renovate/github_release_plugin_version
renovate/gradle-6.x
renovate/gradle-7.x
renovate/gradle-8.x
renovate/gradle-9.x
renovate/io.ktor-ktor-client-cio-1.x
renovate/io.ktor-ktor-client-core-1.x
renovate/io.ktor-ktor-server-1.x
renovate/io.ktor-ktor-server-host-common-1.x
renovate/klock_version
renovate/korlibs
renovate/kotlin
renovate/kotlin-coroutines
renovate/kotlin-monorepo
renovate/kotlin-poet
renovate/kotlin-serialization
renovate/kotlin.coroutines
renovate/kotlin.poet
renovate/kotlin.serialization
renovate/kotlin_coroutines_version
renovate/kotlin_serialisation_runtime_version
renovate/kotlin_version
renovate/kotlinx-coroutines-monorepo
renovate/kslog
renovate/ksp
renovate/ksp-monorepo
renovate/ktor
renovate/ktor-monorepo
renovate/ktor_version
renovate/major-dokka
renovate/major-kotlin
renovate/major-kotlin-monorepo
renovate/major-kotlin.poet
renovate/major-ksp
renovate/major-ktor-monorepo
renovate/major-ktor_version
renovate/micro_utils_version
renovate/microutils
renovate/nmcp
renovate/org.jetbrains.dokka-1.x
renovate/org.jetbrains.dokka-dokka-gradle-plugin-0.x
renovate/org.jetbrains.dokka-dokka-gradle-plugin-1.x
renovate/org.jetbrains.dokka-gfm-plugin-1.x
renovate/org.jetbrains.dokka-org.jetbrains.dokka.gradle.plugin-0.x
renovate/org.jetbrains.dokka-org.jetbrains.dokka.gradle.plugin-1.x
renovate/org.jetbrains.kotlin-kotlin-gradle-plugin-1.x
renovate/org.jetbrains.kotlin-kotlin-serialization-1.x
renovate/org.jetbrains.kotlin.multiplatform-1.x
renovate/org.jetbrains.kotlin.multiplatform-org.jetbrains.kotlin.multiplatform.gradle.plugin-1.x
renovate/org.jetbrains.kotlin.plugin.serialization-1.x
renovate/org.jetbrains.kotlin.plugin.serialization-org.jetbrains.kotlin.plugin.serialization.gradle.plugin-1.x
renovate/org.jetbrains.kotlinx-kotlinx-coroutines-core-1.x
renovate/org.jetbrains.kotlinx-kotlinx-serialization-json-1.x
renovate/org.jetbrains.kotlinx-kotlinx-serialization-properties-1.x
renovate/org.jetbrains.kotlinx-kotlinx-serialization-properties-common-0.x
renovate/org.jetbrains.kotlinx-kotlinx-serialization-properties-js-0.x
renovate/org.jetbrains.kotlinx-kotlinx-serialization-runtime-0.x
renovate/org.jetbrains.kotlinx-kotlinx-serialization-runtime-common-0.x
renovate/org.jetbrains.kotlinx-kotlinx-serialization-runtime-js-0.x
renovate/uuid
renovate/uuid_version
renovate/validator
renovate/versions
task/28-migration_to_mpp
task/676-rework_of_media_groups
tg_channel_imh

View File

@@ -6,6 +6,8 @@
**Breaking changes**:
* `RichBlockTableCell.align` now uses the string-serialized `RichBlockTableCellAlign` sealed hierarchy (`Left`, `Center`, or `Right`) instead of `String`
* `RichBlockTableCell` is now a sealed interface with `Header` and `Regular` implementations; the input table DSL uses `headerCell` and `cell` respectively
* `InputRichBlockListItem` is now a sealed interface with `Ordered` and `Unordered` implementations; ordered items require a non-null `value` and typed `LabelType`, while `LabelType.Decimals` is the default; `InputRichBlocksBuilder` now exposes separate `orderedList` and `unorderedList` DSL functions with matching item builders
* `ReplyParameters` is now a sealed interface with nested `ReplyParameters.Chat` and `ReplyParameters.Ephemeral` implementations; overloaded `ReplyParameters(...)` companion factories construct both regular-message and ephemeral-message variants
* The 4 group-family message implementations (`CommonGroupContentMessageImpl`, `CommonForumContentMessageImpl`, `CommonChannelDirectMessagesContentMessageImpl`, `CommonSuggestedChannelDirectMessagesContentMessageImpl`) gained trailing `receiverUser`/`ephemeralMessageId` primary-constructor parameters (defaulted to `null`) — positional construction of these classes must be updated
@@ -14,6 +16,8 @@
**Migration advice**: Keep `ReplyParameters(...)` for both chat-message and ephemeral-message targets; explicit `ReplyParameters.Ephemeral(...)` subtype construction also remains available; pass `receiverUser`/`ephemeralMessageId` explicitly (or rely on their `null` default) when constructing the 4 group-family message implementations positionally
* `Core`:
* (`Rich Messages`) Added the raw-string-serialized `RichBlockTableCellAlign` hierarchy and migrated table-cell alignment from `String` to `RichBlockTableCellAlign`
* (`Rich Messages`) Split `RichBlockTableCell` into header/regular variants with a shared flat surrogate serializer; added `headerCell` to the input table DSL
* (`Rich Messages`) Added `h1` through `h6` shortcuts for plain and rich-text headings in `InputRichBlocksBuilder`
* (`Rich Messages`) Reworked the input table DSL to build cells through nested `table { row { cell(...) { } } }` builders
* (`Rich Messages`) Replaced the flat `InputRichBlockListItem` data class with ordered/unordered variants, added the string-serialized `LabelType` hierarchy (`A`, `a`, `I`, `i`, `1`), and split the list DSL into `InputRichBlockOrderedListBuilder`/`InputRichBlockUnorderedListBuilder`

1
codex-master-baseline Submodule

Submodule codex-master-baseline added at c7761fd294

View File

@@ -35863,8 +35863,10 @@ public final class dev/inmo/tgbotapi/types/rich/InputRichBlockTableBuilder {
public final class dev/inmo/tgbotapi/types/rich/InputRichBlockTableRowBuilder {
public fun <init> ()V
public final fun build ()Ljava/util/List;
public final fun cell (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Integer;Ljava/lang/Integer;Lkotlin/jvm/functions/Function1;)V
public static synthetic fun cell$default (Ldev/inmo/tgbotapi/types/rich/InputRichBlockTableRowBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Integer;Ljava/lang/Integer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
public final fun cell (Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lkotlin/jvm/functions/Function1;)V
public static synthetic fun cell$default (Ldev/inmo/tgbotapi/types/rich/InputRichBlockTableRowBuilder;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
public final fun headerCell (Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lkotlin/jvm/functions/Function1;)V
public static synthetic fun headerCell$default (Ldev/inmo/tgbotapi/types/rich/InputRichBlockTableRowBuilder;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
}
public final class dev/inmo/tgbotapi/types/rich/InputRichBlockThinking : dev/inmo/tgbotapi/types/rich/InputRichBlock {
@@ -36929,44 +36931,123 @@ public final class dev/inmo/tgbotapi/types/rich/RichBlockTable$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCell {
public abstract interface class dev/inmo/tgbotapi/types/rich/RichBlockTableCell {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell$Companion;
public fun <init> (Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Boolean;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;)V
public synthetic fun <init> (Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Boolean;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ldev/inmo/tgbotapi/types/rich/RichText;
public final fun component2 ()Ljava/lang/Boolean;
public final fun component3 ()Ljava/lang/Integer;
public final fun component4 ()Ljava/lang/Integer;
public final fun component5 ()Ljava/lang/String;
public final fun component6 ()Ljava/lang/String;
public final fun copy (Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Boolean;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;)Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell;
public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell;Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Boolean;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell;
public fun equals (Ljava/lang/Object;)Z
public final fun getAlign ()Ljava/lang/String;
public final fun getColspan ()Ljava/lang/Integer;
public final fun getRowspan ()Ljava/lang/Integer;
public final fun getText ()Ldev/inmo/tgbotapi/types/rich/RichText;
public final fun getValign ()Ljava/lang/String;
public fun hashCode ()I
public final fun isHeader ()Ljava/lang/Boolean;
public fun toString ()Ljava/lang/String;
}
public final synthetic class dev/inmo/tgbotapi/types/rich/RichBlockTableCell$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell$$serializer;
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell;
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell;)V
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
public abstract fun getAlign ()Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;
public abstract fun getColspan ()Ljava/lang/Integer;
public abstract fun getRowspan ()Ljava/lang/Integer;
public abstract fun getText ()Ldev/inmo/tgbotapi/types/rich/RichText;
public abstract fun getValign ()Ljava/lang/String;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCell$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCell$Header : dev/inmo/tgbotapi/types/rich/RichBlockTableCell {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell$Header$Companion;
public fun <init> (Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Integer;Ljava/lang/Integer;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;)V
public synthetic fun <init> (Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Integer;Ljava/lang/Integer;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ldev/inmo/tgbotapi/types/rich/RichText;
public final fun component2 ()Ljava/lang/Integer;
public final fun component3 ()Ljava/lang/Integer;
public final fun component4 ()Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;
public final fun component5 ()Ljava/lang/String;
public final fun copy (Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Integer;Ljava/lang/Integer;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;)Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell$Header;
public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell$Header;Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Integer;Ljava/lang/Integer;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell$Header;
public fun equals (Ljava/lang/Object;)Z
public fun getAlign ()Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;
public fun getColspan ()Ljava/lang/Integer;
public fun getRowspan ()Ljava/lang/Integer;
public fun getText ()Ldev/inmo/tgbotapi/types/rich/RichText;
public fun getValign ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCell$Header$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCell$Regular : dev/inmo/tgbotapi/types/rich/RichBlockTableCell {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell$Regular$Companion;
public fun <init> (Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Integer;Ljava/lang/Integer;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;)V
public synthetic fun <init> (Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Integer;Ljava/lang/Integer;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ldev/inmo/tgbotapi/types/rich/RichText;
public final fun component2 ()Ljava/lang/Integer;
public final fun component3 ()Ljava/lang/Integer;
public final fun component4 ()Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;
public final fun component5 ()Ljava/lang/String;
public final fun copy (Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Integer;Ljava/lang/Integer;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;)Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell$Regular;
public static synthetic fun copy$default (Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell$Regular;Ldev/inmo/tgbotapi/types/rich/RichText;Ljava/lang/Integer;Ljava/lang/Integer;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;Ljava/lang/String;ILjava/lang/Object;)Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell$Regular;
public fun equals (Ljava/lang/Object;)Z
public fun getAlign ()Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;
public fun getColspan ()Ljava/lang/Integer;
public fun getRowspan ()Ljava/lang/Integer;
public fun getText ()Ldev/inmo/tgbotapi/types/rich/RichText;
public fun getValign ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCell$Regular$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCell$Serializer : kotlinx/serialization/KSerializer {
public static final field INSTANCE Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell$Serializer;
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell;
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCell;)V
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
}
public abstract interface class dev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign$Companion;
public abstract fun getName ()Ljava/lang/String;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign$Center : dev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign {
public static final field INSTANCE Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign$Center;
public fun equals (Ljava/lang/Object;)Z
public fun getName ()Ljava/lang/String;
public fun hashCode ()I
public final fun serializer ()Lkotlinx/serialization/KSerializer;
public fun toString ()Ljava/lang/String;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign$Left : dev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign {
public static final field INSTANCE Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign$Left;
public fun equals (Ljava/lang/Object;)Z
public fun getName ()Ljava/lang/String;
public fun hashCode ()I
public final fun serializer ()Lkotlinx/serialization/KSerializer;
public fun toString ()Ljava/lang/String;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign$Right : dev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign {
public static final field INSTANCE Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign$Right;
public fun equals (Ljava/lang/Object;)Z
public fun getName ()Ljava/lang/String;
public fun hashCode ()I
public final fun serializer ()Lkotlinx/serialization/KSerializer;
public fun toString ()Ljava/lang/String;
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign$Serializer : kotlinx/serialization/KSerializer {
public static final field INSTANCE Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign$Serializer;
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ldev/inmo/tgbotapi/types/rich/RichBlockTableCellAlign;)V
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
}
public final class dev/inmo/tgbotapi/types/rich/RichBlockThinking : dev/inmo/tgbotapi/types/rich/RichBlock {
public static final field Companion Ldev/inmo/tgbotapi/types/rich/RichBlockThinking$Companion;
public static final field TYPE Ljava/lang/String;

View File

@@ -55,14 +55,23 @@ class InputRichBlockTableRowBuilder {
private val cells = mutableListOf<RichBlockTableCell>()
fun cell(
align: String,
align: RichBlockTableCellAlign,
valign: String,
isHeader: Boolean? = null,
colspan: Int? = null,
rowspan: Int? = null,
block: RichTextBuilder.() -> Unit
) {
cells.add(RichBlockTableCell(buildRichText(block), isHeader, colspan, rowspan, align, valign))
cells.add(RichBlockTableCell.Regular(buildRichText(block), colspan, rowspan, align, valign))
}
fun headerCell(
align: RichBlockTableCellAlign,
valign: String,
colspan: Int? = null,
rowspan: Int? = null,
block: RichTextBuilder.() -> Unit
) {
cells.add(RichBlockTableCell.Header(buildRichText(block), colspan, rowspan, align, valign))
}
fun build(): List<RichBlockTableCell> = cells.toList()

View File

@@ -15,6 +15,11 @@ import dev.inmo.tgbotapi.types.valignField
import dev.inmo.tgbotapi.types.valueField
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.KSerializer
import kotlinx.serialization.EncodeDefault
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
/**
* Caption of a rich formatted block.
@@ -34,21 +39,86 @@ data class RichBlockCaption(
*
* @see <a href="https://core.telegram.org/bots/api#richblocktablecell">RichBlockTableCell</a>
*/
@Serializable
data class RichBlockTableCell(
@SerialName(textField)
val text: RichText? = null,
@SerialName(isHeaderField)
val isHeader: Boolean? = null,
@SerialName(colspanField)
val colspan: Int? = null,
@SerialName(rowspanField)
val rowspan: Int? = null,
@SerialName(alignField)
val align: String,
@SerialName(valignField)
@Serializable(RichBlockTableCell.Serializer::class)
sealed interface RichBlockTableCell {
val text: RichText?
val colspan: Int?
val rowspan: Int?
val align: RichBlockTableCellAlign
val valign: String
)
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(Serializer::class)
data class Header(
@SerialName(textField)
override val text: RichText? = null,
@SerialName(colspanField)
override val colspan: Int? = null,
@SerialName(rowspanField)
override val rowspan: Int? = null,
@SerialName(alignField)
override val align: RichBlockTableCellAlign,
@SerialName(valignField)
override val valign: String
) : RichBlockTableCell
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(Serializer::class)
data class Regular(
@SerialName(textField)
override val text: RichText? = null,
@SerialName(colspanField)
override val colspan: Int? = null,
@SerialName(rowspanField)
override val rowspan: Int? = null,
@SerialName(alignField)
override val align: RichBlockTableCellAlign,
@SerialName(valignField)
override val valign: String
) : RichBlockTableCell
object Serializer : KSerializer<RichBlockTableCell> {
@Serializable
private data class Surrogate(
@SerialName(textField)
val text: RichText? = null,
@SerialName(isHeaderField)
@EncodeDefault(EncodeDefault.Mode.NEVER)
val isHeader: Boolean? = null,
@SerialName(colspanField)
val colspan: Int? = null,
@SerialName(rowspanField)
val rowspan: Int? = null,
@SerialName(alignField)
val align: RichBlockTableCellAlign,
@SerialName(valignField)
val valign: String
)
override val descriptor: SerialDescriptor = Surrogate.serializer().descriptor
override fun deserialize(decoder: Decoder): RichBlockTableCell {
val surrogate = decoder.decodeSerializableValue(Surrogate.serializer())
return if (surrogate.isHeader == true) {
Header(surrogate.text, surrogate.colspan, surrogate.rowspan, surrogate.align, surrogate.valign)
} else {
Regular(surrogate.text, surrogate.colspan, surrogate.rowspan, surrogate.align, surrogate.valign)
}
}
override fun serialize(encoder: Encoder, value: RichBlockTableCell) {
val surrogate = Surrogate(
value.text,
true.takeIf { value is Header },
value.colspan,
value.rowspan,
value.align,
value.valign
)
encoder.encodeSerializableValue(Surrogate.serializer(), surrogate)
}
}
}
/**
* An item of a [RichBlockList].

View File

@@ -0,0 +1,52 @@
package dev.inmo.tgbotapi.types.rich
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
/** Horizontal alignment of a [RichBlockTableCell]. */
@Serializable(RichBlockTableCellAlign.Serializer::class)
sealed interface RichBlockTableCellAlign {
val name: String
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(Serializer::class)
data object Left : RichBlockTableCellAlign {
override val name: String = "left"
}
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(Serializer::class)
data object Center : RichBlockTableCellAlign {
override val name: String = "center"
}
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(Serializer::class)
data object Right : RichBlockTableCellAlign {
override val name: String = "right"
}
object Serializer : KSerializer<RichBlockTableCellAlign> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(
"RichBlockTableCellAlign",
PrimitiveKind.STRING
)
override fun deserialize(decoder: Decoder): RichBlockTableCellAlign = when (val name = decoder.decodeString()) {
Left.name -> Left
Center.name -> Center
Right.name -> Right
else -> throw SerializationException("Unknown RichBlockTableCell alignment: $name")
}
override fun serialize(encoder: Encoder, value: RichBlockTableCellAlign) {
encoder.encodeString(value.name)
}
}
}

View File

@@ -411,10 +411,9 @@ data class RichBlockTable(
fun renderRow(row: List<RichBlockTableCell>): String =
row.joinToString(separator = " | ", prefix = "| ", postfix = " |") { it.text?.markdown ?: "" }
fun alignment(cell: RichBlockTableCell): String = when (cell.align) {
"left" -> ":---"
"center" -> ":--:"
"right" -> "---:"
else -> "---"
RichBlockTableCellAlign.Left -> ":---"
RichBlockTableCellAlign.Center -> ":--:"
RichBlockTableCellAlign.Right -> "---:"
}
val header = cells.first()
val lines = mutableListOf(
@@ -433,11 +432,11 @@ data class RichBlockTable(
val captionPart = caption?.let { "<caption>${it.html}</caption>" } ?: ""
val rows = cells.joinToString(separator = "") { row ->
val renderedCells = row.joinToString(separator = "") { cell ->
val tag = if (cell.isHeader == true) "th" else "td"
val tag = if (cell is RichBlockTableCell.Header) "th" else "td"
val cellAttributes = buildString {
cell.colspan?.let { append(" colspan=\"$it\"") }
cell.rowspan?.let { append(" rowspan=\"$it\"") }
append(" align=\"${cell.align}\"")
append(" align=\"${cell.align.name}\"")
append(" valign=\"${cell.valign}\"")
}
"<$tag$cellAttributes>${cell.text?.html ?: ""}</$tag>"

View File

@@ -84,12 +84,12 @@ class InputRichBlocksDslTest {
val blocks = buildInputRichBlocks {
table(isBordered = true, isStriped = false, caption = RichTextPlain("caption")) {
row {
cell(align = "left", valign = "top", isHeader = true, colspan = 2) {
headerCell(align = RichBlockTableCellAlign.Left, valign = "top", colspan = 2) {
bold("heading")
}
}
row {
cell(align = "center", valign = "middle", rowspan = 2) {
cell(align = RichBlockTableCellAlign.Center, valign = "middle", rowspan = 2) {
plain("value")
}
}
@@ -101,19 +101,18 @@ class InputRichBlocksDslTest {
InputRichBlockTable(
cells = listOf(
listOf(
RichBlockTableCell(
RichBlockTableCell.Header(
text = RichTextBold(RichTextPlain("heading")),
isHeader = true,
colspan = 2,
align = "left",
align = RichBlockTableCellAlign.Left,
valign = "top"
)
),
listOf(
RichBlockTableCell(
RichBlockTableCell.Regular(
text = RichTextPlain("value"),
rowspan = 2,
align = "center",
align = RichBlockTableCellAlign.Center,
valign = "middle"
)
)

View File

@@ -61,7 +61,7 @@ class InputRichMessageSerializationTest {
fun encodesTableReusingReceivedCellType() {
val table = InputRichBlockTable(
cells = listOf(
listOf(RichBlockTableCell(RichTextPlain("h1"), isHeader = true, align = "left", valign = "top"))
listOf(RichBlockTableCell.Header(RichTextPlain("h1"), align = RichBlockTableCellAlign.Left, valign = "top"))
)
)
val message = InputRichMessageBlocks(blocks = listOf(table))
@@ -72,6 +72,42 @@ class InputRichMessageSerializationTest {
assertEquals(true, cell["is_header"]?.jsonPrimitive?.boolean)
}
@Test
fun serializesTableCellVariantsWithSharedFlatShape() {
val header: RichBlockTableCell = RichBlockTableCell.Header(RichTextPlain("h"), align = RichBlockTableCellAlign.Left, valign = "top")
val regular: RichBlockTableCell = RichBlockTableCell.Regular(RichTextPlain("v"), align = RichBlockTableCellAlign.Right, valign = "bottom")
val headerElement = json.encodeToJsonElement(RichBlockTableCell.Serializer, header).jsonObject
val regularElement = json.encodeToJsonElement(RichBlockTableCell.Serializer, regular).jsonObject
assertEquals(true, headerElement["is_header"]?.jsonPrimitive?.boolean)
assertTrue("is_header" !in regularElement)
assertEquals(header, json.decodeFromJsonElement(RichBlockTableCell.Serializer, headerElement))
assertEquals(regular, json.decodeFromJsonElement(RichBlockTableCell.Serializer, regularElement))
assertTrue(json.decodeFromString(RichBlockTableCell.Serializer, "{\"align\":\"left\",\"valign\":\"top\",\"is_header\":false}") is RichBlockTableCell.Regular)
}
@Test
fun serializesEveryTableCellAlignmentAsItsName() {
val alignments = listOf(
RichBlockTableCellAlign.Left,
RichBlockTableCellAlign.Center,
RichBlockTableCellAlign.Right
)
alignments.forEach { alignment ->
val encoded = json.encodeToString(RichBlockTableCellAlign.Serializer, alignment)
assertEquals("\"${alignment.name}\"", encoded)
assertEquals(alignment, json.decodeFromString(RichBlockTableCellAlign.Serializer, encoded))
}
}
@Test
fun rejectsUnknownTableCellAlignment() {
assertFailsWith<SerializationException> {
json.decodeFromString(RichBlockTableCellAlign.Serializer, "\"justify\"")
}
}
@Test
fun encodesPhotoBlockMedia() {
val photoBlock = InputRichBlockPhoto(TelegramMediaPhoto(FileId("photo_file_id")))

View File

@@ -108,12 +108,12 @@ class RichBlockFormattingTest {
val block = RichBlockTable(
listOf(
listOf(
RichBlockTableCell(text = RichTextPlain("H1"), isHeader = true, align = "left", valign = "top"),
RichBlockTableCell(text = RichTextPlain("H2"), isHeader = true, align = "center", valign = "top")
RichBlockTableCell.Header(text = RichTextPlain("H1"), align = RichBlockTableCellAlign.Left, valign = "top"),
RichBlockTableCell.Header(text = RichTextPlain("H2"), align = RichBlockTableCellAlign.Center, valign = "top")
),
listOf(
RichBlockTableCell(text = RichTextPlain("a"), align = "left", valign = "top"),
RichBlockTableCell(text = RichTextPlain("b"), align = "center", valign = "top")
RichBlockTableCell.Regular(text = RichTextPlain("a"), align = RichBlockTableCellAlign.Left, valign = "top"),
RichBlockTableCell.Regular(text = RichTextPlain("b"), align = RichBlockTableCellAlign.Center, valign = "top")
)
)
)