# # send a message # # this should handle # # send [ .. ] # send private [ .. ] # send private rr [ .. ] # send rr [ .. ] # send noprivate [ .. ] # send b [ .. ] # send copy [ .. ] # send copy rr [ .. ] # # Copyright (c) Dirk Koopman G1TLH # # $Id$ # my ($self, $line) = @_; return (1, $self->msg('e5')) if $self->remotecmd; my @out; my $loc = $self->{loc} = {}; my $notincalls = 1; my @to; # set up defaults $loc->{private} = '1'; $loc->{rrreq} = '0'; # $DB::single = 1; if ($self->state eq "prompt") { my @f = split /([\s\@\$,])/, $line; @f = map {s/\s+//g; length $_ ? $_ : ()} @f; @f = grep {$_ ne ','} @f; # any thing after send? return (1, $self->msg('e6')) if !@f; return (1, $self->msg('e28')) unless $self->registered || uc $f[0] eq $main::myalias; while (@f) { my $f = uc shift @f; # first deal with copies if ($f eq 'C' || $f eq 'CC' || $f eq 'COPY') { my $rr = '0'; if (@f && uc $f[0] eq 'RR') { shift @f; $rr = '1'; } if (@f) { my $m = shift @f; my $oref = DXMsg::get($m); return (0, $self->msg('m4', $m)) unless $oref; return (0, $self->msg('m16')) unless @f; # separate copy to everyone listed while (@f) { my $newcall = uc shift @f; my $msgno = DXMsg::next_transno('Msgno'); my $newsubj = "CC: " . $oref->subject; my $nref = DXMsg->alloc($msgno, $newcall, $self->call, $main::systime, '1', $newsubj, $main::mycall, '0', $rr); my @list; my $from = $oref->from; my $to = $oref->to; my $date = cldate($oref->t); my $time = ztime($oref->t); my $buf = "Original from: $from To: $to Date: $date $time"; push @list, $buf; push @list, $oref->read_msg_body(); $nref->store(\@list); $nref->add_dir(); push @out, $self->msg('m2', $oref->msgno, $newcall); } } DXMsg::queue_msg(); return (1, @out); } # private / noprivate / rr if ($notincalls && ($f eq 'B' || $f =~ /^NOP/oi)) { $loc->{private} = '0'; } elsif ($notincalls && ($f eq 'P' || $f =~ /^PRI/oi)) { ; } elsif ($notincalls && ($f eq 'RR')) { $loc->{rrreq} = '1'; } elsif ($f eq '<' && @f) { # this is bbs syntax for from call $loc->{from} = uc shift @f; } elsif (($f =~ /^[\@\.\#\$]$/ || $f eq '.#') && @f) { # this is bbs syntax, for send it 'to node' shift @f; } elsif ($f =~ /^\$/) { # this is bbs syntax for a bid next; } elsif ($f =~ /^<(\S+)/) { # this is bbs syntax for from call $loc->{from} = $1; } elsif ($f =~ /^\$\S+/) { # this is bbs syntax for bid ; } else { # callsign ? $notincalls = 0; # $DB::single = 1; # is this callsign a distro? # but be careful about messages to 'sysop' if ($self->priv < 5 && $f eq 'SYSOP') { push @to, $main::myalias; $loc->{private} = 1; } else { my $fn = "/spider/msg/distro/$f.pl"; if (-e $fn) { my $fh = new IO::File $fn; if ($fh) { local $/ = undef; my $s = <$fh>; $fh->close; my @call; @call = eval $s; return (1, "Error in Distro $f.pl:", $@) if $@; if (@call > 0) { push @f, @call; next; } } } } if (($loc->{private} && is_callsign($f)) || (!$loc->{private} && DXMsg::valid_bull_addr($f))) { if (grep $_ eq $f, @DXMsg::badmsg) { push @out, $self->msg('m3', $f); } else { push @to, $f; } } else { push @out, $self->msg('m3', $f); } } } # check we have some callsigns if (@to) { $loc->{to} = \@to; } else { delete $self->{loc}; return (1, @out, $self->msg('e6')); } $loc->{from} ||= $self->call; unless (is_callsign($loc->{from})) { delete $self->{loc}; return (1, $self->msg('e22', $loc->{from})); } # find me and set the state and the function on my state variable to # keep calling me for every line until I relinquish control $self->func("DXMsg::do_send_stuff"); $self->state('send1'); push @out, $self->msg('m1'); } else { push @out, $self->msg('m17', $self->state); } return (1, @out);