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 43497f23..ea7dc5c6 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 @@ -47,6 +47,17 @@ class LongPollUpdatesParser( private val listenersMap: MutableMap>> = mutableMapOf() + @Suppress("UNCHECKED_CAST") + private fun dispatch(eventType: LongPollEvent, event: T) { + listenersMap[eventType]?.forEach { callback -> + (callback as? VkEventCallback)?.onEvent(event) + } + } + + private fun dispatchAll(eventType: LongPollEvent, events: List) { + events.forEach { event -> dispatch(eventType, event) } + } + fun parseNextUpdate(event: List) { val eventId = event.first().asInt() @@ -96,13 +107,7 @@ class LongPollUpdatesParser( marked = true ) eventsToSend += eventToSend - - listenersMap[LongPollEvent.MARKED_AS_IMPORTANT]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback) - ?.onEvent(eventToSend) - } - } + dispatch(LongPollEvent.MARKED_AS_IMPORTANT, eventToSend) } MessageFlags.SPAM -> { @@ -111,13 +116,7 @@ class LongPollUpdatesParser( cmId = cmId ) eventsToSend += eventToSend - - listenersMap[LongPollEvent.MARKED_AS_SPAM]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback) - ?.onEvent(eventToSend) - } - } + dispatch(LongPollEvent.MARKED_AS_SPAM, eventToSend) } MessageFlags.DELETED -> { @@ -134,15 +133,9 @@ class LongPollUpdatesParser( cmId = cmId, forAll = false ) - } - eventsToSend += eventToSend - - listenersMap[LongPollEvent.MESSAGE_DELETED]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback) - ?.onEvent(eventToSend) - } } + eventsToSend += eventToSend + dispatch(LongPollEvent.MESSAGE_DELETED, eventToSend) } MessageFlags.AUDIO_LISTENED -> { @@ -151,26 +144,14 @@ class LongPollUpdatesParser( cmId = cmId ) eventsToSend += eventToSend - - listenersMap[LongPollEvent.AUDIO_MESSAGE_LISTENED]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback) - ?.onEvent(eventToSend) - } - } + dispatch(LongPollEvent.AUDIO_MESSAGE_LISTENED, eventToSend) } else -> Unit } } - eventsToSend.forEach { eventToSend -> - listenersMap[LongPollEvent.MESSAGE_SET_FLAGS]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback)?.onEvent(eventToSend) - } - } - } + dispatchAll(LongPollEvent.MESSAGE_SET_FLAGS, eventsToSend) } private fun parseMessageClearFlags(eventType: ApiEvent, event: List) { @@ -194,13 +175,7 @@ class LongPollUpdatesParser( marked = false ) eventsToSend += eventToSend - - listenersMap[LongPollEvent.MARKED_AS_IMPORTANT]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback) - ?.onEvent(eventToSend) - } - } + dispatch(LongPollEvent.MARKED_AS_IMPORTANT, eventToSend) } MessageFlags.SPAM -> { @@ -214,13 +189,7 @@ class LongPollUpdatesParser( val eventToSend = LongPollParsedEvent.MessageMarkedAsNotSpam(message = message) eventsToSend += eventToSend - - listenersMap[LongPollEvent.MARKED_AS_NOT_SPAM]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback) - ?.onEvent(eventToSend) - } - } + dispatch(LongPollEvent.MARKED_AS_NOT_SPAM, eventToSend) } } } @@ -236,13 +205,7 @@ class LongPollUpdatesParser( val eventToSend = LongPollParsedEvent.MessageRestored(message = message) eventsToSend += eventToSend - - listenersMap[LongPollEvent.MESSAGE_RESTORED]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback) - ?.onEvent(eventToSend) - } - } + dispatch(LongPollEvent.MESSAGE_RESTORED, eventToSend) } } } @@ -251,13 +214,7 @@ class LongPollUpdatesParser( } } - eventsToSend.forEach { eventToSend -> - listenersMap[LongPollEvent.MESSAGE_CLEAR_FLAGS]?.let { listeners -> - listeners.map { vkEventCallback -> - vkEventCallback.onEvent(eventToSend) - } - } - } + dispatchAll(LongPollEvent.MESSAGE_CLEAR_FLAGS, eventsToSend) } } @@ -281,20 +238,16 @@ class LongPollUpdatesParser( }.await() message?.let { - listenersMap[LongPollEvent.MESSAGE_NEW]?.let { - it.map { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent( - LongPollParsedEvent.NewMessage( - message = message, - inArchive = convo?.isArchived == true - // TODO: 03-Apr-25, Danil Nikolaev: - // load user settings about restoring chats with - // enabled notifications from archive - ) - ) - } - } + dispatch( + LongPollEvent.MESSAGE_NEW, + LongPollParsedEvent.NewMessage( + message = message, + inArchive = convo?.isArchived == true + // TODO: 03-Apr-25, Danil Nikolaev: + // load user settings about restoring chats with + // enabled notifications from archive + ) + ) } } } @@ -310,12 +263,7 @@ class LongPollUpdatesParser( peerId = peerId, cmId = cmId )?.let { message -> - listenersMap[LongPollEvent.MESSAGE_EDITED]?.let { - it.map { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent(LongPollParsedEvent.MessageEdited(message)) - } - } + dispatch(LongPollEvent.MESSAGE_EDITED, LongPollParsedEvent.MessageEdited(message)) } } } @@ -326,18 +274,14 @@ class LongPollUpdatesParser( val cmId = event[2].asLong() val unreadCount = event[3].asInt() - listenersMap[LongPollEvent.INCOMING_MESSAGE_READ]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent( - LongPollParsedEvent.IncomingMessageRead( - peerId = peerId, - cmId = cmId, - unreadCount = unreadCount - ) - ) - } - } + dispatch( + LongPollEvent.INCOMING_MESSAGE_READ, + LongPollParsedEvent.IncomingMessageRead( + peerId = peerId, + cmId = cmId, + unreadCount = unreadCount + ) + ) } private fun parseMessageReadOutgoing(eventType: ApiEvent, event: List) { @@ -346,18 +290,14 @@ class LongPollUpdatesParser( val cmId = event[2].asLong() val unreadCount = event[3].asInt() - listenersMap[LongPollEvent.OUTGOING_MESSAGE_READ]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent( - LongPollParsedEvent.OutgoingMessageRead( - peerId = peerId, - cmId = cmId, - unreadCount = unreadCount - ) - ) - } - } + dispatch( + LongPollEvent.OUTGOING_MESSAGE_READ, + LongPollParsedEvent.OutgoingMessageRead( + peerId = peerId, + cmId = cmId, + unreadCount = unreadCount + ) + ) } private fun parseChatClearFlags(eventType: ApiEvent, event: List) { @@ -390,28 +330,14 @@ class LongPollUpdatesParser( archived = false ) eventsToSend += eventToSend - - listenersMap[LongPollEvent.CHAT_ARCHIVED]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback) - ?.onEvent(eventToSend) - } - } + dispatch(LongPollEvent.CHAT_ARCHIVED, eventToSend) } else -> Unit } } - eventsToSend.forEach { eventToSend -> - listenersMap[LongPollEvent.CHAT_CLEAR_FLAGS]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback)?.onEvent( - eventToSend - ) - } - } - } + dispatchAll(LongPollEvent.CHAT_CLEAR_FLAGS, eventsToSend) } } @@ -445,28 +371,14 @@ class LongPollUpdatesParser( archived = true ) eventsToSend += eventToSend - - listenersMap[LongPollEvent.CHAT_ARCHIVED]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback) - ?.onEvent(eventToSend) - } - } + dispatch(LongPollEvent.CHAT_ARCHIVED, eventToSend) } else -> Unit } } - eventsToSend.forEach { eventToSend -> - listenersMap[LongPollEvent.CHAT_SET_FLAGS]?.let { listeners -> - listeners.map { vkEventCallback -> - (vkEventCallback as? VkEventCallback)?.onEvent( - eventToSend - ) - } - } - } + dispatchAll(LongPollEvent.CHAT_SET_FLAGS, eventsToSend) } } @@ -476,17 +388,13 @@ class LongPollUpdatesParser( val peerId = event[1].asLong() val cmId = event[2].asLong() - listenersMap[LongPollEvent.CHAT_CLEARED]?.let { listeners -> - listeners.forEach { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent( - LongPollParsedEvent.ChatCleared( - peerId = peerId, - toCmId = cmId - ) - ) - } - } + dispatch( + LongPollEvent.CHAT_CLEARED, + LongPollParsedEvent.ChatCleared( + peerId = peerId, + toCmId = cmId + ) + ) } private fun parseChatMajorChanged(eventType: ApiEvent, event: List) { @@ -495,17 +403,13 @@ class LongPollUpdatesParser( val peerId = event[1].asLong() val majorId = event[2].asInt() - listenersMap[LongPollEvent.CHAT_MAJOR_CHANGED]?.let { listeners -> - listeners.forEach { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent( - LongPollParsedEvent.ChatMajorChanged( - peerId = peerId, - majorId = majorId, - ) - ) - } - } + dispatch( + LongPollEvent.CHAT_MAJOR_CHANGED, + LongPollParsedEvent.ChatMajorChanged( + peerId = peerId, + majorId = majorId, + ) + ) } private fun parseChatMinorChanged(eventType: ApiEvent, event: List) { @@ -514,17 +418,13 @@ class LongPollUpdatesParser( val peerId = event[1].asLong() val minorId = event[2].asInt() - listenersMap[LongPollEvent.CHAT_MINOR_CHANGED]?.let { listeners -> - listeners.forEach { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent( - LongPollParsedEvent.ChatMinorChanged( - peerId = peerId, - minorId = minorId, - ) - ) - } - } + dispatch( + LongPollEvent.CHAT_MINOR_CHANGED, + LongPollParsedEvent.ChatMinorChanged( + peerId = peerId, + minorId = minorId, + ) + ) } private fun parseInteraction(eventType: ApiEvent, event: List) { @@ -556,20 +456,16 @@ class LongPollUpdatesParser( // if userIds contains only account's id, then we don't need to show our status if (userIds.isEmpty()) return - listenersMap[longPollEvent]?.let { listeners -> - listeners.forEach { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent( - LongPollParsedEvent.Interaction( - interactionType = interactionType, - peerId = peerId, - userIds = userIds, - totalCount = totalCount, - timestamp = timestamp - ) - ) - } - } + dispatch( + longPollEvent, + LongPollParsedEvent.Interaction( + interactionType = interactionType, + peerId = peerId, + userIds = userIds, + totalCount = totalCount, + timestamp = timestamp + ) + ) } private fun parseUnreadCounterUpdate(eventType: ApiEvent, event: List) { @@ -583,22 +479,18 @@ class LongPollUpdatesParser( val archiveUnreadUnmutedCount = event[8].asInt() val archiveMentionsCount = event[9].asInt() - listenersMap[LongPollEvent.UNREAD_COUNTER_UPDATE]?.let { listeners -> - listeners.forEach { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent( - LongPollParsedEvent.UnreadCounter( - unread = unreadCount, - unreadUnmuted = unreadUnmutedCount, - showOnlyMuted = showOnlyMuted, - business = businessNotifyUnreadCount, - archive = archiveUnreadCount, - archiveUnmuted = archiveUnreadUnmutedCount, - archiveMentions = archiveMentionsCount - ) - ) - } - } + dispatch( + LongPollEvent.UNREAD_COUNTER_UPDATE, + LongPollParsedEvent.UnreadCounter( + unread = unreadCount, + unreadUnmuted = unreadUnmutedCount, + showOnlyMuted = showOnlyMuted, + business = businessNotifyUnreadCount, + archive = archiveUnreadCount, + archiveUnmuted = archiveUnreadUnmutedCount, + archiveMentions = archiveMentionsCount + ) + ) } private fun parseMessageUpdated(eventType: ApiEvent, event: List) { @@ -612,12 +504,7 @@ class LongPollUpdatesParser( peerId = peerId, cmId = cmId )?.let { message -> - listenersMap[LongPollEvent.MESSAGE_UPDATED]?.let { - it.map { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent(LongPollParsedEvent.MessageUpdated(message)) - } - } + dispatch(LongPollEvent.MESSAGE_UPDATED, LongPollParsedEvent.MessageUpdated(message)) } } } @@ -629,12 +516,10 @@ class LongPollUpdatesParser( coroutineScope.launch(Dispatchers.IO) { loadMessage(messageId = messageId)?.let { message -> - listenersMap[LongPollEvent.MESSAGE_CACHE_CLEAR]?.let { - it.map { vkEventCallback -> - (vkEventCallback as VkEventCallback) - .onEvent(LongPollParsedEvent.MessageCacheClear(message)) - } - } + dispatch( + LongPollEvent.MESSAGE_CACHE_CLEAR, + LongPollParsedEvent.MessageCacheClear(message) + ) } } }