Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions MatrixSDK/Data/MXRoomState.h
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,11 @@ Use MXRoomSummary.displayname to get a computed room display name.
*/
- (float)memberNormalizedPowerLevel:(NSString*)userId;

/**
Returns the power level for a given user identifier, this checks also for the creator and additional creators
*/
- (NSInteger)powerLevelOfUserWithUserID:(NSString *)userId;


# pragma mark - Conference call
/**
Expand Down
81 changes: 76 additions & 5 deletions MatrixSDK/Data/MXRoomState.m
Original file line number Diff line number Diff line change
Expand Up @@ -328,21 +328,53 @@ - (NSString *)avatar
return avatar;
}

- (NSString *)roomVersion
{
NSString *roomVersion;

// Check it from the state events
MXEvent *event = [stateEvents objectForKey:kMXEventTypeStringRoomCreate].lastObject;
NSDictionary<NSString *, id> *eventContent = [self contentOfEvent:event];

if (event && eventContent)
{
MXJSONModelSetString(roomVersion, eventContent[@"room_version"]);
roomVersion = [roomVersion copy];

}
return roomVersion;
}

- (NSString *)creatorUserId
{
NSString *creatorUserId;

// Check it from the state events
MXEvent *event = [stateEvents objectForKey:kMXEventTypeStringRoomCreate].lastObject;
NSString* sender = [event sender];

if (event && sender)
{
creatorUserId = [sender copy];
}
return creatorUserId;
}

- (NSArray<NSString*> *)additionalCreators
{
NSArray<NSString*> *additionalCreators = @[];

// Check it from the state events
MXEvent *event = [stateEvents objectForKey:kMXEventTypeStringRoomCreate].lastObject;
NSDictionary<NSString *, id> *eventContent = [self contentOfEvent:event];

if (event && eventContent)
{
MXJSONModelSetString(creatorUserId, eventContent[@"creator"]);
creatorUserId = [creatorUserId copy];
MXJSONModelSetArray(additionalCreators, eventContent[@"additional_creators"]);
additionalCreators = [additionalCreators copy];

}
return creatorUserId;
return additionalCreators;
}

- (MXRoomHistoryVisibility)historyVisibility
Expand Down Expand Up @@ -601,13 +633,52 @@ - (float)memberNormalizedPowerLevel:(NSString*)userId
// Ignore banned and left (kicked) members
if (member.membership != MXMembershipLeave && member.membership != MXMembershipBan)
{
float userPowerLevelFloat = [powerLevels powerLevelOfUserWithUserID:userId];
powerLevel = maxPowerLevel ? userPowerLevelFloat / maxPowerLevel : 1;
float userPowerLevelFloat = [self powerLevelOfUserWithUserID:userId];
if (maxPowerLevel && userPowerLevelFloat >= maxPowerLevel)
{
powerLevel = 1;
}
else
{
powerLevel = maxPowerLevel ? userPowerLevelFloat / maxPowerLevel : 1;
}
}

return powerLevel;
}

- (NSInteger)powerLevelOfUserWithUserID:(NSString *)userId
{
if ([self isMSC4289Supported])
{
if ([userId isEqualToString: [self creatorUserId]] || [[self additionalCreators] containsObject: userId])
{
return maxPowerLevel ? maxPowerLevel + 1 : NSIntegerMax;
}
}

// By default, use usersDefault
NSInteger userPowerLevel = powerLevels.usersDefault;

NSNumber *powerLevel;
MXJSONModelSetNumber(powerLevel, powerLevels.users[userId]);
if (powerLevel)
{
userPowerLevel = [powerLevel integerValue];
}

return userPowerLevel;
}

- (BOOL)isMSC4289Supported {
NSArray<NSString*> *supportedRoomVersions = @[@"org.matrix.hydra.11",@"12"];
if ([self roomVersion])
{
return [supportedRoomVersions containsObject:[self roomVersion]];
}
return NO;
}

# pragma mark - Conference call
- (BOOL)isOngoingConferenceCall
{
Expand Down
5 changes: 5 additions & 0 deletions MatrixSDK/JSONModels/MXRoomCreateContent.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ extern NSString* _Nonnull const MXRoomCreateContentRoomTypeJSONKey;
*/
@property (nonatomic, copy, readonly, nullable) NSString *creatorUserId;

/**
The array of `user_id` of the additional room creators.
*/
@property (nonatomic, copy, readonly, nullable) NSArray<NSString*> *additionalCreators;

/**
Room predecessor information if the current room is a new version of an old room (that has a state event `m.room.tombstone`).
*/
Expand Down
8 changes: 8 additions & 0 deletions MatrixSDK/JSONModels/MXRoomCreateContent.m
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
// Private

static NSString* const kRoomCreateContentUserIdJSONKey = @"creator";
static NSString* const kRoomCreateContentAdditionalCreatorsJSONKey = @"additional_creators";
static NSString* const kRoomCreateContentPredecessorInfoJSONKey = @"predecessor";
static NSString* const kRoomCreateContentRoomVersionJSONKey = @"room_version";
static NSString* const kRoomCreateContentFederateJSONKey = @"m.federate";
Expand All @@ -34,6 +35,7 @@
@interface MXRoomCreateContent()

