b98a42f69b2c5d3947e58e5d5e0e6cc0a92d9a0a
[spider.git] / cmd / kill.pl
1 #
2 # kill or delete a message
3 #
4 # Copyright (c) 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
21 # $DB::single = 1;
22
23 while (@f) {
24         my $f = shift @f;
25         if ($f =~ /^fu/io) {
26                 return (1, $self->msg('e5')) if $self->priv < 5;
27                 $full = 1;
28         } elsif ($f =~ /^\d+$/o) {
29                 $ref = DXMsg::get($f);
30                 if (!$ref) {
31                         push @out, "Msg $f not found";
32                         next;
33                 }
34                 if ($self->priv < 5 && $ref->to ne $call && $ref->from ne $call) {
35                         push @out, "Msg $f not available";
36                         next;
37                 } 
38                 push @refs, $ref;
39         } elsif ($f =~ /(\d+)-(\d+)/) {
40                 my $from = $1;
41                 my $to = $2;
42                 @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
43                 @refs = grep { $_->msgno >= $from && $_->msgno <= $to } @refs;
44         } elsif ($f =~ /^fr/io) {
45                 $f = shift @f;
46                 if ($f) {
47                         $f = shellregex($f);
48                         @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
49                         @refs = grep { $_->from =~ m{$f}i } @refs;
50                 }
51         } elsif ($f =~ /^to/io) {
52                 $f = shift @f;
53                 if ($f) {
54                         $f = shellregex($f);
55                         @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
56                         @refs = grep { $_->to =~ m{$f}i } @refs;
57                 }
58         } else {
59                 push @out, "invalid argument '$f'";
60                 return (1, @out);
61         }
62 }
63
64 foreach $ref ( @refs) {
65         Log('msg', "Message $ref->{msgno} from $ref->{from} to $ref->{to} deleted by $call");
66         if ($full) {
67                 DXChannel::broadcast_nodes(DXProt::pc49($ref->{from}, $ref->{subject}), $main::me);
68         }
69         my $tonode = $ref->tonode;
70         $ref->stop_msg($tonode) if $tonode;
71         $ref->del_msg($self);
72         push @out, $self->msg('m12', $ref->msgno);
73 }
74
75 return (1, @out);