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 -> {
@@ -136,13 +135,7 @@ class LongPollUpdatesParser(
) )
} }
eventsToSend += eventToSend eventsToSend += eventToSend
dispatch(LongPollEvent.MESSAGE_DELETED, eventToSend)
listenersMap[LongPollEvent.MESSAGE_DELETED]?.let { listeners ->
listeners.map { vkEventCallback ->
(vkEventCallback as? VkEventCallback<LongPollParsedEvent.MessageDeleted>)
?.onEvent(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,10 +238,8 @@ 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>)
.onEvent(
LongPollParsedEvent.NewMessage( LongPollParsedEvent.NewMessage(
message = message, message = message,
inArchive = convo?.isArchived == true inArchive = convo?.isArchived == true
@@ -296,8 +251,6 @@ class LongPollUpdatesParser(
} }
} }
} }
}
}
private fun parseMessageEdit(eventType: ApiEvent, event: List<Any>) { private fun parseMessageEdit(eventType: ApiEvent, event: List<Any>) {
Log.d("LongPollUpdatesParser", "$eventType: $event") Log.d("LongPollUpdatesParser", "$eventType: $event")
@@ -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,10 +274,8 @@ 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>)
.onEvent(
LongPollParsedEvent.IncomingMessageRead( LongPollParsedEvent.IncomingMessageRead(
peerId = peerId, peerId = peerId,
cmId = cmId, cmId = cmId,
@@ -337,8 +283,6 @@ class LongPollUpdatesParser(
) )
) )
} }
}
}
private fun parseMessageReadOutgoing(eventType: ApiEvent, event: List<Any>) { private fun parseMessageReadOutgoing(eventType: ApiEvent, event: List<Any>) {
Log.d("LongPollUpdatesParser", "$eventType: $event") Log.d("LongPollUpdatesParser", "$eventType: $event")
@@ -346,10 +290,8 @@ 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>)
.onEvent(
LongPollParsedEvent.OutgoingMessageRead( LongPollParsedEvent.OutgoingMessageRead(
peerId = peerId, peerId = peerId,
cmId = cmId, cmId = cmId,
@@ -357,8 +299,6 @@ class LongPollUpdatesParser(
) )
) )
} }
}
}
private fun parseChatClearFlags(eventType: ApiEvent, event: List<Any>) { private fun parseChatClearFlags(eventType: ApiEvent, event: List<Any>) {
Log.d("LongPollUpdatesParser", "$eventType: $event") Log.d("LongPollUpdatesParser", "$eventType: $event")
@@ -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,18 +388,14 @@ 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>)
.onEvent(
LongPollParsedEvent.ChatCleared( LongPollParsedEvent.ChatCleared(
peerId = peerId, peerId = peerId,
toCmId = cmId toCmId = cmId
) )
) )
} }
}
}
private fun parseChatMajorChanged(eventType: ApiEvent, event: List<Any>) { private fun parseChatMajorChanged(eventType: ApiEvent, event: List<Any>) {
Log.d("LongPollUpdatesParser", "$eventType: $event") Log.d("LongPollUpdatesParser", "$eventType: $event")
@@ -495,18 +403,14 @@ 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>)
.onEvent(
LongPollParsedEvent.ChatMajorChanged( LongPollParsedEvent.ChatMajorChanged(
peerId = peerId, peerId = peerId,
majorId = majorId, majorId = majorId,
) )
) )
} }
}
}
private fun parseChatMinorChanged(eventType: ApiEvent, event: List<Any>) { private fun parseChatMinorChanged(eventType: ApiEvent, event: List<Any>) {
Log.d("LongPollUpdatesParser", "$eventType: $event") Log.d("LongPollUpdatesParser", "$eventType: $event")
@@ -514,18 +418,14 @@ 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>)
.onEvent(
LongPollParsedEvent.ChatMinorChanged( LongPollParsedEvent.ChatMinorChanged(
peerId = peerId, peerId = peerId,
minorId = minorId, minorId = minorId,
) )
) )
} }
}
}
private fun parseInteraction(eventType: ApiEvent, event: List<Any>) { private fun parseInteraction(eventType: ApiEvent, event: List<Any>) {
Log.d("LongPollUpdatesParser", "$eventType: $event") Log.d("LongPollUpdatesParser", "$eventType: $event")
@@ -556,10 +456,8 @@ 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>)
.onEvent(
LongPollParsedEvent.Interaction( LongPollParsedEvent.Interaction(
interactionType = interactionType, interactionType = interactionType,
peerId = peerId, peerId = peerId,
@@ -569,8 +467,6 @@ class LongPollUpdatesParser(
) )
) )
} }
}
}
private fun parseUnreadCounterUpdate(eventType: ApiEvent, event: List<Any>) { private fun parseUnreadCounterUpdate(eventType: ApiEvent, event: List<Any>) {
Log.d("LongPollUpdatesParser", "$eventType $event") Log.d("LongPollUpdatesParser", "$eventType $event")
@@ -583,10 +479,8 @@ 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>)
.onEvent(
LongPollParsedEvent.UnreadCounter( LongPollParsedEvent.UnreadCounter(
unread = unreadCount, unread = unreadCount,
unreadUnmuted = unreadUnmutedCount, unreadUnmuted = unreadUnmutedCount,
@@ -598,8 +492,6 @@ class LongPollUpdatesParser(
) )
) )
} }
}
}
private fun parseMessageUpdated(eventType: ApiEvent, event: List<Any>) { private fun parseMessageUpdated(eventType: ApiEvent, event: List<Any>) {
Log.d("LongPollUpdatesParser", "$eventType $event") Log.d("LongPollUpdatesParser", "$eventType $event")
@@ -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)) )
}
}
} }
} }
} }