sub init
{
my $user = DXUser->get($main::mycall);
+ $DXProt::myprot_version += $main::version*100;
$me = DXProt->new($main::mycall, undef, $user);
+ $me->{here} = 1;
# $me->{sort} = 'M'; # M for me
}
$self->{outbound} = $sort eq 'O';
$self->{priv} = $user->priv;
$self->{lang} = $user->lang;
+ $self->{isolate} = $user->{isolate};
$self->{consort} = $line; # save the connection type
$self->{here} = 1;
}
$self->state('init');
$self->pc50_t(time);
+
Log('DXProt', "$call connected");
}
my @list;
if ($field[4] eq '*') { # sysops
- $target = "Sysops";
+ $target = "SYSOP";
@list = map { $_->priv >= 5 ? $_ : () } get_all_users();
} elsif ($field[4] gt ' ') { # speciality list handling
my ($name) = split /\./, $field[4];
last SWITCH if !$node; # ignore if havn't seen a PC19 for this one yet
my $i;
+
for ($i = 2; $i < $#field; $i++) {
my ($call, $confmode, $here) = $field[$i] =~ /^(\S+) (-) (\d)/o;
next if length $call < 3;
$call =~ s/-\d+$//o; # remove ssid for users
my $user = DXUser->get_current($call);
$user = DXUser->new($call) if !$user;
- $user->node($node->call);
$user->homenode($node->call) if !$user->homenode;
+ $user->node($node->call);
+ $user->lastin($main::systime);
$user->put;
}
if (!$user) {
$user = DXUser->new($call);
$user->sort('A');
- $user->node($call);
+ $user->priv(1); # I have relented and defaulted nodes
+ $self->{priv} = 1; # to user RCMDs allowed
$user->homenode($call);
- $user->put;
+ $user->node($call);
}
+ $user->lastin($main::systime);
+ $user->put;
}
# queue up any messages
- DXMsg::queue_msg() if $self->state eq 'normal';
+ DXMsg::queue_msg() if $self->state eq 'normal';
last SWITCH;
}
last SWITCH;
}
- if (($pcno >= 28 && $pcno <= 33) || $pcno == 40 || $pcno == 42) { # mail/file handling
+ if (($pcno >= 28 && $pcno <= 33) || $pcno == 40 || $pcno == 42 || $pcno == 49) { # mail/file handling
DXMsg::process($self, $line);
return;
}
if ($field[1] eq $main::mycall) {
my $ref = DXUser->get_current($field[2]);
Log('rcmd', 'in', $ref->{priv}, $field[2], $field[3]);
- if ($ref->{priv}) { # you have to have SOME privilege, the commands have further filtering
- $self->{remotecmd} = 1; # for the benefit of any command that needs to know
- my @in = (DXCommandmode::run_cmd($self, $field[3]));
- for (@in) {
- s/\s*$//og;
- $self->send(pc35($main::mycall, $field[2], "$main::mycall:$_"));
- Log('rcmd', 'out', $field[2], $_);
+ unless ($field[3] =~ /rcmd/i) { # not allowed to relay RCMDS!
+ if ($ref->{priv}) { # you have to have SOME privilege, the commands have further filtering
+ $self->{remotecmd} = 1; # for the benefit of any command that needs to know
+ my @in = (DXCommandmode::run_cmd($self, $field[3]));
+ for (@in) {
+ s/\s*$//og;
+ $self->send(pc35($main::mycall, $field[2], "$main::mycall:$_"));
+ Log('rcmd', 'out', $field[2], $_);
+ }
+ delete $self->{remotecmd};
}
- delete $self->{remotecmd};
+ } else {
+ $self->send(pc35($main::mycall, $field[2], "$main::mycall:Tut tut tut...!"));
}
} else {
route($field[1], $line);
} elsif ($field[2] == 2) {
$user->qth($field[3]);
} elsif ($field[2] == 3) {
- my ($latd, $latm, $latl, $longd, $longm, $longl) = split /\s+/, $field[3];
- $longd += ($longm/60);
- $longd = 0-$longd if (uc $longl) eq 'W';
- $user->long($longd);
- $latd += ($latm/60);
- $latd = 0-$latd if (uc $latl) eq 'S';
- $user->lat($latd);
+ my ($lat, $long) = DXBearing::stoll($field[3]);
+ $user->lat($lat);
+ $user->long($long);
} elsif ($field[2] == 4) {
$user->homenode($field[3]);
}
if ($pcno == 48) {
last SWITCH;
}
- if ($pcno == 49) {
- last SWITCH;
- }
if ($pcno == 50) { # keep alive/user list
my $ref = DXCluster->get_exact($field[1]);
# REBROADCAST!!!!
#
- my $hops;
- if (($hops) = $line =~ /H(\d+)\^\~?$/o) {
+ my $hops;
+ if (!$self->{isolate} && (($hops) = $line =~ /H(\d+)\^\~?$/o)) {
my $newhops = $hops - 1;
if ($newhops > 0) {
$line =~ s/\^H$hops(\^\~?)$/\^H$newhops$1/; # change the hop count
foreach $node (@gonenodes) {
next if $node->call eq $call;
- broadcast_ak1a(pc21($node->call, 'Gone'), $self); # done like this 'cos DXNodes don't have a pc21 method
+ broadcast_ak1a(pc21($node->call, 'Gone'), $self) unless $self->{isolate}; # done like this 'cos DXNodes don't have a pc21 method
$node->del();
}
# now broadcast to all other ak1a nodes that I have gone
broadcast_ak1a(pc21($call, 'Gone.'), $self);
+
Log('DXProt', $call . " Disconnected");
$ref->del() if $ref;
}
{
my $self = shift;
my $n;
+ my @nodes;
# send our nodes
- my @nodes = DXNode::get_all();
-
- # create a list of all the nodes that are not connected to this connection
- @nodes = grep { $_->dxchan != $self } @nodes;
+ if ($self->{isolate}) {
+ @nodes = (DXCluster->get_exact($main::mycall));
+ } else {
+ # create a list of all the nodes that are not connected to this connection
+ @nodes = DXNode::get_all();
+ @nodes = grep { $_->dxchan != $self } @nodes;
+ }
$self->send($me->pc19(@nodes));
# get all the users connected on the above nodes and send them out
foreach $chan (@chan) {
next if grep $chan == $_, @except;
- $chan->send($s); # send it if it isn't the except list
+ $chan->send($s) unless $chan->{isolate}; # send it if it isn't the except list
}
}
foreach $chan (@chan) {
next if grep $chan == $_, @except;
- $chan->send($s); # send it if it isn't the except list
+ $s =~ s/\a//og if !$chan->{beep};
+ $chan->send($s); # send it if it isn't the except list or hasn't a passout flag
}
}