about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/NNTP.pm12
-rw-r--r--public-inbox-nntpd26
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;