From 07c0f890dada8ebc0e09c4b2b0dadb6c43303160 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Mon, 30 Jan 2023 14:18:33 -0500
Subject: [PATCH] conversationmodel: get registered name for non contact
 members

Because in a swarm you can talk with non contacts, we should at
least retrieve the username when possible.

Change-Id: Ie01cd10cc1231fc4024bd5a08c30c08d69e8e7f0
GitLab: #948
---
 src/libclient/contactmodel.cpp      | 22 ++++++++++++++++------
 src/libclient/conversationmodel.cpp | 19 +++++++++++++++----
 2 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/src/libclient/contactmodel.cpp b/src/libclient/contactmodel.cpp
index f441e2642..f46f86ec9 100644
--- a/src/libclient/contactmodel.cpp
+++ b/src/libclient/contactmodel.cpp
@@ -47,7 +47,6 @@
 
 // Std
 #include <algorithm>
-#include <mutex>
 
 namespace lrc {
 
@@ -120,6 +119,7 @@ public:
     std::mutex contactsMtx_;
     std::mutex bannedContactsMtx_;
     QString searchStatus_ {};
+    QMap<QString, QString> nonContactLookup_;
 
 public Q_SLOTS:
     /**
@@ -509,6 +509,11 @@ ContactModel::sendDhtMessage(const QString& contactUri,
 const QString
 ContactModel::bestNameForContact(const QString& contactUri) const
 {
+    if (contactUri.isEmpty())
+        return contactUri;
+    if (contactUri == owner.profileInfo.uri)
+        return owner.accountModel->bestNameForAccount(owner.id);
+    QString res = contactUri;
     try {
         auto contact = getContact(contactUri);
         auto alias = contact.profileInfo.alias.simplified();
@@ -517,8 +522,15 @@ ContactModel::bestNameForContact(const QString& contactUri) const
         }
         return alias;
     } catch (const std::out_of_range&) {
+        auto itContact = pimpl_->nonContactLookup_.find(contactUri);
+        if (itContact != pimpl_->nonContactLookup_.end()) {
+            return *itContact;
+        } else {
+            // This is not a contact, but we should get the registered name
+            ConfigurationManager::instance().lookupAddress(owner.id, "", contactUri);
+        }
     }
-    return contactUri;
+    return res;
 }
 
 QString
@@ -775,9 +787,7 @@ ContactModelPimpl::slotNewBuddySubscription(const QString& accountId,
 }
 
 void
-ContactModelPimpl::slotContactAdded(const QString& accountId,
-                                    const QString& contactUri,
-                                    bool)
+ContactModelPimpl::slotContactAdded(const QString& accountId, const QString& contactUri, bool)
 {
     if (accountId != linked.owner.id)
         return;
@@ -951,12 +961,12 @@ ContactModelPimpl::slotRegisteredNameFound(const QString& accountId,
 
     if (status == 0 /* SUCCESS */) {
         std::lock_guard<std::mutex> lk(contactsMtx_);
-
         if (contacts.find(uri) != contacts.end()) {
             // update contact and remove temporary item
             contacts[uri].registeredName = registeredName;
             searchResult.clear();
         } else {
+            nonContactLookup_[uri] = registeredName;
             if ((searchQuery != uri && searchQuery != registeredName) || searchQuery.isEmpty()) {
                 // we are notified that a previous lookup ended
                 return;
diff --git a/src/libclient/conversationmodel.cpp b/src/libclient/conversationmodel.cpp
index 7dac144b0..c9cee8ef9 100644
--- a/src/libclient/conversationmodel.cpp
+++ b/src/libclient/conversationmodel.cpp
@@ -1452,7 +1452,9 @@ ConversationModel::clearHistory(const QString& uid)
         std::lock_guard<std::mutex> lk(pimpl_->interactionsLocks[conversation.uid]);
         conversation.interactions->clear();
     }
-    storage::getHistory(pimpl_->db, conversation, pimpl_->linked.owner.profileInfo.uri); // will contain "Conversation started"
+    storage::getHistory(pimpl_->db,
+                        conversation,
+                        pimpl_->linked.owner.profileInfo.uri); // will contain "Conversation started"
 
     Q_EMIT modelChanged();
     Q_EMIT conversationCleared(uid);
@@ -1507,7 +1509,8 @@ ConversationModel::clearInteractionFromConversation(const QString& convId,
                 lastInteractionUpdated = true;
             }
             if (conversation.lastSelfMessageId == interactionId) {
-                conversation.lastSelfMessageId = conversation.interactions->lastSelfMessageId(owner.profileInfo.uri);
+                conversation.lastSelfMessageId = conversation.interactions->lastSelfMessageId(
+                    owner.profileInfo.uri);
             }
 
         } catch (const std::out_of_range& e) {
@@ -2467,7 +2470,9 @@ ConversationModelPimpl::slotConversationLoaded(uint32_t requestId,
                 linked.owner.dataTransferModel->registerTransferId(fileId, msgId);
                 downloadFile = (bytesProgress == 0);
             } else if (msg.type == interaction::Type::CALL) {
-                msg.body = storage::getCallInteractionString(msg.authorUri == linked.owner.profileInfo.uri, msg);
+                msg.body = storage::getCallInteractionString(msg.authorUri
+                                                                 == linked.owner.profileInfo.uri,
+                                                             msg);
             } else if (msg.type == interaction::Type::CONTACT) {
                 auto bestName = msg.authorUri == linked.owner.profileInfo.uri
                                     ? linked.owner.accountModel->bestNameForAccount(linked.owner.id)
@@ -2617,7 +2622,9 @@ ConversationModelPimpl::slotMessageReceived(const QString& accountId,
             // If we're a call in a swarm
             if (msg.authorUri != linked.owner.profileInfo.uri)
                 updateUnread = true;
-            msg.body = storage::getCallInteractionString(msg.authorUri == linked.owner.profileInfo.uri, msg);
+            msg.body = storage::getCallInteractionString(msg.authorUri
+                                                             == linked.owner.profileInfo.uri,
+                                                         msg);
         } else if (msg.type == interaction::Type::CONTACT) {
             auto bestName = msg.authorUri == linked.owner.profileInfo.uri
                                 ? linked.owner.accountModel->bestNameForAccount(linked.owner.id)
@@ -3215,6 +3222,10 @@ ConversationModelPimpl::addSwarmConversation(const QString& convId)
             otherMember = member["uri"];
         } else if (member["uri"] == accountURI) {
             lastRead = member["lastDisplayed"];
+        } else if (mode != conversation::Mode::ONE_TO_ONE) {
+            // Note: a conversation may be with non contacts.
+            // So, refresh bestName to be sure to get quick updates in UI
+            linked.owner.contactModel->bestNameForContact(member["uri"]);
         }
         if (member["uri"] != accountURI)
             conversation.interactions->setRead(member["uri"], member["lastDisplayed"]);
-- 
GitLab