From 8064b95e3d29175222fa92a0c131c6d4878f7877 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Mon, 7 Sep 2026 11:28:42 +0900 Subject: [PATCH] group: render chat messages after EOSE, fetching profiles while the stored events arrive made the subscription drop most of them. --- group.go | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/group.go b/group.go index b621d24..5cc2793 100644 --- a/group.go +++ b/group.go @@ -271,28 +271,32 @@ var group = &cli.Command{ // stored events arrive newest-first before EOSE, so we buffer them // from the end and print them in chronological order once EOSE // arrives; live events are printed as they come. + // + // rendering a message needs profile metadata, which may have to be + // fetched from the network, so it is only done after EOSE: doing it + // while the stored events are still arriving is slow enough that the + // subscription gives up waiting for EOSE and the events that hadn't + // been read yet are dropped. eosed := false - messages := make([]string, 200) + messages := make([]nostr.Event, 200) base := len(messages) for { select { case evt := <-sub.Events: - meta := sys.FetchProfileMetadata(ctx, evt.PubKey) - line := color.HiBlueString(meta.ShortName()) + " " + color.HiCyanString(evt.CreatedAt.Time().Format(time.DateTime)) + ": " + colorizeNoteContent(ctx, evt.Content) if eosed { - stdout(line) + stdout(formatGroupChatMessage(ctx, evt)) } else if base > 0 { base-- - messages[base] = line + messages[base] = evt } // else: pre-EOSE buffer is full (relay returned more than the limit); drop. case reason := <-sub.ClosedReason: stdout("closed:" + color.YellowString(reason)) case <-sub.EndOfStoredEvents: eosed = true - for _, msg := range messages[base:] { - stdout(msg) + for _, evt := range messages[base:] { + stdout(formatGroupChatMessage(ctx, evt)) } case <-sub.Context.Done(): return fmt.Errorf("subscription ended: %w", context.Cause(sub.Context)) @@ -968,6 +972,13 @@ func cond(b bool, ifYes string, ifNo string) string { var hashtagRe = regexp.MustCompile(`#+\w+`) +func formatGroupChatMessage(ctx context.Context, evt nostr.Event) string { + meta := sys.FetchProfileMetadata(ctx, evt.PubKey) + return color.HiBlueString(meta.ShortName()) + + " " + color.HiCyanString(evt.CreatedAt.Time().Format(time.DateTime)) + + ": " + colorizeNoteContent(ctx, evt.Content) +} + func colorizeNoteContent(ctx context.Context, content string) string { var sb strings.Builder