add CTY-3304
[spider.git] / cmd / directory.pl
index 1581041cb4ce5d6d6149fdcc9457c2462731b396..1e2193219ef984afc97bde2cc1e0dfbba04f5563 100644 (file)
@@ -3,7 +3,7 @@
 #
 # Copyright (c) Dirk Koopman G1TLH
 #
-# $Id$
+#
 #
 
 my ($self, $line) = @_;
@@ -12,61 +12,65 @@ my @ref;
 my $ref;
 my @out;
 my $f;
-my $n = 10;
+my $n = 0;
 
-if (!@f) {
-       my @all = (DXMsg::get_all());
-       my ($i, $count);
-       for ($i = $#all; $i > 0; $i--) {
-               $ref = $all[$i];
-               next if $self->priv < 5 && $ref->private && $ref->to ne $self->call && $ref->from ne $self->call;
-               unshift @ref, $ref;
-               last if ++$count >= $n;
-       }
-}
+# select candidates
+my @all = grep {!$_->private || !($self->priv < 5 && $_->to ne $self->call && $_->from ne $self->call)} (DXMsg::get_all());
+@all =  grep {!$_->delete  || ($self->priv >= 5 && $_->delete)} @all;
+
+return (1, $self->msg('dir1')) unless @all;
+my $sel = 0;
+my $from = 0;
+my $to = $all[@all-1]->msgno;
 
 while (@f) {
        $f = uc shift @f;
        if ($f eq 'ALL') {
-               foreach $ref (DXMsg::get_all()) { 
-                       next if $self->priv < 5 && $ref->private && $ref->to ne $self->call && $ref->from ne $self->call;
-                       push @ref, $ref;
-               }
-               last;
+               @ref = @all;
+               $n = @ref;
+               $sel++;
        } elsif ($f =~ /^O/o) {         # dir/own
-               foreach $ref (DXMsg::get_all()) { 
-                       push @ref, $ref if $ref->private && ($ref->to eq $self->call || $ref->from eq $self->call);
-               }
+               @ref = grep { $_->to eq $self->call || $_->from eq $self->call } @all;
+               $sel++;
        } elsif ($f =~ /^N/o) {         # dir/new
-               foreach $ref (DXMsg::get_all()) { 
-                       push @ref, $ref if $ref->private && !$ref->read && $ref->to eq $self->call;
+               @ref = grep { $_->t > $self->user->lastin } @all;
+               $sel++;
+       } elsif ($f =~ /^S/o) {     # dir/subject
+               $f = shift @f;
+               if ($f) {
+                       $f =~ s{(.)}{"\Q$1"}ge;
+                       @ref = grep { $_->subject =~ m{$f}i } @all;
+                       $sel++;
                }
-       } elsif ($f eq '>' || $f eq 'TO'){
+       } elsif ($f eq '>' || $f =~ /^T/o){  
                $f = uc shift @f;
                if ($f) {
                        $f = shellregex($f);
-                       foreach $ref (DXMsg::get_all()) { 
-                               next if $self->priv < 5 && $ref->private && $ref->to ne $self->call && $ref->from ne $self->call;
-                               next unless $ref->to =~ m{$f};
-                               push @ref, $ref;
-                       }
+                       @ref = grep { $_->to =~ m{$f} } @all;
+                       $sel++;
                }
-       } elsif ($f eq '<' || $f eq 'FROM'){
+       } elsif ($f eq '<' || $f =~ /^F/o){
                $f = uc shift @f;
                if ($f) {
                        $f = shellregex($f);
-                       foreach $ref (DXMsg::get_all()) { 
-                               next if $self->priv < 5 && $ref->private && $ref->to ne $self->call && $ref->from ne $self->call;
-                               next unless $ref->from =~ m{$f};
-                               push @ref, $ref;
-                       }
+                       @ref = grep { $_->from =~ m{$f} } @all;
+                       $sel++;
                }
+       } elsif ($f =~ /^(\d+)-(\d+)$/) {               # a range of items
+               $from = $1;
+               $to = $2;
        } elsif ($f =~ /^\d+$/ && $f > 0) {             # a number of items
                $n = $f;
        }
 }
 
+$n = 10 unless $n;
+@ref = @all unless $sel || @ref;
+
 if (@ref) {
+       if ($from != 0 || $to != $all[@all-1]->msgno) {
+               @ref = grep {$_->msgno >= $from && $_->msgno <= $to} @ref;
+       }
        my $i = @ref - $n;
        $i = 0 unless $i > 0;
        my $count;
@@ -76,6 +80,6 @@ if (@ref) {
                last if ++$count >= $n;
        }
 } else {
-       push @out, $self->msg('e3', 'directory', $line); 
+       push @out, $self->msg('dir1'); 
 }
 return (1, @out);