aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Matrix/Client.pm661
-rw-r--r--lib/Matrix/Client/Requester.pm626
2 files changed, 79 insertions, 8 deletions
diff --git a/lib/Matrix/Client.pm6 b/lib/Matrix/Client.pm6
index 6849fe4..8fc9e6a 100644
--- a/lib/Matrix/Client.pm6
+++ b/lib/Matrix/Client.pm6
@@ -92,6 +92,55 @@ method check-res($res) {
}
}
+# User Data
+
+method profile(Str :$user-id?) {
+ my $id = $user-id // $!user-id;
+ my $res = $.get("/profile/" ~ $id);
+ $.check-res($res);
+ $res
+}
+
+method display-name(Str :$user-id?) {
+ my $id = $user-id // $!user-id;
+ my $res = $.get("/profile/" ~ $id ~ "/displayname");
+ $.check-res($res);
+
+ my $data = from-json($res.content);
+
+ $data<displayname> // ""
+}
+
+method change-display-name(Str:D $display-name!) {
+ my $res = $.put("/profile/" ~ $!user-id ~ "/displayname",
+ displayname => $display-name);
+ return $.check-res($res);
+}
+
+method avatar-url(Str :$user-id?) {
+ my $id = $user-id // $!user-id;
+ my $res = $.get("/profile/" ~ $id ~ "/avatar_url");
+ $.check-res($res);
+ my $data = from-json($res.content);
+
+ $data<avatar_url> // ""
+}
+
+method change-avatar(Str:D $avatar!, Bool :$upload) {
+ my $mxc-url;
+ if so $upload {
+ $mxc-url = $.upload($avatar);
+ } else {
+ $mxc-url = $avatar;
+ }
+
+ my $res = $.put("/profile/" ~ $!user-id ~ "/avatar_url",
+ avatar_url => $mxc-url);
+ return $.check-res($res);
+}
+
+# Syncronization
+
multi method sync() {
my $res = $.get("/sync",
timeout => 30000
@@ -116,6 +165,8 @@ multi method sync(:$sync-filter is copy, :$since = "") {
$.sync(sync-filter => to-json($sync-filter), since => $since)
}
+# Rooms
+
method join-room($room-id!) {
$.post("/join/" ~ $room-id)
}
@@ -136,3 +187,13 @@ method send(Str $room-id, Str $body, :$type? = "m.text") {
$Matrix::Client::Common::TXN-ID++;
$.put("/rooms/$room-id/send/m.room.message/{$Matrix::Client::Common::TXN-ID}", msgtype => $type, body => $body)
}
+
+# Media
+
+method upload(Str $path where *.IO.f) {
+ my $buf = slurp $path, :bin;
+ my $res = $.post-bin("/upload", $buf, content-type => "image/png");
+ $.check-res($res);
+ my $data = from-json($res.content);
+ $data<content_uri> // "";
+}
diff --git a/lib/Matrix/Client/Requester.pm6 b/lib/Matrix/Client/Requester.pm6
index c2ba865..ec9a2d1 100644
--- a/lib/Matrix/Client/Requester.pm6
+++ b/lib/Matrix/Client/Requester.pm6
@@ -12,31 +12,41 @@ has $!url-prefix = "";
has $!access-token = "";
has $!sync-since = "";
-method get(Str $path, *%data) {
+method get(Str $path, :$media = False, *%data) {
my $q = "$path?access_token=$!access-token";
for %data.kv -> $k,$v {
$q ~= "&$k=$v" unless $v eq "";
}
- my $uri = uri_encode($.base-url ~ $q);
+ my $uri = uri_encode($.base-url($media) ~ $q);
$!ua.history = [];
$!ua.get($uri)
}
-method base-url(--> Str) {
- "$.home-server$!client-endpoint$!url-prefix"
+method base-url(Bool :$media? = False --> Str) {
+ if !$media {
+ "$.home-server$!client-endpoint$!url-prefix"
+ } else {
+ "$.home-server/_matrix/media/r0"
+ }
}
-multi method post(Str $path, Str $json) {
- my $req = HTTP::Request.new(POST => $.base-url() ~ $path ~ "?access_token=$!access-token",
+multi method post(Str $path, Str $json, :$media = False) {
+ my $req = HTTP::Request.new(POST => $.base-url(:$media) ~ $path ~ "?access_token=$!access-token",
Content-Type => 'application/json');
$req.add-content($json);
$!ua.history = [];
$!ua.request($req)
}
-multi method post(Str $path, *%params) {
- self.post($path, to-json(%params))
+method post-bin(Str $path, Buf $buf, :$content-type) {
+ my $req = POST($.base-url(:media) ~ $path ~ "?access_token=$!access-token", content => $buf, Content-Type => $content-type);
+ $!ua.history = [];
+ $!ua.request($req)
+}
+
+multi method post(Str $path, :$media = False, *%params) {
+ self.post($path, :$media, to-json(%params))
}
multi method put(Str $path,Str $json) {