summary refs log tree commit diff
path: root/scripts/sync_room_to_group.pl
blob: 3366c2c68fcbfabfb00baeb82fb11d240e1c5ff6 (plain) (blame)
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
#!/usr/bin/env perl

use strict;
use warnings;

use JSON::XS;
use LWP::UserAgent;
use URI::Escape;

if (@ARGV < 4) {
    die "usage: $0 <homeserver url> <access_token> <room_id|room_alias> <group_id>\n";
}

my ($hs, $access_token, $room_id, $group_id) = @ARGV;
my $ua = LWP::UserAgent->new();
$ua->timeout(10);

if ($room_id =~ /^#/) {
    $room_id = uri_escape($room_id);
    $room_id = decode_json($ua->get("${hs}/_matrix/client/r0/directory/room/${room_id}?access_token=${access_token}")->decoded_content)->{room_id};
}

my $room_users  = [ keys %{decode_json($ua->get("${hs}/_matrix/client/r0/rooms/${room_id}/joined_members?access_token=${access_token}")->decoded_content)->{joined}} ];
my $group_users = [ map { $_->{user_id} } @{decode_json($ua->get("${hs}/_matrix/client/unstable/groups/${group_id}/users?access_token=${access_token}" )->decoded_content)->{chunk}} ];

my $diff = {};
foreach my $user (@$room_users) { $diff->{$user}++ }
foreach my $user (@$group_users) { $diff->{$user}-- }

foreach my $user (keys %$diff) {
    if ($diff->{$user} == 1) {
        warn "inviting $user";
        $ua->put("${hs}/_matrix/client/unstable/groups/${group_id}/admin/users/invite/${user}?access_token=${access_token}", Content=>'{}');
    }
    elsif ($diff->{$user} == -1) {
        warn "removing $user";
        $ua->put("${hs}/_matrix/client/unstable/groups/${group_id}/admin/users/remove/${user}?access_token=${access_token}", Content=>'{}');
    }
}