From 94857bdff039a00b10ac6356e58edfcb3c1d26df Mon Sep 17 00:00:00 2001 From: Matias Linares Date: Tue, 13 Feb 2018 20:53:53 -0300 Subject: Add simple responses --- lib/Matrix/Response.pm6 | 86 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 lib/Matrix/Response.pm6 diff --git a/lib/Matrix/Response.pm6 b/lib/Matrix/Response.pm6 new file mode 100644 index 0000000..6a25bf9 --- /dev/null +++ b/lib/Matrix/Response.pm6 @@ -0,0 +1,86 @@ +use JSON::Tiny; + +unit module Matrix::Response; + +class Matrix::Response::Event { + has %.content; + has $.type is required; + + method gist(--> Str) { + "Event<$.type>" + } +} + +class Matrix::Response::RoomEvent is Matrix::Response::Event { + has Str $.sender; + has Int $.origin_server_ts; + has $.event_id; + has Str $.room_id; + + method id { $.event_id } + method timestamp { $!origin_server_ts } + method room-id { $.room-id } +} + +class Matrix::Response::StateEvent is Matrix::Response::RoomEvent { + has $.prev_content; + has $.state_key; +} + +class Matrix::Response::Timeline { + has Matrix::Response::Event @.events; + has Bool $limited; + has Str $prev-batch; +} + +class Matrix::Response::RoomInfo { + has $.room-id is required; + has Matrix::Response::Event @.state; + has Matrix::Response::Timeline $.timeline; + + method gist(--> Str) { + "" + } +} + +sub gather-events($from) { + gather for $from.List -> $ev { + take Matrix::Response::StateEvent.new(|$ev); + } +} + +class Matrix::Response::Sync { + has Str $.next-batch; + has Matrix::Response::Event @.presence; + has Matrix::Response::RoomInfo @.joined-rooms; + + multi method new(Str $json) { + return self.new(from-json($json)); + } + + multi method new(Hash $json) { + my $next-batch = $json; + my Matrix::Response::Event @presence; + my Matrix::Response::RoomInfo @joined-rooms; + + for $json.List -> $ev { + @presence.push(Matrix::Response::Event.new(|$ev)); + } + + for $json.kv -> $room-id, $data { + my @state = gather-events($data); + + my $timeline = Matrix::Response::Timeline.new( + limited => $data, + prev-batch => $data, + events => gather-events($data) + ); + + @joined-rooms.push(Matrix::Response::RoomInfo.new( + :$room-id, :$timeline, :@state + )); + } + + return self.bless(:$next-batch, :@presence, :@joined-rooms); + } +} -- cgit v1.2.3-70-g09d2