aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatias Linares <matiaslina@gmail.com>2020-12-26 22:33:31 -0300
committerMatias Linares <matiaslina@gmail.com>2020-12-26 22:33:31 -0300
commitd5b3361c9ceeac3ed3a90dab35b12b0bd4ab7612 (patch)
tree4be8cf0e6d8a95d2c041359a5e01ee90fda144cf
parent8f423e22081a8579bb37a61b16ade04617e50ddc (diff)
downloadperl6-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.md13
-rw-r--r--lib/Matrix/Client/Room.pm6116
-rw-r--r--lib/Matrix/Response.pm64
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;