diff --git a/src/jamidht/conversation.cpp b/src/jamidht/conversation.cpp index 176b60f5251e81b906abcf8f0fdea54e0d306687..c6cbce985e0f2095b7b8ec1d5f377e3e571c6dd5 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 104947e23991d730f138196d0c71b3f82ca5106e..6d8b48ed435e031da46831f5ccdbb15612c97886 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 8e33f63913bb0055ee8c023002d2f3eb81fb1aef..e8a49f4bef4a532d42a5d17da985ce261b3cfd0d 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