+# Also applies the diff to the database (a bit ugly).
+sub find_diff {
+ my ($dbh, $invitation_ts, $want_colors, $have_colors, $seen_names) = @_;
+
+ my @diffs = ();
+ for my $real_name (keys %$want_colors) {
+ my $wc = $want_colors->{$real_name};
+ if (exists($have_colors->{$real_name})) {
+ if ($have_colors->{$real_name} eq $wc) {
+ # Already good.
+ next;
+ }
+ skv_log("Markerer at $real_name har byttet treningssted.");
+ push @diffs, [
+ $real_name, { backgroundColor => $rgb{$wc} }
+ ];
+ $dbh->do('UPDATE applied SET color=? WHERE channel=? AND ts=? AND name=?', undef,
+ $wc, $config::invitation_channel, $invitation_ts, $real_name);
+ } else {
+ skv_log("Markerer at $real_name skal på trening.");
+ push @diffs, [
+ $real_name, { backgroundColor => $rgb{$wc} }
+ ];
+ $dbh->do('INSERT INTO applied (channel, ts, name, color) VALUES (?, ?, ?, ?)', undef,
+ $config::invitation_channel, $invitation_ts, $real_name, $wc);
+ }
+ }
+ for my $real_name (keys %$have_colors) {
+ next if (exists($want_colors->{$real_name}));
+ 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, [
+ $real_name, { backgroundColor => $rgb{white} }
+ ];
+ $dbh->do('DELETE FROM applied WHERE channel=? AND ts=? AND name=?', undef,
+ $config::invitation_channel, $invitation_ts, $real_name);
+ }
+ }
+ return @diffs;
+}