part of "pangea_room_extension.dart"; extension UserPermissionsRoomExtension on Room { // If there are no other admins, and at least one non-admin, return true Future _isOnlyAdmin() async { if (!isRoomAdmin) { return false; } final List participants = await requestParticipants(); return ((participants .where( (e) => e.powerLevel == ClassDefaultValues.powerLevelOfAdmin && e.id != BotName.byEnvironment, ) .toList() .length) == 1) && (participants .where( (e) => e.powerLevel < ClassDefaultValues.powerLevelOfAdmin && e.id != BotName.byEnvironment, ) .toList()) .isNotEmpty; } 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, {bool spaceMode = false}) { if (!isSpace) { ErrorHandler.logError( m: "should not call canIAddSpaceChildren on non-space room. Room id: $id", data: toJson(), s: StackTrace.current, ); return false; } final isSpaceAdmin = isRoomAdmin; final isChildRoomAdmin = room?.isRoomAdmin ?? true; // if user is not admin of child room, return false if (!isChildRoomAdmin) return false; // if the child room is a space, or will be a space, // then the user must be an admin of the parent space if (room?.isSpace ?? spaceMode) return isSpaceAdmin; // otherwise, the user can add the child room to the parent // if they're the admin of the parent or if the parent creation // of group chats return isSpaceAdmin || (pangeaRoomRules?.isCreateRooms ?? 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('events') ?.tryGet(eventType) ?? 100; return ownPowerLevel >= pl; } int? get _eventsDefaultPowerLevel => getState(EventTypes.RoomPowerLevels) ?.content .tryGet('events_default'); }