my $dxchan;
if ((($dxchan = DXChannel::get($_[2])) && $dxchan->is_user) || $_[4] =~ /^[\#\w.]+$/){
- $self->send_chat($line, @_[1..6]);
+ $self->send_chat(0, $line, @_[1..6]);
} elsif ($_[2] eq '*' || $_[2] eq $main::mycall) {
# remember a route
}
# send it
- $self->send_announce($line, @_[1..6]);
+ $self->send_announce(0, $line, @_[1..6]);
} else {
$self->route($_[2], $line);
}
RouteDB::delete($ncall, $self->{call});
- unless ($ncall eq $self->{call}) {
- dbg("PCPROT: PC17 from non-local $ncall, ignored") if isdbg('chanerr');
- return;
- }
-
my $uref = Route::User::get($ucall);
unless ($uref) {
dbg("PCPROT: Route::User $ucall not in config") if isdbg('chanerr');
+ return;
}
my $parent = Route::Node::get($ncall);
unless ($parent) {
dbg("PCPROT: Route::Node $ncall not in config") if isdbg('chanerr');
+ return;
}
- $dxchan = $parent->dxchan if $parent;
+ $dxchan = DXChannel::get($ncall);
if ($dxchan && $dxchan ne $self) {
dbg("PCPROT: PC17 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr');
return;
}
- $dxchan = DXChannel::get($ncall);
unless ($dxchan) {
if ($parent->via_pc92) {
dbg("PCPROT: non-local node controlled by PC92, ignored") if isdbg('chanerr');
}
# input filter if required and then remove user if present
- if ($parent) {
# return unless $self->in_filter_route($parent);
- $parent->del_user($uref) if $uref;
- } else {
- $parent = Route->new($ncall); # throw away
- }
+ $parent->del_user($uref);
# send info to all logged in thingies
$self->tell_login('logoutu', "$ncall: $ucall") if DXUser->get_current($ncall)->is_local_node;
return;
}
- $uref = Route->new($ucall) unless $uref; # throw away
$self->route_pc17($origin, $line, $parent, $uref);
# $self->route_pc92d($main::mycall, undef, $parent, $uref) if $dxchan;
}
}
$self->{handle_xml}++ if DXXml::available() && $_[1] =~ /\bxml/;
if ($_[1] =~ /\bpc9x/) {
- $self->{do_pc9x}++;
+ $self->{do_pc9x} = 1;
+ dbg("Do px9x set on $self->{call}");
}
} else {
$self->version(50.0);
$user = DXUser->new($call) unless $user;
if ($_[2] == 1) {
+ if (($_[3] =~ /spotter/i || $_[3] =~ /self/i) && $user->name && $user->name ne $_[3]) {
+ dbg("PCPROT: invalid name") if isdbg('chanerr');
+ if ($main::mycall eq 'GB7DJK' || $main::mycall eq 'GB7BAA' || $main::mycall eq 'WR3D') {
+ DXChannel::broadcast_nodes(pc41($_[1], 1, $user->name)); # send it to everyone including me
+ }
+ return;
+ }
$user->name($_[3]);
} elsif ($_[2] == 2) {
$user->qth($_[3]);
} elsif ($_[2] == 3) {
if (is_latlong($_[3])) {
my ($lat, $long) = DXBearing::stoll($_[3]);
- $user->lat($lat);
- $user->long($long);
- $user->qra(DXBearing::lltoqra($lat, $long));
+ $user->lat($lat) if $lat;
+ $user->long($long) if $long;
+ $user->qra(DXBearing::lltoqra($lat, $long)) unless $user->qra;
} else {
dbg('PCPROT: not a valid lat/long') if isdbg('chanerr');
return;
} elsif ($_[2] == 5) {
if (is_qra(uc $_[3])) {
my ($lat, $long) = DXBearing::qratoll(uc $_[3]);
- $user->lat($lat);
- $user->long($long);
+ $user->lat($lat) if $lat && !$user->lat;
+ $user->long($long) if $long && !$user->long;
$user->qra(uc $_[3]);
} else {
dbg('PCPROT: not a valid QRA locator') if isdbg('chanerr');
my (@radd, @rdel);
- $self->{do_pc9x} ||= 1;
-
my $pcall = $_[1];
unless ($pcall) {
dbg("PCPROT: invalid callsign string '$_[1]', ignored") if isdbg('chanerr');
if ($pcall eq $self->{call} && $self->{state} eq 'init') {
$self->state('init92');
+ $self->{do_pc9x} = 1;
+ dbg("Do pc9x set on $pcall");
+ }
+ unless ($self->{do_pc9x}) {
+ dbg("PCPROT: PC9x come in from non-PC9x node, ignored") if isdbg('chanerr');
+ return;
}
my $parent = check_pc9x_t($pcall, $t, 92, 1) || return;
my $oparent = $parent;
- $parent->lastid->{92} = $t;
$parent->do_pc9x(1);
$parent->via_pc92(1);
my $line = shift;
my $origin = shift;
- $self->{do_pc9x} ||= 1;
+# $self->{do_pc9x} ||= 1;
my $pcall = $_[1];
unless (is_callsign($pcall)) {
}
# otherwise, drop through and allow it to be broadcast
- } elsif ($to eq '*' || $to eq 'SYSOP' || $to eq 'WX') {
+ } elsif ($to eq '*' || uc $to eq 'SYSOP' || uc $to eq 'WX') {
# announces
+ my $sysop = uc $to eq 'SYSOP' ? '*' : ' ';
+ my $wx = uc $to eq 'WX' ? '1' : '0';
+ my $local = $via eq 'LOCAL' ? '*' : $via;
+
+ $self->send_announce(1, pc12($from, $text, $local, $via, $sysop, $wx, $pcall), $from, $local, $text, $sysop, $pcall, $wx, $via eq 'LOCAL' ? $via : undef);
+ return if $via eq 'LOCAL';
} else {
- # chat messages
+ # chat messages to non-pc9x nodes
+ $self->send_chat(1, pc12($from, $text, undef, $to, undef, $pcall), $from, '*', $text, $to, $pcall, '0');
}
$self->broadcast_route_pc9x($pcall, undef, $line, 0);
}