From d02c263e1a78d7dbb048de260a569cf8e5af9ec0 Mon Sep 17 00:00:00 2001 From: benkuly <3976820-benkuly@users.noreply.gitlab.com> Date: Tue, 1 Nov 2022 18:40:28 +0100 Subject: [PATCH] Add `m.read.private` receipts, as per [MSC2285](https://github.com/matrix-org/matrix-spec-proposals/pull/2285). Make `m.fully_read` optional on `/read_markers`, as per [MSC2285](https://github.com/matrix-org/matrix-spec-proposals/pull/2285). Allow `m.fully_read` markers to be set from `/receipts`, as per [MSC2285](https://github.com/matrix-org/matrix-spec-proposals/pull/2285). --- .../folivo/trixnity/client/store/RoomUser.kt | 12 ++- .../client/user/ReceiptEventHandler.kt | 11 ++- .../client/user/ReceiptEventHandlerTest.kt | 89 +++++++------------ .../clientserverapi/client/RoomsApiClient.kt | 5 +- .../model/rooms/GetHierarchy.kt | 2 +- .../model/rooms/SetReadMarkers.kt | 3 +- .../clientserverapi/model/rooms/SetReceipt.kt | 9 +- .../clientserverapi/server/RoomsRoutesTest.kt | 3 +- .../model/events/m/ReceiptEventContent.kt | 45 ++-------- .../core/model/events/m/ReceiptType.kt | 46 ++++++++++ .../events/EventSerializerTest.kt | 39 ++++---- .../model/federation/GetHierarchy.kt | 2 +- 12 files changed, 129 insertions(+), 137 deletions(-) create mode 100644 trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/model/events/m/ReceiptType.kt diff --git a/trixnity-client/src/commonMain/kotlin/net/folivo/trixnity/client/store/RoomUser.kt b/trixnity-client/src/commonMain/kotlin/net/folivo/trixnity/client/store/RoomUser.kt index 303edb1c7..cb4f329ea 100644 --- a/trixnity-client/src/commonMain/kotlin/net/folivo/trixnity/client/store/RoomUser.kt +++ b/trixnity-client/src/commonMain/kotlin/net/folivo/trixnity/client/store/RoomUser.kt @@ -6,6 +6,8 @@ import net.folivo.trixnity.core.model.EventId import net.folivo.trixnity.core.model.RoomId import net.folivo.trixnity.core.model.UserId import net.folivo.trixnity.core.model.events.Event +import net.folivo.trixnity.core.model.events.m.ReceiptEventContent +import net.folivo.trixnity.core.model.events.m.ReceiptType import net.folivo.trixnity.core.model.events.m.room.MemberEventContent @Serializable @@ -14,5 +16,11 @@ data class RoomUser( val userId: UserId, val name: String, val event: @Contextual Event, - val lastReadMessage: EventId? = null, -) \ No newline at end of file + val receipts: Map = mapOf(), +) { + @Serializable + data class RoomUserReceipt( + val eventId: EventId, + val receipt: ReceiptEventContent.Receipt + ) +} \ No newline at end of file diff --git a/trixnity-client/src/commonMain/kotlin/net/folivo/trixnity/client/user/ReceiptEventHandler.kt b/trixnity-client/src/commonMain/kotlin/net/folivo/trixnity/client/user/ReceiptEventHandler.kt index cfff0c852..095c50d41 100644 --- a/trixnity-client/src/commonMain/kotlin/net/folivo/trixnity/client/user/ReceiptEventHandler.kt +++ b/trixnity-client/src/commonMain/kotlin/net/folivo/trixnity/client/user/ReceiptEventHandler.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.job import mu.KotlinLogging import net.folivo.trixnity.client.getRoomId +import net.folivo.trixnity.client.store.RoomUser import net.folivo.trixnity.client.store.RoomUserStore import net.folivo.trixnity.clientserverapi.client.MatrixClientServerApiClient import net.folivo.trixnity.core.EventHandler @@ -31,11 +32,13 @@ class ReceiptEventHandler( log.debug { "set read receipts of room $roomId" } receiptEvent.content.events.forEach { (eventId, receipts) -> receipts - .filterIsInstance() - .forEach { receipt -> - receipt.read.keys.forEach { userId -> + .forEach { (receiptType, receipts) -> + receipts.forEach { (userId, receipt) -> roomUserStore.update(userId, roomId) { oldRoomUser -> - oldRoomUser?.copy(lastReadMessage = eventId) + oldRoomUser?.copy( + receipts = oldRoomUser.receipts + + (receiptType to RoomUser.RoomUserReceipt(eventId, receipt)) + ) } } } diff --git a/trixnity-client/src/commonTest/kotlin/net/folivo/trixnity/client/user/ReceiptEventHandlerTest.kt b/trixnity-client/src/commonTest/kotlin/net/folivo/trixnity/client/user/ReceiptEventHandlerTest.kt index 48267d296..51b766951 100644 --- a/trixnity-client/src/commonTest/kotlin/net/folivo/trixnity/client/user/ReceiptEventHandlerTest.kt +++ b/trixnity-client/src/commonTest/kotlin/net/folivo/trixnity/client/user/ReceiptEventHandlerTest.kt @@ -7,8 +7,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.first -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.JsonPrimitive import net.folivo.trixnity.client.getInMemoryRoomUserStore import net.folivo.trixnity.client.mockMatrixClientServerApiClient import net.folivo.trixnity.client.store.RoomUser @@ -19,7 +17,7 @@ import net.folivo.trixnity.core.model.UserId import net.folivo.trixnity.core.model.events.Event import net.folivo.trixnity.core.model.events.m.ReceiptEventContent import net.folivo.trixnity.core.model.events.m.ReceiptEventContent.Receipt -import net.folivo.trixnity.core.model.events.m.ReceiptEventContent.Receipt.ReadReceipt +import net.folivo.trixnity.core.model.events.m.ReceiptType import net.folivo.trixnity.core.model.events.m.room.MemberEventContent import net.folivo.trixnity.core.model.events.m.room.Membership import net.folivo.trixnity.core.serialization.createMatrixEventJson @@ -47,7 +45,11 @@ class ReceiptEventHandlerTest : ShouldSpec({ scope.cancel() } - fun roomUser(roomId: RoomId, userId: UserId, lastReadMessage: EventId? = null): RoomUser { + fun roomUser( + roomId: RoomId, + userId: UserId, + receipts: Map = mapOf() + ): RoomUser { return RoomUser( roomId, userId, @@ -60,7 +62,7 @@ class ReceiptEventHandlerTest : ShouldSpec({ 0L, stateKey = "" ), - lastReadMessage = lastReadMessage, + receipts = receipts, ) } @@ -71,11 +73,9 @@ class ReceiptEventHandlerTest : ShouldSpec({ val event = Event.EphemeralEvent( ReceiptEventContent( events = mapOf( - EventId("eventId") to setOf( - ReadReceipt( - read = mapOf( - UserId("unknownUser", "localhost") to ReadReceipt.ReadEvent(0L) - ) + EventId("eventId") to mapOf( + ReceiptType.Read to mapOf( + UserId("unknownUser", "localhost") to Receipt(0L) ) ) ) @@ -93,10 +93,9 @@ class ReceiptEventHandlerTest : ShouldSpec({ val event = Event.EphemeralEvent( ReceiptEventContent( events = mapOf( - EventId("eventId") to setOf( - Receipt.Unknown( - type = "awesome", - raw = JsonObject(mapOf("dino" to JsonPrimitive("unicorn"))), + EventId("eventId") to mapOf( + ReceiptType.Unknown("awesome") to mapOf( + UserId("unknownUser", "localhost") to Receipt(0L) ) ) ) @@ -115,11 +114,9 @@ class ReceiptEventHandlerTest : ShouldSpec({ val event = Event.EphemeralEvent( ReceiptEventContent( events = mapOf( - eventId to setOf( - ReadReceipt( - read = mapOf( - alice to ReadReceipt.ReadEvent(0L) - ) + eventId to mapOf( + ReceiptType.Read to mapOf( + alice to Receipt(0L) ) ) ) @@ -128,61 +125,37 @@ class ReceiptEventHandlerTest : ShouldSpec({ ) cut.setReadReceipts(event) - roomUserStore.get(alice, room).first()?.lastReadMessage shouldBe eventId + roomUserStore.get(alice, room).first()?.receipts?.get(ReceiptType.Read) shouldBe + RoomUser.RoomUserReceipt(eventId, Receipt(0L)) } should("replace the last read message of a user when a new last message is received") { val existingEventId = EventId("existingEvent") - val existingRoomUser = roomUser(room, alice, lastReadMessage = existingEventId) - roomUserStore.update(alice, room) { existingRoomUser } - val eventId = EventId("eventId") - val event = Event.EphemeralEvent( - ReceiptEventContent( - events = mapOf( - eventId to setOf( - ReadReceipt( - read = mapOf( - alice to ReadReceipt.ReadEvent(0L) - ) - ) - ) + val existingRoomUser = roomUser( + room, alice, receipts = mapOf( + ReceiptType.Read to RoomUser.RoomUserReceipt( + existingEventId, + Receipt(0) ) - ), - roomId = room, + ) ) - cut.setReadReceipts(event) - roomUserStore.get(alice, room).first()?.lastReadMessage shouldBe eventId - } - - should("set the last read message even when unknown receipt types are encountered") { - val eventId = EventId("eventId") - val existingRoomUser = roomUser(room, alice) roomUserStore.update(alice, room) { existingRoomUser } + val eventId = EventId("eventId") val event = Event.EphemeralEvent( ReceiptEventContent( events = mapOf( - eventId to setOf( - Receipt.Unknown( - type = "awesome", - raw = JsonObject(mapOf("dino" to JsonPrimitive("unicorn"))) - ), - ReadReceipt( - read = mapOf( - alice to ReadReceipt.ReadEvent(0L) - ) - ), - Receipt.Unknown( - type = "awesome", - raw = JsonObject(mapOf("unicorn" to JsonPrimitive("dino"))) - ), + eventId to mapOf( + ReceiptType.Read to mapOf( + alice to Receipt(3) + ) ) ) ), roomId = room, ) cut.setReadReceipts(event) - - roomUserStore.get(alice, room).first()?.lastReadMessage shouldBe eventId + roomUserStore.get(alice, room).first()?.receipts?.get(ReceiptType.Read) shouldBe + RoomUser.RoomUserReceipt(eventId, Receipt(3L)) } } }) \ No newline at end of file diff --git a/trixnity-clientserverapi/trixnity-clientserverapi-client/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/client/RoomsApiClient.kt b/trixnity-clientserverapi/trixnity-clientserverapi-client/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/client/RoomsApiClient.kt index 51aaf82b3..bbc1ec277 100644 --- a/trixnity-clientserverapi/trixnity-clientserverapi-client/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/client/RoomsApiClient.kt +++ b/trixnity-clientserverapi/trixnity-clientserverapi-client/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/client/RoomsApiClient.kt @@ -9,6 +9,7 @@ import net.folivo.trixnity.core.model.RoomId import net.folivo.trixnity.core.model.UserId import net.folivo.trixnity.core.model.events.* import net.folivo.trixnity.core.model.events.Event.StateEvent +import net.folivo.trixnity.core.model.events.m.ReceiptType import net.folivo.trixnity.core.model.events.m.TagEventContent import net.folivo.trixnity.core.model.events.m.room.CreateEventContent import net.folivo.trixnity.core.model.events.m.room.MemberEventContent @@ -309,7 +310,7 @@ interface RoomsApiClient { suspend fun setReceipt( roomId: RoomId, eventId: EventId, - receiptType: SetReceipt.ReceiptType = SetReceipt.ReceiptType.READ, + receiptType: ReceiptType = ReceiptType.Read, asUserId: UserId? = null, ): Result @@ -751,7 +752,7 @@ class RoomsApiClientImpl( override suspend fun setReceipt( roomId: RoomId, eventId: EventId, - receiptType: SetReceipt.ReceiptType, + receiptType: ReceiptType, asUserId: UserId?, ): Result = httpClient.request(SetReceipt(roomId.e(), receiptType, eventId.e(), asUserId)) diff --git a/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/GetHierarchy.kt b/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/GetHierarchy.kt index fcff46482..011620790 100644 --- a/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/GetHierarchy.kt +++ b/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/GetHierarchy.kt @@ -43,7 +43,7 @@ data class GetHierarchy( @SerialName("name") val name: String? = null, @SerialName("num_joined_members") val joinedMembersCount: Long, @SerialName("room_id") val roomId: RoomId, - @SerialName("room_type") val roomType: CreateEventContent.RoomType, + @SerialName("room_type") val roomType: CreateEventContent.RoomType? = null, @SerialName("topic") val topic: String? = null, @SerialName("world_readable") val worldReadable: Boolean, ) diff --git a/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/SetReadMarkers.kt b/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/SetReadMarkers.kt index 49d039be0..8fdc7c11e 100644 --- a/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/SetReadMarkers.kt +++ b/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/SetReadMarkers.kt @@ -22,7 +22,8 @@ data class SetReadMarkers( ) : MatrixEndpoint { @Serializable data class Request( - @SerialName("m.fully_read") val fullyRead: EventId, + @SerialName("m.fully_read") val fullyRead: EventId? = null, @SerialName("m.read") val read: EventId? = null, + @SerialName("m.read.private") val privateRead: EventId? = null, ) } \ No newline at end of file diff --git a/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/SetReceipt.kt b/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/SetReceipt.kt index 2a36153b9..d94ea1887 100644 --- a/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/SetReceipt.kt +++ b/trixnity-clientserverapi/trixnity-clientserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/clientserverapi/model/rooms/SetReceipt.kt @@ -9,6 +9,7 @@ import net.folivo.trixnity.core.MatrixEndpoint import net.folivo.trixnity.core.model.EventId import net.folivo.trixnity.core.model.RoomId import net.folivo.trixnity.core.model.UserId +import net.folivo.trixnity.core.model.events.m.ReceiptType /** * @see matrix spec @@ -21,10 +22,4 @@ data class SetReceipt( @SerialName("receiptType") val receiptType: ReceiptType, @SerialName("eventId") val eventId: EventId, @SerialName("user_id") val asUserId: UserId? = null -) : MatrixEndpoint { - @Serializable - enum class ReceiptType { - @SerialName("m.read") - READ - } -} \ No newline at end of file +) : MatrixEndpoint \ No newline at end of file diff --git a/trixnity-clientserverapi/trixnity-clientserverapi-server/src/commonTest/kotlin/net/folivo/trixnity/clientserverapi/server/RoomsRoutesTest.kt b/trixnity-clientserverapi/trixnity-clientserverapi-server/src/commonTest/kotlin/net/folivo/trixnity/clientserverapi/server/RoomsRoutesTest.kt index 12331a5bd..9f60812a5 100644 --- a/trixnity-clientserverapi/trixnity-clientserverapi-server/src/commonTest/kotlin/net/folivo/trixnity/clientserverapi/server/RoomsRoutesTest.kt +++ b/trixnity-clientserverapi/trixnity-clientserverapi-server/src/commonTest/kotlin/net/folivo/trixnity/clientserverapi/server/RoomsRoutesTest.kt @@ -18,6 +18,7 @@ import net.folivo.trixnity.core.model.RoomId import net.folivo.trixnity.core.model.UserId import net.folivo.trixnity.core.model.events.* import net.folivo.trixnity.core.model.events.m.FullyReadEventContent +import net.folivo.trixnity.core.model.events.m.ReceiptType import net.folivo.trixnity.core.model.events.m.TagEventContent import net.folivo.trixnity.core.model.events.m.room.* import net.folivo.trixnity.core.model.events.m.space.ChildEventContent @@ -1143,7 +1144,7 @@ class RoomsRoutesTest : TestsWithMocks() { verifyWithSuspend { handlerMock.setReceipt(assert { it.endpoint.roomId shouldBe RoomId("!room:server") - it.endpoint.receiptType shouldBe SetReceipt.ReceiptType.READ + it.endpoint.receiptType shouldBe ReceiptType.Read it.endpoint.eventId shouldBe EventId("\$event") }) } diff --git a/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/model/events/m/ReceiptEventContent.kt b/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/model/events/m/ReceiptEventContent.kt index 85c64564b..0d7188593 100644 --- a/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/model/events/m/ReceiptEventContent.kt +++ b/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/model/events/m/ReceiptEventContent.kt @@ -11,58 +11,29 @@ import kotlinx.serialization.json.* import net.folivo.trixnity.core.model.EventId import net.folivo.trixnity.core.model.UserId import net.folivo.trixnity.core.model.events.EphemeralEventContent -import net.folivo.trixnity.core.model.events.m.ReceiptEventContent.Receipt /** * @see matrix spec */ -@Serializable(with = ReadEventsSerializer::class) +@Serializable(with = ReceiptEventContentSerializer::class) data class ReceiptEventContent( - val events: Map> + val events: Map>> ) : EphemeralEventContent { - - sealed interface Receipt { - data class ReadReceipt( - val read: Map - ) : Receipt { - @Serializable - data class ReadEvent(@SerialName("ts") val timestamp: Long) - } - - data class Unknown( - val raw: JsonElement, - val type: String - ) : Receipt - } + @Serializable + data class Receipt(@SerialName("ts") val timestamp: Long) } -object ReadEventsSerializer : KSerializer { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ReadEventsSerializer") +object ReceiptEventContentSerializer : KSerializer { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ReceiptEventContentSerializer") override fun deserialize(decoder: Decoder): ReceiptEventContent { require(decoder is JsonDecoder) - val jsonObject = decoder.decodeJsonElement().jsonObject - return ReceiptEventContent(jsonObject.entries.associate { (eventId, jsonObject) -> - EventId(eventId) to jsonObject.jsonObject.entries.map { (type, receipt) -> - when (type) { - "m.read" -> Receipt.ReadReceipt(decoder.json.decodeFromJsonElement(receipt)) - else -> Receipt.Unknown(raw = receipt, type = type) - } - }.toSet() - }) + return ReceiptEventContent(decoder.json.decodeFromJsonElement(decoder.decodeJsonElement())) } override fun serialize(encoder: Encoder, value: ReceiptEventContent) { require(encoder is JsonEncoder) - val json = JsonObject(value.events.entries.associate { (eventId, receipts) -> - eventId.full to JsonObject(receipts.associate { receipt -> - when (receipt) { - is Receipt.ReadReceipt -> "m.read" to encoder.json.encodeToJsonElement(receipt.read) - is Receipt.Unknown -> receipt.type to receipt.raw - } - }) - }) - encoder.encodeJsonElement(json) + encoder.encodeJsonElement(encoder.json.encodeToJsonElement(value.events)) } } \ No newline at end of file diff --git a/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/model/events/m/ReceiptType.kt b/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/model/events/m/ReceiptType.kt new file mode 100644 index 000000000..a2d85536d --- /dev/null +++ b/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/model/events/m/ReceiptType.kt @@ -0,0 +1,46 @@ +package net.folivo.trixnity.core.model.events.m + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +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 + +@Serializable(with = ReceiptTypeSerializer::class) +abstract class ReceiptType { + abstract val name: String + + object Read : ReceiptType() { + override val name = "m.read" + } + + object PrivateRead : ReceiptType() { + override val name = "m.read.private" + } + + object FullyRead : ReceiptType() { + override val name = "m.fully_read" + } + + data class Unknown(override val name: String) : ReceiptType() +} + +object ReceiptTypeSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("ReceiptTypeSerializer", PrimitiveKind.STRING) + + override fun deserialize(decoder: Decoder): ReceiptType { + return when (val name = decoder.decodeString()) { + ReceiptType.Read.name -> ReceiptType.Read + ReceiptType.PrivateRead.name -> ReceiptType.PrivateRead + ReceiptType.FullyRead.name -> ReceiptType.FullyRead + else -> ReceiptType.Unknown(name) + } + } + + override fun serialize(encoder: Encoder, value: ReceiptType) { + encoder.encodeString(value.name) + } + +} \ No newline at end of file diff --git a/trixnity-core/src/commonTest/kotlin/net/folivo/trixnity/core/serialization/events/EventSerializerTest.kt b/trixnity-core/src/commonTest/kotlin/net/folivo/trixnity/core/serialization/events/EventSerializerTest.kt index 83c0a83f6..981b37caf 100644 --- a/trixnity-core/src/commonTest/kotlin/net/folivo/trixnity/core/serialization/events/EventSerializerTest.kt +++ b/trixnity-core/src/commonTest/kotlin/net/folivo/trixnity/core/serialization/events/EventSerializerTest.kt @@ -12,7 +12,8 @@ import net.folivo.trixnity.core.model.events.Event.* import net.folivo.trixnity.core.model.events.UnsignedRoomEventData.UnsignedMessageEventData import net.folivo.trixnity.core.model.events.UnsignedRoomEventData.UnsignedStateEventData import net.folivo.trixnity.core.model.events.m.ReceiptEventContent -import net.folivo.trixnity.core.model.events.m.ReceiptEventContent.Receipt.ReadReceipt +import net.folivo.trixnity.core.model.events.m.ReceiptEventContent.Receipt +import net.folivo.trixnity.core.model.events.m.ReceiptType import net.folivo.trixnity.core.model.events.m.room.* import net.folivo.trixnity.core.model.events.m.room.RoomMessageEventContent.UnknownRoomMessageEventContent import net.folivo.trixnity.core.model.keys.Key @@ -799,19 +800,15 @@ class EventSerializerTest { EphemeralEvent( ReceiptEventContent( events = mapOf( - EventId("\$wUeWup1q4tsPBG-zHFicJTHpY30cmxjgV-LW0ZAOB9s") to setOf( - ReadReceipt( - read = mapOf( - UserId("user1", "localhost") to ReadReceipt.ReadEvent(1644259179796L), - UserId("user2", "localhost") to ReadReceipt.ReadEvent(1644258600722L), - ) + EventId("\$wUeWup1q4tsPBG-zHFicJTHpY30cmxjgV-LW0ZAOB9s") to mapOf( + ReceiptType.Read to mapOf( + UserId("user1", "localhost") to Receipt(1644259179796L), + UserId("user2", "localhost") to Receipt(1644258600722L), ) ), - EventId("\$zu9ULQ-V3AGcshRNfByIb3sVZ62cTUpeZcdIJ3fBNXE") to setOf( - ReadReceipt( - read = mapOf( - UserId("user3", "localhost") to ReadReceipt.ReadEvent(1644267366690L) - ) + EventId("\$zu9ULQ-V3AGcshRNfByIb3sVZ62cTUpeZcdIJ3fBNXE") to mapOf( + ReceiptType.Read to mapOf( + UserId("user3", "localhost") to Receipt(1644267366690L) ) ) ), @@ -826,19 +823,15 @@ class EventSerializerTest { val receipt = EphemeralEvent( ReceiptEventContent( events = mapOf( - EventId("\$wUeWup1q4tsPBG-zHFicJTHpY30cmxjgV-LW0ZAOB9s") to setOf( - ReadReceipt( - read = mapOf( - UserId("user1", "localhost") to ReadReceipt.ReadEvent(1644259179796L), - UserId("user2", "localhost") to ReadReceipt.ReadEvent(1644258600722L), - ) + EventId("\$wUeWup1q4tsPBG-zHFicJTHpY30cmxjgV-LW0ZAOB9s") to mapOf( + ReceiptType.Read to mapOf( + UserId("user1", "localhost") to Receipt(1644259179796L), + UserId("user2", "localhost") to Receipt(1644258600722L), ) ), - EventId("\$zu9ULQ-V3AGcshRNfByIb3sVZ62cTUpeZcdIJ3fBNXE") to setOf( - ReadReceipt( - read = mapOf( - UserId("user3", "localhost") to ReadReceipt.ReadEvent(1644267366690L) - ) + EventId("\$zu9ULQ-V3AGcshRNfByIb3sVZ62cTUpeZcdIJ3fBNXE") to mapOf( + ReceiptType.Read to mapOf( + UserId("user3", "localhost") to Receipt(1644267366690L) ) ) ), diff --git a/trixnity-serverserverapi/trixnity-serverserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/serverserverapi/model/federation/GetHierarchy.kt b/trixnity-serverserverapi/trixnity-serverserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/serverserverapi/model/federation/GetHierarchy.kt index 6cd6ee16d..485e17709 100644 --- a/trixnity-serverserverapi/trixnity-serverserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/serverserverapi/model/federation/GetHierarchy.kt +++ b/trixnity-serverserverapi/trixnity-serverserverapi-model/src/commonMain/kotlin/net/folivo/trixnity/serverserverapi/model/federation/GetHierarchy.kt @@ -40,7 +40,7 @@ data class GetHierarchy( @SerialName("name") val name: String? = null, @SerialName("num_joined_members") val joinedMembersCount: Long, @SerialName("room_id") val roomId: RoomId, - @SerialName("room_type") val roomType: CreateEventContent.RoomType, + @SerialName("room_type") val roomType: CreateEventContent.RoomType? = null, @SerialName("topic") val topic: String? = null, @SerialName("world_readable") val worldReadable: Boolean, )