diff --git a/changelogs/room_versions/newsfragments/2297.clarification b/changelogs/room_versions/newsfragments/2297.clarification new file mode 100644 index 00000000..65262d0e --- /dev/null +++ b/changelogs/room_versions/newsfragments/2297.clarification @@ -0,0 +1 @@ +Clarify meaning of floating-point powerlevels. \ No newline at end of file diff --git a/content/rooms/fragments/v1-floaty-power-levels.md b/content/rooms/fragments/v1-floaty-power-levels.md new file mode 100644 index 00000000..50421159 --- /dev/null +++ b/content/rooms/fragments/v1-floaty-power-levels.md @@ -0,0 +1,41 @@ + +##### `m.room.power_levels` events accept values as floats + +When the value is a float + * First, exponential notation is applied: `5.114698E4` becomes `51146.98` + * Second, the value is truncated at the decimal point: `51146.98` becomes `51146`. + +Any float greater than or equal to `1e309` must result in the powerlevel event +being rejected. + +For example, this is a valid `m.room.power_levels` event in this room version: + +```json +{ + "content": { + "ban": 50, + "events": { + "m.room.power_levels": 100 + }, + "events_default": 0, + "state_default": 50, + "users": { + "@example:example.org": 100, + "@alice:localhost": 50, + "@bob:localhost": 50.57 + }, + "users_default": 0 + }, + "origin_server_ts": 1432735824653, + "room_id": "!jEsUZKDJdhlrceRyVU:example.org", + "sender": "@example:example.org", + "state_key": "", + "type": "m.room.power_levels" +} +``` + +In this example, both `@bob:localhost` and `@alice:localhost` have the same effective +power level of `50`, even though the values are technically different. + +Note that, since this room version does not enforce that events comply with the requirements +of [Canonical JSON](/appendices#canonical-json), power levels can be formatted as floats. diff --git a/content/rooms/v1.md b/content/rooms/v1.md index 773d7caa..c537b337 100644 --- a/content/rooms/v1.md +++ b/content/rooms/v1.md @@ -59,6 +59,8 @@ Events in version 1 rooms have the following structure: {{% rver-fragment name="v1-stringy-power-levels" %}} +{{% rver-fragment name="v1-floaty-power-levels" %}} + ### Authorization rules {{% rver-fragment name="v1-auth-rules" %}} diff --git a/content/rooms/v2.md b/content/rooms/v2.md index f0ea1ac7..17401932 100644 --- a/content/rooms/v2.md +++ b/content/rooms/v2.md @@ -57,6 +57,8 @@ Events in rooms of this version have the following structure: {{% rver-fragment name="v1-stringy-power-levels" %}} +{{% rver-fragment name="v1-floaty-power-levels" %}} + ### Authorization rules {{% rver-fragment name="v1-auth-rules" %}} diff --git a/content/rooms/v3.md b/content/rooms/v3.md index 6a3522b7..b89f7b59 100644 --- a/content/rooms/v3.md +++ b/content/rooms/v3.md @@ -87,6 +87,8 @@ The complete structure of a event in a v3 room is shown below. {{% rver-fragment name="v1-stringy-power-levels" %}} +{{% rver-fragment name="v1-floaty-power-levels" %}} + ### Authorization rules {{% boxes/note %}} diff --git a/content/rooms/v4.md b/content/rooms/v4.md index bd5651e1..bc8f620d 100644 --- a/content/rooms/v4.md +++ b/content/rooms/v4.md @@ -76,6 +76,8 @@ the changes in this room version. {{% rver-fragment name="v1-stringy-power-levels" %}} +{{% rver-fragment name="v1-floaty-power-levels" %}} + ### Authorization rules {{% rver-fragment name="v3-auth-rules" %}} diff --git a/content/rooms/v5.md b/content/rooms/v5.md index 665b0568..5bc0b943 100644 --- a/content/rooms/v5.md +++ b/content/rooms/v5.md @@ -58,6 +58,8 @@ completeness. {{% rver-fragment name="v1-stringy-power-levels" %}} +{{% rver-fragment name="v1-floaty-power-levels" %}} + ### Authorization rules {{% rver-fragment name="v3-auth-rules" %}}