about summary refs log tree commit homepage
path: root/lib/PublicInbox/Inbox.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-08-12 19:52:35 +0000
committerEric Wong <e@80x24.org>2016-08-12 19:52:35 +0000
commit50c1b933afec4937ebc99e1d372cef2dc6b295c2 (patch)
tree87d96aff45da05c97ed56d8133322ef3f32d33f1 /lib/PublicInbox/Inbox.pm
parent9a38d54754c724c5f81e8dc000bd42dbeddc39a6 (diff)
downloadpublic-inbox-50c1b933afec4937ebc99e1d372cef2dc6b295c2.tar.gz
Improve the discoverability of NNTP endpoints for users
who still know what NNTP is.

==> ~/.public-inbox/config <==
; aliases for the locally-run nntpd can be specified in
; the "publicinbox" section:
[publicinbox]
	nntpserver = nntp://ou63pmih66umazou.onion/
	nntpserver = news.public-inbox.org

	; NNTPS is not supported natively, yet,
	; but one can use haproxy or similar
	; nntpserver = nntps://news.public-inbox.invalid/

; mirrors for specific inboxes may be specified either as full
; NNTP (or NNTPS) URLs, or with the server name only if the
; newsgroup name is specfied for a local NNTP server
[publicinbox "git"]
	...
	newsgroup = inbox.a.b.c
	nntpmirror = nntp://czquwvybam4bgbro.onion/
	nntpmirror = hjrcffqmbrq6wope.onion

	; there may be a mirror on a different server with a
	; different name:
	nntpmirror = nntp://news.example.com/differently.named.group

; (And I really need to write manpages for all this...)
Diffstat (limited to 'lib/PublicInbox/Inbox.pm')
-rw-r--r--lib/PublicInbox/Inbox.pm46
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm
index 922ca9bb..414973c6 100644
--- a/lib/PublicInbox/Inbox.pm
+++ b/lib/PublicInbox/Inbox.pm
@@ -147,6 +147,52 @@ sub base_url {
         }
 }
 
+sub nntp_url {
+        my ($self) = @_;
+        $self->{-nntp_url} ||= do {
+                # no checking for nntp_usable here, we can point entirely
+                # to non-local servers or users run by a different user
+                my $ns = $self->{-pi_config}->{'publicinbox.nntpserver'};
+                my $group = $self->{newsgroup};
+                my @urls;
+                if ($ns && $group) {
+                        $ns = [ $ns ] if ref($ns) ne 'ARRAY';
+                        @urls = map {
+                                my $u = m!\Anntps?://! ? $_ : "nntp://$_";
+                                $u .= '/' if $u !~ m!/\z!;
+                                $u.$group;
+                        } @$ns;
+                }
+
+                my $mirrors = $self->{nntpmirror};
+                if ($mirrors) {
+                        my @m;
+                        foreach (@$mirrors) {
+                                my $u = m!\Anntps?://! ? $_ : "nntp://$_";
+                                if ($u =~ m!\Anntps?://[^/]+/?\z!) {
+                                        if ($group) {
+                                                $u .= '/' if $u !~ m!/\z!;
+                                                $u .= $group;
+                                        } else {
+                                                warn
+"publicinbox.$self->{name}.nntpmirror=$_ missing newsgroup name\n";
+                                        }
+                                }
+                                # else: allow full URLs like:
+                                # nntp://news.example.com/alt.example
+                                push @m, $u;
+                        }
+                        my %seen = map { $_ => 1 } @urls;
+                        foreach my $u (@m) {
+                                next if $seen{$u};
+                                $seen{$u} = 1;
+                                push @urls, $u;
+                        }
+                }
+                \@urls;
+        };
+}
+
 sub nntp_usable {
         my ($self) = @_;
         my $ret = $self->mm && $self->search;