add CTY-3304
[spider.git] / cmd / kill.pl
index b410bc14c63c5a016233ed2ffebaf5633ba30f99..8c8e275cbdb6c19bd801c0b1b02e4de0720bea6f 100644 (file)
@@ -1,10 +1,12 @@
 #
 # kill or delete a message
 #
-# Copyright (c) Dirk Koopman G1TLH
+# Copyright (c) 1998 Dirk Koopman G1TLH
 #
-# $Id$
 #
+#
+
+use strict;
 
 my ($self, $line) = @_;
 my @f = split /\s+/, $line;
@@ -12,21 +14,70 @@ my $msgno;
 my @out;
 my @body;
 my $ref;
+my @refs;
+my $call = $self->call;
+my $full;
+my $expunge;
 
 # $DB::single = 1;
 
-for $msgno (@f) {
-  $ref = DXMsg::get($msgno);
-  if (!$ref) {
-    push @out, "Msg $msgno not found";
-       next;
-  }
-  if ($ref->private && $self->priv < 9 && $ref->to ne $ref->call) {
-    push @out, "Msg $msgno not available";
-       next;
-  }
-  $ref->del_msg;
-  push @out, "Message $msgno deleted";
+while (@f) {
+       my $f = shift @f;
+       if ($f =~ /^fu/io) {
+               return (1, $self->msg('e5')) if $self->priv < 5;
+               $full = 1;
+       } elsif ($f =~ /^ex/io) {
+               return (1, $self->msg('e5')) if $self->priv < 6;
+               $expunge = 1;
+       } elsif ($f =~ /^\d+$/o) {
+               $ref = DXMsg::get($f);
+               if (!$ref) {
+                       push @out, "Msg $f not found";
+                       next;
+               }
+               if ($self->priv < 5 && $ref->to ne $call && $ref->from ne $call) {
+                       push @out, "Msg $f not available";
+                       next;
+               } 
+               push @refs, $ref;
+       } elsif ($f =~ /(\d+)-(\d+)/) {
+               my $from = $1;
+               my $to = $2;
+               @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
+               @refs = grep { $_->msgno >= $from && $_->msgno <= $to } @refs;
+       } elsif ($f =~ /^fr/io) {
+               $f = shift @f;
+               if ($f) {
+                       $f = shellregex($f);
+                       @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
+                       @refs = grep { $_->from =~ m{$f}i } @refs;
+               }
+       } elsif ($f =~ /^to/io) {
+               $f = shift @f;
+               if ($f) {
+                       $f = shellregex($f);
+                       @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
+                       @refs = grep { $_->to =~ m{$f}i } @refs;
+               }
+       } else {
+               push @out, "invalid argument '$f'";
+               return (1, @out);
+       }
+}
+
+foreach $ref ( @refs) {
+       if ($ref->keep) {
+               push @out, $self->msg('m18', $ref->msgno);
+               next;
+       }
+       my $tonode = $ref->tonode;
+       $ref->stop_msg($tonode) if $tonode;
+       $ref->mark_delete($expunge ? 0 : undef);
+       push @out, $self->msg('m12', $ref->msgno);
+       Log('msg', "Message $ref->{msgno} from $ref->{from} to $ref->{to} deleted by $call");
+       if ($full) {
+               DXChannel::broadcast_nodes(DXProt::pc49($ref->{from}, $ref->{subject}), $main::me);
+       }
 }
 
 return (1, @out);