X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=cmd%2Fdirectory.pl;h=1e2193219ef984afc97bde2cc1e0dfbba04f5563;hb=eac4538f1f78b3d014539dc548fc6322e8337429;hp=1581041cb4ce5d6d6149fdcc9457c2462731b396;hpb=2c55d933fc8883717c59c2e7d25dc82d63e3f507;p=spider.git diff --git a/cmd/directory.pl b/cmd/directory.pl index 1581041c..1e219321 100644 --- a/cmd/directory.pl +++ b/cmd/directory.pl @@ -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);