From 5b5ba747d885c58e2663282c53ae14bd1cdff42e Mon Sep 17 00:00:00 2001 From: Danil Nikolaev Date: Sun, 23 Mar 2025 11:53:28 +0300 Subject: [PATCH] some updates --- .../fast/domain/LongPollUpdatesParser.kt | 106 ++++++++++-------- .../dev/meloda/fast/model/LongPollEvent.kt | 10 ++ .../MessagesHistoryViewModel.kt | 30 +++++ 3 files changed, 102 insertions(+), 44 deletions(-) diff --git a/core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUpdatesParser.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUpdatesParser.kt index 65037ee5..e28b339e 100644 --- a/core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUpdatesParser.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUpdatesParser.kt @@ -35,13 +35,12 @@ class LongPollUpdatesParser( private val coroutineScope = CoroutineScope(coroutineContext) - private val listenersMap: MutableMap>> = - mutableMapOf() + private val listenersMap: MutableMap>> = mutableMapOf() fun parseNextUpdate(event: List) { val eventId = event.first().asInt() - when (val eventType = ApiEvent.parseOrNull(eventId)) { + when (val eventType = ApiEvent.parseOrNull(eventId)) { null -> Log.d("LongPollUpdatesParser", "parseNextUpdate: unknownEvent: $event") ApiEvent.MESSAGE_SET_FLAGS -> parseMessageSetFlags(eventType, event) @@ -59,14 +58,10 @@ class LongPollUpdatesParser( ApiEvent.VIDEO_UPLOADING, ApiEvent.FILE_UPLOADING -> parseInteraction(eventType, event) - ApiEvent.UNREAD_COUNT_UPDATE -> onNewEvent(eventType, event) + ApiEvent.UNREAD_COUNT_UPDATE -> parseUnreadCounterUpdate(eventType, event) } } - private fun onNewEvent(eventType: ApiEvent, event: List) { - Log.d("LongPollUpdatesParser", "newEvent: $eventType: $event") - } - private fun parseInteraction(eventType: ApiEvent, event: List) { Log.d("LongPollUpdatesParser", "$eventType: $event") @@ -105,23 +100,50 @@ class LongPollUpdatesParser( } } + private fun parseUnreadCounterUpdate(eventType: ApiEvent, event: List) { + Log.d("LongPollUpdatesParser", "$eventType $event") + + val unreadCount = event[1].asInt() + val unreadUnmutedCount = event[2].asInt() + val showOnlyMuted = event[3].asInt() == 1 + val businessNotifyUnreadCount = event[4].asInt() + val archiveUnreadCount = event[7].asInt() + val archiveUnreadUnmutedCount = event[8].asInt() + val archiveMentionsCount = event[9].asInt() + + listenersMap[ApiEvent.UNREAD_COUNT_UPDATE]?.let { listeners -> + listeners.forEach { vkEventCallback -> + (vkEventCallback as VkEventCallback) + .onEvent( + LongPollEvent.UnreadCounter( + unread = unreadCount, + unreadUnmuted = unreadUnmutedCount, + showOnlyMuted = showOnlyMuted, + business = businessNotifyUnreadCount, + archive = archiveUnreadCount, + archiveUnmuted = archiveUnreadUnmutedCount, + archiveMentions = archiveMentionsCount + ) + ) + } + } + } + private fun parseConversationPinStateChanged(eventType: ApiEvent, event: List) { Log.d("LongPollUpdatesParser", "$eventType: $event") val peerId = event[1].asInt() val majorId = event[2].asInt() - coroutineScope.launch { - listenersMap[ApiEvent.PIN_UNPIN_CONVERSATION]?.let { listeners -> - listeners.forEach { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent( - LongPollEvent.VkConversationPinStateChangedEvent( - peerId = peerId, - majorId = majorId - ) + listenersMap[ApiEvent.PIN_UNPIN_CONVERSATION]?.let { listeners -> + listeners.forEach { vkEventCallback -> + (vkEventCallback as VkEventCallback) + .onEvent( + LongPollEvent.VkConversationPinStateChangedEvent( + peerId = peerId, + majorId = majorId ) - } + ) } } } @@ -184,18 +206,16 @@ class LongPollUpdatesParser( val messageId = event[2].asInt() val unreadCount = event[3].asInt() - coroutineScope.launch { - listenersMap[ApiEvent.MESSAGE_READ_INCOMING]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent( - LongPollEvent.VkMessageReadIncomingEvent( - peerId = peerId, - messageId = messageId, - unreadCount = unreadCount - ) + listenersMap[ApiEvent.MESSAGE_READ_INCOMING]?.let { listeners -> + listeners.map { vkEventCallback -> + (vkEventCallback as VkEventCallback) + .onEvent( + LongPollEvent.VkMessageReadIncomingEvent( + peerId = peerId, + messageId = messageId, + unreadCount = unreadCount ) - } + ) } } } @@ -206,18 +226,16 @@ class LongPollUpdatesParser( val messageId = event[2].asInt() val unreadCount = event[3].asInt() - coroutineScope.launch { - listenersMap[ApiEvent.MESSAGE_READ_OUTGOING]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent( - LongPollEvent.VkMessageReadOutgoingEvent( - peerId = peerId, - messageId = messageId, - unreadCount = unreadCount - ) + listenersMap[ApiEvent.MESSAGE_READ_OUTGOING]?.let { listeners -> + listeners.map { vkEventCallback -> + (vkEventCallback as VkEventCallback) + .onEvent( + LongPollEvent.VkMessageReadOutgoingEvent( + peerId = peerId, + messageId = messageId, + unreadCount = unreadCount ) - } + ) } } } @@ -266,7 +284,7 @@ class LongPollUpdatesParser( } } - private fun registerListener( + private fun registerListener( eventType: ApiEvent, listener: VkEventCallback ) { @@ -275,7 +293,7 @@ class LongPollUpdatesParser( } } - private fun registerListeners( + private fun registerListeners( eventTypes: List, listener: VkEventCallback ) { @@ -344,12 +362,12 @@ class LongPollUpdatesParser( } } -internal inline fun assembleEventCallback( +internal inline fun assembleEventCallback( crossinline block: (R) -> Unit, ): VkEventCallback { return VkEventCallback { event -> block.invoke(event) } } -fun interface VkEventCallback { +fun interface VkEventCallback { fun onEvent(event: T) } diff --git a/core/model/src/main/kotlin/dev/meloda/fast/model/LongPollEvent.kt b/core/model/src/main/kotlin/dev/meloda/fast/model/LongPollEvent.kt index 3acf2ca3..3cd1806c 100644 --- a/core/model/src/main/kotlin/dev/meloda/fast/model/LongPollEvent.kt +++ b/core/model/src/main/kotlin/dev/meloda/fast/model/LongPollEvent.kt @@ -32,4 +32,14 @@ sealed interface LongPollEvent { val totalCount: Int, val timestamp: Int ) : LongPollEvent + + data class UnreadCounter( + val unread: Int, + val unreadUnmuted: Int, + val showOnlyMuted: Boolean, + val business: Int, + val archive: Int, + val archiveUnmuted: Int, + val archiveMentions: Int + ): LongPollEvent } diff --git a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModel.kt b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModel.kt index 27f046df..b08e199e 100644 --- a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModel.kt +++ b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModel.kt @@ -224,7 +224,37 @@ class MessagesHistoryViewModelImpl( } private fun handleReadIncomingEvent(event: LongPollEvent.VkMessageReadIncomingEvent) { + if (event.peerId != screenState.value.conversationId) return + val messages = messages.value + val messageIndex = + messages.indexOfFirstOrNull { it.id == event.messageId } + + if (messageIndex == null) { // диалога нет в списке + // pizdets + } else { + val newConversation = screenState.value.conversation.copy( + inRead = event.messageId + ) + + val uiMessages = messages.mapIndexed { index, item -> + item.asPresentation( + resourceProvider = resourceProvider, + showName = false, + prevMessage = messages.getOrNull(index + 1), + nextMessage = messages.getOrNull(index - 1), + showTimeInActionMessages = userSettings.showTimeInActionMessages.value, + conversation = newConversation + ) + } + + screenState.setValue { old -> + old.copy( + conversation = newConversation, + messages = uiMessages, + ) + } + } } private fun handleReadOutgoingEvent(event: LongPollEvent.VkMessageReadOutgoingEvent) {