Reimplement sending basic text messages

This commit is contained in:
Nicolas Werner 2019-09-11 00:00:04 +02:00
parent a1c97fc8d6
commit a7595eab5a
3 changed files with 69 additions and 2 deletions

View File

@ -7,6 +7,9 @@
#include <QDate> #include <QDate>
#include <QHash> #include <QHash>
#include "Logging.h"
#include "MatrixClient.h"
namespace qml_mtx_events { namespace qml_mtx_events {
Q_NAMESPACE Q_NAMESPACE
@ -110,6 +113,8 @@ public:
Q_INVOKABLE void viewRawMessage(QString id) const; Q_INVOKABLE void viewRawMessage(QString id) const;
void addEvents(const mtx::responses::Timeline &events); void addEvents(const mtx::responses::Timeline &events);
template<class T>
void sendMessage(const T &msg);
public slots: public slots:
void fetchHistory(); void fetchHistory();
@ -121,6 +126,8 @@ private slots:
signals: signals:
void oldMessagesRetrieved(const mtx::responses::Messages &res); 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: private:
DecryptionResult decryptEvent( DecryptionResult decryptEvent(
@ -139,3 +146,25 @@ private:
QHash<QString, QColor> userColors; 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());
});
}

View File

@ -62,3 +62,41 @@ TimelineViewManager::initWithMessages(const std::map<QString, mtx::responses::Ti
models.value(e.first)->addEvents(e.second); 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);
}

View File

@ -46,8 +46,8 @@ public slots:
void setHistoryView(const QString &room_id); void setHistoryView(const QString &room_id);
void queueTextMessage(const QString &msg) {} void queueTextMessage(const QString &msg);
void queueReplyMessage(const QString &reply, const RelatedInfo &related) {} void queueReplyMessage(const QString &reply, const RelatedInfo &related);
void queueEmoteMessage(const QString &msg) {} void queueEmoteMessage(const QString &msg) {}
void queueImageMessage(const QString &roomid, void queueImageMessage(const QString &roomid,
const QString &filename, const QString &filename,