diff --git a/lib/src/room.dart b/lib/src/room.dart index b28bec51..c8c80437 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -1593,16 +1593,14 @@ class Room { /// Returns the power level of the given user ID. int getPowerLevelByUserId(String userId) { var powerLevel = 0; - final powerLevelState = getState(EventTypes.RoomPowerLevels); - if (powerLevelState == null) return powerLevel; - if (powerLevelState.content['users_default'] is int) { - powerLevel = powerLevelState.content['users_default']; - } - if (powerLevelState.content + final powerLevelMap = getState(EventTypes.RoomPowerLevels)?.content; + if (powerLevelMap == null) return powerLevel; + powerLevel = getDefaultPowerLevel(powerLevelMap); + if (powerLevelMap .tryGet>('users') ?.tryGet(userId) != null) { - powerLevel = powerLevelState.content['users'][userId]; + powerLevel = powerLevelMap['users'][userId]; } return powerLevel; } @@ -1652,7 +1650,7 @@ class Room { final groupCallPowerLevel = powerLevelMap?.tryGetMap('events')?['org.matrix.msc3401.call.member']; return groupCallPowerLevel != null && - groupCallPowerLevel >= powerLevelMap?['users_default']; + groupCallPowerLevel <= getDefaultPowerLevel(powerLevelMap!); } /// sets the `org.matrix.msc3401.call.member` power level to users default for @@ -1663,7 +1661,8 @@ class Room { if (currentPowerLevelsMap != null) { final newPowerLevelMap = currentPowerLevelsMap; newPowerLevelMap['events'].addAll({ - 'org.matrix.msc3401.call.member': currentPowerLevelsMap['users_default'] + 'org.matrix.msc3401.call.member': + getDefaultPowerLevel(currentPowerLevelsMap) }); await client.setRoomStateWithKey( id, @@ -1674,6 +1673,11 @@ class Room { } } + /// Takes in `[m.room.power_levels].content` and returns the default power level + int getDefaultPowerLevel(Map powerLevelMap) { + return powerLevelMap.tryGet('users_default') ?? 0; + } + /// The default level required to send message events. Can be overridden by the events key. bool get canSendDefaultMessages => _hasPermissionFor('events_default') && diff --git a/test/room_test.dart b/test/room_test.dart index b723a0e9..a757b4a9 100644 --- a/test/room_test.dart +++ b/test/room_test.dart @@ -460,6 +460,101 @@ void main() { expect(resp, '42'); }); + test('Enabling group calls', () async { + expect(room.groupCallsEnabled, false); + room.setState( + Event( + senderId: '@test:example.com', + type: 'm.room.power_levels', + room: room, + eventId: '123a', + content: { + 'events': {'org.matrix.msc3401.call.member': 100}, + 'state_default': 50, + 'users': {'@test:fakeServer.notExisting': 100}, + 'users_default': 0 + }, + originServerTs: DateTime.now(), + stateKey: '', + ), + ); + expect(room.groupCallsEnabled, false); + room.setState( + Event( + senderId: '@test:example.com', + type: 'm.room.power_levels', + room: room, + eventId: '123a', + content: { + 'events': {'org.matrix.msc3401.call.member': 27}, + 'state_default': 50, + 'users': {'@test:fakeServer.notExisting': 100}, + 'users_default': 100 + }, + originServerTs: DateTime.now(), + stateKey: '', + ), + ); + expect(room.groupCallsEnabled, true); + room.setState( + Event( + senderId: '@test:example.com', + type: 'm.room.power_levels', + room: room, + eventId: '123', + content: { + 'events': {}, + 'state_default': 50, + 'users': {'@test:fakeServer.notExisting': 100}, + 'users_default': 0 + }, + originServerTs: DateTime.now(), + stateKey: ''), + ); + expect(room.groupCallsEnabled, false); + await room.enableGroupCalls(); + expect(room.groupCallsEnabled, true); + room.setState( + Event( + senderId: '@test:example.com', + type: 'm.room.power_levels', + room: room, + eventId: '123', + content: { + 'events': {}, + 'state_default': 50, + 'users': {'@test:fakeServer.notExisting': 100}, + }, + originServerTs: DateTime.now(), + stateKey: '', + ), + ); + await room.enableGroupCalls(); + expect(room.groupCallsEnabled, true); + room.setState( + Event( + senderId: '@test:example.com', + type: 'm.room.power_levels', + room: room, + eventId: '123abc', + content: { + 'ban': 50, + 'events': {'m.room.name': 0, 'm.room.power_levels': 100}, + 'events_default': 0, + 'invite': 50, + 'kick': 50, + 'notifications': {'room': 20}, + 'redact': 50, + 'state_default': 50, + 'users': {}, + 'users_default': 0 + }, + originServerTs: DateTime.now(), + stateKey: '', + ), + ); + }); + test('invite', () async { await room.invite('Testname'); });