+
+# enter the spot for dup checking and return true if it is already a dup
+sub dup
+{
+ my ($freq, $call, $d, $text) = @_;
+
+ # dump if too old
+ return 2 if $d < $main::systime - $dupage;
+
+ $freq = sprintf "%.1f", $freq; # normalise frequency
+ chomp $text;
+ $text = substr($text, 0, $duplth) if length $text > $duplth;
+ unpad($text);
+ my $dupkey = "$freq|$call|$d|$text";
+ return 1 if exists $dup{$dupkey};
+ $dup{$dupkey} = $d; # in seconds (to the nearest minute)
+ return 0;
+}
+
+# called every hour and cleans out the dup cache
+sub process
+{
+ my $cutoff = $main::systime - $dupage;
+ while (my ($key, $val) = each %dup) {
+ delete $dup{$key} if $val < $cutoff;
+ }
+}
+
+sub listdups
+{
+ my $regex = shift;
+ $regex = '.*' unless $regex;
+ $regex =~ s/[\$\@\%]//g;
+ my @out;
+ for (sort { $dup{$a} <=> $dup{$b} } grep { m{$regex}i } keys %dup) {
+ my $val = $dup{$_};
+ push @out, "$_ = " . cldatetime($val);
+ }
+ return @out;
+}