mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 11:00:48 +03:00
Hide the edit menu when the user doesn't have enough power
This commit is contained in:
parent
340c9ab9de
commit
791a9d0a4d
5 changed files with 93 additions and 20 deletions
|
@ -21,7 +21,7 @@ ExternalProject_Add(
|
||||||
MatrixStructs
|
MatrixStructs
|
||||||
|
|
||||||
GIT_REPOSITORY https://github.com/mujx/matrix-structs
|
GIT_REPOSITORY https://github.com/mujx/matrix-structs
|
||||||
GIT_TAG 55a1a5aad0ead3cc45475fc1aed1bf54a56e352c
|
GIT_TAG ddba5a597be4bafd20e1dd37e5e7b7dc798b0997
|
||||||
|
|
||||||
BUILD_IN_SOURCE 1
|
BUILD_IN_SOURCE 1
|
||||||
SOURCE_DIR ${MATRIX_STRUCTS_ROOT}
|
SOURCE_DIR ${MATRIX_STRUCTS_ROOT}
|
||||||
|
|
|
@ -206,6 +206,12 @@ public:
|
||||||
bool isFormatValid();
|
bool isFormatValid();
|
||||||
void setCurrentFormat();
|
void setCurrentFormat();
|
||||||
|
|
||||||
|
//! Check if the given user has power leve greater than than
|
||||||
|
//! lowest power level of the given events.
|
||||||
|
bool hasEnoughPowerLevel(const std::vector<mtx::events::EventType> &eventTypes,
|
||||||
|
const std::string &room_id,
|
||||||
|
const std::string &user_id);
|
||||||
|
|
||||||
//! Retrieves the saved room avatar.
|
//! Retrieves the saved room avatar.
|
||||||
QImage getRoomAvatar(const QString &id);
|
QImage getRoomAvatar(const QString &id);
|
||||||
QImage getRoomAvatar(const std::string &id);
|
QImage getRoomAvatar(const std::string &id);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
class FlatButton;
|
class FlatButton;
|
||||||
class TextField;
|
class TextField;
|
||||||
|
class QHBoxLayout;
|
||||||
class Avatar;
|
class Avatar;
|
||||||
class QPixmap;
|
class QPixmap;
|
||||||
class QLayout;
|
class QLayout;
|
||||||
|
@ -91,6 +92,11 @@ private:
|
||||||
static constexpr int AvatarSize = 64;
|
static constexpr int AvatarSize = 64;
|
||||||
|
|
||||||
void setAvatar(const QImage &img) { avatarImg_ = img; }
|
void setAvatar(const QImage &img) { avatarImg_ = img; }
|
||||||
|
void setupEditButton();
|
||||||
|
|
||||||
|
//! Whether the user would be able to change the name or the topic of the room.
|
||||||
|
bool hasEditRights_ = true;
|
||||||
|
QHBoxLayout *editLayout_;
|
||||||
|
|
||||||
// Button section
|
// Button section
|
||||||
FlatButton *saveBtn_;
|
FlatButton *saveBtn_;
|
||||||
|
|
39
src/Cache.cc
39
src/Cache.cc
|
@ -15,6 +15,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
|
@ -1223,6 +1224,44 @@ Cache::isNotificationSent(const std::string &event_id)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Cache::hasEnoughPowerLevel(const std::vector<mtx::events::EventType> &eventTypes,
|
||||||
|
const std::string &room_id,
|
||||||
|
const std::string &user_id)
|
||||||
|
{
|
||||||
|
using namespace mtx::events;
|
||||||
|
using namespace mtx::events::state;
|
||||||
|
|
||||||
|
auto txn = lmdb::txn::begin(env_);
|
||||||
|
auto db = getStatesDb(txn, room_id);
|
||||||
|
|
||||||
|
uint16_t min_event_level = std::numeric_limits<uint16_t>::max();
|
||||||
|
uint16_t user_level = std::numeric_limits<uint16_t>::min();
|
||||||
|
|
||||||
|
lmdb::val event;
|
||||||
|
bool res = lmdb::dbi_get(txn, db, lmdb::val(to_string(EventType::RoomPowerLevels)), event);
|
||||||
|
|
||||||
|
if (res) {
|
||||||
|
try {
|
||||||
|
StateEvent<PowerLevels> msg =
|
||||||
|
json::parse(std::string(event.data(), event.size()));
|
||||||
|
|
||||||
|
user_level = msg.content.user_level(user_id);
|
||||||
|
|
||||||
|
for (const auto &ty : eventTypes)
|
||||||
|
min_event_level =
|
||||||
|
std::min(min_event_level,
|
||||||
|
(uint16_t)msg.content.state_level(to_string(ty)));
|
||||||
|
} catch (const json::exception &e) {
|
||||||
|
qWarning() << "hasEnoughPowerLevel: " << e.what();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
txn.commit();
|
||||||
|
|
||||||
|
return user_level >= min_event_level;
|
||||||
|
}
|
||||||
|
|
||||||
QHash<QString, QString> Cache::DisplayNames;
|
QHash<QString, QString> Cache::DisplayNames;
|
||||||
QHash<QString, QString> Cache::AvatarUrls;
|
QHash<QString, QString> Cache::AvatarUrls;
|
||||||
|
|
||||||
|
|
|
@ -11,11 +11,13 @@
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QPixmap>
|
#include <QPixmap>
|
||||||
|
#include <QSettings>
|
||||||
#include <QSharedPointer>
|
#include <QSharedPointer>
|
||||||
#include <QStyleOption>
|
#include <QStyleOption>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
using namespace dialogs;
|
using namespace dialogs;
|
||||||
|
using namespace mtx::events;
|
||||||
|
|
||||||
EditModal::EditModal(const QString &roomId, QWidget *parent)
|
EditModal::EditModal(const QString &roomId, QWidget *parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
|
@ -86,7 +88,7 @@ EditModal::EditModal(const QString &roomId, QWidget *parent)
|
||||||
&StateEventProxy::stateEventSent,
|
&StateEventProxy::stateEventSent,
|
||||||
this,
|
this,
|
||||||
[this, proxy, newName]() {
|
[this, proxy, newName]() {
|
||||||
proxy->deleteLater();
|
Q_UNUSED(proxy);
|
||||||
errorField_->hide();
|
errorField_->hide();
|
||||||
emit nameChanged(newName);
|
emit nameChanged(newName);
|
||||||
close();
|
close();
|
||||||
|
@ -96,7 +98,7 @@ EditModal::EditModal(const QString &roomId, QWidget *parent)
|
||||||
&StateEventProxy::stateEventError,
|
&StateEventProxy::stateEventError,
|
||||||
this,
|
this,
|
||||||
[this, proxy, newName](const QString &msg) {
|
[this, proxy, newName](const QString &msg) {
|
||||||
proxy->deleteLater();
|
Q_UNUSED(proxy);
|
||||||
errorField_->setText(msg);
|
errorField_->setText(msg);
|
||||||
errorField_->show();
|
errorField_->show();
|
||||||
});
|
});
|
||||||
|
@ -113,7 +115,7 @@ EditModal::EditModal(const QString &roomId, QWidget *parent)
|
||||||
&StateEventProxy::stateEventSent,
|
&StateEventProxy::stateEventSent,
|
||||||
this,
|
this,
|
||||||
[this, proxy, newTopic]() {
|
[this, proxy, newTopic]() {
|
||||||
proxy->deleteLater();
|
Q_UNUSED(proxy);
|
||||||
errorField_->hide();
|
errorField_->hide();
|
||||||
close();
|
close();
|
||||||
});
|
});
|
||||||
|
@ -122,7 +124,7 @@ EditModal::EditModal(const QString &roomId, QWidget *parent)
|
||||||
&StateEventProxy::stateEventError,
|
&StateEventProxy::stateEventError,
|
||||||
this,
|
this,
|
||||||
[this, proxy, newTopic](const QString &msg) {
|
[this, proxy, newTopic](const QString &msg) {
|
||||||
proxy->deleteLater();
|
Q_UNUSED(proxy);
|
||||||
errorField_->setText(msg);
|
errorField_->setText(msg);
|
||||||
errorField_->show();
|
errorField_->show();
|
||||||
});
|
});
|
||||||
|
@ -242,9 +244,43 @@ RoomSettings::RoomSettings(const QString &room_id, QWidget *parent)
|
||||||
auto menuLabel = new QLabel("Room Settings", this);
|
auto menuLabel = new QLabel("Room Settings", this);
|
||||||
menuLabel->setFont(font);
|
menuLabel->setFont(font);
|
||||||
|
|
||||||
|
topSection_ = new TopSection(info_, avatarImg_, this);
|
||||||
|
|
||||||
|
editLayout_ = new QHBoxLayout;
|
||||||
|
editLayout_->setMargin(0);
|
||||||
|
editLayout_->addWidget(topSection_);
|
||||||
|
|
||||||
|
setupEditButton();
|
||||||
|
|
||||||
|
layout->addWidget(menuLabel);
|
||||||
|
layout->addLayout(editLayout_);
|
||||||
|
layout->addLayout(notifOptionLayout_);
|
||||||
|
layout->addLayout(accessOptionLayout);
|
||||||
|
layout->addLayout(btnLayout);
|
||||||
|
|
||||||
|
connect(cancelBtn_, &QPushButton::clicked, this, &RoomSettings::closing);
|
||||||
|
connect(saveBtn_, &QPushButton::clicked, this, &RoomSettings::saveSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RoomSettings::setupEditButton()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
QSettings settings;
|
||||||
|
auto userId = settings.value("auth/user_id").toString().toStdString();
|
||||||
|
|
||||||
|
hasEditRights_ = cache::client()->hasEnoughPowerLevel(
|
||||||
|
{EventType::RoomName, EventType::RoomTopic}, room_id_.toStdString(), userId);
|
||||||
|
} catch (const lmdb::error &e) {
|
||||||
|
qWarning() << "lmdb error" << e.what();
|
||||||
|
}
|
||||||
|
|
||||||
constexpr int buttonSize = 36;
|
constexpr int buttonSize = 36;
|
||||||
constexpr int iconSize = buttonSize / 2;
|
constexpr int iconSize = buttonSize / 2;
|
||||||
|
|
||||||
|
if (!hasEditRights_)
|
||||||
|
return;
|
||||||
|
|
||||||
QIcon editIcon;
|
QIcon editIcon;
|
||||||
editIcon.addFile(":/icons/icons/ui/edit.svg");
|
editIcon.addFile(":/icons/icons/ui/edit.svg");
|
||||||
editFieldsBtn_ = new FlatButton(this);
|
editFieldsBtn_ = new FlatButton(this);
|
||||||
|
@ -264,21 +300,7 @@ RoomSettings::RoomSettings(const QString &room_id, QWidget *parent)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
topSection_ = new TopSection(info_, avatarImg_, this);
|
editLayout_->addWidget(editFieldsBtn_, 0, Qt::AlignRight | Qt::AlignTop);
|
||||||
|
|
||||||
auto editLayout = new QHBoxLayout;
|
|
||||||
editLayout->setMargin(0);
|
|
||||||
editLayout->addWidget(topSection_);
|
|
||||||
editLayout->addWidget(editFieldsBtn_, 0, Qt::AlignRight | Qt::AlignTop);
|
|
||||||
|
|
||||||
layout->addWidget(menuLabel);
|
|
||||||
layout->addLayout(editLayout);
|
|
||||||
layout->addLayout(notifOptionLayout_);
|
|
||||||
layout->addLayout(accessOptionLayout);
|
|
||||||
layout->addLayout(btnLayout);
|
|
||||||
|
|
||||||
connect(cancelBtn_, &QPushButton::clicked, this, &RoomSettings::closing);
|
|
||||||
connect(saveBtn_, &QPushButton::clicked, this, &RoomSettings::saveSettings);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in a new issue