+ my $self = shift;
+ my $cmdline = shift;
+ my @ans;
+
+ # 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;
+ my @pw = split / */, $passwd;
+ if ($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'));
+ }
+ delete $self->{passwd};
+ $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(^/)();
+ $self->send_ans(run_cmd($self, $cmdline));
+ $self->send($self->talk_prompt);
+ } elsif ($self->{talklist} && @{$self->{talklist}}) {
+ # send what has been said to whoever is in this person's talk list
+ for (@{$self->{talklist}}) {
+ $self->send_talks($_, $cmdline);
+ }
+ $self->send($self->talk_prompt) if $self->{state} eq 'talk';
+ } else {
+ # for safety
+ $self->state('prompt');
+ }
+ } else {
+ $self->send_ans(run_cmd($self, $cmdline));
+ }
+
+ # send a prompt only if we are in a prompt state
+ $self->prompt() if $self->{state} =~ /^prompt/o;
+}
+
+# send out the talk messages taking into account vias and connectivity
+sub send_talks
+{
+ my ($self, $ent, $line) = @_;
+
+ my ($to, $via) = $ent =~ /(\S+)>(\S+)/;
+ $to = $ent unless $to;
+ my $call = $via ? $via : $to;
+ my $clref = Route::get($call);
+ my $dxchan = $clref->dxchan if $clref;
+ if ($dxchan) {
+ $dxchan->talk($self->{call}, $to, $via, $line);
+ } else {
+ $self->send($self->msg('disc2', $via ? $via : $to));
+ my @l = grep { $_ ne $ent } @{$self->{talklist}};
+ if (@l) {
+ $self->{talklist} = \@l;
+ } else {
+ delete $self->{talklist};
+ $self->state('prompt');
+ }
+ }
+}
+
+sub talk_prompt
+{
+ my $self = shift;
+ my @call;
+ for (@{$self->{talklist}}) {
+ my ($to, $via) = /(\S+)>(\S+)/;
+ $to = $_ unless $to;
+ push @call, $to;
+ }
+ return $self->msg('talkprompt', join(',', @call));
+}
+
+#
+# send a load of stuff to a command user with page prompting
+# and stuff
+#