+# enter the spot for dup checking and return true if it is already a dup
+sub dup {
+ my ($freq, $call, $d, $text, $by, $node) = @_;
+
+ # dump if too old
+ return 2 if $d < $main::systime - $dupage;
+
+ # turn the time into minutes (should be already but...)
+ $d = int ($d / 60);
+ $d *= 60;
+
+ # remove SSID or area
+ $by =~ s|[-/]\d+$||;
+
+# $freq = sprintf "%.1f", $freq; # normalise frequency
+ $freq = int $freq; # normalise frequency
+ $call = substr($call, 0, $maxcalllth) if length $call > $maxcalllth;
+
+ chomp $text;
+ $text =~ s/\%([0-9A-F][0-9A-F])/chr(hex($1))/eg;
+ $text = uc unpad($text);
+ my $otext = $text;
+# $text = Encode::encode("iso-8859-1", $text) if $main::can_encode && Encode::is_utf8($text, 1);
+ $text =~ s/^\+\w+\s*//; # remove leading LoTW callsign
+ $text =~ s/\s{2,}[\dA-Z]?[A-Z]\d?$// if length $text > 24;
+ $text =~ s/[\W\x00-\x2F\x7B-\xFF]//g; # tautology, just to make quite sure!
+ $text = substr($text, 0, $duplth) if length $text > $duplth;
+ my $ldupkey = "X$|$call|$by|$node|$freq|$d|$text";
+ my $t = DXDupe::find($ldupkey);
+ return 1 if $t && $t - $main::systime > 0;
+
+ DXDupe::add($ldupkey, $main::systime+$dupage);
+ $otext = substr($otext, 0, $duplth) if length $otext > $duplth;
+ $otext =~ s/\s+$//;
+ if (length $otext && $otext ne $text) {
+ $ldupkey = "X$freq|$call|$by|$otext";
+ $t = DXDupe::find($ldupkey);
+ return 1 if $t && $t - $main::systime > 0;
+ DXDupe::add($ldupkey, $main::systime+$dupage);
+ }
+ return 0;
+}
+
+sub listdups