Adapt to power level changes in room version 12
This commit is contained in:
committed by
Tobias Fella
parent
24e43d063a
commit
aa40fc84ea
@@ -100,6 +100,10 @@ QVariant UserListModel::data(const QModelIndex &index, int role) const
|
||||
return plEvent->powerLevelForUser(memberId);
|
||||
}
|
||||
if (role == PowerLevelStringRole) {
|
||||
if (m_currentRoom->roomCreatorHasUltimatePowerLevel() && m_currentRoom->isCreator(memberId)) {
|
||||
return i18nc("@info the person that created this room", "Creator");
|
||||
}
|
||||
|
||||
auto pl = m_currentRoom->currentState().get<RoomPowerLevelsEvent>();
|
||||
// User might not in the room yet, in this case pl can be nullptr.
|
||||
// e.g. When invited but user not accepted or denied the invitation.
|
||||
|
||||
@@ -536,6 +536,9 @@ bool NeoChatRoom::containsUser(const QString &userID) const
|
||||
|
||||
bool NeoChatRoom::canSendEvent(const QString &eventType) const
|
||||
{
|
||||
if (roomCreatorHasUltimatePowerLevel() && isCreator(localMember().id())) {
|
||||
return true;
|
||||
}
|
||||
auto plEvent = currentState().get<RoomPowerLevelsEvent>();
|
||||
if (!plEvent) {
|
||||
return false;
|
||||
@@ -548,6 +551,9 @@ bool NeoChatRoom::canSendEvent(const QString &eventType) const
|
||||
|
||||
bool NeoChatRoom::canSendState(const QString &eventType) const
|
||||
{
|
||||
if (roomCreatorHasUltimatePowerLevel() && isCreator(localMember().id())) {
|
||||
return true;
|
||||
}
|
||||
auto plEvent = currentState().get<RoomPowerLevelsEvent>();
|
||||
if (!plEvent) {
|
||||
return false;
|
||||
@@ -1741,4 +1747,20 @@ void NeoChatRoom::setHiddenFilter(std::function<bool(const Quotient::RoomEvent *
|
||||
NeoChatRoom::m_hiddenFilter = hiddenFilter;
|
||||
}
|
||||
|
||||
bool NeoChatRoom::roomCreatorHasUltimatePowerLevel() const
|
||||
{
|
||||
bool ok = false;
|
||||
auto version = this->version().toInt(&ok);
|
||||
// This is terrible. For non-numeric room versions, I don't think there's a way of knowing whether they're pre- or post hydra.
|
||||
// We just assume they are. Shouldn't matter for normal users anyway.
|
||||
return !ok || version > 11;
|
||||
}
|
||||
|
||||
bool NeoChatRoom::isCreator(const QString &userId) const
|
||||
{
|
||||
auto createEvent = currentState().get<RoomCreateEvent>();
|
||||
return roomCreatorHasUltimatePowerLevel() && createEvent
|
||||
&& (createEvent->senderId() == userId || createEvent->contentPart<QStringList>(u"additional_creators"_s).contains(userId));
|
||||
}
|
||||
|
||||
#include "moc_neochatroom.cpp"
|
||||
|
||||
@@ -589,6 +589,18 @@ public:
|
||||
|
||||
static void setHiddenFilter(std::function<bool(const Quotient::RoomEvent *)> hiddenFilter);
|
||||
|
||||
/**
|
||||
* @brief Whether this room has a room version where the creator is treated as having an ultimate power level
|
||||
*
|
||||
* For unusual room versions, this information might be wrong.
|
||||
*/
|
||||
bool roomCreatorHasUltimatePowerLevel() const;
|
||||
|
||||
/**
|
||||
* @brief Whether this user is considered a creator of this room. Only applies to post-v12 rooms.
|
||||
*/
|
||||
bool isCreator(const QString &userId) const;
|
||||
|
||||
private:
|
||||
bool m_visible = false;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user