From 12c1bebf99acdfce850a99cca700585b8f96306b Mon Sep 17 00:00:00 2001 From: Daniele Tonon Date: Tue, 7 Nov 2023 15:05:53 +0100 Subject: [PATCH] Add support for live chat message, kind:1311 --- clients.go | 6 +++ data.go | 16 ++++++ pages.go | 32 ++++++++++++ render_event.go | 29 +++++++++++ templates/live_event_message.html | 85 +++++++++++++++++++++++++++++++ utils.go | 4 ++ 6 files changed, 172 insertions(+) create mode 100644 templates/live_event_message.html diff --git a/clients.go b/clients.go index 4fa9ac3..e1d6922 100644 --- a/clients.go +++ b/clients.go @@ -57,6 +57,12 @@ func generateClientList(style Style, code string, event *nostr.Event) []ClientRe {ID: "zap.stream", Name: "zap.stream", URL: template.URL("https://zap.stream/" + code)}, {ID: "nostrudel", Name: "Nostrudel", URL: template.URL("https://nostrudel.ninja/#/streams/" + code)}, } + } else if event.Kind == 1311 { + return []ClientReference{ + {ID: "native", Name: "your native client", URL: template.URL("nostr:" + code)}, + {ID: "zap.stream", Name: "zap.stream", URL: template.URL("https://zap.stream/" + code)}, + {ID: "nostrudel", Name: "Nostrudel", URL: template.URL("https://nostrudel.ninja/#/streams/" + code)}, + } } return nil } diff --git a/data.go b/data.go index 7726c53..bacbbfe 100644 --- a/data.go +++ b/data.go @@ -5,6 +5,7 @@ import ( "fmt" "html" "html/template" + "strconv" "strings" "time" @@ -88,6 +89,7 @@ type Data struct { alt string kind1063Metadata *Kind1063Metadata kind30311Metadata *Kind30311Metadata + kind1311Metadata *Kind1311Metadata } type Kind1063Metadata struct { @@ -115,6 +117,10 @@ type Kind30311Metadata struct { Tags []string } +type Kind1311Metadata struct { + // ... +} + func (fm Kind1063Metadata) IsVideo() bool { return strings.Split(fm.M, "/")[0] == "video" } func (fm Kind1063Metadata) IsImage() bool { return strings.Split(fm.M, "/")[0] == "image" } func (fm Kind1063Metadata) DisplayImage() string { @@ -281,6 +287,16 @@ func grabData(ctx context.Context, code string, isProfileSitemap bool) (*Data, e for _, t := range tTags { data.kind30311Metadata.Tags = append(data.kind30311Metadata.Tags, t[1]) } + case 1311: + data.templateId = LiveEventMessage + data.kind1311Metadata = &Kind1311Metadata{} + data.content = event.Content + if atag := event.Tags.GetFirst([]string{"a", ""}); atag != nil { + parts := strings.Split((*atag)[1], ":") + kind, _ := strconv.Atoi(parts[0]) + parentNevent, _ := nip19.EncodeEntity(parts[1], kind, parts[2], data.relays) + data.parentLink = template.HTML(replaceNostrURLsWithTags(nostrEveryMatcher, "nostr:"+parentNevent)) + } default: data.templateId = Other } diff --git a/pages.go b/pages.go index f2c541d..9778d65 100644 --- a/pages.go +++ b/pages.go @@ -19,6 +19,7 @@ const ( TelegramInstantView FileMetadata LiveEvent + LiveEventMessage Other ) @@ -328,6 +329,37 @@ type LiveEventPage struct { func (*LiveEventPage) TemplateText() string { return tmplLiveEvent } +var ( + //go:embed templates/live_event_message.html + tmplLiveEventMessage string + LiveEventMessageTemplate = tmpl.MustCompile(&LiveEventMessagePage{}) +) + +type LiveEventMessagePage struct { + OpenGraphPartial `tmpl:"opengraph"` + HeadCommonPartial `tmpl:"head_common"` + TopPartial `tmpl:"top"` + DetailsPartial `tmpl:"details"` + ClientsPartial `tmpl:"clients"` + FooterPartial `tmpl:"footer"` + + Content template.HTML + CreatedAt string + Metadata *sdk.ProfileMetadata + Npub string + NpubShort string + ParentLink template.HTML + SeenOn []string + Style Style + Subject string + TitleizedContent string + Alt string + + LiveEventMessage Kind1311Metadata +} + +func (*LiveEventMessagePage) TemplateText() string { return tmplLiveEventMessage } + var ( //go:embed templates/relay.html tmplRelay string diff --git a/render_event.go b/render_event.go index c1e638d..a1f927d 100644 --- a/render_event.go +++ b/render_event.go @@ -362,6 +362,35 @@ func renderEvent(w http.ResponseWriter, r *http.Request) { LiveEvent: *data.kind30311Metadata, }) + case LiveEventMessage: + // opengraph.Image = data.kind1311Metadata.Image + + err = LiveEventMessageTemplate.Render(w, &LiveEventMessagePage{ + OpenGraphPartial: opengraph, + HeadCommonPartial: HeadCommonPartial{ + IsProfile: false, + TailwindDebugStuff: tailwindDebugStuff, + NaddrNaked: data.naddrNaked, + NeventNaked: data.neventNaked, + }, + DetailsPartial: detailsData, + ClientsPartial: ClientsPartial{ + Clients: generateClientList(style, data.naddr, data.event), + }, + + Content: template.HTML(data.content), + CreatedAt: data.createdAt, + Metadata: data.metadata, + Npub: data.npub, + NpubShort: data.npubShort, + ParentLink: data.parentLink, + Style: style, + Subject: subject, + TitleizedContent: titleizedContent, + Alt: data.alt, + + LiveEventMessage: *data.kind1311Metadata, + }) case Other: detailsData.HideDetails = false // always open this since we know nothing else about the event diff --git a/templates/live_event_message.html b/templates/live_event_message.html new file mode 100644 index 0000000..160d9a1 --- /dev/null +++ b/templates/live_event_message.html @@ -0,0 +1,85 @@ + + + + + {{.TitleizedContent}} + + {{template "opengraph" .OpenGraphPartial}} + + {{template "head_common" .HeadCommonPartial}} + + + + {{template "top" .}} + +
+
+
+
+ +
+ +
+
+
+ {{.Metadata.Name}} + + {{if not (eq .Metadata.Name .Metadata.DisplayName)}} + {{.Metadata.DisplayName}} + {{end}} +
+
+ {{.NpubShort}} +
+
+
+
+
+ {{.CreatedAt}} +
+ +
+ {{ if not (eq "" .ParentLink) }} messagin during the live event + {{ .ParentLink }} {{ end }} +
+ +
+ +
+ {{ if (not (eq "" .Subject))}} +

{{.Subject}}

+ {{ else }} +

+ {{.Metadata.Name}} on Nostr: {{.TitleizedContent}} +

+ {{ end }} + + {{ .Content }} +
+ + {{template "details" .DetailsPartial}} + +
+
+ + {{template "clients" .ClientsPartial}} +
+
+ + {{template "footer" .}} + + diff --git a/utils.go b/utils.go index 65d65e3..383b8c6 100644 --- a/utils.go +++ b/utils.go @@ -61,6 +61,7 @@ var kindNames = map[int]string{ 43: "Channel Hide Message", 44: "Channel Mute User", 1063: "File Metadata", + 1311: "Live Chat Message", 1984: "Reporting", 9734: "Zap Request", 9735: "Zap", @@ -80,6 +81,7 @@ var kindNames = map[int]string{ 30018: "Create or update a product", 30023: "Long-form Content", 30078: "Application-specific Data", + 30311: "Live Event", } var kindNIPs = map[int]string{ @@ -98,6 +100,7 @@ var kindNIPs = map[int]string{ 43: "28", 44: "28", 1063: "94", + 1311: "53", 1984: "56", 9734: "57", 9735: "57", @@ -117,6 +120,7 @@ var kindNIPs = map[int]string{ 30018: "15", 30023: "23", 30078: "78", + 30311: "53", } type Style string