use QSL;
use DB_File;
use VE7CC;
+use DXXml;
use strict;
use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase $maxerrors %nothereslug
- $maxbadcount $msgpolltime $default_pagelth);
+ $maxbadcount $msgpolltime $default_pagelth $cmdimportdir);
%Cache = (); # cache of dynamically loaded routine's mod times
%cmd_cache = (); # cache of short names
$maxerrors = 20; # the maximum number of concurrent errors allowed before disconnection
$maxbadcount = 3; # no of bad words allowed before disconnection
$msgpolltime = 3600; # the time between polls for new messages
-
+$cmdimportdir = "$main::root/cmd_import"; # the base directory for importing command scripts
+ # this does not exist as default, you need to create it manually
+ #
use vars qw($VERSION $BRANCH);
$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
my $host = $self->{conn}->{peerhost};
$host ||= "AGW Port #$self->{conn}->{agwport}" if exists $self->{conn}->{agwport};
$host ||= "unknown";
- Log('DXCommand', "$call connected from $host");
+ LogDbg('DXCommand', "$call connected from $host");
$self->{name} = $name ? $name : $call;
$self->send($self->msg('l2',$self->{name}));
my @bad;
if (@bad = BadWords::check($l)) {
$self->badcount(($self->badcount||0) + @bad);
- Log('DXCommand', "$self->{call} swore: $l");
+ LogDbg('DXCommand', "$self->{call} swore: $l with words:" . join(',', @bad) . ")");
} else {
for (@{$self->{talklist}}) {
$self->send_talks($_, $l);
my @bad;
if (@bad = BadWords::check($cmdline)) {
$self->badcount(($self->badcount||0) + @bad);
- Log('DXCommand', "$self->{call} swore: $cmdline");
+ LogDbg('DXCommand', "$self->{call} swore: $cmdline with words:" . join(',', @bad) . ")");
} else {
for (@{$self->{talklist}}) {
$self->send_talks($_, $rawline);
# check for excessive swearing
if ($self->{badcount} && $self->{badcount} >= $maxbadcount) {
- Log('DXCommand', "$self->{call} logged out for excessive swearing");
+ LogDbg('DXCommand', "$self->{call} logged out for excessive swearing");
$self->disconnect;
return;
}
return () if length $cmdline == 0;
-
+
+
# split the command line up into parts, the first part is the command
my ($cmd, $args) = split /\s+/, $cmdline, 2;
$args = "" unless defined $args;
delete $nothereslug{$k};
}
}
+
+ import_cmd();
}
#
# send info to all logged in thingies
$self->tell_login('logoutu');
- Log('DXCommand', "$call disconnected");
+ LogDbg('DXCommand', "$call disconnected");
$self->SUPER::disconnect;
}
return @out;
}
+# Import any commands contained in any files in import_cmd directory
+#
+# If the filename has a recogisable callsign as some delimited part
+# of it, then this is the user the command will be run as.
+#
+sub import_cmd
+{
+ # are there any to do in this directory?
+ return unless -d $cmdimportdir;
+ unless (opendir(DIR, $cmdimportdir)) {
+ LogDbg('err', "can\'t open $cmdimportdir $!");
+ return;
+ }
+
+ my @names = readdir(DIR);
+ closedir(DIR);
+ my $name;
+ foreach $name (@names) {
+ next if $name =~ /^\./;
+
+ my $s = Script->new($name, $cmdimportdir);
+ if ($s) {
+ LogDbg('DXCommand', "Run import cmd file $name");
+ my @cat = split /[^A-Za-z0-9]+/, $name;
+ my ($call) = grep {is_callsign(uc $_)} @cat;
+ $call ||= $main::mycall;
+ $call = uc $call;
+ my @out;
+
+
+ $s->inscript(0); # switch off script checks
+
+ if ($call eq $main::mycall) {
+ @out = $s->run($main::me, 1);
+ } else {
+ my $dxchan = DXChannel::get($call);
+ if ($dxchan) {
+ @out = $s->run($dxchan, 1);
+ } else {
+ my $u = DXUser->get($call);
+ if ($u) {
+ $dxchan = $main::me;
+ my $old = $dxchan->{call};
+ my $priv = $dxchan->{priv};
+ my $user = $dxchan->{user};
+ $dxchan->{call} = $call;
+ $dxchan->{priv} = $u->priv;
+ $dxchan->{user} = $u;
+ @out = $s->run($dxchan, 1);
+ $dxchan->{call} = $call;
+ $dxchan->{priv} = $priv;
+ $dxchan->{user} = $user;
+ } else {
+ LogDbg('err', "Trying to run import cmd for non-existant user $call");
+ }
+ }
+ }
+ $s->erase;
+ for (@out) {
+ LogDbg('DXCommand', "Import cmd $name/$call: $_");
+ }
+ } else {
+ LogDbg('err', "Failed to open $cmdimportdir/$name $!");
+ unlink "$cmdimportdir/$name";
+ }
+ }
+}
1;
__END__