From 9d50b6f0eade4f544ee7864383aa2a17bdc65a34 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Fri, 17 Nov 2017 01:53:09 +0000 Subject: quick and dirty room membership<->group membership sync script --- scripts/sync_room_to_group.pl | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 scripts/sync_room_to_group.pl (limited to 'scripts') diff --git a/scripts/sync_room_to_group.pl b/scripts/sync_room_to_group.pl new file mode 100755 index 0000000000..3366c2c68f --- /dev/null +++ b/scripts/sync_room_to_group.pl @@ -0,0 +1,39 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use JSON::XS; +use LWP::UserAgent; +use URI::Escape; + +if (@ARGV < 4) { + die "usage: $0 \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=>'{}'); + } +} \ No newline at end of file -- cgit 1.4.1 From 2145ee19769b8160d8ab8b02d29bbe42563a627f Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sun, 19 Nov 2017 00:48:38 +0000 Subject: don't double-invite in sync_room_to_group.pl --- scripts/sync_room_to_group.pl | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'scripts') diff --git a/scripts/sync_room_to_group.pl b/scripts/sync_room_to_group.pl index 3366c2c68f..92891f3d19 100755 --- a/scripts/sync_room_to_group.pl +++ b/scripts/sync_room_to_group.pl @@ -21,7 +21,10 @@ if ($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 $group_users = [ + (map { $_->{user_id} } @{decode_json($ua->get("${hs}/_matrix/client/unstable/groups/${group_id}/users?access_token=${access_token}" )->decoded_content)->{chunk}}), + (map { $_->{user_id} } @{decode_json($ua->get("${hs}/_matrix/client/unstable/groups/${group_id}/invited_users?access_token=${access_token}" )->decoded_content)->{chunk}}), +]; my $diff = {}; foreach my $user (@$room_users) { $diff->{$user}++ } @@ -30,10 +33,10 @@ 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=>'{}'); + print STDERR $ua->put("${hs}/_matrix/client/unstable/groups/${group_id}/admin/users/invite/${user}?access_token=${access_token}", Content=>'{}')->status_line."\n"; } 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=>'{}'); + print STDERR $ua->put("${hs}/_matrix/client/unstable/groups/${group_id}/admin/users/remove/${user}?access_token=${access_token}", Content=>'{}')->status_line."\n"; } } \ No newline at end of file -- cgit 1.4.1 From 3ab2cfec47be134451f8091c1379870ccb7eee26 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Tue, 21 Nov 2017 12:10:20 +0000 Subject: sanity checks --- scripts/sync_room_to_group.pl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'scripts') diff --git a/scripts/sync_room_to_group.pl b/scripts/sync_room_to_group.pl index 92891f3d19..f0c2dfadfa 100755 --- a/scripts/sync_room_to_group.pl +++ b/scripts/sync_room_to_group.pl @@ -26,6 +26,9 @@ my $group_users = [ (map { $_->{user_id} } @{decode_json($ua->get("${hs}/_matrix/client/unstable/groups/${group_id}/invited_users?access_token=${access_token}" )->decoded_content)->{chunk}}), ]; +die "refusing to sync from empty room" unless (@$room_users); +die "refusing to sync to empty group" unless (@$group_users); + my $diff = {}; foreach my $user (@$room_users) { $diff->{$user}++ } foreach my $user (@$group_users) { $diff->{$user}-- } @@ -39,4 +42,4 @@ foreach my $user (keys %$diff) { warn "removing $user"; print STDERR $ua->put("${hs}/_matrix/client/unstable/groups/${group_id}/admin/users/remove/${user}?access_token=${access_token}", Content=>'{}')->status_line."\n"; } -} \ No newline at end of file +} -- cgit 1.4.1