From 90c1a7613c877a771c7cfa22ad3338a7c7364357 Mon Sep 17 00:00:00 2001 From: David Woloszyn Date: Tue, 21 May 2024 18:10:20 +1000 Subject: [PATCH] MDL-81951 communication_matrix: New trait for power levels A more reliable way of obtaining room power levels is now used in the new trait get_room_power_levels_v3. This makes get_room_powerlevels_from_sync_v3 less needed, but not necessarily redundant. The names of the containing methods have been adjusted to make better sense of which trait they belong to. --- .../matrix/classes/communication_feature.php | 9 +--- .../matrix/get_room_power_levels_v3.php | 53 +++++++++++++++++++ .../get_room_powerlevels_from_sync_v3.php | 2 +- .../matrix/classes/local/spec/v1p1.php | 1 + 4 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 communication/provider/matrix/classes/local/spec/features/matrix/get_room_power_levels_v3.php diff --git a/communication/provider/matrix/classes/communication_feature.php b/communication/provider/matrix/classes/communication_feature.php index 18c88f07fa765..d43889d57a31b 100644 --- a/communication/provider/matrix/classes/communication_feature.php +++ b/communication/provider/matrix/classes/communication_feature.php @@ -722,14 +722,7 @@ private function get_current_powerlevel_data(): \stdClass { ); } - $powerdata = $this->get_body($response); - $powerdata = array_filter( - $powerdata->rooms->join->{$roomid}->state->events, - fn($value) => $value->type === 'm.room.power_levels' - ); - $powerdata = reset($powerdata); - - return $powerdata->content; + return $this->get_body($response); } /** diff --git a/communication/provider/matrix/classes/local/spec/features/matrix/get_room_power_levels_v3.php b/communication/provider/matrix/classes/local/spec/features/matrix/get_room_power_levels_v3.php new file mode 100644 index 0000000000000..a7e689836e531 --- /dev/null +++ b/communication/provider/matrix/classes/local/spec/features/matrix/get_room_power_levels_v3.php @@ -0,0 +1,53 @@ +. + +namespace communication_matrix\local\spec\features\matrix; + +use communication_matrix\local\command; +use GuzzleHttp\Psr7\Response; + +/** + * Matrix API feature to fetch room power levels. + * + * https://spec.matrix.org/v1.1/client-server-api/#mroompower_levels + * + * @package communication_matrix + * @copyright 2024 David Woloszyn + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @codeCoverageIgnore + * This code does not warrant being tested. Testing offers no discernible benefit given its usage is tested. + */ +trait get_room_power_levels_v3 { + /** + * Get a list of room members and their power levels. + * + * @param string $roomid The room ID + * @return Response + */ + public function get_room_power_levels(string $roomid): Response { + + $params = [ + ':roomid' => $roomid, + ]; + + return $this->execute(new command( + $this, + method: 'GET', + endpoint: '_matrix/client/r0/rooms/:roomid/state/m.room.power_levels', + params: $params, + )); + } +} diff --git a/communication/provider/matrix/classes/local/spec/features/matrix/get_room_powerlevels_from_sync_v3.php b/communication/provider/matrix/classes/local/spec/features/matrix/get_room_powerlevels_from_sync_v3.php index a01765d437980..cdb6df6727275 100644 --- a/communication/provider/matrix/classes/local/spec/features/matrix/get_room_powerlevels_from_sync_v3.php +++ b/communication/provider/matrix/classes/local/spec/features/matrix/get_room_powerlevels_from_sync_v3.php @@ -37,7 +37,7 @@ trait get_room_powerlevels_from_sync_v3 { * @param string $roomid The room ID * @return Response */ - public function get_room_power_levels(string $roomid): Response { + public function get_room_power_levels_from_sync(string $roomid): Response { // Filter the event data according to the API: // https://spec.matrix.org/v1.1/client-server-api/#filtering // We have to filter out all of the object data that we do not want, diff --git a/communication/provider/matrix/classes/local/spec/v1p1.php b/communication/provider/matrix/classes/local/spec/v1p1.php index fc34831006781..c23c2d84b4ec0 100644 --- a/communication/provider/matrix/classes/local/spec/v1p1.php +++ b/communication/provider/matrix/classes/local/spec/v1p1.php @@ -36,6 +36,7 @@ class v1p1 extends \communication_matrix\matrix_client { use features\matrix\upload_content_v3; use features\matrix\update_room_power_levels_v3; use features\matrix\get_room_powerlevels_from_sync_v3; + use features\matrix\get_room_power_levels_v3; // We use the Synapse API here because it can invite users to a room without requiring them to accept the invite. use features\synapse\invite_member_to_room_v1;