fix a few Log/Dbg thingies.
[spider.git] / perl / DXCommandmode.pm
index 79ba03b0b8f63ac3f189534677f9d4d55cb7c5e2..404a7391af2c6bc59d76b28936cc0cc0b2d98720 100644 (file)
@@ -38,7 +38,7 @@ use VE7CC;
 
 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
@@ -48,7 +48,9 @@ $scriptbase = "$main::root/scripts"; # the place where all users start scripts g
 $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+)/ );
@@ -91,7 +93,7 @@ sub start
        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}));
@@ -295,7 +297,7 @@ sub normal
                                        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);
@@ -309,7 +311,7 @@ sub normal
                        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);
@@ -341,7 +343,7 @@ sub normal
 
        # 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;
        }
@@ -430,7 +432,8 @@ sub run_cmd
        
 
        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;
@@ -525,6 +528,8 @@ sub process
                        delete $nothereslug{$k};
                }
        }
+
+       import_cmd();
 }
 
 #
@@ -557,7 +562,7 @@ sub disconnect
        # send info to all logged in thingies
        $self->tell_login('logoutu');
 
-       Log('DXCommand', "$call disconnected");
+       LogDbg('DXCommand', "$call disconnected");
 
        $self->SUPER::disconnect;
 }
@@ -1011,5 +1016,72 @@ sub store_startup_script
        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__