diff --git a/src/ui/RoomSettings.cpp b/src/ui/RoomSettings.cpp
index 97c7cd61..769f2c8d 100644
--- a/src/ui/RoomSettings.cpp
+++ b/src/ui/RoomSettings.cpp
@@ -74,6 +74,11 @@ RoomSettings::RoomSettings(QString roomid, QObject *parent)
guestRules_ = info_.guest_access ? AccessState::CanJoin : AccessState::Forbidden;
emit accessJoinRulesChanged();
+ if (auto ev = cache::client()->getStateEvent<mtx::events::state::HistoryVisibility>(
+ roomid_.toStdString())) {
+ this->historyVisibility_ = ev->content.history_visibility;
+ }
+
this->allowedRoomsModel = new RoomSettingsAllowedRoomsModel(this);
}
@@ -151,6 +156,22 @@ RoomSettings::notifications()
return notifications_;
}
+RoomSettings::Visibility
+RoomSettings::historyVisibility() const
+{
+ switch (this->historyVisibility_) {
+ case mtx::events::state::Visibility::WorldReadable:
+ return WorldReadable;
+ case mtx::events::state::Visibility::Joined:
+ return Joined;
+ case mtx::events::state::Visibility::Invited:
+ return Invited;
+ case mtx::events::state::Visibility::Shared:
+ return Shared;
+ }
+ return Shared;
+}
+
bool
RoomSettings::privateAccess() const
{
@@ -279,6 +300,20 @@ RoomSettings::canChangeAvatar() const
}
bool
+RoomSettings::canChangeHistoryVisibility() const
+{
+ try {
+ return cache::hasEnoughPowerLevel({EventType::RoomHistoryVisibility},
+ roomid_.toStdString(),
+ utils::localUser().toStdString());
+ } catch (const lmdb::error &e) {
+ nhlog::db()->warn("lmdb error: {}", e.what());
+ }
+
+ return false;
+}
+
+bool
RoomSettings::isEncryptionEnabled() const
{
return usesEncryption_;
@@ -458,6 +493,52 @@ RoomSettings::changeName(const QString &name)
}
void
+RoomSettings::changeHistoryVisibility(Visibility value)
+{
+ auto tempVis = mtx::events::state::Visibility::Shared;
+
+ switch (value) {
+ case WorldReadable:
+ tempVis = mtx::events::state::Visibility::WorldReadable;
+ break;
+ case Joined:
+ tempVis = mtx::events::state::Visibility::Joined;
+ break;
+ case Invited:
+ tempVis = mtx::events::state::Visibility::Invited;
+ break;
+ case Shared:
+ tempVis = mtx::events::state::Visibility::Shared;
+ break;
+ default:
+ return;
+ }
+
+ using namespace mtx::events;
+ auto proxy = std::make_shared<ThreadProxy>();
+ connect(proxy.get(), &ThreadProxy::eventSent, this, [this, tempVis]() {
+ this->historyVisibility_ = tempVis;
+ emit historyVisibilityChanged();
+ });
+ connect(proxy.get(), &ThreadProxy::error, this, &RoomSettings::displayError);
+
+ state::HistoryVisibility body;
+ body.history_visibility = tempVis;
+
+ http::client()->send_state_event(
+ roomid_.toStdString(),
+ body,
+ [proxy](const mtx::responses::EventId &, mtx::http::RequestErr err) {
+ if (err) {
+ emit proxy->error(QString::fromStdString(err->matrix_error.error));
+ return;
+ }
+
+ emit proxy->eventSent();
+ });
+}
+
+void
RoomSettings::changeTopic(const QString &topic)
{
// Check if the values are changed from the originals.
|