diff --git a/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt b/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt index 96f0235c..bbe72d8c 100644 --- a/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt +++ b/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt @@ -12,6 +12,7 @@ import chat.revolt.api.realtime.frames.receivable.ChannelAckFrame import chat.revolt.api.realtime.frames.receivable.ChannelStartTypingFrame import chat.revolt.api.realtime.frames.receivable.ChannelStopTypingFrame import chat.revolt.api.realtime.frames.receivable.ChannelUpdateFrame +import chat.revolt.api.realtime.frames.receivable.MessageAppendFrame import chat.revolt.api.realtime.frames.receivable.MessageFrame import chat.revolt.api.realtime.frames.receivable.MessageUpdateFrame import chat.revolt.api.realtime.frames.receivable.PongFrame @@ -176,6 +177,33 @@ object RealtimeSocket { } } + "MessageAppend" -> { + val messageAppendFrame = + RevoltJson.decodeFromString(MessageAppendFrame.serializer(), rawFrame) + Log.d( + "RealtimeSocket", + "Received message append frame for ${messageAppendFrame.id} in channel ${messageAppendFrame.channel}." + ) + + var message = RevoltAPI.messageCache[messageAppendFrame.id] + + if (message == null) { + Log.d( + "RealtimeSocket", + "Message ${messageAppendFrame.id} not found in cache. Will not append." + ) + return + } + + messageAppendFrame.append.embeds?.let { + message = message!!.copy(embeds = message!!.embeds?.plus(it) ?: it) + } + + RevoltAPI.messageCache[messageAppendFrame.id] = message!! + + RevoltAPI.wsFrameChannel.send(messageAppendFrame) + } + "MessageUpdate" -> { val messageUpdateFrame = RevoltJson.decodeFromString(MessageUpdateFrame.serializer(), rawFrame) diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt index 3746d48c..261f4f5e 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt +++ b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt @@ -19,6 +19,7 @@ import chat.revolt.api.internals.ULID import chat.revolt.api.realtime.RealtimeSocketFrames import chat.revolt.api.realtime.frames.receivable.ChannelStartTypingFrame import chat.revolt.api.realtime.frames.receivable.ChannelStopTypingFrame +import chat.revolt.api.realtime.frames.receivable.MessageAppendFrame import chat.revolt.api.realtime.frames.receivable.MessageDeleteFrame import chat.revolt.api.realtime.frames.receivable.MessageFrame import chat.revolt.api.realtime.frames.receivable.MessageUpdateFrame @@ -319,6 +320,24 @@ class ChannelScreenViewModel : ViewModel() { }) } + is MessageAppendFrame -> { + if (it.channel != activeChannel?.id) return@onEach + + val hasMessage = renderableMessages.any { currentMsg -> + currentMsg.id == it.id + } + + if (!hasMessage) return@onEach + + regroupMessages(renderableMessages.map { currentMsg -> + if (currentMsg.id == it.id) { + RevoltAPI.messageCache[it.id] ?: currentMsg + } else { + currentMsg + } + }) + } + is MessageDeleteFrame -> { if (it.channel != activeChannel?.id) return@onEach