relay pages at /r/... and nip05 pages at /p/...

This commit is contained in:
fiatjaf
2023-07-27 13:00:52 -03:00
parent bb24a43eb2
commit 4e587cf186
4 changed files with 52 additions and 41 deletions

View File

@@ -31,7 +31,22 @@ func render(w http.ResponseWriter, r *http.Request) {
if strings.HasPrefix(code, "e/") { if strings.HasPrefix(code, "e/") {
code, _ = nip19.EncodeEvent(code[2:], []string{}, "") code, _ = nip19.EncodeEvent(code[2:], []string{}, "")
} else if strings.HasPrefix(code, "p/") { } else if strings.HasPrefix(code, "p/") {
code, _ = nip19.EncodePublicKey(code[2:]) if urlSuffixMatcher.MatchString(code) {
// it's a nip05
code = code[2:]
} else {
// it's a hex pubkey
code, _ = nip19.EncodePublicKey(code[2:])
}
} else if strings.HasPrefix(code, "r/") {
hostname := code[2:]
if strings.HasPrefix(hostname, "wss:/") || strings.HasPrefix(hostname, "ws:/") {
hostname = trimProtocol(hostname)
http.Redirect(w, r, "/r/"+hostname, http.StatusFound)
} else {
renderRelayPage(w, r)
}
return
} else if strings.HasPrefix(code, "nostr:") { } else if strings.HasPrefix(code, "nostr:") {
http.Redirect(w, r, "/"+code[6:], http.StatusFound) http.Redirect(w, r, "/"+code[6:], http.StatusFound)
} else if strings.HasPrefix(code, "npub") && strings.HasSuffix(code, ".xml") { } else if strings.HasPrefix(code, "npub") && strings.HasSuffix(code, ".xml") {
@@ -50,19 +65,6 @@ func render(w http.ResponseWriter, r *http.Request) {
// code can be a nevent, nprofile, npub or nip05 identifier, in which case we try to fetch the associated event // code can be a nevent, nprofile, npub or nip05 identifier, in which case we try to fetch the associated event
event, err := getEvent(r.Context(), code) event, err := getEvent(r.Context(), code)
if err != nil { if err != nil {
// this will fail if code is a relay URL, in which case we will handle it differently
// If the protocol is present strip it and redirect
if strings.HasPrefix(code, "wss:/") || strings.HasPrefix(code, "ws:/") {
hostname := trimProtocol(code)
http.Redirect(w, r, "/"+hostname, http.StatusFound)
}
if urlMatcher.MatchString(code) {
renderRelayPage(w, r)
return
}
http.Error(w, "error fetching event: "+err.Error(), 404) http.Error(w, "error fetching event: "+err.Error(), 404)
return return
} }
@@ -301,7 +303,7 @@ func render(w http.ResponseWriter, r *http.Request) {
"kindNIP": kindNIP, "kindNIP": kindNIP,
"lastNotes": renderableLastNotes, "lastNotes": renderableLastNotes,
"parentNevent": parentNevent, "parentNevent": parentNevent,
"authorRelays": authorRelays, "authorRelays": authorRelays,
} }
// if a mapping is not found fallback to raw // if a mapping is not found fallback to raw

View File

@@ -13,7 +13,7 @@ import (
func renderRelayPage(w http.ResponseWriter, r *http.Request) { func renderRelayPage(w http.ResponseWriter, r *http.Request) {
code := r.URL.Path[1:] code := r.URL.Path[1:]
hostname := code hostname := code[2:]
typ := "relay" typ := "relay"
if strings.HasSuffix(hostname, ".xml") { if strings.HasSuffix(hostname, ".xml") {
hostname = code[:len(hostname)-4] hostname = code[:len(hostname)-4]

View File

@@ -7,15 +7,25 @@
<meta property="og:site_name" content="{{.npub | escapeString}}" /> <meta property="og:site_name" content="{{.npub | escapeString}}" />
{{ if .metadata.Picture }} {{ if .metadata.Picture }}
<meta property="og:image" content="{{.metadata.Picture | escapeString}}" /> <meta property="og:image" content="{{.metadata.Picture | escapeString}}" />
<meta property="twitter:image" content="{{.proxy}}{{.metadata.Picture | escapeString}}" /> <meta
{{end}} property="twitter:image"
{{ if .metadata.About }} content="{{.proxy}}{{.metadata.Picture | escapeString}}"
<meta property="og:description" content="{{.metadata.About | escapeString}}" /> />
{{end}} {{ if .metadata.About }}
<meta
property="og:description"
content="{{.metadata.About | escapeString}}"
/>
{{end}} {{end}}
<meta property="twitter:card" content="summary" /> <meta property="twitter:card" content="summary" />
<link rel="canonical" href="https://nostr.com/{{.npub | escapeString }}" /> <link rel="canonical" href="https://nostr.com/{{.npub | escapeString }}" />
<link rel="sitemap" type="application/xml" title="Sitemap for {{.npub | escapeString}}" href="/{{.npub | escapeString}}.xml"> <link
rel="sitemap"
type="application/xml"
title="Sitemap for {{.npub | escapeString}}"
href="/{{.npub | escapeString}}.xml"
/>
{{template "head_common.html" }} {{template "head_common.html" }}
</head> </head>
@@ -28,10 +38,10 @@
<header class="column columnA"> <header class="column columnA">
<div class="info-wrapper"> <div class="info-wrapper">
<div class="name"> <div class="name">
{{.metadata.Name | escapeString}} {{.metadata.Name | escapeString}}
<span class="display" <span class="display"
>{{.metadata.DisplayName | escapeString}}</span >{{.metadata.DisplayName | escapeString}}</span
> >
</div> </div>
</div> </div>
<div class="pic-wrapper"> <div class="pic-wrapper">
@@ -77,13 +87,12 @@
<div class="field"> <div class="field">
<div class="label">Posting on these relays</div> <div class="label">Posting on these relays</div>
{{if .authorRelays}} {{if .authorRelays}} {{range $index, $element := .authorRelays}}
{{range $index, $element := .authorRelays}} <a href="/r/{{$element | escapeString}}" class="button"
<a href="/{{$element | escapeString}}" class="button">{{$element}}</a> >{{$element}}</a
{{end}} >
{{else}} {{end}} {{else}} No relays found, sorry! Try to reload to search
No relays found, sorry! Try to reload to search again. again. {{end}}
{{end}}
</div> </div>
<div class="field last_update"> <div class="field last_update">

View File

@@ -92,7 +92,7 @@ var kindNIPS = map[int]string{
30078: "78", 30078: "78",
} }
var urlMatcher = regexp.MustCompile(`^(wss?:\/\/)?[\w-_.]+\.[\w-_.]+(\/[\/\w]*)?$`) var urlSuffixMatcher = regexp.MustCompile(`[\w-_.]+\.[\w-_.]+(\/[\/\w]*)?$`)
type ClientReference struct { type ClientReference struct {
Name string Name string
@@ -329,10 +329,10 @@ func unique(strSlice []string) []string {
keys := make(map[string]bool) keys := make(map[string]bool)
list := []string{} list := []string{}
for _, entry := range strSlice { for _, entry := range strSlice {
if _, ok := keys[entry]; !ok { if _, ok := keys[entry]; !ok {
keys[entry] = true keys[entry] = true
list = append(list, entry) list = append(list, entry)
} }
} }
return list return list
} }