You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
fluffychat/lib/pangea/extensions/pangea_room_extension/user_permissions_extension....

108 lines
2.9 KiB
Dart

part of "pangea_room_extension.dart";
extension PangeaRoom7 on Room {
bool _isMadeByUser(String userId) =>
getState(EventTypes.RoomCreate)?.senderId == userId;
//if the user is an admin of the room or any immediate parent of the room
//Question: check parents of parents?
//check logic
bool get _isSpaceAdmin {
if (isSpace) return _isRoomAdmin;
for (final parent in pangeaSpaceParents) {
if (parent._isRoomAdmin) {
return true;
}
}
for (final parent in pangeaSpaceParents) {
for (final parent2 in parent.pangeaSpaceParents) {
if (parent2._isRoomAdmin) {
return true;
}
}
}
return false;
}
bool _isUserRoomAdmin(String userId) => getParticipants().any(
(e) =>
e.id == userId &&
e.powerLevel == ClassDefaultValues.powerLevelOfAdmin,
);
bool _isUserSpaceAdmin(String userId) {
if (isSpace) return isUserRoomAdmin(userId);
for (final parent in pangeaSpaceParents) {
if (parent.isUserRoomAdmin(userId)) {
return true;
}
}
return false;
}
bool get _isRoomOwner =>
getState(EventTypes.RoomCreate)?.senderId == client.userID;
bool get _isRoomAdmin =>
ownPowerLevel == ClassDefaultValues.powerLevelOfAdmin;
bool get _showClassEditOptions => isSpace && isRoomAdmin;
bool get _canDelete => isSpaceAdmin;
bool _canIAddSpaceChild(Room? room) {
if (!isSpace) {
ErrorHandler.logError(
m: "should not call canIAddSpaceChildren on non-space room",
data: toJson(),
s: StackTrace.current,
);
return false;
}
if (room != null && !room._isRoomAdmin) {
return false;
}
if (!pangeaCanSendEvent(EventTypes.spaceChild) && !_isRoomAdmin) {
return false;
}
if (room == null) {
return isRoomAdmin || (pangeaRoomRules?.isCreateRooms ?? false);
}
if (room.isExchange) {
return isRoomAdmin;
}
if (!room.isSpace) {
return pangeaRoomRules?.isCreateRooms ?? false;
}
if (room.isPangeaClass) {
ErrorHandler.logError(
m: "should not call canIAddSpaceChild with class",
data: room.toJson(),
s: StackTrace.current,
);
return false;
}
return false;
}
bool get _canIAddSpaceParents =>
_isRoomAdmin || pangeaCanSendEvent(EventTypes.spaceParent);
//overriding the default canSendEvent to check power levels
bool _pangeaCanSendEvent(String eventType) {
final powerLevelsMap = getState(EventTypes.RoomPowerLevels)?.content;
if (powerLevelsMap == null) return 0 <= ownPowerLevel;
final pl = powerLevelsMap
.tryGetMap<String, dynamic>('events')
?.tryGet<int>(eventType) ??
100;
return ownPowerLevel >= pl;
}
int? get _eventsDefaultPowerLevel => getState(EventTypes.RoomPowerLevels)
?.content
.tryGet<int>('events_default');
}