@property (nonatomic, copy, readwrite, nullable) NSString *creatorUserId;
@property (nonatomic, copy, readwrite, nullable) NSArray<NSString*> *additionalCreators;
@property (nonatomic, strong, readwrite, nullable) MXRoomPredecessorInfo *roomPredecessorInfo;
@property (nonatomic, copy, readwrite, nullable) NSString *roomVersion;
@property (nonatomic, readwrite) BOOL isFederated;
Expand All @@ -53,6 +55,7 @@ + (id)modelFromJSON:(NSDictionary *)jsonDictionary
roomCreateContent.isFederated = YES;

MXJSONModelSetString(roomCreateContent.creatorUserId, jsonDictionary[kRoomCreateContentUserIdJSONKey]);
MXJSONModelSetArray(roomCreateContent.additionalCreators, jsonDictionary[kRoomCreateContentAdditionalCreatorsJSONKey]);
MXJSONModelSetMXJSONModel(roomCreateContent.roomPredecessorInfo, MXRoomPredecessorInfo, jsonDictionary[kRoomCreateContentPredecessorInfoJSONKey]);
MXJSONModelSetString(roomCreateContent.roomVersion, jsonDictionary[kRoomCreateContentRoomVersionJSONKey]);
MXJSONModelSetBoolean(roomCreateContent.isFederated, jsonDictionary[kRoomCreateContentFederateJSONKey]);
Expand Down Expand Up @@ -94,6 +97,11 @@ - (NSDictionary *)JSONDictionary
jsonDictionary[MXRoomCreateContentRoomTypeJSONKey] = self.roomType;
}

if (self.additionalCreators)
{
jsonDictionary[kRoomCreateContentAdditionalCreatorsJSONKey] = self.additionalCreators;
}

return jsonDictionary;
}

Expand Down
8 changes: 0 additions & 8 deletions MatrixSDK/JSONModels/MXRoomPowerLevels.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,6 @@ extern NSInteger const kMXRoomPowerLevelNotificationsRoomDefault;
*/
@property (nonatomic) NSInteger usersDefault;

/**
Helper to get the power level of a member of the room.

@param userId the id of the user.
@return his power level.
*/
- (NSInteger)powerLevelOfUserWithUserID:(NSString*)userId;

#pragma mark - Setup

/**
Expand Down
15 changes: 0 additions & 15 deletions MatrixSDK/JSONModels/MXRoomPowerLevels.m
Original file line number Diff line number Diff line change
Expand Up @@ -117,21 +117,6 @@ - (instancetype)initWithDefaultSpecValues
return self;
}

- (NSInteger)powerLevelOfUserWithUserID:(NSString *)userId
{
// By default, use usersDefault
NSInteger userPowerLevel = _usersDefault;

NSNumber *powerLevel;
MXJSONModelSetNumber(powerLevel, _users[userId]);
if (powerLevel)
{
userPowerLevel = [powerLevel integerValue];
}

return userPowerLevel;
}

- (NSInteger)minimumPowerLevelForSendingEventAsMessage:(MXEventTypeString)eventTypeString
{
NSInteger minimumPowerLevel;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ - (BOOL)isCondition:(MXPushRuleCondition*)condition satisfiedBy:(MXEvent*)event
{
MXRoomPowerLevels *roomPowerLevels = roomState.powerLevels;
NSInteger notifLevel = [roomPowerLevels minimumPowerLevelForNotifications:notifLevelKey defaultPower:50];
NSInteger senderPowerLevel = [roomPowerLevels powerLevelOfUserWithUserID:event.sender];
NSInteger senderPowerLevel = [roomState powerLevelOfUserWithUserID:event.sender];

isSatisfied = (senderPowerLevel >= notifLevel);
}
Expand Down
5 changes: 3 additions & 2 deletions MatrixSDK/Space/MXSpace.swift
Original file line number Diff line number Diff line change
Expand Up @@ -327,12 +327,13 @@ public class MXSpace: NSObject {
}

room.state { roomState in
guard let powerLevels = roomState?.powerLevels else {
guard let roomState,
let powerLevels = roomState.powerLevels else {
MXLog.warning("[MXSpace] canAddRoom: space power levels not found")
completion(false)
return
}
let userPowerLevel = powerLevels.powerLevelOfUser(withUserID: userId)
let userPowerLevel = roomState.powerLevelOfUser(withUserID: userId)
let minimumPowerLevel = self.minimumPowerLevelForAddingRoom(with: powerLevels)
let canAddRoom = userPowerLevel >= minimumPowerLevel

Expand Down
2 changes: 1 addition & 1 deletion MatrixSDK/VoIP/MXCallManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -1325,7 +1325,7 @@ + (BOOL)canPlaceConferenceCallInRoom:(MXRoom *)room roomState:(MXRoomState *)roo
else
{
MXRoomPowerLevels *powerLevels = roomState.powerLevels;
NSInteger oneSelfPowerLevel = [powerLevels powerLevelOfUserWithUserID:room.mxSession.myUserId];
NSInteger oneSelfPowerLevel = [roomState powerLevelOfUserWithUserID:room.mxSession.myUserId];

// Only member with invite power level can create a conference call
if (oneSelfPowerLevel >= powerLevels.invite)
Expand Down
Loading