From 2438254a514b1eb3ffe8b90d5a8ac45263542a49 Mon Sep 17 00:00:00 2001
From: agsantos <aline.gondimsantos@savoirfairelinux.com>
Date: Mon, 14 Dec 2020 13:41:23 -0500
Subject: [PATCH] plugins: attach swarm and Plugins System

Change-Id: I136f5ba49f14a379ec6dce37fbd837e38d90f549
---
 src/jamidht/conversation.cpp       | 33 ++++++++++++++++++++++++++++++
 src/plugin/chatservicesmanager.cpp | 16 ++++++++++++++-
 src/plugin/streamdata.h            |  2 ++
 3 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/src/jamidht/conversation.cpp b/src/jamidht/conversation.cpp
index 176b60f525..c6cbce985e 100644
--- a/src/jamidht/conversation.cpp
+++ b/src/jamidht/conversation.cpp
@@ -29,6 +29,12 @@
 #include <opendht/thread_pool.h>
 #include <tuple>
 
+#ifdef ENABLE_PLUGIN
+#include "manager.h"
+#include "plugin/jamipluginmanager.h"
+#include "plugin/streamdata.h"
+#endif
+
 namespace jami {
 
 ConvInfo::ConvInfo(const Json::Value& json)
@@ -196,6 +202,19 @@ public:
                                 shared->getAccountID(), convId, uri, action);
                     }
                 }
+#ifdef ENABLE_PLUGIN
+                auto& pluginChatManager
+                    = jami::Manager::instance().getJamiPluginManager().getChatServicesManager();
+                std::shared_ptr<JamiMessage> cm
+                    = std::make_shared<JamiMessage>(shared->getAccountID(),
+                                                    convId,
+                                                    c.at("author") != shared->getUsername(),
+                                                    const_cast<std::map<std::string, std::string>&>(
+                                                        c),
+                                                    false);
+                cm->isSwarm = true;
+                pluginChatManager.publishMessage(cm);
+#endif
                 // announce message
                 emitSignal<DRing::ConversationSignal::MessageReceived>(shared->getAccountID(),
                                                                        convId,
@@ -244,6 +263,7 @@ Conversation::Impl::repoPath() const
 std::vector<std::map<std::string, std::string>>
 Conversation::Impl::convCommitToMap(const std::vector<ConversationCommit>& commits) const
 {
+    auto shared = account_.lock();
     std::vector<std::map<std::string, std::string>> result = {};
     for (const auto& commit : commits) {
         auto authorDevice = commit.author.email;
@@ -309,6 +329,19 @@ Conversation::Impl::convCommitToMap(const std::vector<ConversationCommit>& commi
         message["type"] = type;
         message["timestamp"] = std::to_string(commit.timestamp);
         result.emplace_back(message);
+#ifdef ENABLE_PLUGIN
+        auto& pluginChatManager
+            = jami::Manager::instance().getJamiPluginManager().getChatServicesManager();
+        std::shared_ptr<JamiMessage> cm
+            = std::make_shared<JamiMessage>(shared->getAccountID(),
+                                            repository_->id(),
+                                            authorId != shared->getUsername(),
+                                            const_cast<std::map<std::string, std::string>&>(message),
+                                            false);
+        cm->isSwarm = true;
+        cm->fromHistory = true;
+        pluginChatManager.publishMessage(cm);
+#endif
     }
     return result;
 }
diff --git a/src/plugin/chatservicesmanager.cpp b/src/plugin/chatservicesmanager.cpp
index 104947e239..6d8b48ed43 100644
--- a/src/plugin/chatservicesmanager.cpp
+++ b/src/plugin/chatservicesmanager.cpp
@@ -20,6 +20,7 @@
 #include "pluginmanager.h"
 #include "logger.h"
 #include "manager.h"
+#include "jamidht/jamiaccount.h"
 #include "fileutils.h"
 
 namespace jami {
@@ -90,7 +91,20 @@ ChatServicesManager::registerChatService(PluginManager& pluginManager)
     // sendTextMessage is a service that allows plugins to send a message in a conversation.
     auto sendTextMessage = [](const DLPlugin*, void* data) {
         auto cm = static_cast<JamiMessage*>(data);
-        jami::Manager::instance().sendTextMessage(cm->accountId, cm->peerId, cm->data, true);
+        if (const auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(
+                cm->accountId)) {
+            try {
+                if (cm->isSwarm)
+                    acc->sendMessage(cm->peerId, cm->data.at("body"));
+                else
+                    jami::Manager::instance().sendTextMessage(cm->accountId,
+                                                              cm->peerId,
+                                                              cm->data,
+                                                              true);
+            } catch (const std::exception& e) {
+                JAMI_ERR("Exception during text message sending: %s", e.what());
+            }
+        }
         return 0;
     };
 
diff --git a/src/plugin/streamdata.h b/src/plugin/streamdata.h
index 8e33f63913..e8a49f4bef 100644
--- a/src/plugin/streamdata.h
+++ b/src/plugin/streamdata.h
@@ -88,4 +88,6 @@ struct JamiMessage
     std::map<std::string, std::string> data;
     // True if message is originated from Plugin code.
     bool fromPlugin;
+    bool isSwarm {false};
+    bool fromHistory {false};
 };
\ No newline at end of file
-- 
GitLab