[Room] Add powerlevels getter
This commit is contained in:
parent
3407c2f605
commit
8051b360ac
|
@ -138,4 +138,7 @@ class Event extends RoomState {
|
||||||
final String eventID = await room.sendTextEvent(text, txid: txid);
|
final String eventID = await room.sendTextEvent(text, txid: txid);
|
||||||
return eventID;
|
return eventID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Whether the client is allowed to redact this event.
|
||||||
|
bool get canRedact => senderId == room.client.userID || room.canRedact;
|
||||||
}
|
}
|
||||||
|
|
|
@ -465,7 +465,7 @@ class Room {
|
||||||
/// Set the power level of the user with the [userID] to the value [power].
|
/// Set the power level of the user with the [userID] to the value [power].
|
||||||
Future<dynamic> setPower(String userID, int power) async {
|
Future<dynamic> setPower(String userID, int power) async {
|
||||||
if (states["m.room.power_levels"] == null) return null;
|
if (states["m.room.power_levels"] == null) return null;
|
||||||
Map<String, int> powerMap = states["m.room.power_levels"].content["users"];
|
Map powerMap = states["m.room.power_levels"].content["users"];
|
||||||
powerMap[userID] = power;
|
powerMap[userID] = power;
|
||||||
|
|
||||||
dynamic res = await client.connection.jsonRequest(
|
dynamic res = await client.connection.jsonRequest(
|
||||||
|
@ -819,4 +819,41 @@ class Room {
|
||||||
if (setAvatarResp is ErrorResponse) return setAvatarResp;
|
if (setAvatarResp is ErrorResponse) return setAvatarResp;
|
||||||
return setAvatarResp["event_id"];
|
return setAvatarResp["event_id"];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool _hasPermissionFor(String action) {
|
||||||
|
if (getState("m.room.power_levels") == null ||
|
||||||
|
getState("m.room.power_levels").content[action] == null) return false;
|
||||||
|
return ownPowerLevel >= getState("m.room.power_levels").content[action];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The level required to ban a user.
|
||||||
|
bool get canBan => _hasPermissionFor("ban");
|
||||||
|
|
||||||
|
/// The default level required to send message events. Can be overridden by the events key.
|
||||||
|
bool get canSendDefaultMessages => _hasPermissionFor("events_default");
|
||||||
|
|
||||||
|
/// The level required to invite a user.
|
||||||
|
bool get canInvite => _hasPermissionFor("invite");
|
||||||
|
|
||||||
|
/// The level required to kick a user.
|
||||||
|
bool get canKick => _hasPermissionFor("kick");
|
||||||
|
|
||||||
|
/// The level required to redact an event.
|
||||||
|
bool get canRedact => _hasPermissionFor("redact");
|
||||||
|
|
||||||
|
/// The default level required to send state events. Can be overridden by the events key.
|
||||||
|
bool get canSendDefaultStates => _hasPermissionFor("state_default");
|
||||||
|
|
||||||
|
bool get canChangePowerLevel => canSendEvent("m.room.power_levels");
|
||||||
|
|
||||||
|
bool canSendEvent(String eventType) {
|
||||||
|
if (getState("m.room.power_levels") == null ||
|
||||||
|
getState("m.room.power_levels").content["events"] == null) return false;
|
||||||
|
if (getState("m.room.power_levels").content["events"][eventType] == null)
|
||||||
|
return eventType == "m.room.message"
|
||||||
|
? canSendDefaultMessages
|
||||||
|
: canSendDefaultStates;
|
||||||
|
return ownPowerLevel >=
|
||||||
|
getState("m.room.power_levels").content["events"][eventType];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,4 +165,15 @@ class User extends RoomState {
|
||||||
|
|
||||||
return newRoomID;
|
return newRoomID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Whether the client is allowed to ban/unban this user.
|
||||||
|
bool get canBan => room.canBan && powerLevel < room.ownPowerLevel;
|
||||||
|
|
||||||
|
/// Whether the client is allowed to kick this user.
|
||||||
|
bool get canKick => room.canKick && powerLevel < room.ownPowerLevel;
|
||||||
|
|
||||||
|
/// Whether the client is allowed to change the power level of this user.
|
||||||
|
/// Please be aware that you can only set the power level to at least your own!
|
||||||
|
bool get canChangePowerLevel =>
|
||||||
|
room.canChangePowerLevel && powerLevel < room.ownPowerLevel;
|
||||||
}
|
}
|
||||||
|
|
|
@ -214,8 +214,51 @@ void main() {
|
||||||
expect(room.ownPowerLevel, 100);
|
expect(room.ownPowerLevel, 100);
|
||||||
expect(room.getPowerLevelByUserId(matrix.userID), room.ownPowerLevel);
|
expect(room.getPowerLevelByUserId(matrix.userID), room.ownPowerLevel);
|
||||||
expect(room.getPowerLevelByUserId("@nouser:example.com"), 10);
|
expect(room.getPowerLevelByUserId("@nouser:example.com"), 10);
|
||||||
|
expect(room.ownPowerLevel, 100);
|
||||||
|
expect(room.canBan, true);
|
||||||
|
expect(room.canInvite, true);
|
||||||
|
expect(room.canKick, true);
|
||||||
|
expect(room.canRedact, true);
|
||||||
|
expect(room.canSendDefaultMessages, true);
|
||||||
|
expect(room.canSendDefaultStates, true);
|
||||||
|
expect(room.canChangePowerLevel, true);
|
||||||
|
expect(room.canSendEvent("m.room.name"), true);
|
||||||
|
expect(room.canSendEvent("m.room.power_levels"), true);
|
||||||
|
expect(room.canSendEvent("m.room.member"), true);
|
||||||
expect(room.powerLevels,
|
expect(room.powerLevels,
|
||||||
room.states["m.room.power_levels"].content["users"]);
|
room.states["m.room.power_levels"].content["users"]);
|
||||||
|
|
||||||
|
room.states["m.room.power_levels"] = RoomState(
|
||||||
|
senderId: "@test:example.com",
|
||||||
|
typeKey: "m.room.power_levels",
|
||||||
|
roomId: room.id,
|
||||||
|
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
|
||||||
|
},
|
||||||
|
stateKey: "");
|
||||||
|
expect(room.ownPowerLevel, 0);
|
||||||
|
expect(room.canBan, false);
|
||||||
|
expect(room.canInvite, false);
|
||||||
|
expect(room.canKick, false);
|
||||||
|
expect(room.canRedact, false);
|
||||||
|
expect(room.canSendDefaultMessages, true);
|
||||||
|
expect(room.canSendDefaultStates, false);
|
||||||
|
expect(room.canChangePowerLevel, false);
|
||||||
|
expect(room.canSendEvent("m.room.name"), true);
|
||||||
|
expect(room.canSendEvent("m.room.power_levels"), false);
|
||||||
|
expect(room.canSendEvent("m.room.member"), false);
|
||||||
|
expect(room.canSendEvent("m.room.message"), true);
|
||||||
final dynamic resp =
|
final dynamic resp =
|
||||||
await room.setPower("@test:fakeServer.notExisting", 90);
|
await room.setPower("@test:fakeServer.notExisting", 90);
|
||||||
expect(resp["event_id"], "42");
|
expect(resp["event_id"], "42");
|
||||||
|
|
Loading…
Reference in a new issue