RouteDB::update($_[6], $self->{call});
# RouteDB::update($to, $_[6]);
+ # convert this to a PC93 and process it as such
+ $self->normal(pc93($to, $from, $via, $_[3], $_[6]));
+ return;
+
+ # this is all redundant but kept for now for reference
+
# it is here and logged on
$dxchan = DXChannel::get($main::myalias) if $to eq $main::mycall;
$dxchan = DXChannel::get($to) unless $dxchan;
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);
}
my $h;
$h = 1 if DXChannel::get($ncall);
RouteDB::update($ncall, $self->{call}, $h);
+ if ($h && $self->{call} ne $ncall) {
+ dbg("PCPROT: trying to update a local node, ignored") if isdbg('chanerr');
+ return;
+ }
if (eph_dup($line)) {
dbg("PCPROT: dup PC16 detected") if isdbg('chanerr');
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->sort('S');
}
$self->{handle_xml}++ if DXXml::available() && $_[1] =~ /\bxml/;
- my ($pc9x) = $_[1] =~ /\bpc9\[(\d+)\]/;
- $self->{do_pc92}++ if defined $pc9x && $pc9x =~ /2/;
+ if ($_[1] =~ /\bpc9x/) {
+ $self->{do_pc9x} = 1;
+ dbg("Do px9x set on $self->{call}");
+ }
} else {
$self->version(50.0);
$self->version($_[2] / 100) if $_[2] && $_[2] =~ /^\d+$/;
# but remember there will only be one (pair) these because any extras will be
# thrown away.
if (@rout) {
- $self->route_pc21($self->{call}, $line, @rout);
+# $self->route_pc21($self->{call}, $line, @rout);
$self->route_pc19($self->{call}, $line, @rout);
}
if (@pc92out) {
$self->broadcast_route_pc9x($main::mycall, undef, $line, 0);
# if this is an external node then send out the external config
- unless ($self->{do_pc92}) {
+ unless ($self->{do_pc9x}) {
$line = gen_my_pc92_config(Route::Node::get($self->{call}));
$self->broadcast_route_pc9x($main::mycall, undef, $line, 0);
}
my $line = shift;
my $origin = shift;
- if ($self->{do_pc92} && $self->{state} ne 'init92') {
+ if ($self->{do_pc9x} && $self->{state} ne 'init92') {
dbg("PCPROT: disconnecting because login call not sent in any pc92") if isdbg('chanerr');
$self->send("**** You logged in with $self->{call} but that is NOT your \$mycall");
$self->disconnect;
my $line = shift;
my $origin = shift;
- if ($self->{do_pc92}) {
+ if ($self->{do_pc9x}) {
if ($self->{state} ne 'init92') {
dbg("PCPROT: disconnecting because login call not sent in any pc92") if isdbg('chanerr');
$self->send("**** You logged in with $self->{call} but that is NOT your \$mycall");
$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');
if ($ref->isa('Route::Node') || $ref->isa('DXProt')) {
$flag |= 4;
my $dxchan = DXChannel::get($call);
- $flag |= 2 if $call ne $main::mycall && $dxchan && !$dxchan->{do_pc92};
+ $flag |= 2 if $call ne $main::mycall && $dxchan && !$dxchan->{do_pc9x};
if ($ext) {
if ($ref->version) {
my $version = $ref->version || 1.0;
my (@radd, @rdel);
- $self->{do_pc92} ||= 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_pc92(1);
+ $parent->do_pc9x(1);
$parent->via_pc92(1);
if (@ent) {
dbg("ROUTE: reset obscount on $parent->{call} now " . $parent->obscount) if isdbg('route');
}
+ #
foreach my $r (@nent) {
# my ($call, $is_node, $is_extnode, $here, $version, $build) = _decode_pc92_call($_);
if ($r->[0]) {
}
my @pc19 = grep { $_ && $_->isa('Route::Node') } @radd;
my @pc16 = grep { $_ && $_->isa('Route::User') } @radd;
+ unshift @pc19, $parent if $self->{state} eq 'init92' && $oparent == $parent;
$self->route_pc19($pcall, undef, @pc19) if @pc19;
$self->route_pc16($pcall, undef, $parent, @pc16) if @pc16;
}
+sub handle_93
+{
+ my $self = shift;
+ my $pcno = shift;
+ my $line = shift;
+ my $origin = shift;
+
+# $self->{do_pc9x} ||= 1;
+
+ my $pcall = $_[1];
+ unless (is_callsign($pcall)) {
+ dbg("PCPROT: invalid callsign string '$_[1]', ignored") if isdbg('chanerr');
+ return;
+ }
+ my $t = $_[2];
+ my $parent = check_pc9x_t($pcall, $t, 93, 1) || return;
+
+ my $to = $_[3];
+ my $from = $_[4];
+ my $via = $_[5];
+ my $text = $_[6];
+ my $onode = $_[7];
+ $onode = $pcall if @_ <= 8;
+
+ # will we allow it at all?
+ if ($censorpc) {
+ my @bad;
+ if (@bad = BadWords::check($text)) {
+ dbg("PCPROT: Bad words: @bad, dropped") if isdbg('chanerr');
+ return;
+ }
+ }
+
+ # if this is a 'bad spotter' user then ignore it
+ my $nossid = $from;
+ $nossid =~ s/-\d+$//;
+ if ($badspotter->in($nossid)) {
+ dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr');
+ return;
+ }
+
+ if (is_callsign($to)) {
+ # local talks
+ my $dxchan;
+ $dxchan = DXChannel::get($main::myalias) if $to eq $main::mycall;
+ $dxchan = DXChannel::get($to) unless $dxchan;
+ if ($dxchan && $dxchan->is_user) {
+ $dxchan->talk($from, $to, $via, $text, $onode);
+ return;
+ }
+
+ # convert to PC10 talks where appropriate
+ my $ref = Route::get($to);
+ if ($ref) {
+ my @dxchan = $ref->alldxchan;
+ for $dxchan (@dxchan) {
+ if ($dxchan->{do_pc9x}) {
+ $dxchan->send($line);
+ } else {
+ $dxchan->talk($from, $to, $via, $text, $onode);
+ }
+ }
+ return;
+ }
+
+ # otherwise, drop through and allow it to be broadcast
+ } 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 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);
+}
+
# if get here then rebroadcast the thing with its Hop count decremented (if
# there is one). If it has a hop count and it decrements to zero then don't
# rebroadcast it.
if (eph_dup($line)) {
dbg("PCPROT: Ephemeral dup, dropped") if isdbg('chanerr');
} else {
- unless ($self->{isolate}) {
- DXChannel::broadcast_nodes($line, $self) if $line =~ /\^H\d+\^?~?$/; # send it to everyone but me
+ if ($pcno >= 90) {
+ my $pcall = $_[1];
+ unless (is_callsign($pcall)) {
+ dbg("PCPROT: invalid callsign string '$_[1]', ignored") if isdbg('chanerr');
+ return;
+ }
+ my $t = $_[2];
+ my $parent = check_pc9x_t($pcall, $t, $pcno, 1) || return;
+ $self->broadcast_route_pc9x($pcall, undef, $line, 0);
+ } else {
+ unless ($self->{isolate}) {
+ DXChannel::broadcast_nodes($line, $self) if $line =~ /\^H\d+\^?~?$/; # send it to everyone but me
+ }
}
}
}