blob: 6a25bf986482076d49b2e2e38766490ebe3eb5b0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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) {
"<Matrix::Response::RoomInfo: $.room-id>"
}
}
sub gather-events($from) {
gather for $from<events>.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<next_batch>;
my Matrix::Response::Event @presence;
my Matrix::Response::RoomInfo @joined-rooms;
for $json<presence><events>.List -> $ev {
@presence.push(Matrix::Response::Event.new(|$ev));
}
for $json<rooms><join>.kv -> $room-id, $data {
my @state = gather-events($data<state>);
my $timeline = Matrix::Response::Timeline.new(
limited => $data<timeline><limited>,
prev-batch => $data<timeline><prev_batch>,
events => gather-events($data<timeline>)
);
@joined-rooms.push(Matrix::Response::RoomInfo.new(
:$room-id, :$timeline, :@state
));
}
return self.bless(:$next-batch, :@presence, :@joined-rooms);
}
}
|