refactor: reduce long poll dispatch noise

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