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