diff --git a/imports/NeoChat/Component/ChatTextInput.qml b/imports/NeoChat/Component/ChatTextInput.qml
index 23c6520a1..29249dc3c 100644
--- a/imports/NeoChat/Component/ChatTextInput.qml
+++ b/imports/NeoChat/Component/ChatTextInput.qml
@@ -469,9 +469,14 @@ ToolBar {
autoCompleteEndPosition = cursorPosition
}
+ // store each user we autoComplete here, this will be helpful later to generate
+ // the matrix.to links.
+ // This use an hack to define: https://doc.qt.io/qt-5/qml-var.html#property-value-initialization-semantics
+ property var userAutocompleted: ({})
+
function postMessage() {
roomManager.actionsHandler.postMessage(inputField.text.trim(), attachmentPath,
- replyEventID, editEventId);
+ replyEventID, editEventId, inputField.userAutocompleted);
clearAttachment();
currentRoom.markAllMessagesAsRead();
clear();
@@ -482,6 +487,10 @@ ToolBar {
function autoComplete() {
documentHandler.replaceAutoComplete(autoCompleteListView.currentItem.displayText)
+ // Unfortunally it doesn't
+ if (!autoCompleteListView.currentItem.isEmoji) {
+ inputField.userAutocompleted[autoCompleteListView.currentItem.displayText] = autoCompleteListView.currentItem.userId;
+ }
}
}
}
@@ -574,6 +583,7 @@ ToolBar {
function clear() {
inputField.clear()
+ inputField.userAutocompleted = {};
}
function clearEditReply() {
diff --git a/src/actionshandler.cpp b/src/actionshandler.cpp
index 35fd314e1..6bf18ec24 100644
--- a/src/actionshandler.cpp
+++ b/src/actionshandler.cpp
@@ -159,15 +159,16 @@ void ActionsHandler::createRoom(const QString &name, const QString &topic)
}
void ActionsHandler::postMessage(const QString &text,
- const QString &attachementPath, const QString &replyEventId, const QString &editEventId)
+ const QString &attachementPath, const QString &replyEventId, const QString &editEventId,
+ const QVariantMap usernames)
{
QString rawText = text;
QString cleanedText = text;
- for (const auto *user : m_room->users()) {
- const auto displayName = user->displayname(m_room);
- cleanedText = cleanedText.replace(displayName,
- "[" + displayName + "](https://matrix.to/#/" + user->id() + ")");
+ for (const auto username : usernames.keys()) {
+ const auto replacement = usernames.value(username);
+ cleanedText = cleanedText.replace(username,
+ "[" + username + "](https://matrix.to/#/" + replacement.toString() + ")");
}
if (attachementPath.length() > 0) {
@@ -270,6 +271,9 @@ void ActionsHandler::postMessage(const QString &text,
if (rawText.indexOf(partPrefix) == 0) {
rawText = rawText.remove(0, partPrefix.length());
const QStringList splittedText = rawText.split(" ");
+ qDebug() << m_room;
+ qDebug() << "m_room";
+ qDebug() << splittedText;
if (splittedText.count() == 0 || splittedText[0].isEmpty()) {
// leave current room
m_connection->leaveRoom(m_room);
diff --git a/src/actionshandler.h b/src/actionshandler.h
index caf80f695..9df180920 100644
--- a/src/actionshandler.h
+++ b/src/actionshandler.h
@@ -70,7 +70,8 @@ public Q_SLOTS:
///
/// This also interprets commands if any.
void postMessage(const QString &text, const QString &attachementPath,
- const QString &replyEventId, const QString &editEventId);
+ const QString &replyEventId, const QString &editEventId,
+ const QVariantMap usernames);
private:
Connection *m_connection = nullptr;
diff --git a/src/neochatroom.cpp b/src/neochatroom.cpp
index d720a5973..00f0756ee 100644
--- a/src/neochatroom.cpp
+++ b/src/neochatroom.cpp
@@ -99,6 +99,7 @@ void NeoChatRoom::uploadFile(const QUrl &url, const QString &body)
});
connect(this, &Room::fileTransferProgress, [=](const QString &id, qint64 progress, qint64 total) {
if (id == txnId) {
+ qDebug() << "Progress:" << progress << total;
setFileUploadingProgress(int(float(progress) / float(total) * 100));
}
});
@@ -535,7 +536,9 @@ void NeoChatRoom::postMessage(const QString &text, MessageEventType type, const
void NeoChatRoom::postHtmlMessage(const QString &text, const QString &html, MessageEventType type, const QString &replyEventId, const QString &relateToEventId)
{
- bool isRichText = Qt::mightBeRichText(html);
+ QString htmlWithLinks = html;
+ htmlWithLinks = htmlWithLinks.replace(QRegularExpression("@([^: ]*):([^ ]*\\.[^ ]*)"), "@$1:$2");
+ bool isRichText = Qt::mightBeRichText(htmlWithLinks);
bool isReply = !replyEventId.isEmpty();
bool isEdit = !relateToEventId.isEmpty();
const auto replyIt = findInTimeline(replyEventId);
@@ -548,15 +551,11 @@ void NeoChatRoom::postHtmlMessage(const QString &text, const QString &html, Mess
QJsonObject json {
{"type", "m.room.message"},
{"msgtype", msgTypeToString(type)},
- {"body", "* " + text},
- {"format", "org.matrix.custom.html"},
- {"formatted_body", html},
+ {"body", "* " + (isRichText ? text : htmlWithLinks)},
{"m.new_content",
QJsonObject {
- {"body", text},
- {"msgtype", msgTypeToString(type)},
- {"format", "org.matrix.custom.html"},
- {"formatted_body", html}
+ {"body", (isRichText ? text : htmlWithLinks)},
+ {"msgtype", msgTypeToString(type)}
}
},
{"m.relates_to",
@@ -595,7 +594,7 @@ void NeoChatRoom::postHtmlMessage(const QString &text, const QString &html, Mess
"\">In reply to " + replyEvt.senderId() +
"
" + eventToString(replyEvt, Qt::RichText) +
- "" + (isRichText ? html : text)
+ "" + (isRichText ? htmlWithLinks : text)
}
};
// clang-format on