diff options
-rw-r--r-- | lib/PublicInbox/NNTP.pm | 12 | ||||
-rw-r--r-- | public-inbox-nntpd | 26 |
2 files changed, 25 insertions, 13 deletions
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 8f866859..79f2c2f8 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -93,7 +93,7 @@ sub list_overview_fmt ($$) { sub list_active ($;$) { my ($self, $wildmat) = @_; wildmat2re($wildmat); - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { $ng->{name} =~ $wildmat or next; group_line($self, $ng); } @@ -102,7 +102,7 @@ sub list_active ($;$) { sub list_active_times ($;$) { my ($self, $wildmat) = @_; wildmat2re($wildmat); - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { $ng->{name} =~ $wildmat or next; my $c = eval { $ng->mm->created_at } || time; more($self, "$ng->{name} $c $ng->{address}"); @@ -112,7 +112,7 @@ sub list_active_times ($;$) { sub list_newsgroups ($;$) { my ($self, $wildmat) = @_; wildmat2re($wildmat); - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { $ng->{name} =~ $wildmat or next; my $d = $ng->description; more($self, "$ng->{name} $d"); @@ -137,7 +137,7 @@ sub cmd_list ($;$$) { $arg->($self, @args); } else { more($self, '215 list of newsgroups follows'); - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { group_line($self, $ng); } } @@ -200,7 +200,7 @@ sub cmd_newgroups ($$$;$$) { # TODO dists more($self, '231 list of new newsgroups follows'); - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { my $c = eval { $ng->mm->created_at } || 0; next unless $c > $ts; group_line($self, $ng); @@ -249,7 +249,7 @@ sub cmd_newnews ($$$$;$$) { ngpat2re($keep); ngpat2re($skip); my @srch; - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { $ng->{name} =~ $keep or next; $ng->{name} =~ $skip and next; my $srch = $ng->search or next; diff --git a/public-inbox-nntpd b/public-inbox-nntpd index b66de58e..0395e98b 100644 --- a/public-inbox-nntpd +++ b/public-inbox-nntpd @@ -298,7 +298,7 @@ sub event_read { package PublicInbox::NNTPD; use strict; use warnings; -use fields qw(groups err out); +use fields qw(groups grouplist err out); sub new { my ($class) = @_; @@ -306,6 +306,7 @@ sub new { $self->{groups} = {}; $self->{err} = \*STDERR; $self->{out} = \*STDOUT; + $self->{grouplist} = []; $self; } @@ -314,26 +315,37 @@ sub refresh_groups { require PublicInbox::Config; my $pi_config = PublicInbox::Config->new; my $new = {}; + my @list; foreach my $k (keys %$pi_config) { $k =~ /\Apublicinbox\.([^\.]+)\.mainrepo\z/ or next; my $g = $1; my $git_dir = $pi_config->{$k}; - my $address = $pi_config->{"publicinbox.$g.address"}; - my $ng = PublicInbox::NewsGroup->new($g, $git_dir, $address); + my $addr = $pi_config->{"publicinbox.$g.address"}; + my $ngname = $pi_config->{"publicinbox.$g.newsgroup"}; + if (defined $ngname) { + next if ($ngname eq ''); # disabled + $g = $ngname; + } + my $ng = PublicInbox::NewsGroup->new($g, $git_dir, $addr); my $old_ng = $self->{groups}->{$g}; - # Reuse the old one if possible since it can hold references - # to valid mm and gcf objects + # Reuse the old one if possible since it can hold + # references to valid mm and gcf objects if ($old_ng) { $old_ng->update($ng); $ng = $old_ng; } # Only valid if Msgmap works - $new->{$g} = $ng if $ng->mm(1); + if ($ng->mm(1)) { + $new->{$g} = $ng; + push @list, $ng; + } } + @list = sort { $a->{name} cmp $b->{name} } @list; + $self->{grouplist} = \@list; # this will destroy old groups that got deleted %{$self->{groups}} = %$new; -}; +} 1; |