]> dxcluster.net Git - spider.git/blob - cmd/kill.pl
slightly modified specially for ARC
[spider.git] / cmd / kill.pl
1 #
2 # kill or delete a message
3 #
4 # Copyright (c) 1998 Dirk Koopman G1TLH
5 #
6 # $Id$
7 #
8
9 use strict;
10
11 my ($self, $line) = @_;
12 my @f = split /\s+/, $line;
13 my $msgno;
14 my @out;
15 my @body;
16 my $ref;
17 my @refs;
18 my $call = $self->call;
19 my $full;
20 my $expunge;
21
22 # $DB::single = 1;
23
24 while (@f) {
25         my $f = shift @f;
26         if ($f =~ /^fu/io) {
27                 return (1, $self->msg('e5')) if $self->priv < 5;
28                 $full = 1;
29         } elsif ($f =~ /^ex/io) {
30                 return (1, $self->msg('e5')) if $self->priv < 6;
31                 $expunge = 1;
32         } elsif ($f =~ /^\d+$/o) {
33                 $ref = DXMsg::get($f);
34                 if (!$ref) {
35                         push @out, "Msg $f not found";
36                         next;
37                 }
38                 if ($self->priv < 5 && $ref->to ne $call && $ref->from ne $call) {
39                         push @out, "Msg $f not available";
40                         next;
41                 } 
42                 push @refs, $ref;
43         } elsif ($f =~ /(\d+)-(\d+)/) {
44                 my $from = $1;
45                 my $to = $2;
46                 @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
47                 @refs = grep { $_->msgno >= $from && $_->msgno <= $to } @refs;
48         } elsif ($f =~ /^fr/io) {
49                 $f = shift @f;
50                 if ($f) {
51                         $f = shellregex($f);
52                         @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
53                         @refs = grep { $_->from =~ m{$f}i } @refs;
54                 }
55         } elsif ($f =~ /^to/io) {
56                 $f = shift @f;
57                 if ($f) {
58                         $f = shellregex($f);
59                         @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
60                         @refs = grep { $_->to =~ m{$f}i } @refs;
61                 }
62         } else {
63                 push @out, "invalid argument '$f'";
64                 return (1, @out);
65         }
66 }
67
68 foreach $ref ( @refs) {
69         if ($ref->keep) {
70                 push @out, $self->msg('m18', $ref->msgno);
71                 next;
72         }
73         my $tonode = $ref->tonode;
74         $ref->stop_msg($tonode) if $tonode;
75         $ref->mark_delete($expunge ? 0 : undef);
76         push @out, $self->msg('m12', $ref->msgno);
77         Log('msg', "Message $ref->{msgno} from $ref->{from} to $ref->{to} deleted by $call");
78         if ($full) {
79                 DXChannel::broadcast_nodes(DXProt::pc49($ref->{from}, $ref->{subject}), $main::me);
80         }
81 }
82
83 return (1, @out);