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
$maxbadcount = 3; # no of bad words allowed before disconnection
$msgpolltime = 3600; # the time between polls for new messages
$default_pagelth = 20; # the default page length 0 = unlimited
+$cmdimportdir = "$main::root/cmd_import"; # the base directory for importing command scripts
+ # this does not exist as default, you need to create it manually
delete $nothereslug{$k};
}
}
+
+ import_cmd();
}
#
return grep {$_->{sort} eq 'U'} DXChannel::get_all();
}
-# run a script for this user
-sub run_script
-{
- my $self = shift;
- my $silent = shift || 0;
-
-}
-
#
# search for the command in the cache of short->long form commands
#
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)) {
+ dbg("can\'t open $cmdimportdir $!");
+ Log('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) {
+
+ dbg("Run import cmd file $name");
+ Log('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 {
+ Log('err', "Trying to run import cmd for non-existant user $call");
+ dbg( "Trying to run import cmd for non-existant user $call");
+ }
+ }
+ }
+ $s->erase;
+ for (@out) {
+ Log('DXCommand', "Import cmd $name/$call: $_");
+ dbg("Import cmd $name/$call: $_");
+ }
+ } else {
+ Log("Failed to open $cmdimportdir/$name $!");
+ dbg("Failed to open $cmdimportdir/$name $!");
+ unlink "$cmdimportdir/$name";
+ }
+ }
+}
+
1;
__END__
sub new
{
my $pkg = shift;
- my $script = clean(lc shift);
- my $fn = "$base/$script";
+ my $script = clean(shift);
+ my $mybase = shift || $base;
+ my $fn = "$mybase/$script";
- my $fh = new IO::File $fn;
- return undef unless $fh;
- my $self = bless {call => $script}, $pkg;
+ my $self = {call => $script};
+ my $fh = IO::File->new($fn);
+ if ($fh) {
+ $self->{fn} = $fn;
+ } else {
+ $fh = IO::File->new(lc $fn);
+ if ($fh) {
+ $self->{fn} = $fn;
+ } else {
+ return undef;
+ }
+ }
my @lines;
while (<$fh>) {
chomp;
}
$fh->close;
$self->{lines} = \@lines;
+ $self->{inscript} = 1;
return bless $self, $pkg;
}
{
my $self = shift;
my $dxchan = shift;
+ my $return_output = shift;
+ my @out;
+
foreach my $l (@{$self->{lines}}) {
unless ($l =~ /^\s*\#/ || $l =~ /^\s*$/) {
- $dxchan->inscript(1);
- my @out = DXCommandmode::run_cmd($dxchan, $l);
- $dxchan->inscript(0);
- if ($dxchan->can('send_ans')) {
- $dxchan->send_ans(@out);
- } else {
- dbg($_) for @out;
- }
+ $dxchan->inscript(1) if $self->{inscript};
+ push @out, DXCommandmode::run_cmd($dxchan, $l);
+ $dxchan->inscript(0) if $self->{inscript};
last if @out && $l =~ /^pri?v?/i;
}
}
+ if ($return_output) {
+ return @out;
+ } else {
+ if ($dxchan->can('send_ans')) {
+ $dxchan->send_ans(@out);
+ } else {
+ dbg($_) for @out;
+ }
+ }
+ return ();
+}
+
+sub inscript
+{
+ my $self = shift;
+ $self->{inscript} = shift if @_;
+ return $self->{inscript};
}
sub store
sub erase
{
- my $call = clean(lc shift);
- my $fn = "$base/$call";
- unlink $fn;
+ my $self = shift;
+ unlink $self->{fn};
}