- my $self = shift;
- my $user = $self->{user};
- my $call = $self->{call};
- my $cmdline = shift;
-
- # strip out //
- $cmdline =~ s|//|/|og;
-
- # split the command line up into parts, the first part is the command
- my ($cmd, $args) = $cmdline =~ /^([\w\/]+)\s*(.*)/o;
-
- if ($cmd) {
-
- my ($path, $fcmd);
-
- # first expand out the entry to a command
- ($path, $fcmd) = search($main::localcmd, $cmd, "pl");
- ($path, $fcmd) = search($main::cmd, $cmd, "pl") if !$path || !$fcmd;
-
- my @ans = $self->eval_file($path, $fcmd, $args) if $path && $fcmd;
-# @ans = $self->eval_file($main::cmd, $cmd, $args) if !$ans[0];
- if ($ans[0]) {
- shift @ans;
- $self->send(@ans) if @ans > 0;
+ 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/;
+
+ if ($self->{state} eq 'page') {
+ my $i = $self->{pagelth};
+ my $ref = $self->{pagedata};
+ my $tot = @$ref;
+
+ # abort if we get a line starting in with a
+ if ($cmdline =~ /^a/io) {
+ undef $ref;
+ $i = 0;
+ }
+
+ # send a tranche of data
+ while ($i-- > 0 && @$ref) {
+ my $line = shift @$ref;
+ $line =~ s/\s+$//o; # why am having to do this?
+ $self->send($line);
+ }
+
+ # reset state if none or else chuck out an intermediate prompt
+ if ($ref && @$ref) {
+ $tot -= $self->{pagelth};
+ $self->send($self->msg('page', $tot));
+ } else {
+ $self->state('prompt');
+ }
+ } elsif ($self->{state} eq 'sysop') {
+ my $passwd = $self->{user}->passwd;
+ if ($passwd) {
+ my @pw = grep {$_ !~ /\s/} split //, $passwd;
+ my @l = @{$self->{passwd}};
+ my $str = "$pw[$l[0]].*$pw[$l[1]].*$pw[$l[2]].*$pw[$l[3]].*$pw[$l[4]]";
+ if ($cmdline =~ /$str/) {
+ $self->{priv} = $self->{user}->priv;
+ } else {
+ $self->send($self->msg('sorry'));
+ }
+ } else {
+ $self->send($self->msg('sorry'));
+ }
+ $self->state('prompt');
+ } elsif ($self->{state} eq 'passwd') {
+ my $passwd = $self->{user}->passwd;
+ if ($passwd && $cmdline eq $passwd) {
+ $self->send($self->msg('pw1'));
+ $self->state('passwd1');
+ } else {
+ $self->conn->{echo} = $self->conn->{decho};
+ delete $self->conn->{decho};
+ $self->send($self->msg('sorry'));
+ $self->state('prompt');
+ }
+ } elsif ($self->{state} eq 'passwd1') {
+ $self->{passwd} = $cmdline;
+ $self->send($self->msg('pw2'));
+ $self->state('passwd2');
+ } elsif ($self->{state} eq 'passwd2') {
+ if ($cmdline eq $self->{passwd}) {
+ $self->{user}->passwd($cmdline);
+ $self->send($self->msg('pw3'));
+ } else {
+ $self->send($self->msg('pw4'));
+ }
+ $self->conn->{echo} = $self->conn->{decho};
+ delete $self->conn->{decho};
+ $self->state('prompt');
+ } elsif ($self->{state} eq 'talk') {
+ if ($cmdline =~ m{^(?:/EX|/ABORT)}i) {
+ for (@{$self->{talklist}}) {
+ $self->send_talks($_, $self->msg('talkend'));
+ }
+ $self->state('prompt');
+ delete $self->{talklist};
+ } elsif ($cmdline =~ m|^/+\w+|) {
+ $cmdline =~ s|^/||;
+ my $sendit = $cmdline =~ s|^/+||;
+ my @in = $self->run_cmd($cmdline);
+ $self->send_ans(@in);
+ if ($sendit && $self->{talklist} && @{$self->{talklist}}) {
+ foreach my $l (@in) {
+ my @bad;
+ if (@bad = BadWords::check($l)) {
+ $self->badcount(($self->badcount||0) + @bad);
+ Log('DXCommand', "$self->{call} swore: $l");
+ } else {
+ for (@{$self->{talklist}}) {
+ $self->send_talks($_, $l);
+ }
+ }
+ }
+ }
+ $self->send($self->talk_prompt);
+ } elsif ($self->{talklist} && @{$self->{talklist}}) {
+ # send what has been said to whoever is in this person's talk list
+ my @bad;
+ if (@bad = BadWords::check($cmdline)) {
+ $self->badcount(($self->badcount||0) + @bad);
+ Log('DXCommand', "$self->{call} swore: $cmdline");
+ } else {
+ for (@{$self->{talklist}}) {
+ $self->send_talks($_, $rawline);
+ }
+ }
+ $self->send($self->talk_prompt) if $self->{state} eq 'talk';
+ } else {
+ # for safety
+ $self->state('prompt');
+ }
+ } elsif (my $func = $self->{func}) {
+ no strict 'refs';
+ my @ans;
+ if (ref $self->{edit}) {
+ eval { @ans = $self->{edit}->$func($self, $rawline)};
+ } else {
+ eval { @ans = &{$self->{func}}($self, $rawline) };
+ }
+ if ($@) {
+ $self->send_ans("Syserr: on stored func $self->{func}", $@);
+ delete $self->{func};
+ $self->state('prompt');
+ undef $@;
+ }
+ $self->send_ans(@ans);