]> git.sesse.net Git - skvidarsync/blobdiff - bin/sync.pl
Correct cell names for duplicate detection.
[skvidarsync] / bin / sync.pl
index 4487fb45dcd6e5d8a76748d7d2534c1bdd09edac..0237fd66e7edf73ebea482ae007546324c7ed464 100644 (file)
@@ -7,12 +7,14 @@ use JSON::XS;
 use LWP::UserAgent;
 use DBI;
 use POSIX;
+use Time::HiRes;
 binmode STDOUT, ':utf8';
 binmode STDERR, ':utf8';
 use utf8;
 
 # TODO:
 # - detect moves between groups
+# - make the sheet message more in-your-face (ephemeral message)
 
 require '../include/config.pm';
 
@@ -114,7 +116,7 @@ sub matches_name {
 
 sub format_cell_names_for_seen {
        my $seen = shift;
-       my @cells = map { chr(ord('A') + $_->[2]) . $_->[1] } @$seen;
+       my @cells = map { chr(ord('A') + $_->[2]) . ($_->[1] + 1) } @$seen;
        return join(', ', @cells);
 }
 
@@ -278,6 +280,8 @@ sub find_diff {
                if (!exists($seen_names->{lc $real_name})) {
                        # TODO: This can somehow come if we try to add someone who's not in the sheet, too?
                        skv_log("Ønsket å fjerne at $real_name skulle på trening, men de var ikke i regnearket lenger.");
+               } elsif (scalar @{$seen_names->{lc $real_name}} > 1) {
+                       # Don't touch them.
                } else {
                        skv_log("Fjerner at $real_name skal på trening.");
                        push @diffs, [
@@ -329,6 +333,8 @@ sub possibly_nag_user {
 }
 
 sub run {
+       my $start = [Time::HiRes::gettimeofday];
+
        @log = ();
        skv_log("Siste sync startet: " . POSIX::ctime(time));
 
@@ -349,7 +355,7 @@ sub run {
 
        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");
+               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() ]);
                die;
        }
@@ -545,9 +551,13 @@ sub run {
                for my $diff (@diffs) {
                        my $real_name = $diff->[0];
 
-                       # See if we can find them in the spreadsheet.
                        my $seen = $seen_names{lc $real_name};
-                       die if (!defined($seen) || scalar @$seen > 1);
+
+                       # We've already complained about these earlier, so just skip them silently.
+                       next if (scalar @$seen > 1);
+
+                       # See if we can find them in the spreadsheet.
+                       die "Could not find $real_name" if (!defined($seen));
                        my $rowno = $seen->[0][1];
                        my $colno = $seen->[0][2];
                        push @yellow_updates, {
@@ -590,9 +600,16 @@ sub run {
        push @yellow_updates, serialize_skv_log_to_sheet();
        sheet_batch_update($ua, $token, \@yellow_updates);
        $dbh->commit;
+
+       my $elapsed = Time::HiRes::tv_interval($start);
+       printf "Tok %.0f ms.\n", 1e3 * $elapsed;
 }
 
 if ($#ARGV >= 0 && $ARGV[0] eq '--daemon') {
+       # Start with a single, forced run.
+       unlink("/srv/skvidar-slack.sesse.net/marker");
+       run();
+
        while (1) {
                if (!unlink("/srv/skvidar-slack.sesse.net/marker")) {
                        unless ($!{ENOENT}) {