+06Jan02=======================================================================
+1. fix leading space removal from messages input from the keyboard
+2. make some mods to allow perl 5.7.2 to run
+3. create $DXProt::eph_restime to allow variable slugging of ephemeral dups
+4. create $DXProt::eph_info_restime to allow a long dupe time for these
+4. create $DXProt::eph_pc34 to allow a short anti dupe slug for rcmd loops
02Jan02=======================================================================
1. updated the copyright dates
2. modernised and extended the Windows instructions a bit.
my $self = shift;
my $cmdline = shift;
my @ans;
+
+ # save this for them's that need it
+ my $rawline = $cmdline;
# remove leading and trailing spaces
$cmdline =~ s/^\s*(.*)\s*$/$1/;
Log('DXCommand', "$self->{call} swore: $cmdline");
} else {
for (@{$self->{talklist}}) {
- $self->send_talks($_, $cmdline);
+ $self->send_talks($_, $rawline);
}
}
$self->send($self->talk_prompt) if $self->{state} eq 'talk';
no strict 'refs';
my @ans;
if (ref $self->{edit}) {
- eval { @ans = $self->{edit}->$func($self, $cmdline)};
+ eval { @ans = $self->{edit}->$func($self, $rawline)};
} else {
- eval { @ans = &{$self->{func}}($self, $cmdline) };
+ eval { @ans = &{$self->{func}}($self, $rawline) };
}
if ($@) {
$self->send_ans("Syserr: on stored func $self->{func}", $@);
$main::build += $VERSION;
$main::branch += $BRANCH;
-use vars qw($pc11_max_age $pc23_max_age $last_pc50
+use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restime $eph_pc34_restime
$last_hour $last10 %eph %pings %rcmds $ann_to_talk
%nodehops $baddx $badspotter $badnode $censorpc $rspfcheck
$allowzero $decode_dk0wcy $send_opernam @checklist);
$last10 = $last_pc50 = time;
$ann_to_talk = 1;
$rspfcheck = 1;
+$eph_restime = 180;
+$eph_info_restime = 10*60;
+$eph_pc34_restime = 30;
@checklist =
(
}
if ($pcno == 34 || $pcno == 36) { # remote commands (incoming)
- $self->process_rcmd($field[1], $field[2], $field[2], $field[3]);
+ if (eph_dup($line, $eph_pc34_restime)) {
+ dbg("PCPROT: dupe") if isdbg('chanerr');
+ } else {
+ $self->process_rcmd($field[1], $field[2], $field[2], $field[3]);
+ }
return;
}
if ($pcno == 35) { # remote command replies
+ eph_del_regex("^PC35\^$field[2]\^$field[1]\^");
$self->process_rcmd_reply($field[1], $field[2], $field[1], $field[3]);
return;
}
if ($pcno == 41) { # user info
my $call = $field[1];
+ if (eph_dup($line, $eph_info_restime)) {
+ dbg("PCPROT: dupe") if isdbg('chanerr');
+ return;
+ }
+
# input filter if required
# my $ref = Route::get($call) || Route->new($call);
# return unless $self->in_filter_route($ref);
} elsif ($field[2] == 4) {
$user->homenode($field[3]);
} elsif ($field[2] == 5) {
- if (is_qra($field[3])) {
- my ($lat, $long) = DXBearing::qratoll($field[3]);
+ if (is_qra(uc $field[3])) {
+ my ($lat, $long) = DXBearing::qratoll(uc $field[3]);
$user->lat($lat);
$user->long($long);
- $user->qra($field[3]);
+ $user->qra(uc $field[3]);
} else {
dbg('PCPROT: not a valid QRA locator') if isdbg('chanerr');
return;
$user->lastoper($main::systime); # to cut down on excessive for/opers being generated
$user->put;
+ unless ($self->{isolate}) {
+ DXChannel::broadcast_nodes($line, $self); # send it to everyone but me
+ }
+
# perhaps this IS what we want after all
# $self->route_pc41($ref, $call, $field[2], $field[3], $field[4]);
-# return;
+ return;
}
if ($pcno == 43) {
sub eph_dup
{
my $s = shift;
+ my $t = shift || $eph_restime;
my $r;
# chop the end off
$s =~ s/\^H\d\d?\^?\~?$//;
$r = 1 if exists $eph{$s}; # pump up the dup if it keeps circulating
- $eph{$s} = $main::systime;
+ $eph{$s} = $main::systime + $t;
return $r;
}
my ($key, $val);
while (($key, $val) = each %eph) {
- if ($main::systime - $val > 180) {
+ if ($main::systime >= $val) {
delete $eph{$key};
}
}
}
+sub eph_list
+{
+ my ($key, $val);
+ my @out;
+
+ while (($key, $val) = each %eph) {
+ push @out, $key, $val;
+ }
+ return @out;
+}
1;
__END__