diff options
Diffstat (limited to 'lib/Matrix')
-rw-r--r-- | lib/Matrix/Client.pm6 | 61 | ||||
-rw-r--r-- | lib/Matrix/Client/Requester.pm6 | 26 |
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) { |