X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FNNTP.pm;h=1f31b4a5baae9685653d9a9d67cdf0ecc1f4ce90;hb=a18fb89880ca33ae9dfbf751014157b6756fd88a;hp=95ac7d5fd7ccaddf2dbf505241e006fdf1251ec9;hpb=59a7f5c908dc0e898e8925bcd06c5e526f86d063;p=public-inbox.git diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 95ac7d5f..1f31b4a5 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -180,6 +180,22 @@ sub cmd_list ($;$$) { '.' } +sub listgroup_range_i { + my ($self, $beg, $end) = @_; + my $r = $self->{ng}->mm->msg_range($beg, $end, 'num'); + scalar(@$r) or return; + more($self, join("\r\n", map { $_->[0] } @$r)); + 1; +} + +sub listgroup_all_i { + my ($self, $num) = @_; + my $ary = $self->{ng}->mm->ids_after($num); + scalar(@$ary) or return; + more($self, join("\r\n", @$ary)); + 1; +} + sub cmd_listgroup ($;$$) { my ($self, $group, $range) = @_; if (defined $group) { @@ -187,26 +203,13 @@ sub cmd_listgroup ($;$$) { return $res if ($res !~ /\A211 /); more($self, $res); } - my $ng = $self->{ng} or return '412 no newsgroup selected'; - my $mm = $ng->mm; + $self->{ng} or return '412 no newsgroup selected'; if (defined $range) { my $r = get_range($self, $range); return $r unless ref $r; - my ($beg, $end) = @$r; - long_response($self, sub { - $r = $mm->msg_range($beg, $end, 'num'); - scalar(@$r) or return; - more($self, join("\r\n", map { $_->[0] } @$r)); - 1; - }); + long_response($self, \&listgroup_range_i, @$r); } else { # grab every article number - my $n = 0; - long_response($self, sub { - my $ary = $mm->ids_after(\$n); - scalar(@$ary) or return; - more($self, join("\r\n", @$ary)); - 1; - }); + long_response($self, \&listgroup_all_i, \(my $num = 0)); } } @@ -287,6 +290,26 @@ sub ngpat2re (;$) { $_[0] = qr/\A(?:$_[0])\z/; } +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; + } + } +} + sub cmd_newnews ($$$$;$$) { my ($self, $newsgroups, $date, $time, $gmt, $dists) = @_; my $ts = eval { parse_time($date, $time, $gmt) }; @@ -295,34 +318,17 @@ sub cmd_newnews ($$$$;$$) { my ($keep, $skip) = split('!', $newsgroups, 2); ngpat2re($keep); ngpat2re($skip); - my @over; + 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 @over, $over; + push @overs, $over; }; - return '.' unless @over; + return '.' unless @overs; my $prev = 0; - long_response($self, sub { - my $over = $over[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 @over; - if (@over) { # continue onto next newsgroup - $prev = 0; - return 1; - } else { # break out of the long response. - return; - } - } - }); + long_response($self, \&newnews_i, \@overs, $ts, \$prev); } sub cmd_group ($$) {