Skip to content

Commit 745ba31

Browse files
anakin78zmahibi
authored andcommitted
When receiving WebSocket chat comments that require user specific data, fetch new messages via REST call.
Signed-off-by: Jens Zalzala <jens@shakingearthdigital.com>
1 parent 155517a commit 745ba31

3 files changed

Lines changed: 50 additions & 12 deletions

File tree

app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessage.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ data class ChatMessage(
315315
FEDERATED_USER_REMOVED,
316316
PHONE_ADDED,
317317
THREAD_CREATED,
318+
THREAD_RENAMED,
318319
MESSAGE_PINNED,
319320
MESSAGE_UNPINNED
320321
}
@@ -323,6 +324,16 @@ data class ChatMessage(
323324
private const val TAG = "ChatMessage"
324325
private const val MILLIES: Long = 1000L
325326

327+
val SYSTEM_MESSAGE_TYPE_UNTRANSLATED: Set<SystemMessageType> = setOf(
328+
SystemMessageType.REACTION,
329+
SystemMessageType.REACTION_DELETED,
330+
SystemMessageType.REACTION_REVOKED,
331+
SystemMessageType.MESSAGE_DELETED,
332+
SystemMessageType.MESSAGE_EDITED,
333+
SystemMessageType.THREAD_CREATED,
334+
SystemMessageType.THREAD_RENAMED,
335+
)
336+
326337
private const val REGEX_STRING_DEFAULT =
327338
"""(\s|\n|^)(https?:\/\/)((?:[-A-Z0-9+_]+\.)+[-A-Z]+(?:\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*)(\s|\n|$)"""
328339
}

app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -270,20 +270,27 @@ class OfflineFirstChatRepository @Inject constructor(
270270
delay(INSURANCE_REQUEST_DELAY)
271271
Log.d(TAG, "execute insurance request with latestKnownMessageIdFromSync: $latestKnownMessageIdFromSync")
272272

273-
var fieldMap = getFieldMap(
274-
lookIntoFuture = true,
275-
timeout = 0,
276-
includeLastKnown = false,
277-
lastKnown = latestKnownMessageIdFromSync.toInt(),
278-
limit = 200
279-
)
280-
val networkParams = Bundle()
281-
networkParams.putSerializable(BundleKeys.KEY_FIELD_MAP, fieldMap)
282-
283-
getAndPersistMessages(networkParams)
273+
fetchNewMessages()
284274
}
285275
}
286276

277+
/**
278+
* Fetches messages newer than latest known message
279+
*/
280+
private suspend fun fetchNewMessages() {
281+
var fieldMap = getFieldMap(
282+
lookIntoFuture = true,
283+
timeout = 0,
284+
includeLastKnown = false,
285+
lastKnown = latestKnownMessageIdFromSync.toInt(),
286+
limit = 200
287+
)
288+
val networkParams = Bundle()
289+
networkParams.putSerializable(BundleKeys.KEY_FIELD_MAP, fieldMap)
290+
291+
getAndPersistMessages(networkParams)
292+
}
293+
287294
override suspend fun loadMoreMessages(
288295
anchorMessageId: Long,
289296
direction: ChatMessageRepository.LoadMoreDirection,
@@ -594,6 +601,16 @@ class OfflineFirstChatRepository @Inject constructor(
594601
updateBlocks(newChatBlock)
595602
}
596603

604+
/**
605+
* Returns true if all system messages do not require translation.
606+
* Ignores other message types.
607+
*/
608+
private fun isUntranslatedSystemMessage(messagesJson: List<ChatMessageJson>): Boolean =
609+
messagesJson.all {
610+
it.systemMessageType == ChatMessage.SystemMessageType.DUMMY ||
611+
it.systemMessageType in ChatMessage.SYSTEM_MESSAGE_TYPE_UNTRANSLATED
612+
}
613+
597614
private suspend fun handleSystemMessagesThatAffectDatabase(messagesJson: List<ChatMessageJson>) {
598615
var hasPinnedMessageChange = false
599616
messagesJson.forEach { messageJson ->
@@ -1010,10 +1027,18 @@ class OfflineFirstChatRepository @Inject constructor(
10101027
}
10111028

10121029
override suspend fun onSignalingChatMessageReceived(chatMessages: List<ChatMessageJson>) {
1030+
// check if we need to get user specific data from the backend
1031+
if (!isUntranslatedSystemMessage(chatMessages) ||
1032+
chatMessages.any { it.messageParameters?.containsKey("file") == true }) {
1033+
Log.d(TAG, "onSignalingChatMessageReceived force data refresh")
1034+
fetchNewMessages()
1035+
return
1036+
}
1037+
10131038
persistChatMessagesAndHandleSystemMessages(chatMessages, emitOnIncoming = true)
10141039

10151040
// we assume that the signaling messages are on top of the latest chatblock and include them inside it.
1016-
// If for whatever reason the assume was not correct and there would be messages in between, the
1041+
// If for whatever reason the assumption was not correct and there would be messages in between, the
10171042
// insurance request should fix this by adding the missing messages and updating the chatblocks.
10181043
val latestChatBlock = chatBlocksDao.getLatestChatBlock(internalConversationId, threadId)
10191044
latestChatBlock.first()?.apply {

app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.RECORDIN
7373
import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.RECORDING_STARTED
7474
import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.RECORDING_STOPPED
7575
import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.THREAD_CREATED
76+
import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.THREAD_RENAMED
7677
import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.USER_ADDED
7778
import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.USER_REMOVED
7879

@@ -147,6 +148,7 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter<ChatMessage.Syst
147148
"federated_user_removed" -> FEDERATED_USER_REMOVED
148149
"phone_added" -> PHONE_ADDED
149150
"thread_created" -> THREAD_CREATED
151+
"thread_renamed" -> THREAD_RENAMED
150152
"message_pinned" -> MESSAGE_PINNED
151153
"message_unpinned" -> MESSAGE_UNPINNED
152154
else -> DUMMY

0 commit comments

Comments
 (0)