+ }
+
+ # only do a rspf check on PC23 (not 27)
+ if ($pcno == 23) {
+ return if $rspfcheck and !$self->rspfcheck(1, $_[8], $_[7])
+ }
+
+ # do some de-duping
+ my $d = cltounix($_[1], sprintf("%02d18Z", $_[2]));
+ my $sfi = unpad($_[3]);
+ my $k = unpad($_[4]);
+ my $i = unpad($_[5]);
+ my ($r) = $_[6] =~ /R=(\d+)/;
+ $r = 0 unless $r;
+ if (($pcno == 23 && $d < $main::systime - $pc23_max_age) || $d > $main::systime + 1500 || $_[2] < 0 || $_[2] > 23) {
+ dbg("PCPROT: WWV Date ($_[1] $_[2]) out of range") if isdbg('chanerr');
+ return;
+ }
+ if (Geomag::dup($d,$sfi,$k,$i,$_[6])) {
+ dbg("PCPROT: Dup WWV Spot ignored\n") if isdbg('chanerr');
+ return;
+ }
+ $_[7] =~ s/-\d+$//o; # remove spotter's ssid
+
+ my $wwv = Geomag::update($d, $_[2], $sfi, $k, $i, @_[6..8], $r);
+
+ my $rep;
+ eval {
+ $rep = Local::wwv($self, $_[1], $_[2], $sfi, $k, $i, @_[6..8], $r);
+ };
+ # dbg("Local::wwv2 error $@") if isdbg('local') if $@;
+ return if $rep;
+
+ # DON'T be silly and send on PC27s!
+ return if $pcno == 27;
+
+ # broadcast to the eager world
+ send_wwv_spot($self, $line, $d, $_[2], $sfi, $k, $i, @_[6..8]);
+}
+
+# set here status
+sub handle_24
+{
+ my $self = shift;
+ my $pcno = shift;
+ my $line = shift;
+ my $origin = shift;
+ my $call = uc $_[1];
+ my ($nref, $uref);
+ $nref = Route::Node::get($call);
+ $uref = Route::User::get($call);
+ return unless $nref || $uref; # if we don't know where they are, it's pointless sending it on
+
+ if (eph_dup($line)) {
+ dbg("PCPROT: Dup PC24 ignored\n") if isdbg('chanerr');
+ return;
+ }
+
+ $nref->here($_[2]) if $nref;
+ $uref->here($_[2]) if $uref;
+ my $ref = $nref || $uref;
+ return unless $self->in_filter_route($ref);
+
+ $self->route_pc24($origin, $line, $ref, $_[3]);
+}
+
+# merge request
+sub handle_25
+{
+ my $self = shift;
+ my $pcno = shift;
+ my $line = shift;
+ my $origin = shift;
+ if ($_[1] ne $main::mycall) {
+ $self->route($_[1], $line);
+ return;
+ }
+ if ($_[2] eq $main::mycall) {
+ dbg("PCPROT: Trying to merge to myself, ignored") if isdbg('chanerr');
+ return;
+ }
+
+ Log('DXProt', "Merge request for $_[3] spots and $_[4] WWV from $_[2]");
+
+ # spots
+ if ($_[3] > 0) {
+ my @in = reverse Spot::search(1, undef, undef, 0, $_[3]);
+ my $in;
+ foreach $in (@in) {
+ $self->send(pc26(@{$in}[0..4], $_[2]));
+ }
+ }
+
+ # wwv
+ if ($_[4] > 0) {
+ my @in = reverse Geomag::search(0, $_[4], time, 1);
+ my $in;
+ foreach $in (@in) {
+ $self->send(pc27(@{$in}[0..5], $_[2]));
+ }
+ }
+}
+
+sub handle_26 {goto &handle_11}
+sub handle_27 {goto &handle_23}
+
+# mail/file handling
+sub handle_28
+{
+ my $self = shift;
+ my $pcno = shift;
+ my $line = shift;
+ my $origin = shift;
+ if ($_[1] eq $main::mycall) {
+ no strict 'refs';
+ my $sub = "DXMsg::handle_$pcno";
+ &$sub($self, @_);
+ } else {
+ $self->route($_[1], $line) unless $self->is_clx;
+ }
+}
+
+sub handle_29 {goto &handle_28}
+sub handle_30 {goto &handle_28}
+sub handle_31 {goto &handle_28}
+sub handle_32 {goto &handle_28}
+sub handle_33 {goto &handle_28}
+
+sub handle_34
+{
+ my $self = shift;
+ my $pcno = shift;
+ my $line = shift;
+ my $origin = shift;
+ if (eph_dup($line, $eph_pc34_restime)) {
+ dbg("PCPROT: dupe PC34, ignored") if isdbg('chanerr');
+ } else {
+ $self->process_rcmd($_[1], $_[2], $_[2], $_[3]);
+ }
+}
+
+# remote command replies
+sub handle_35
+{
+ my $self = shift;
+ my $pcno = shift;
+ my $line = shift;
+ my $origin = shift;
+ eph_del_regex("^PC35\\^$_[2]\\^$_[1]\\^");
+ $self->process_rcmd_reply($_[1], $_[2], $_[1], $_[3]);
+}