X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FNNTP.pm;h=eb2c0b38c445025dec375e4dd8f443a35ced59e5;hb=f5604d35bbe02ad72a4e8d5b2189ea31acf1d7b5;hp=2197d7588721048fcbb9015e3b46bfddce13ad40;hpb=98ff501233ee371c98519bf96394ef8085c3b076;p=public-inbox.git diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 2197d758..eb2c0b38 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -136,29 +136,29 @@ sub list_headers ($;$) { sub list_active ($;$) { my ($self, $wildmat) = @_; wildmat2re($wildmat); - foreach my $ng (@{$self->{nntpd}->{grouplist}}) { - $ng->{newsgroup} =~ $wildmat or next; - group_line($self, $ng); + my $groups = $self->{nntpd}->{groups}; + for my $ngname (grep(/$wildmat/, @{$self->{nntpd}->{groupnames}})) { + group_line($self, $groups->{$ngname}); } } sub list_active_times ($;$) { my ($self, $wildmat) = @_; wildmat2re($wildmat); - foreach my $ng (@{$self->{nntpd}->{grouplist}}) { - $ng->{newsgroup} =~ $wildmat or next; - my $c = eval { $ng->uidvalidity } // time; - more($self, "$ng->{newsgroup} $c $ng->{-primary_address}"); + my $groups = $self->{nntpd}->{groups}; + for my $ngname (grep(/$wildmat/, @{$self->{nntpd}->{groupnames}})) { + my $ibx = $groups->{$ngname}; + my $c = eval { $ibx->uidvalidity } // time; + more($self, "$ngname $c <$ibx->{-primary_address}>"); } } sub list_newsgroups ($;$) { my ($self, $wildmat) = @_; wildmat2re($wildmat); - foreach my $ng (@{$self->{nntpd}->{grouplist}}) { - $ng->{newsgroup} =~ $wildmat or next; - my $d = $ng->description; - more($self, "$ng->{newsgroup} $d"); + my $groups = $self->{nntpd}->{groups}; + for my $ngname (grep(/$wildmat/, @{$self->{nntpd}->{groupnames}})) { + more($self, "$ngname ".$groups->{$ngname}->description); } } @@ -244,7 +244,7 @@ sub parse_time ($$;$) { sub group_line ($$) { my ($self, $ng) = @_; my ($min, $max) = $ng->mm->minmax; - more($self, "$ng->{newsgroup} $max $min n") if defined $min && defined $max; + more($self, "$ng->{newsgroup} $max $min n"); } sub cmd_newgroups ($$$;$$) { @@ -294,23 +294,28 @@ sub ngpat2re (;$) { } sub newnews_i { - my ($self, $overs, $ts, $prev) = @_; - my $over = $overs->[0]; - my $msgs = $over->query_ts($ts, $$prev); - if (scalar @$msgs) { - more($self, '<' . - join(">\r\n<", map { $_->{mid} } @$msgs ). - '>'); - $$prev = $msgs->[-1]->{num}; - } else { - shift @$overs; - if (@$overs) { # continue onto next newsgroup - $$prev = 0; - return 1; - } else { # break out of the long response. - return; + my ($self, $names, $ts, $prev) = @_; + my $ngname = $names->[0]; + if (my $ibx = $self->{nntpd}->{groups}->{$ngname}) { + if (my $over = $ibx->over) { + my $msgs = $over->query_ts($ts, $$prev); + if (scalar @$msgs) { + more($self, '<' . + join(">\r\n<", + map { $_->{mid} } @$msgs ) . + '>'); + $$prev = $msgs->[-1]->{num}; + return 1; # continue on current group + } } } + shift @$names; + if (@$names) { # continue onto next newsgroup + $$prev = 0; + 1; + } else { # all done, break out of the long_response + undef; + } } sub cmd_newnews ($$$$;$$) { @@ -321,17 +326,11 @@ sub cmd_newnews ($$$$;$$) { my ($keep, $skip) = split('!', $newsgroups, 2); ngpat2re($keep); ngpat2re($skip); - my @overs; - foreach my $ng (@{$self->{nntpd}->{grouplist}}) { - $ng->{newsgroup} =~ $keep or next; - $ng->{newsgroup} =~ $skip and next; - my $over = $ng->over or next; - push @overs, $over; - }; - return '.' unless @overs; - + my @names = grep(!/$skip/, grep(/$keep/, + @{$self->{nntpd}->{groupnames}})); + return '.' unless scalar(@names); my $prev = 0; - long_response($self, \&newnews_i, \@overs, $ts, \$prev); + long_response($self, \&newnews_i, \@names, $ts, \$prev); } sub cmd_group ($$) { @@ -343,8 +342,6 @@ sub cmd_group ($$) { $self->{ng} = $ng; my ($min, $max) = $ng->mm->minmax; - $min ||= 0; - $max ||= 0; $self->{article} = $min; my $est_size = $max - $min; "211 $est_size $min $max $group";