]> git.sesse.net Git - skvidarsync/blobdiff - bin/sync.pl
Get more of the sheet, so that we get the headings (will be needed soon).
[skvidarsync] / bin / sync.pl
index 89512436e4eddfdab0c4aac1f0a8e44727ed605a..5d09c24c893cee9000a564048753dff392b08ca2 100644 (file)
@@ -12,8 +12,8 @@ binmode STDERR, ':utf8';
 use utf8;
 
 # TODO:
-# - support non-fixed sheets
 # - detect moves between groups
+# - better daemon behavior
 
 require '../include/config.pm';
 
@@ -54,7 +54,7 @@ sub get_spreadsheet_name {
        my $cell = shift;
        my $name = $cell->{'userEnteredValue'}{'stringValue'};
        return undef if (!defined($name));
-       return undef if ($name =~ /^G[1-4]\.[1-4]/);
+       return undef if ($name =~ /^G[1-4]\.[1-5]/);
        $name =~ s/🆕//;
        $name =~ s/\(.*\)//g;
        $name =~ s/\[.*\]//g;
@@ -137,6 +137,26 @@ sub sheet_batch_update {
        die $response->decoded_content if !$response->is_success;
 }
 
+sub get_spreadsheet_with_title {
+       my ($ua, $token, $wanted_sheet_title) = @_;
+
+       # See if we have any spreadsheets that match this title.
+       my $response = $ua->get('https://sheets.googleapis.com/v4/spreadsheets/' . $config::sheet_id . '?key=' . $config::gsheets_api_key . '&fields=sheets/properties',
+               Authorization => 'Bearer ' . $token
+       );
+       my $sheets_json = JSON::XS::decode_json($response->decoded_content);
+       my ($tab_name, $tab_id);
+       for my $sheet (@{$sheets_json->{'sheets'}}) {
+               my $title = $sheet->{'properties'}{'title'};
+               my $sheet_id = $sheet->{'properties'}{'sheetId'};
+               if ($title =~ /\Q$wanted_sheet_title\E/) {
+                       # skv_log("Synkroniserer ($config::invitation_channel, $invitation_ts) mot arket “$title” (fane-ID $sheet_id).");
+                       return ($title, $sheet_id);
+               }
+       }
+       return (undef, undef);
+}
+
 skv_log("Siste sync startet: " . POSIX::ctime(time));
 
 # Initialize the handles we need for communication.
@@ -154,22 +174,7 @@ my $invitation_ts = $linkref->{'ts'};
 my $wanted_sheet_title = $linkref->{'sheet_title'};
 die "Could not get newest sheet title" if (!defined($wanted_sheet_title));
 
-# See if we have any spreadsheets that match this title.
-my $response = $ua->get('https://sheets.googleapis.com/v4/spreadsheets/' . $config::sheet_id . '?key=' . $config::gsheets_api_key . '&fields=sheets/properties',
-       Authorization => 'Bearer ' . $token
-);
-my $sheets_json = JSON::XS::decode_json($response->decoded_content);
-my ($tab_name, $tab_id);
-for my $sheet (@{$sheets_json->{'sheets'}}) {
-       my $title = $sheet->{'properties'}{'title'};
-       my $sheet_id = $sheet->{'properties'}{'sheetId'};
-       if ($title =~ /\Q$wanted_sheet_title\E/) {
-               skv_log("Synkroniserer ($config::invitation_channel, $invitation_ts) mot arket “$title” (fane-ID $sheet_id).");
-               $tab_name = $title;
-               $tab_id = $sheet_id;
-               last;
-       }
-}
+my ($tab_name, $tab_id) = get_spreadsheet_with_title($ua, $token, $wanted_sheet_title);
 if (!defined($tab_name)) {
        skv_log("Fant ikke noen fane med “$wanted_sheet_title” i navnet; kan ikke synkronisere.\n");
        sheet_batch_update($ua, $token, [ serialize_skv_log_to_sheet() ]);
@@ -185,7 +190,7 @@ while (my $ref = $q->fetchrow_hashref) {
 }
 
 # Get the list of all people in the sheet (we're going to need them soon anyway).
-$response = $ua->get('https://sheets.googleapis.com/v4/spreadsheets/' . $config::sheet_id . '?key=' . $config::gsheets_api_key . '&ranges=' . $tab_name . '!A9:Z5000&fields=sheets/data/rowData/values/userEnteredValue',
+my $response = $ua->get('https://sheets.googleapis.com/v4/spreadsheets/' . $config::sheet_id . '?key=' . $config::gsheets_api_key . '&ranges=' . $tab_name . '!A4:Z5000&fields=sheets/data/rowData/values/userEnteredValue',
        Authorization => 'Bearer ' . $token
 );
 my $main_sheet_json = JSON::XS::decode_json($response->decoded_content);
@@ -194,7 +199,7 @@ my $main_sheet_json = JSON::XS::decode_json($response->decoded_content);
 my %seen_names = ();
 {
        my $main_sheet_rows = $main_sheet_json->{'sheets'}[0]{'data'}[0]{'rowData'};
-       my $rowno = 9;
+       my $rowno = 4;
        for my $row (@$main_sheet_rows) {
                my $colno = 0;
                for my $val (@{$row->{'values'}}) {
@@ -441,7 +446,7 @@ while (my $ref = $q->fetchrow_hashref) {
        if ($ref->{'event_type'} eq 'reaction_added') {
                $msg .= ' +';
        } else {
-               $msg .= ' -';
+               $msg .= ' ';
        }
        if ($ref->{'reaction'} eq 'open_mouth') {
                $msg .= '😮';
@@ -449,7 +454,14 @@ while (my $ref = $q->fetchrow_hashref) {
                $msg .= '❤️';
        }
        $msg .= ' ';
-       $msg .= $slack_userid_to_real_name{$ref->{'userid'}} // ($slack_userid_to_slack_name{$ref->{'userid'}} . ' (fant ikke regneark-navn)');
+       if (exists($slack_userid_to_real_name{$ref->{'userid'}})) {
+               $msg .= $slack_userid_to_real_name{$ref->{'userid'}};
+       } elsif (exists($slack_userid_to_slack_name{$ref->{'userid'}})) {
+               $msg .= $slack_userid_to_slack_name{$ref->{'userid'}} . ' (fant ikke regneark-navn)';
+       } else {
+               # Should only happen if we didn't see the initial reaction_add, only reaction_remove.
+               $msg .= $ref->{'userid'} . ' (fant ikke Slack-navn)';
+       }
        push @recent_changes, { values => [{ userEnteredValue => { stringValue => $msg } }] };
 }
 while (scalar @recent_changes < 50) {