From d7e16efaa6787e5c7c255d134fd439371230e854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Tue, 24 Oct 2023 16:03:33 -0400 Subject: [PATCH] conversation_module: correctly remove conversations that we left Fix members detection & path in leave Change-Id: I5ab4131b34ba561797ed5eb84f3736faf5e101b3 --- src/jamidht/conversation.cpp | 2 +- src/jamidht/conversation_module.cpp | 14 +++++++++----- src/jamidht/conversationrepository.cpp | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/jamidht/conversation.cpp b/src/jamidht/conversation.cpp index 2b02d579c1..460165f5ad 100644 --- a/src/jamidht/conversation.cpp +++ b/src/jamidht/conversation.cpp @@ -176,7 +176,7 @@ public: accountId_ = shared->getAccountID(); transferManager_ = std::make_shared<TransferManager>(shared->getAccountID(), repository_->id()); - conversationDataPath_ = fileutils::get_data_dir() / shared->getAccountID() + conversationDataPath_ = fileutils::get_data_dir() / shared->getAccountID() / "conversation_data" / repository_->id(); fetchedPath_ = conversationDataPath_ / "fetched"; sendingPath_ = conversationDataPath_ / "sending"; diff --git a/src/jamidht/conversation_module.cpp b/src/jamidht/conversation_module.cpp index cf9b219af6..04d907e4c5 100644 --- a/src/jamidht/conversation_module.cpp +++ b/src/jamidht/conversation_module.cpp @@ -95,11 +95,11 @@ struct SyncedConversation pending.reset(); } - std::vector<std::map<std::string, std::string>> getMembers(bool includeBanned = false) const + std::vector<std::map<std::string, std::string>> getMembers(bool includeLeft, bool includeBanned) const { // conversation mtx must be locked if (conversation) - return conversation->getMembers(true, true, includeBanned); + return conversation->getMembers(true, includeLeft, includeBanned); // If we're cloning, we can return the initial members std::vector<std::map<std::string, std::string>> result; result.reserve(info.members.size()); @@ -830,7 +830,7 @@ ConversationModule::Impl::getConversationMembers(const std::string& conversation bool includeBanned) const { return withConv(conversationId, - [&](const auto& conv) { return conv.getMembers(includeBanned); }); + [&](const auto& conv) { return conv.getMembers(true, includeBanned); }); } void @@ -885,9 +885,13 @@ ConversationModule::Impl::removeConversation(const std::string& conversationId) bool ConversationModule::Impl::removeConversationImpl(SyncedConversation& conv) { - auto members = conv.getMembers(); + auto members = conv.getMembers(false, false); auto isSyncing = !conv.conversation; - auto hasMembers = !isSyncing && !(members.size() == 1 && username_ == members[0]["uri"]); + auto hasMembers = !isSyncing // If syncing there is no member to inform + && std::find_if(members.begin(), members.end(), [&](const auto& member) { + return member.at("uri") == username_; + }) != members.end() // We must be still a member + && members.size() != 1; // If there is only ourself conv.info.removed = std::time(nullptr); if (isSyncing) conv.info.erased = std::time(nullptr); diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp index 59d3ce2e5b..f749854128 100644 --- a/src/jamidht/conversationrepository.cpp +++ b/src/jamidht/conversationrepository.cpp @@ -3382,7 +3382,7 @@ ConversationRepository::leave() // Remove related files std::filesystem::path repoPath = git_repository_workdir(repo.get()); auto crt = fmt::format("{}.crt", uri); - auto adminFile = repoPath / "admin" / crt; + auto adminFile = repoPath / "admins" / crt; auto memberFile = repoPath / "members" / crt; auto crlsPath = repoPath / "CRLs"; -- GitLab