diff --git a/imports/Spectral/Dialog/RoomSettingsDialog.qml b/imports/Spectral/Dialog/RoomSettingsDialog.qml
index 4919c751f..b9a216914 100644
--- a/imports/Spectral/Dialog/RoomSettingsDialog.qml
+++ b/imports/Spectral/Dialog/RoomSettingsDialog.qml
@@ -9,6 +9,11 @@ import Spectral.Setting 0.1
Dialog {
property var room
+ readonly property bool canChangeAvatar: room.canSendState("m.room.avatar")
+ readonly property bool canChangeName: room.canSendState("m.room.name")
+ readonly property bool canChangeTopic: room.canSendState("m.room.topic")
+ readonly property bool canChangeCanonicalAlias: room.canSendState("m.room.canonical_alias")
+
anchors.centerIn: parent
width: 480
@@ -36,6 +41,8 @@ Dialog {
circular: true
+ enabled: canChangeAvatar
+
onClicked: {
var fileDialog = openFileDialog.createObject(ApplicationWindow.overlay)
@@ -61,6 +68,8 @@ Dialog {
text: room.name
placeholderText: "Room Name"
+
+ enabled: canChangeName
}
AutoTextField {
@@ -70,6 +79,8 @@ Dialog {
text: room.topic
placeholderText: "Room Topic"
+
+ enabled: canChangeTopic
}
}
}
@@ -179,6 +190,8 @@ Dialog {
Button {
Layout.alignment: Qt.AlignRight
+ visible: canChangeName || canChangeTopic
+
text: "Save"
highlighted: true
@@ -216,6 +229,8 @@ Dialog {
id: canonicalAliasComboBox
+ enabled: canChangeCanonicalAlias
+
model: room.remoteAliases
currentIndex: room.remoteAliases.indexOf(room.canonicalAlias)
@@ -275,6 +290,42 @@ Dialog {
}
}
}
+
+ RowLayout {
+ Layout.fillWidth: true
+
+ Label {
+ Layout.preferredWidth: 100
+ Layout.alignment: Qt.AlignTop
+
+ wrapMode: Label.Wrap
+ text: "Remote Aliases"
+ color: MPalette.lighter
+ }
+
+ ColumnLayout {
+ Layout.fillWidth: true
+
+ spacing: 0
+
+ Repeater {
+ model: {
+ var localAliases = room.localAliases
+ var remoteAliases = room.remoteAliases
+ return remoteAliases.filter(n => !localAliases.includes(n))
+ }
+
+ delegate: Label {
+ width: parent.width
+
+ text: modelData
+
+ font.pixelSize: 12
+ color: MPalette.lighter
+ }
+ }
+ }
+ }
}
}
diff --git a/include/libQuotient b/include/libQuotient
index 16d670095..d4034fb12 160000
--- a/include/libQuotient
+++ b/include/libQuotient
@@ -1 +1 @@
-Subproject commit 16d6700950f5f0ebd71481efd5e1a24f04e3c651
+Subproject commit d4034fb12b189156e135dcf0fb94960a1d8e9be9
diff --git a/src/spectralroom.cpp b/src/spectralroom.cpp
index 4906ca0b4..87396c305 100644
--- a/src/spectralroom.cpp
+++ b/src/spectralroom.cpp
@@ -21,6 +21,7 @@
#include "events/reactionevent.h"
#include "events/roommessageevent.h"
#include "events/typingevent.h"
+#include "events/roompowerlevelsevent.h"
#include "jobs/downloadfilejob.h"
#include "user.h"
#include "utils.h"
@@ -487,20 +488,32 @@ void SpectralRoom::postPlainMessage(const QString& text,
if (isReply) {
const auto& replyEvt = **replyIt;
- QJsonObject json{{"msgtype", msgTypeToString(type)},
- {"body", "> <" + replyEvt.senderId() + "> " +
- eventToString(replyEvt) + "\n\n" + text},
- {"format", "org.matrix.custom.html"},
- {"m.relates_to",
- QJsonObject{{"m.in_reply_to",
- QJsonObject{{"event_id", replyEventId}}}}},
- {"formatted_body",
- "In reply to " + replyEvt.senderId() +
- "
" + eventToString(replyEvt, Qt::RichText) +
- "
" + text.toHtmlEscaped()}};
+ // clang-format off
+ QJsonObject json{
+ {"msgtype", msgTypeToString(type)},
+ {"body", "> <" + replyEvt.senderId() + "> " + eventToString(replyEvt) + "\n\n" + text},
+ {"format", "org.matrix.custom.html"},
+ {"m.relates_to",
+ {
+ {"m.in_reply_to",
+ {
+ {"event_id", replyEventId}
+ }
+ }
+ }
+ },
+ {"formatted_body",
+ "In reply to " + replyEvt.senderId() +
+ "
" + eventToString(replyEvt, Qt::RichText) +
+ "
" + text
+ }
+ };
+ // clang-format on
+
postJson("m.room.message", json);
return;
@@ -521,20 +534,32 @@ void SpectralRoom::postHtmlMessage(const QString& text,
if (isReply) {
const auto& replyEvt = **replyIt;
- QJsonObject json{{"msgtype", msgTypeToString(type)},
- {"body", "> <" + replyEvt.senderId() + "> " +
- eventToString(replyEvt) + "\n\n" + text},
- {"format", "org.matrix.custom.html"},
- {"m.relates_to",
- QJsonObject{{"m.in_reply_to",
- QJsonObject{{"event_id", replyEventId}}}}},
- {"formatted_body",
- "In reply to " + replyEvt.senderId() +
- "
" + eventToString(replyEvt, Qt::RichText) +
- "
" + html}};
+ // clang-format off
+ QJsonObject json{
+ {"msgtype", msgTypeToString(type)},
+ {"body", "> <" + replyEvt.senderId() + "> " + eventToString(replyEvt) + "\n\n" + text},
+ {"format", "org.matrix.custom.html"},
+ {"m.relates_to",
+ {
+ {"m.in_reply_to",
+ {
+ {"event_id", replyEventId}
+ }
+ }
+ }
+ },
+ {"formatted_body",
+ "In reply to " + replyEvt.senderId() +
+ "
" + eventToString(replyEvt, Qt::RichText) +
+ "
" + html
+ }
+ };
+ // clang-format on
+
postJson("m.room.message", json);
return;
@@ -588,3 +613,19 @@ bool SpectralRoom::containsUser(QString userID) const {
return Room::memberJoinState(u) != JoinState::Leave;
}
+
+bool SpectralRoom::canSendEvent(const QString& eventType) const {
+ auto plEvent = getCurrentState();
+ auto pl = plEvent->powerLevelForEvent(eventType);
+ auto currentPl = plEvent->powerLevelForUser(localUser()->id());
+
+ return currentPl >= pl;
+}
+
+bool SpectralRoom::canSendState(const QString& eventType) const {
+ auto plEvent = getCurrentState();
+ auto pl = plEvent->powerLevelForState(eventType);
+ auto currentPl = plEvent->powerLevelForUser(localUser()->id());
+
+ return currentPl >= pl;
+}
diff --git a/src/spectralroom.h b/src/spectralroom.h
index 8fd0bf8cb..308673502 100644
--- a/src/spectralroom.h
+++ b/src/spectralroom.h
@@ -75,6 +75,9 @@ class SpectralRoom : public Room {
Q_INVOKABLE bool containsUser(QString userID) const;
+ Q_INVOKABLE bool canSendEvent(const QString& eventType) const;
+ Q_INVOKABLE bool canSendState(const QString& eventType) const;
+
private:
QString m_cachedInput;
QSet highlights;