diff options
author | Matias Linares <matiaslina@gmail.com> | 2020-12-26 22:33:31 -0300 |
---|---|---|
committer | Matias Linares <matiaslina@gmail.com> | 2020-12-26 22:33:31 -0300 |
commit | d5b3361c9ceeac3ed3a90dab35b12b0bd4ab7612 (patch) | |
tree | 4be8cf0e6d8a95d2c041359a5e01ee90fda144cf | |
parent | 8f423e22081a8579bb37a61b16ade04617e50ddc (diff) | |
download | perl6-matrix-client-d5b3361c9ceeac3ed3a90dab35b12b0bd4ab7612.tar.gz |
Implement membership endpoints for Matrix::Client::Room
This implements for room endpoints:
* Join a room
* Get a single event
* Get states
* Get room aliases
* Get room members
-rw-r--r-- | endpoints.md | 13 | ||||
-rw-r--r-- | lib/Matrix/Client/Room.pm6 | 116 | ||||
-rw-r--r-- | lib/Matrix/Response.pm6 | 4 |
3 files changed, 103 insertions, 30 deletions
diff --git a/endpoints.md b/endpoints.md index ad26ad9..e8bc9f8 100644 --- a/endpoints.md +++ b/endpoints.md @@ -75,7 +75,7 @@ from matrix.org. This will give you an overview about what's implemented in the - [X] DELETE - /_matrix/client/r0/directory/room/{roomAlias} - [X] GET - /_matrix/client/r0/directory/room/{roomAlias} -- [ ] GET - /_matrix/client/r0/rooms/{roomId}/aliases +- [X] GET - /_matrix/client/r0/rooms/{roomId}/aliases - [X] PUT - /_matrix/client/r0/directory/room/{roomAlias} ## Room discovery @@ -91,7 +91,7 @@ from matrix.org. This will give you an overview about what's implemented in the - [X] POST - /_matrix/client/r0/rooms/{roomId}/forget - [X] POST - /_matrix/client/r0/rooms/{roomId}/invite - [ ] POST - /_matrix/client/r0/rooms/{roomId}/invite -- [ ] POST - /_matrix/client/r0/rooms/{roomId}/join +- [X] POST - /_matrix/client/r0/rooms/{roomId}/join - [X] POST - /_matrix/client/r0/rooms/{roomId}/kick - [X] POST - /_matrix/client/r0/rooms/{roomId}/leave - [X] POST - /_matrix/client/r0/rooms/{roomId}/unban @@ -102,13 +102,13 @@ from matrix.org. This will give you an overview about what's implemented in the - [ ] GET - /_matrix/client/r0/events/{eventId} - [ ] GET - /_matrix/client/r0/initialSync - [ ] GET - /_matrix/client/r0/rooms/{roomId}/context/{eventId} -- [ ] GET - /_matrix/client/r0/rooms/{roomId}/event/{eventId} +- [X] GET - /_matrix/client/r0/rooms/{roomId}/event/{eventId} - [ ] GET - /_matrix/client/r0/rooms/{roomId}/initialSync - [X] GET - /_matrix/client/r0/rooms/{roomId}/joined_members -- [ ] GET - /_matrix/client/r0/rooms/{roomId}/members +- [X] GET - /_matrix/client/r0/rooms/{roomId}/members - [X] GET - /_matrix/client/r0/rooms/{roomId}/messages - [X] GET - /_matrix/client/r0/rooms/{roomId}/state -- [ ] GET - /_matrix/client/r0/rooms/{roomId}/state/{eventType}/{stateKey} +- [X] GET - /_matrix/client/r0/rooms/{roomId}/state/{eventType}/{stateKey} - [X] GET - /_matrix/client/r0/sync - [ ] GET - /_matrix/client/r0/user/{userId}/filter/{filterId} - [ ] POST - /_matrix/client/r0/rooms/{roomId}/receipt/{receiptType}/{eventId} @@ -176,5 +176,4 @@ from matrix.org. This will give you an overview about what's implemented in the # Endpoint completion -0.398058% - (41/103) - +0.446602% - (46/103) diff --git a/lib/Matrix/Client/Room.pm6 b/lib/Matrix/Client/Room.pm6 index ca97d2f..72dfb62 100644 --- a/lib/Matrix/Client/Room.pm6 +++ b/lib/Matrix/Client/Room.pm6 @@ -25,15 +25,8 @@ method !get-name() { $!name = $data<name>; } -#| GET - /_matrix/client/r0/rooms/{roomId}/joined_members -method joined-members { - my %data = from-json($.get("/joined_members").content); - %data<joined> -} - -method name { +method name(--> Str) { self!get-name; - $!name } @@ -52,6 +45,42 @@ method fallback-name(--> Str) { }; } +#| GET - /_matrix/client/r0/rooms/{roomId}/aliases +method aliases(--> List) { + my %data = from-json($.get('/aliases').content); + %data<aliases>.List +} + +# Events + +## Getting events for a room + +#| GET - /_matrix/client/r0/rooms/{roomId}/event/{eventId} +method event(Str $event-id --> Matrix::Response::RoomEvent) { + my %data = from-json($.get("/event/$event-id").content); + Matrix::Response::RoomEvent.new(|%data) +} + +#| GET - /_matrix/client/r0/rooms/{roomId}/state +multi method state(--> Seq) { + my $data = from-json($.get('/state').content); + + gather for $data.List -> $event { + take Matrix::Response::StateEvent.new(:room-id($.id), |$event) + } +} + +#| GET - /_matrix/client/r0/rooms/{roomId}/state/{eventType}/{stateKey} +multi method state(Str $event-type, Str $state-key = "") { + from-json($.get("/state/$event-type/$state-key").content) +} + +#| GET - /_matrix/client/r0/rooms/{roomId}/joined_members +method joined-members { + my %data = from-json($.get("/joined_members").content); + %data<joined> +} + #| GET - /_matrix/client/r0/rooms/{roomId}/messages method messages() { my $res = $.get("/messages"); @@ -60,6 +89,23 @@ method messages() { return $data<chunk>.clone; } +#| GET - /_matrix/client/r0/rooms/{roomId}/members +method members(:$at, Str :$membership, Str :$not-membership) { + my %query; + + %query<at> = $at with $at; + %query<membership> = $membership with $membership; + %query<not_membership> = $not-membership with $not-membership; + + my %data = from-json($.get('/members', |%query).content); + + gather for %data<chunk>.List -> $ev { + take Matrix::Response::MemberEvent.new(|$ev) + } +} + +## Sending events to a room + #| PUT - /_matrix/client/r0/rooms/{roomId}/send/{eventType}/{txnId} method send(Str $body!, Str :$type? = "m.text") { $Matrix::Client::Common::TXN-ID++; @@ -71,20 +117,6 @@ method send(Str $body!, Str :$type? = "m.text") { from-json($res.content)<event_id> } -#| GET - /_matrix/client/r0/rooms/{roomId}/state -multi method state(--> Seq) { - my $data = from-json($.get('/state').content); - - gather for $data.List -> $event { - take Matrix::Response::StateEvent.new(:room-id($.id), |$event) - } -} - -#| GET - /_matrix/client/r0/rooms/{roomId}/state/{eventType} -multi method state(Str $event-type) { - from-json($.get("/state/$event-type").content) -} - #| PUT - /_matrix/client/r0/rooms/{roomId}/state/{eventType}/{stateKey} method send-state(Str:D $event-type, :$state-key = "", *%args --> Str) { my $res = $.put( @@ -94,11 +126,49 @@ method send-state(Str:D $event-type, :$state-key = "", *%args --> Str) { from-json($res.content)<event_id> } +# Room membership! + +## Joining rooms + +#| POST - /_matrix/client/r0/rooms/{roomId}/invite +method invite(Str $user-id) { + $.post('/invite', :$user-id) +} + +#| POST - /_matrix/client/r0/rooms/{roomId}/join +method join { + $.post('/join') +} + +## Leaving rooms + #| POST - /_matrix/client/r0/rooms/{roomId}/leave -method leave() { +method leave { $.post('/leave') } +#| POST - /_matrix/client/r0/rooms/{roomId}/forget +method forget { + $.post('/forget') +} + +#| POST - /_matrix/client/r0/rooms/{roomId}/kick +method kick(Str $user-id, Str $reason = "") { + $.post('/kick', :$user-id, :$reason) +} + +## Banning users + +#| POST - /_matrix/client/r0/rooms/{roomId}/ban +method ban(Str $user-id, $reason = "") { + $.post('/ban', :$user-id, :$reason) +} + +#| POST - /_matrix/client/r0/rooms/{roomId}/unban +method unban(Str $user-id) { + $.post('/unban', :$user-id) +} + method Str(--> Str) { "Room<id: {self.id}>" } diff --git a/lib/Matrix/Response.pm6 b/lib/Matrix/Response.pm6 index ec93cf3..cc9e7a8 100644 --- a/lib/Matrix/Response.pm6 +++ b/lib/Matrix/Response.pm6 @@ -23,6 +23,10 @@ class Matrix::Response::StateEvent is Matrix::Response::RoomEvent { has $.state_key; } +class Matrix::Response::MemberEvent is Matrix::Response::StateEvent { + has $.type is required where 'm.room.member'; +} + class Matrix::Response::Timeline { has Matrix::Response::Event @.events; has Bool $limited; |