@@ -328,21 +328,53 @@ - (NSString *)avatar
328328 return avatar;
329329}
330330
331+ - (NSString *)roomVersion
332+ {
333+ NSString *roomVersion;
334+
335+ // Check it from the state events
336+ MXEvent *event = [stateEvents objectForKey: kMXEventTypeStringRoomCreate ].lastObject ;
337+ NSDictionary <NSString *, id > *eventContent = [self contentOfEvent: event];
338+
339+ if (event && eventContent)
340+ {
341+ MXJSONModelSetString (roomVersion, eventContent[@" room_version" ]);
342+ roomVersion = [roomVersion copy ];
343+
344+ }
345+ return roomVersion;
346+ }
347+
331348- (NSString *)creatorUserId
332349{
333350 NSString *creatorUserId;
334351
335352 // Check it from the state events
336353 MXEvent *event = [stateEvents objectForKey: kMXEventTypeStringRoomCreate ].lastObject ;
354+ NSString * sender = [event sender ];
337355
356+ if (event && sender)
357+ {
358+ creatorUserId = [sender copy ];
359+ }
360+ return creatorUserId;
361+ }
362+
363+ - (NSArray <NSString*> *)additionalCreators
364+ {
365+ NSArray <NSString *> *additionalCreators = @[];
366+
367+ // Check it from the state events
368+ MXEvent *event = [stateEvents objectForKey: kMXEventTypeStringRoomCreate ].lastObject ;
338369 NSDictionary <NSString *, id > *eventContent = [self contentOfEvent: event];
339370
340371 if (event && eventContent)
341372 {
342- MXJSONModelSetString (creatorUserId, eventContent[@" creator" ]);
343- creatorUserId = [creatorUserId copy ];
373+ MXJSONModelSetArray (additionalCreators, eventContent[@" additional_creators" ]);
374+ additionalCreators = [additionalCreators copy ];
375+
344376 }
345- return creatorUserId ;
377+ return additionalCreators ;
346378}
347379
348380- (MXRoomHistoryVisibility)historyVisibility
@@ -601,13 +633,52 @@ - (float)memberNormalizedPowerLevel:(NSString*)userId
601633 // Ignore banned and left (kicked) members
602634 if (member.membership != MXMembershipLeave && member.membership != MXMembershipBan)
603635 {
604- float userPowerLevelFloat = [powerLevels powerLevelOfUserWithUserID: userId];
605- powerLevel = maxPowerLevel ? userPowerLevelFloat / maxPowerLevel : 1 ;
636+ float userPowerLevelFloat = [self powerLevelOfUserWithUserID: userId];
637+ if (maxPowerLevel && userPowerLevelFloat >= maxPowerLevel)
638+ {
639+ powerLevel = 1 ;
640+ }
641+ else
642+ {
643+ powerLevel = maxPowerLevel ? userPowerLevelFloat / maxPowerLevel : 1 ;
644+ }
606645 }
607646
608647 return powerLevel;
609648}
610649
650+ - (NSInteger )powerLevelOfUserWithUserID : (NSString *)userId
651+ {
652+ if ([self isMSC4289Supported ])
653+ {
654+ if ([userId isEqualToString: [self creatorUserId ]] || [[self additionalCreators ] containsObject: userId])
655+ {
656+ return NSIntegerMax;
657+ }
658+ }
659+
660+ // By default, use usersDefault
661+ NSInteger userPowerLevel = powerLevels.usersDefault ;
662+
663+ NSNumber *powerLevel;
664+ MXJSONModelSetNumber (powerLevel, powerLevels.users [userId]);
665+ if (powerLevel)
666+ {
667+ userPowerLevel = [powerLevel integerValue ];
668+ }
669+
670+ return userPowerLevel;
671+ }
672+
673+ - (BOOL )isMSC4289Supported {
674+ NSArray <NSString *> *supportedRoomVersions = @[@" org.matrix.hydra.11" ,@" 12" ];
675+ if ([self roomVersion ])
676+ {
677+ return [supportedRoomVersions containsObject: [self roomVersion ]];
678+ }
679+ return NO ;
680+ }
681+
611682# pragma mark - Conference call
612683- (BOOL )isOngoingConferenceCall
613684{
0 commit comments