]> Sergey Matveev's repositories - public-inbox.git/commitdiff
nntp: add "newsgroup" parameter and sort grouplist
authorEric Wong <e@80x24.org>
Sun, 20 Sep 2015 09:34:52 +0000 (09:34 +0000)
committerEric Wong <e@80x24.org>
Sun, 20 Sep 2015 09:34:52 +0000 (09:34 +0000)
Using non-hierarchical mailing list names for newsgroups
might confuse traditional newsreader software and perhaps
some humans.  Allow administrators to configure newsgroups
names and hierarchies to their liking.

Sorting the grouplist alphabetically should probably be
done anyways to improve usability for some clients which
won't sort themselves.

lib/PublicInbox/NNTP.pm
public-inbox-nntpd

index 8f8668591e51ce0e0ffce62f9caa28fb3a1bd223..79f2c2f8e3edc5b191c57c7e7f38018b349c6d53 100644 (file)
@@ -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;
index b66de58efba490facb0bc73a7e839ae0a26bfaa7..0395e98bcff3bd39569c2f6c591c504bd03777d3 100644 (file)
@@ -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;