mirror of
https://github.com/ouchadam/small-talk.git
synced 2025-03-03 03:17:56 +01:00
extracting api responses to their own files to improve ide performance
This commit is contained in:
parent
f07e59c874
commit
3859aa7f0b
@ -0,0 +1,33 @@
|
||||
package app.dapk.st.matrix.sync.internal.request
|
||||
|
||||
import app.dapk.st.matrix.common.EventId
|
||||
import app.dapk.st.matrix.common.RoomId
|
||||
import app.dapk.st.matrix.common.UserId
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
sealed class ApiAccountEvent {
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.direct")
|
||||
data class Direct(
|
||||
@SerialName("content") val content: Map<UserId, List<RoomId>>
|
||||
) : ApiAccountEvent()
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.fully_read")
|
||||
data class FullyRead(
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiAccountEvent() {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("event_id") val eventId: EventId,
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
@Serializable
|
||||
object Ignored : ApiAccountEvent()
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package app.dapk.st.matrix.sync.internal.request
|
||||
|
||||
import app.dapk.st.matrix.common.CipherText
|
||||
import app.dapk.st.matrix.common.Curve25519
|
||||
import app.dapk.st.matrix.common.DeviceId
|
||||
import app.dapk.st.matrix.common.SessionId
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable(with = EncryptedContentDeserializer::class)
|
||||
internal sealed class ApiEncryptedContent {
|
||||
@Serializable
|
||||
data class OlmV1(
|
||||
@SerialName("ciphertext") val cipherText: Map<Curve25519, CipherTextInfo>,
|
||||
@SerialName("sender_key") val senderKey: Curve25519,
|
||||
) : ApiEncryptedContent()
|
||||
|
||||
@Serializable
|
||||
data class MegOlmV1(
|
||||
@SerialName("ciphertext") val cipherText: CipherText,
|
||||
@SerialName("device_id") val deviceId: DeviceId,
|
||||
@SerialName("sender_key") val senderKey: String,
|
||||
@SerialName("session_id") val sessionId: SessionId,
|
||||
@SerialName("m.relates_to") val relation: ApiTimelineEvent.TimelineMessage.Relation? = null,
|
||||
) : ApiEncryptedContent()
|
||||
|
||||
@Serializable
|
||||
data class CipherTextInfo(
|
||||
@SerialName("body") val body: CipherText,
|
||||
@SerialName("type") val type: Int,
|
||||
)
|
||||
|
||||
@Serializable
|
||||
object Unknown : ApiEncryptedContent()
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
package app.dapk.st.matrix.sync.internal.request
|
||||
|
||||
import app.dapk.st.matrix.common.MxUrl
|
||||
import app.dapk.st.matrix.common.UserId
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
sealed class ApiStrippedEvent {
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.member")
|
||||
internal data class RoomMember(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiStrippedEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("displayname") val displayName: String? = null,
|
||||
@SerialName("membership") val membership: ApiTimelineEvent.RoomMember.Content.Membership? = null,
|
||||
@SerialName("is_direct") val isDirect: Boolean? = null,
|
||||
@SerialName("avatar_url") val avatarUrl: MxUrl? = null,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.name")
|
||||
internal data class RoomName(
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiStrippedEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("name") val name: String? = null
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
object Ignored : ApiStrippedEvent()
|
||||
}
|
@ -1,16 +1,11 @@
|
||||
package app.dapk.st.matrix.sync.internal.request
|
||||
|
||||
import app.dapk.st.matrix.common.*
|
||||
import kotlinx.serialization.KSerializer
|
||||
import app.dapk.st.matrix.common.RoomId
|
||||
import app.dapk.st.matrix.common.ServerKeyCount
|
||||
import app.dapk.st.matrix.common.SyncToken
|
||||
import app.dapk.st.matrix.common.UserId
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
|
||||
import kotlinx.serialization.encoding.Decoder
|
||||
import kotlinx.serialization.encoding.Encoder
|
||||
import kotlinx.serialization.json.JsonDecoder
|
||||
import kotlinx.serialization.json.jsonObject
|
||||
import kotlinx.serialization.json.jsonPrimitive
|
||||
|
||||
@Serializable
|
||||
internal data class ApiSyncResponse(
|
||||
@ -28,32 +23,6 @@ data class ApiAccountData(
|
||||
@SerialName("events") val events: List<ApiAccountEvent>
|
||||
)
|
||||
|
||||
@Serializable
|
||||
sealed class ApiAccountEvent {
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.direct")
|
||||
data class Direct(
|
||||
@SerialName("content") val content: Map<UserId, List<RoomId>>
|
||||
) : ApiAccountEvent()
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.fully_read")
|
||||
data class FullyRead(
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiAccountEvent() {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("event_id") val eventId: EventId,
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
@Serializable
|
||||
object Ignored : ApiAccountEvent()
|
||||
}
|
||||
|
||||
@Serializable
|
||||
internal data class DeviceLists(
|
||||
@SerialName("changed") val changed: List<UserId>? = null
|
||||
@ -64,152 +33,6 @@ internal data class ToDevice(
|
||||
@SerialName("events") val events: List<ApiToDeviceEvent>
|
||||
)
|
||||
|
||||
@Serializable
|
||||
sealed class ApiToDeviceEvent {
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.encrypted")
|
||||
internal data class Encrypted(
|
||||
@SerialName("sender") val senderId: UserId,
|
||||
@SerialName("content") val content: ApiEncryptedContent,
|
||||
) : ApiToDeviceEvent()
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room_key")
|
||||
data class RoomKey(
|
||||
@SerialName("sender") val sender: UserId,
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiToDeviceEvent() {
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("room_id") val roomId: RoomId,
|
||||
@SerialName("algorithm") val algorithmName: AlgorithmName,
|
||||
@SerialName("session_id") val sessionId: SessionId,
|
||||
@SerialName("session_key") val sessionKey: String,
|
||||
@SerialName("chain_index") val chainIndex: Long,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.request")
|
||||
data class VerificationRequest(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("from_device") val fromDevice: DeviceId,
|
||||
@SerialName("methods") val methods: List<String>,
|
||||
@SerialName("timestamp") val timestampPosix: Long,
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.ready")
|
||||
data class VerificationReady(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("from_device") val fromDevice: DeviceId,
|
||||
@SerialName("methods") val methods: List<String>,
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.start")
|
||||
data class VerificationStart(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("from_device") val fromDevice: DeviceId,
|
||||
@SerialName("method") val method: String,
|
||||
@SerialName("key_agreement_protocols") val protocols: List<String>,
|
||||
@SerialName("hashes") val hashes: List<String>,
|
||||
@SerialName("message_authentication_codes") val codes: List<String>,
|
||||
@SerialName("short_authentication_string") val short: List<String>,
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.accept")
|
||||
data class VerificationAccept(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("from_device") val fromDevice: DeviceId,
|
||||
@SerialName("method") val method: String,
|
||||
@SerialName("key_agreement_protocol") val protocol: String,
|
||||
@SerialName("hash") val hash: String,
|
||||
@SerialName("message_authentication_code") val code: String,
|
||||
@SerialName("short_authentication_string") val short: List<String>,
|
||||
@SerialName("commitment") val commitment: String,
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.key")
|
||||
data class VerificationKey(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
@SerialName("key") val key: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.mac")
|
||||
data class VerificationMac(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
@SerialName("keys") val keys: String,
|
||||
@SerialName("mac") val mac: Map<String, String>,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.cancel")
|
||||
data class VerificationCancel(
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("code") val code: String,
|
||||
@SerialName("reason") val reason: String,
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
object Ignored : ApiToDeviceEvent()
|
||||
|
||||
|
||||
sealed interface ApiVerificationEvent
|
||||
}
|
||||
|
||||
@Serializable
|
||||
internal data class ApiSyncRooms(
|
||||
@SerialName("join") val join: Map<RoomId, ApiSyncRoom>? = null,
|
||||
@ -227,41 +50,6 @@ internal data class ApiInviteEvents(
|
||||
@SerialName("events") val events: List<ApiStrippedEvent>
|
||||
)
|
||||
|
||||
@Serializable
|
||||
sealed class ApiStrippedEvent {
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.member")
|
||||
internal data class RoomMember(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiStrippedEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("displayname") val displayName: String? = null,
|
||||
@SerialName("membership") val membership: ApiTimelineEvent.RoomMember.Content.Membership? = null,
|
||||
@SerialName("is_direct") val isDirect: Boolean? = null,
|
||||
@SerialName("avatar_url") val avatarUrl: MxUrl? = null,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.name")
|
||||
internal data class RoomName(
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiStrippedEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("name") val name: String? = null
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
object Ignored : ApiStrippedEvent()
|
||||
}
|
||||
|
||||
@Serializable
|
||||
internal data class ApiSyncRoom(
|
||||
@SerialName("timeline") val timeline: ApiSyncRoomTimeline,
|
||||
@ -317,265 +105,3 @@ internal sealed class DecryptedContent {
|
||||
@Serializable
|
||||
object Ignored : DecryptedContent()
|
||||
}
|
||||
|
||||
|
||||
@Serializable(with = EncryptedContentDeserializer::class)
|
||||
internal sealed class ApiEncryptedContent {
|
||||
@Serializable
|
||||
data class OlmV1(
|
||||
@SerialName("ciphertext") val cipherText: Map<Curve25519, CipherTextInfo>,
|
||||
@SerialName("sender_key") val senderKey: Curve25519,
|
||||
) : ApiEncryptedContent()
|
||||
|
||||
@Serializable
|
||||
data class MegOlmV1(
|
||||
@SerialName("ciphertext") val cipherText: CipherText,
|
||||
@SerialName("device_id") val deviceId: DeviceId,
|
||||
@SerialName("sender_key") val senderKey: String,
|
||||
@SerialName("session_id") val sessionId: SessionId,
|
||||
@SerialName("m.relates_to") val relation: ApiTimelineEvent.TimelineMessage.Relation? = null,
|
||||
) : ApiEncryptedContent()
|
||||
|
||||
@Serializable
|
||||
data class CipherTextInfo(
|
||||
@SerialName("body") val body: CipherText,
|
||||
@SerialName("type") val type: Int,
|
||||
)
|
||||
|
||||
@Serializable
|
||||
object Unknown : ApiEncryptedContent()
|
||||
}
|
||||
|
||||
@Serializable
|
||||
internal sealed class ApiTimelineEvent {
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.create")
|
||||
internal data class RoomCreate(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("origin_server_ts") val utcTimestamp: Long,
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("type") val type: String? = null
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.topic")
|
||||
internal data class RoomTopic(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("topic") val topic: String
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.name")
|
||||
internal data class RoomName(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("name") val name: String
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.avatar")
|
||||
internal data class RoomAvatar(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("url") val url: MxUrl? = null
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.member")
|
||||
internal data class RoomMember(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val senderId: UserId,
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("displayname") val displayName: String? = null,
|
||||
@SerialName("membership") val membership: Membership,
|
||||
@SerialName("avatar_url") val avatarUrl: MxUrl? = null,
|
||||
) {
|
||||
|
||||
@JvmInline
|
||||
@Serializable
|
||||
value class Membership(val value: String) {
|
||||
fun isJoin() = value == "join"
|
||||
fun isInvite() = value == "invite"
|
||||
fun isLeave() = value == "leave"
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable
|
||||
internal data class DecryptionStatus(
|
||||
@SerialName("is_verified") val isVerified: Boolean
|
||||
)
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.message")
|
||||
internal data class TimelineMessage(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("sender") val senderId: UserId,
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("origin_server_ts") val utcTimestamp: Long,
|
||||
@SerialName("st.decryption_status") val decryptionStatus: DecryptionStatus? = null
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable(with = ApiTimelineMessageContentDeserializer::class)
|
||||
internal sealed interface Content {
|
||||
val relation: Relation?
|
||||
|
||||
@Serializable
|
||||
data class Text(
|
||||
@SerialName("body") val body: String? = null,
|
||||
@SerialName("formatted_body") val formattedBody: String? = null,
|
||||
@SerialName("m.relates_to") override val relation: Relation? = null,
|
||||
@SerialName("msgtype") val messageType: String = "m.text",
|
||||
) : Content
|
||||
|
||||
@Serializable
|
||||
data class Image(
|
||||
@SerialName("url") val url: MxUrl? = null,
|
||||
@SerialName("file") val file: File? = null,
|
||||
@SerialName("info") val info: Info? = null,
|
||||
@SerialName("m.relates_to") override val relation: Relation? = null,
|
||||
@SerialName("msgtype") val messageType: String = "m.image",
|
||||
) : Content {
|
||||
|
||||
@Serializable
|
||||
data class File(
|
||||
@SerialName("url") val url: MxUrl,
|
||||
@SerialName("iv") val iv: String,
|
||||
@SerialName("v") val v: String,
|
||||
@SerialName("hashes") val hashes: Map<String, String>,
|
||||
@SerialName("key") val key: Key,
|
||||
) {
|
||||
|
||||
@Serializable
|
||||
data class Key(
|
||||
@SerialName("k") val k: String,
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
@Serializable
|
||||
internal data class Info(
|
||||
@SerialName("h") val height: Int? = null,
|
||||
@SerialName("w") val width: Int? = null,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
object Ignored : Content {
|
||||
override val relation: Relation? = null
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable
|
||||
data class Relation(
|
||||
@SerialName("m.in_reply_to") val inReplyTo: InReplyTo? = null,
|
||||
@SerialName("rel_type") val relationType: String? = null,
|
||||
@SerialName("event_id") val eventId: EventId? = null
|
||||
)
|
||||
|
||||
@Serializable
|
||||
data class InReplyTo(
|
||||
@SerialName("event_id") val eventId: EventId
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.encryption")
|
||||
data class Encryption(
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiTimelineEvent() {
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("algorithm") val algorithm: AlgorithmName,
|
||||
@SerialName("rotation_period_ms") val rotationMs: Long? = null,
|
||||
@SerialName("rotation_period_msgs") val rotationMessages: Long? = null,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.encrypted")
|
||||
internal data class Encrypted(
|
||||
@SerialName("sender") val senderId: UserId,
|
||||
@SerialName("content") val encryptedContent: ApiEncryptedContent,
|
||||
@SerialName("event_id") val eventId: EventId,
|
||||
@SerialName("origin_server_ts") val utcTimestamp: Long,
|
||||
) : ApiTimelineEvent()
|
||||
|
||||
@Serializable
|
||||
object Ignored : ApiTimelineEvent()
|
||||
}
|
||||
|
||||
|
||||
internal object EncryptedContentDeserializer : KSerializer<ApiEncryptedContent> {
|
||||
|
||||
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("encryptedContent")
|
||||
|
||||
override fun deserialize(decoder: Decoder): ApiEncryptedContent {
|
||||
require(decoder is JsonDecoder)
|
||||
val element = decoder.decodeJsonElement()
|
||||
return when (val algorithm = element.jsonObject["algorithm"]?.jsonPrimitive?.content) {
|
||||
"m.olm.v1.curve25519-aes-sha2" -> ApiEncryptedContent.OlmV1.serializer().deserialize(decoder)
|
||||
"m.megolm.v1.aes-sha2" -> ApiEncryptedContent.MegOlmV1.serializer().deserialize(decoder)
|
||||
null -> ApiEncryptedContent.Unknown
|
||||
else -> throw IllegalArgumentException("Unknown algorithm : $algorithm")
|
||||
}
|
||||
}
|
||||
|
||||
override fun serialize(encoder: Encoder, value: ApiEncryptedContent) = TODO("Not yet implemented")
|
||||
|
||||
}
|
||||
|
||||
internal object ApiTimelineMessageContentDeserializer : KSerializer<ApiTimelineEvent.TimelineMessage.Content> {
|
||||
|
||||
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("messageContent")
|
||||
|
||||
override fun deserialize(decoder: Decoder): ApiTimelineEvent.TimelineMessage.Content {
|
||||
require(decoder is JsonDecoder)
|
||||
val element = decoder.decodeJsonElement()
|
||||
return when (element.jsonObject["msgtype"]?.jsonPrimitive?.content) {
|
||||
"m.text" -> ApiTimelineEvent.TimelineMessage.Content.Text.serializer().deserialize(decoder)
|
||||
"m.image" -> ApiTimelineEvent.TimelineMessage.Content.Image.serializer().deserialize(decoder)
|
||||
else -> {
|
||||
println(element)
|
||||
ApiTimelineEvent.TimelineMessage.Content.Ignored
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun serialize(encoder: Encoder, value: ApiTimelineEvent.TimelineMessage.Content) = when (value) {
|
||||
ApiTimelineEvent.TimelineMessage.Content.Ignored -> {}
|
||||
is ApiTimelineEvent.TimelineMessage.Content.Image -> ApiTimelineEvent.TimelineMessage.Content.Image.serializer().serialize(encoder, value)
|
||||
is ApiTimelineEvent.TimelineMessage.Content.Text -> ApiTimelineEvent.TimelineMessage.Content.Text.serializer().serialize(encoder, value)
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,197 @@
|
||||
package app.dapk.st.matrix.sync.internal.request
|
||||
|
||||
import app.dapk.st.matrix.common.AlgorithmName
|
||||
import app.dapk.st.matrix.common.EventId
|
||||
import app.dapk.st.matrix.common.MxUrl
|
||||
import app.dapk.st.matrix.common.UserId
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
internal sealed class ApiTimelineEvent {
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.create")
|
||||
internal data class RoomCreate(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("origin_server_ts") val utcTimestamp: Long,
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("type") val type: String? = null
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.topic")
|
||||
internal data class RoomTopic(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("topic") val topic: String
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.name")
|
||||
internal data class RoomName(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("name") val name: String
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.avatar")
|
||||
internal data class RoomAvatar(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("url") val url: MxUrl? = null
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.member")
|
||||
internal data class RoomMember(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val senderId: UserId,
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable
|
||||
internal data class Content(
|
||||
@SerialName("displayname") val displayName: String? = null,
|
||||
@SerialName("membership") val membership: Membership,
|
||||
@SerialName("avatar_url") val avatarUrl: MxUrl? = null,
|
||||
) {
|
||||
|
||||
@JvmInline
|
||||
@Serializable
|
||||
value class Membership(val value: String) {
|
||||
fun isJoin() = value == "join"
|
||||
fun isInvite() = value == "invite"
|
||||
fun isLeave() = value == "leave"
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable
|
||||
internal data class DecryptionStatus(
|
||||
@SerialName("is_verified") val isVerified: Boolean
|
||||
)
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.message")
|
||||
internal data class TimelineMessage(
|
||||
@SerialName("event_id") val id: EventId,
|
||||
@SerialName("sender") val senderId: UserId,
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("origin_server_ts") val utcTimestamp: Long,
|
||||
@SerialName("st.decryption_status") val decryptionStatus: DecryptionStatus? = null
|
||||
) : ApiTimelineEvent() {
|
||||
|
||||
@Serializable(with = ApiTimelineMessageContentDeserializer::class)
|
||||
internal sealed interface Content {
|
||||
val relation: Relation?
|
||||
|
||||
@Serializable
|
||||
data class Text(
|
||||
@SerialName("body") val body: String? = null,
|
||||
@SerialName("formatted_body") val formattedBody: String? = null,
|
||||
@SerialName("m.relates_to") override val relation: Relation? = null,
|
||||
@SerialName("msgtype") val messageType: String = "m.text",
|
||||
) : Content
|
||||
|
||||
@Serializable
|
||||
data class Image(
|
||||
@SerialName("url") val url: MxUrl? = null,
|
||||
@SerialName("file") val file: File? = null,
|
||||
@SerialName("info") val info: Info? = null,
|
||||
@SerialName("m.relates_to") override val relation: Relation? = null,
|
||||
@SerialName("msgtype") val messageType: String = "m.image",
|
||||
) : Content {
|
||||
|
||||
@Serializable
|
||||
data class File(
|
||||
@SerialName("url") val url: MxUrl,
|
||||
@SerialName("iv") val iv: String,
|
||||
@SerialName("v") val v: String,
|
||||
@SerialName("hashes") val hashes: Map<String, String>,
|
||||
@SerialName("key") val key: Key,
|
||||
) {
|
||||
|
||||
@Serializable
|
||||
data class Key(
|
||||
@SerialName("k") val k: String,
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
@Serializable
|
||||
internal data class Info(
|
||||
@SerialName("h") val height: Int? = null,
|
||||
@SerialName("w") val width: Int? = null,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
object Ignored : Content {
|
||||
override val relation: Relation? = null
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable
|
||||
data class Relation(
|
||||
@SerialName("m.in_reply_to") val inReplyTo: InReplyTo? = null,
|
||||
@SerialName("rel_type") val relationType: String? = null,
|
||||
@SerialName("event_id") val eventId: EventId? = null
|
||||
)
|
||||
|
||||
@Serializable
|
||||
data class InReplyTo(
|
||||
@SerialName("event_id") val eventId: EventId
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.encryption")
|
||||
data class Encryption(
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiTimelineEvent() {
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("algorithm") val algorithm: AlgorithmName,
|
||||
@SerialName("rotation_period_ms") val rotationMs: Long? = null,
|
||||
@SerialName("rotation_period_msgs") val rotationMessages: Long? = null,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.encrypted")
|
||||
internal data class Encrypted(
|
||||
@SerialName("sender") val senderId: UserId,
|
||||
@SerialName("content") val encryptedContent: ApiEncryptedContent,
|
||||
@SerialName("event_id") val eventId: EventId,
|
||||
@SerialName("origin_server_ts") val utcTimestamp: Long,
|
||||
) : ApiTimelineEvent()
|
||||
|
||||
@Serializable
|
||||
object Ignored : ApiTimelineEvent()
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package app.dapk.st.matrix.sync.internal.request
|
||||
|
||||
import kotlinx.serialization.KSerializer
|
||||
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
|
||||
import kotlinx.serialization.encoding.Decoder
|
||||
import kotlinx.serialization.encoding.Encoder
|
||||
import kotlinx.serialization.json.JsonDecoder
|
||||
import kotlinx.serialization.json.jsonObject
|
||||
import kotlinx.serialization.json.jsonPrimitive
|
||||
|
||||
internal object ApiTimelineMessageContentDeserializer : KSerializer<ApiTimelineEvent.TimelineMessage.Content> {
|
||||
|
||||
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("messageContent")
|
||||
|
||||
override fun deserialize(decoder: Decoder): ApiTimelineEvent.TimelineMessage.Content {
|
||||
require(decoder is JsonDecoder)
|
||||
val element = decoder.decodeJsonElement()
|
||||
return when (element.jsonObject["msgtype"]?.jsonPrimitive?.content) {
|
||||
"m.text" -> ApiTimelineEvent.TimelineMessage.Content.Text.serializer().deserialize(decoder)
|
||||
"m.image" -> ApiTimelineEvent.TimelineMessage.Content.Image.serializer().deserialize(decoder)
|
||||
else -> {
|
||||
println(element)
|
||||
ApiTimelineEvent.TimelineMessage.Content.Ignored
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun serialize(encoder: Encoder, value: ApiTimelineEvent.TimelineMessage.Content) = when (value) {
|
||||
ApiTimelineEvent.TimelineMessage.Content.Ignored -> {}
|
||||
is ApiTimelineEvent.TimelineMessage.Content.Image -> ApiTimelineEvent.TimelineMessage.Content.Image.serializer().serialize(encoder, value)
|
||||
is ApiTimelineEvent.TimelineMessage.Content.Text -> ApiTimelineEvent.TimelineMessage.Content.Text.serializer().serialize(encoder, value)
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,151 @@
|
||||
package app.dapk.st.matrix.sync.internal.request
|
||||
|
||||
import app.dapk.st.matrix.common.*
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
sealed class ApiToDeviceEvent {
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room.encrypted")
|
||||
internal data class Encrypted(
|
||||
@SerialName("sender") val senderId: UserId,
|
||||
@SerialName("content") val content: ApiEncryptedContent,
|
||||
) : ApiToDeviceEvent()
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.room_key")
|
||||
data class RoomKey(
|
||||
@SerialName("sender") val sender: UserId,
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiToDeviceEvent() {
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("room_id") val roomId: RoomId,
|
||||
@SerialName("algorithm") val algorithmName: AlgorithmName,
|
||||
@SerialName("session_id") val sessionId: SessionId,
|
||||
@SerialName("session_key") val sessionKey: String,
|
||||
@SerialName("chain_index") val chainIndex: Long,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.request")
|
||||
data class VerificationRequest(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("from_device") val fromDevice: DeviceId,
|
||||
@SerialName("methods") val methods: List<String>,
|
||||
@SerialName("timestamp") val timestampPosix: Long,
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.ready")
|
||||
data class VerificationReady(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("from_device") val fromDevice: DeviceId,
|
||||
@SerialName("methods") val methods: List<String>,
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.start")
|
||||
data class VerificationStart(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("from_device") val fromDevice: DeviceId,
|
||||
@SerialName("method") val method: String,
|
||||
@SerialName("key_agreement_protocols") val protocols: List<String>,
|
||||
@SerialName("hashes") val hashes: List<String>,
|
||||
@SerialName("message_authentication_codes") val codes: List<String>,
|
||||
@SerialName("short_authentication_string") val short: List<String>,
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.accept")
|
||||
data class VerificationAccept(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("from_device") val fromDevice: DeviceId,
|
||||
@SerialName("method") val method: String,
|
||||
@SerialName("key_agreement_protocol") val protocol: String,
|
||||
@SerialName("hash") val hash: String,
|
||||
@SerialName("message_authentication_code") val code: String,
|
||||
@SerialName("short_authentication_string") val short: List<String>,
|
||||
@SerialName("commitment") val commitment: String,
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.key")
|
||||
data class VerificationKey(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
@SerialName("key") val key: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.mac")
|
||||
data class VerificationMac(
|
||||
@SerialName("content") val content: Content,
|
||||
@SerialName("sender") val sender: UserId,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
@SerialName("keys") val keys: String,
|
||||
@SerialName("mac") val mac: Map<String, String>,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@SerialName("m.key.verification.cancel")
|
||||
data class VerificationCancel(
|
||||
@SerialName("content") val content: Content,
|
||||
) : ApiToDeviceEvent(), ApiVerificationEvent {
|
||||
|
||||
@Serializable
|
||||
data class Content(
|
||||
@SerialName("code") val code: String,
|
||||
@SerialName("reason") val reason: String,
|
||||
@SerialName("transaction_id") val transactionId: String,
|
||||
)
|
||||
}
|
||||
|
||||
@Serializable
|
||||
object Ignored : ApiToDeviceEvent()
|
||||
|
||||
|
||||
sealed interface ApiVerificationEvent
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package app.dapk.st.matrix.sync.internal.request
|
||||
|
||||
import kotlinx.serialization.KSerializer
|
||||
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
|
||||
import kotlinx.serialization.encoding.Decoder
|
||||
import kotlinx.serialization.encoding.Encoder
|
||||
import kotlinx.serialization.json.JsonDecoder
|
||||
import kotlinx.serialization.json.jsonObject
|
||||
import kotlinx.serialization.json.jsonPrimitive
|
||||
|
||||
internal object EncryptedContentDeserializer : KSerializer<ApiEncryptedContent> {
|
||||
|
||||
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("encryptedContent")
|
||||
|
||||
override fun deserialize(decoder: Decoder): ApiEncryptedContent {
|
||||
require(decoder is JsonDecoder)
|
||||
val element = decoder.decodeJsonElement()
|
||||
return when (val algorithm = element.jsonObject["algorithm"]?.jsonPrimitive?.content) {
|
||||
"m.olm.v1.curve25519-aes-sha2" -> ApiEncryptedContent.OlmV1.serializer().deserialize(decoder)
|
||||
"m.megolm.v1.aes-sha2" -> ApiEncryptedContent.MegOlmV1.serializer().deserialize(decoder)
|
||||
null -> ApiEncryptedContent.Unknown
|
||||
else -> throw IllegalArgumentException("Unknown algorithm : $algorithm")
|
||||
}
|
||||
}
|
||||
|
||||
override fun serialize(encoder: Encoder, value: ApiEncryptedContent) = TODO("Not yet implemented")
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user