renaming timeline text to content, text is a subtype

This commit is contained in:
Adam Brown 2022-03-18 22:40:49 +00:00
parent 9c6ba3d352
commit 8321b5a760
9 changed files with 28 additions and 28 deletions

View File

@ -311,7 +311,7 @@ internal sealed class DecryptedContent {
@Serializable @Serializable
@SerialName("m.room.message") @SerialName("m.room.message")
internal data class TimelineText( internal data class TimelineText(
@SerialName("content") val content: ApiTimelineEvent.TimelineText.Content, @SerialName("content") val content: ApiTimelineEvent.TimelineMessage.Content,
) : DecryptedContent() ) : DecryptedContent()
@Serializable @Serializable
@ -333,7 +333,7 @@ internal sealed class ApiEncryptedContent {
@SerialName("device_id") val deviceId: DeviceId, @SerialName("device_id") val deviceId: DeviceId,
@SerialName("sender_key") val senderKey: String, @SerialName("sender_key") val senderKey: String,
@SerialName("session_id") val sessionId: SessionId, @SerialName("session_id") val sessionId: SessionId,
@SerialName("m.relates_to") val relation: ApiTimelineEvent.TimelineText.Relation? = null, @SerialName("m.relates_to") val relation: ApiTimelineEvent.TimelineMessage.Relation? = null,
) : ApiEncryptedContent() ) : ApiEncryptedContent()
@Serializable @Serializable
@ -437,7 +437,7 @@ internal sealed class ApiTimelineEvent {
@Serializable @Serializable
@SerialName("m.room.message") @SerialName("m.room.message")
internal data class TimelineText( internal data class TimelineMessage(
@SerialName("event_id") val id: EventId, @SerialName("event_id") val id: EventId,
@SerialName("sender") val senderId: UserId, @SerialName("sender") val senderId: UserId,
@SerialName("content") val content: Content, @SerialName("content") val content: Content,
@ -511,4 +511,4 @@ internal object EncryptedContentDeserializer : KSerializer<ApiEncryptedContent>
override fun serialize(encoder: Encoder, value: ApiEncryptedContent) = TODO("Not yet implemented") override fun serialize(encoder: Encoder, value: ApiEncryptedContent) = TODO("Not yet implemented")
} }

View File

@ -36,7 +36,7 @@ internal class SyncEventDecrypter(
ApiEncryptedContent.Unknown -> null ApiEncryptedContent.Unknown -> null
} }
when (it) { when (it) {
is DecryptedContent.TimelineText -> ApiTimelineEvent.TimelineText( is DecryptedContent.TimelineText -> ApiTimelineEvent.TimelineMessage(
event.eventId, event.eventId,
event.senderId, event.senderId,
it.content.copy(relation = relation), it.content.copy(relation = relation),

View File

@ -16,7 +16,7 @@ internal class EventLookupUseCase(
} }
private fun DecryptedTimeline.lookup(id: EventId) = this.value private fun DecryptedTimeline.lookup(id: EventId) = this.value
.filterIsInstance<ApiTimelineEvent.TimelineText>() .filterIsInstance<ApiTimelineEvent.TimelineMessage>()
.firstOrNull { it.id == id } .firstOrNull { it.id == id }
?.let { LookupResult(apiTimelineEvent = it, roomEvent = null) } ?.let { LookupResult(apiTimelineEvent = it, roomEvent = null) }

View File

@ -4,12 +4,12 @@ import app.dapk.st.matrix.sync.RoomEvent
import app.dapk.st.matrix.sync.internal.request.ApiTimelineEvent import app.dapk.st.matrix.sync.internal.request.ApiTimelineEvent
internal data class LookupResult( internal data class LookupResult(
private val apiTimelineEvent: ApiTimelineEvent.TimelineText?, private val apiTimelineEvent: ApiTimelineEvent.TimelineMessage?,
private val roomEvent: RoomEvent?, private val roomEvent: RoomEvent?,
) { ) {
inline fun <T> fold( inline fun <T> fold(
onApiTimelineEvent: (ApiTimelineEvent.TimelineText) -> T?, onApiTimelineEvent: (ApiTimelineEvent.TimelineMessage) -> T?,
onRoomEvent: (RoomEvent) -> T?, onRoomEvent: (RoomEvent) -> T?,
onEmpty: () -> T?, onEmpty: () -> T?,
): T? { ): T? {

View File

@ -44,7 +44,7 @@ internal class RoomEventCreator(
} }
} }
suspend fun ApiTimelineEvent.TimelineText.toRoomEvent(roomId: RoomId, lookup: Lookup): RoomEvent? { suspend fun ApiTimelineEvent.TimelineMessage.toRoomEvent(roomId: RoomId, lookup: Lookup): RoomEvent? {
return when { return when {
this.isEdit() -> handleEdit(roomId, this.content.relation!!.eventId!!, lookup) this.isEdit() -> handleEdit(roomId, this.content.relation!!.eventId!!, lookup)
this.isReply() -> handleReply(roomId, lookup) this.isReply() -> handleReply(roomId, lookup)
@ -52,7 +52,7 @@ internal class RoomEventCreator(
} }
} }
private suspend fun ApiTimelineEvent.TimelineText.handleEdit(roomId: RoomId, editedEventId: EventId, lookup: Lookup): RoomEvent? { private suspend fun ApiTimelineEvent.TimelineMessage.handleEdit(roomId: RoomId, editedEventId: EventId, lookup: Lookup): RoomEvent? {
return lookup(editedEventId).fold( return lookup(editedEventId).fold(
onApiTimelineEvent = { onApiTimelineEvent = {
ifOrNull(this.utcTimestamp > it.utcTimestamp) { ifOrNull(this.utcTimestamp > it.utcTimestamp) {
@ -76,13 +76,13 @@ internal class RoomEventCreator(
) )
} }
private fun RoomEvent.Message.edited(edit: ApiTimelineEvent.TimelineText) = this.copy( private fun RoomEvent.Message.edited(edit: ApiTimelineEvent.TimelineMessage) = this.copy(
content = edit.content.body?.removePrefix(" * ")?.trim() ?: "redacted", content = edit.content.body?.removePrefix(" * ")?.trim() ?: "redacted",
utcTimestamp = edit.utcTimestamp, utcTimestamp = edit.utcTimestamp,
edited = true, edited = true,
) )
private suspend fun ApiTimelineEvent.TimelineText.handleReply(roomId: RoomId, lookup: Lookup): RoomEvent { private suspend fun ApiTimelineEvent.TimelineMessage.handleReply(roomId: RoomId, lookup: Lookup): RoomEvent {
val replyTo = this.content.relation!!.inReplyTo!! val replyTo = this.content.relation!!.inReplyTo!!
val relationEvent = lookup(replyTo.eventId).fold( val relationEvent = lookup(replyTo.eventId).fold(
@ -107,7 +107,7 @@ internal class RoomEventCreator(
} }
} }
private suspend fun ApiTimelineEvent.TimelineText.toMessage( private suspend fun ApiTimelineEvent.TimelineMessage.toMessage(
roomId: RoomId, roomId: RoomId,
content: String = this.content.body ?: "redacted", content: String = this.content.body ?: "redacted",
edited: Boolean = false, edited: Boolean = false,
@ -128,5 +128,5 @@ private fun String.stripTags() = this.substring(this.indexOf("</mx-reply>") + "<
.replace("<em>", "") .replace("<em>", "")
.replace("</em>", "") .replace("</em>", "")
private fun ApiTimelineEvent.TimelineText.isEdit() = this.content.relation?.relationType == "m.replace" && this.content.relation.eventId != null private fun ApiTimelineEvent.TimelineMessage.isEdit() = this.content.relation?.relationType == "m.replace" && this.content.relation.eventId != null
private fun ApiTimelineEvent.TimelineText.isReply() = this.content.relation?.inReplyTo != null private fun ApiTimelineEvent.TimelineMessage.isReply() = this.content.relation?.inReplyTo != null

View File

@ -28,7 +28,7 @@ internal class TimelineEventsProcessor(
decryptedTimeline.value.mapNotNull { event -> decryptedTimeline.value.mapNotNull { event ->
val roomEvent = when (event) { val roomEvent = when (event) {
is ApiTimelineEvent.Encrypted -> event.toRoomEvent(roomToProcess.roomId) is ApiTimelineEvent.Encrypted -> event.toRoomEvent(roomToProcess.roomId)
is ApiTimelineEvent.TimelineText -> event.toRoomEvent(roomToProcess.roomId) { eventId -> is ApiTimelineEvent.TimelineMessage -> event.toRoomEvent(roomToProcess.roomId) { eventId ->
eventLookupUseCase.lookup(eventId, decryptedTimeline, decryptedPreviousEvents) eventLookupUseCase.lookup(eventId, decryptedTimeline, decryptedPreviousEvents)
} }
is ApiTimelineEvent.Encryption -> null is ApiTimelineEvent.Encryption -> null

View File

@ -270,7 +270,7 @@ internal class RoomEventCreatorTest {
) )
} }
private fun givenLookup(event: ApiTimelineEvent.TimelineText): suspend (EventId) -> LookupResult { private fun givenLookup(event: ApiTimelineEvent.TimelineMessage): suspend (EventId) -> LookupResult {
return { return {
if (it == event.id) LookupResult(event, roomEvent = null) else throw IllegalArgumentException("unexpected id: $it") if (it == event.id) LookupResult(event, roomEvent = null) else throw IllegalArgumentException("unexpected id: $it")
} }
@ -283,7 +283,7 @@ internal class RoomEventCreatorTest {
} }
} }
private fun ApiTimelineEvent.TimelineText.toEditEvent(newTimestamp: Long, messageContent: String) = this.copy( private fun ApiTimelineEvent.TimelineMessage.toEditEvent(newTimestamp: Long, messageContent: String) = this.copy(
id = anEventId("a-new-event-id"), id = anEventId("a-new-event-id"),
utcTimestamp = newTimestamp, utcTimestamp = newTimestamp,
content = aTimelineTextEventContent( content = aTimelineTextEventContent(
@ -301,7 +301,7 @@ private fun RoomEvent.Message.toEditEvent(newTimestamp: Long, messageContent: St
) )
) )
private fun ApiTimelineEvent.TimelineText.toReplyEvent(messageContent: String) = anApiTimelineTextEvent( private fun ApiTimelineEvent.TimelineMessage.toReplyEvent(messageContent: String) = anApiTimelineTextEvent(
id = anEventId("a-new-event-id"), id = anEventId("a-new-event-id"),
content = aTimelineTextEventContent( content = aTimelineTextEventContent(
body = "${this.content} $messageContent", body = "${this.content} $messageContent",

View File

@ -18,7 +18,7 @@ internal class FakeRoomEventCreator {
coEvery { with(instance) { event.toRoomEvent(roomId) } } returns result coEvery { with(instance) { event.toRoomEvent(roomId) } } returns result
} }
fun givenCreatesUsingLookup(roomId: RoomId, eventIdToLookup: EventId, event: ApiTimelineEvent.TimelineText, result: RoomEvent, lookupResult: LookupResult) { fun givenCreatesUsingLookup(roomId: RoomId, eventIdToLookup: EventId, event: ApiTimelineEvent.TimelineMessage, result: RoomEvent, lookupResult: LookupResult) {
val slot = slot<suspend (EventId) -> LookupResult>() val slot = slot<suspend (EventId) -> LookupResult>()
coEvery { with(instance) { event.toRoomEvent(roomId, capture(slot)) } } answers { coEvery { with(instance) { event.toRoomEvent(roomId, capture(slot)) } } answers {
runBlocking { runBlocking {

View File

@ -31,28 +31,28 @@ internal fun anEphemeralTypingEvent(
internal fun anApiTimelineTextEvent( internal fun anApiTimelineTextEvent(
id: EventId = anEventId(), id: EventId = anEventId(),
senderId: UserId = aUserId(), senderId: UserId = aUserId(),
content: ApiTimelineEvent.TimelineText.Content = aTimelineTextEventContent(), content: ApiTimelineEvent.TimelineMessage.Content = aTimelineTextEventContent(),
utcTimestamp: Long = 0L, utcTimestamp: Long = 0L,
decryptionStatus: ApiTimelineEvent.DecryptionStatus? = null decryptionStatus: ApiTimelineEvent.DecryptionStatus? = null
) = ApiTimelineEvent.TimelineText(id, senderId, content, utcTimestamp, decryptionStatus) ) = ApiTimelineEvent.TimelineMessage(id, senderId, content, utcTimestamp, decryptionStatus)
internal fun aTimelineTextEventContent( internal fun aTimelineTextEventContent(
body: String? = null, body: String? = null,
formattedBody: String? = null, formattedBody: String? = null,
type: String? = null, type: String? = null,
relation: ApiTimelineEvent.TimelineText.Relation? = null, relation: ApiTimelineEvent.TimelineMessage.Relation? = null,
) = ApiTimelineEvent.TimelineText.Content(body, formattedBody, type, relation) ) = ApiTimelineEvent.TimelineMessage.Content(body, formattedBody, type, relation)
internal fun anEditRelation(originalId: EventId) = ApiTimelineEvent.TimelineText.Relation( internal fun anEditRelation(originalId: EventId) = ApiTimelineEvent.TimelineMessage.Relation(
relationType = "m.replace", relationType = "m.replace",
inReplyTo = null, inReplyTo = null,
eventId = originalId, eventId = originalId,
) )
internal fun aReplyRelation(originalId: EventId) = ApiTimelineEvent.TimelineText.Relation( internal fun aReplyRelation(originalId: EventId) = ApiTimelineEvent.TimelineMessage.Relation(
relationType = null, relationType = null,
eventId = null, eventId = null,
inReplyTo = ApiTimelineEvent.TimelineText.InReplyTo(originalId), inReplyTo = ApiTimelineEvent.TimelineMessage.InReplyTo(originalId),
) )
internal fun anEncryptedApiTimelineEvent( internal fun anEncryptedApiTimelineEvent(
@ -104,7 +104,7 @@ internal fun aMegolmApiEncryptedContent(
deviceId: DeviceId = aDeviceId(), deviceId: DeviceId = aDeviceId(),
senderKey: String = "a-sender-key", senderKey: String = "a-sender-key",
sessionId: SessionId = aSessionId(), sessionId: SessionId = aSessionId(),
relation: ApiTimelineEvent.TimelineText.Relation? = null, relation: ApiTimelineEvent.TimelineMessage.Relation? = null,
) = ApiEncryptedContent.MegOlmV1(cipherText, deviceId, senderKey, sessionId, relation) ) = ApiEncryptedContent.MegOlmV1(cipherText, deviceId, senderKey, sessionId, relation)
internal fun anOlmApiEncryptedContent( internal fun anOlmApiEncryptedContent(