From a7595eab5a6fdcde80b9989f65de1801afad3d3d Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
Date: Wed, 11 Sep 2019 00:00:04 +0200
Subject: [PATCH] Reimplement sending basic text messages

---
 src/timeline2/TimelineModel.h         | 29 ++++++++++++++++++++
 src/timeline2/TimelineViewManager.cpp | 38 +++++++++++++++++++++++++++
 src/timeline2/TimelineViewManager.h   |  4 +--
 3 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/src/timeline2/TimelineModel.h b/src/timeline2/TimelineModel.h
index ca8d4ad63..59321119c 100644
--- a/src/timeline2/TimelineModel.h
+++ b/src/timeline2/TimelineModel.h
@@ -7,6 +7,9 @@
 #include <QDate>
 #include <QHash>
 
+#include "Logging.h"
+#include "MatrixClient.h"
+
 namespace qml_mtx_events {
 Q_NAMESPACE
 
@@ -110,6 +113,8 @@ public:
         Q_INVOKABLE void viewRawMessage(QString id) const;
 
         void addEvents(const mtx::responses::Timeline &events);
+        template<class T>
+        void sendMessage(const T &msg);
 
 public slots:
         void fetchHistory();
@@ -121,6 +126,8 @@ private slots:
 
 signals:
         void oldMessagesRetrieved(const mtx::responses::Messages &res);
+        void messageFailed(const std::string txn_id);
+        void messageSent(const std::string txn_id, std::string event_id);
 
 private:
         DecryptionResult decryptEvent(
@@ -139,3 +146,25 @@ private:
 
         QHash<QString, QColor> userColors;
 };
+
+template<class T>
+void
+TimelineModel::sendMessage(const T &msg)
+{
+        auto txn_id = http::client()->generate_txn_id();
+        http::client()->send_room_message<T, mtx::events::EventType::RoomMessage>(
+          room_id_.toStdString(),
+          txn_id,
+          msg,
+          [this, txn_id](const mtx::responses::EventId &res, mtx::http::RequestErr err) {
+                  if (err) {
+                          const int status_code = static_cast<int>(err->status_code);
+                          nhlog::net()->warn("[{}] failed to send message: {} {}",
+                                             txn_id,
+                                             err->matrix_error.error,
+                                             status_code);
+                          emit messageFailed(txn_id);
+                  }
+                  emit messageSent(txn_id, res.event_id.to_string());
+          });
+}
diff --git a/src/timeline2/TimelineViewManager.cpp b/src/timeline2/TimelineViewManager.cpp
index eb9bea54d..6aa2ff43f 100644
--- a/src/timeline2/TimelineViewManager.cpp
+++ b/src/timeline2/TimelineViewManager.cpp
@@ -62,3 +62,41 @@ TimelineViewManager::initWithMessages(const std::map<QString, mtx::responses::Ti
                 models.value(e.first)->addEvents(e.second);
         }
 }
+
+void
+TimelineViewManager::queueTextMessage(const QString &msg)
+{
+        mtx::events::msg::Text text = {};
+        text.body                   = msg.trimmed().toStdString();
+        text.format                 = "org.matrix.custom.html";
+        text.formatted_body         = utils::markdownToHtml(msg).toStdString();
+
+        if (timeline_)
+                timeline_->sendMessage(text);
+}
+
+void
+TimelineViewManager::queueReplyMessage(const QString &reply, const RelatedInfo &related)
+{
+        mtx::events::msg::Text text = {};
+
+        QString body;
+        bool firstLine = true;
+        for (const auto &line : related.quoted_body.splitRef("\n")) {
+                if (firstLine) {
+                        firstLine = false;
+                        body      = QString("> <%1> %2\n").arg(related.quoted_user).arg(line);
+                } else {
+                        body = QString("%1\n> %2\n").arg(body).arg(line);
+                }
+        }
+
+        text.body   = QString("%1\n%2").arg(body).arg(reply).toStdString();
+        text.format = "org.matrix.custom.html";
+        text.formatted_body =
+          utils::getFormattedQuoteBody(related, utils::markdownToHtml(reply)).toStdString();
+        text.relates_to.in_reply_to.event_id = related.related_event;
+
+        if (timeline_)
+                timeline_->sendMessage(text);
+}
diff --git a/src/timeline2/TimelineViewManager.h b/src/timeline2/TimelineViewManager.h
index 1bec87460..7ec0da5f9 100644
--- a/src/timeline2/TimelineViewManager.h
+++ b/src/timeline2/TimelineViewManager.h
@@ -46,8 +46,8 @@ public slots:
 
         void setHistoryView(const QString &room_id);
 
-        void queueTextMessage(const QString &msg) {}
-        void queueReplyMessage(const QString &reply, const RelatedInfo &related) {}
+        void queueTextMessage(const QString &msg);
+        void queueReplyMessage(const QString &reply, const RelatedInfo &related);
         void queueEmoteMessage(const QString &msg) {}
         void queueImageMessage(const QString &roomid,
                                const QString &filename,
-- 
GitLab