From 7378b0f50a3c63a0fee2882b5adf89a931c560e2 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 27 Jan 2026 10:16:15 +0000 Subject: [PATCH] Add NIP-29 member list fallback to derive participants from messages When NIP-29 relays don't provide kind 39001/39002 member list events, the chat participant list would be empty. This change augments the static participant list with pubkeys from message authors, ensuring users can still see who is active in the group while preserving admin/moderator roles from the member list when available. https://claude.ai/code/session_01Qikw63P4kxwR6ceCQuFMAM --- src/components/ChatViewer.tsx | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/components/ChatViewer.tsx b/src/components/ChatViewer.tsx index c5737db..b915946 100644 --- a/src/components/ChatViewer.tsx +++ b/src/components/ChatViewer.tsx @@ -31,7 +31,7 @@ import { Nip10Adapter } from "@/lib/chat/adapters/nip-10-adapter"; import { Nip29Adapter } from "@/lib/chat/adapters/nip-29-adapter"; import { Nip53Adapter } from "@/lib/chat/adapters/nip-53-adapter"; import type { ChatProtocolAdapter } from "@/lib/chat/adapters/base-adapter"; -import type { Message } from "@/types/chat"; +import type { Message, ParticipantRole } from "@/types/chat"; import type { ChatAction } from "@/types/chat-actions"; import { parseSlashCommand } from "@/lib/chat/slash-command-parser"; import { @@ -895,6 +895,29 @@ export function ChatViewer({ return participants; } + // NIP-29 groups: use static participants but fallback to message authors if empty + // Some relays may not provide kind 39001/39002 member list events + if (protocol === "nip-29" && messages) { + const staticParticipants = conversation?.participants || []; + + // If we have static participants from member list events, use them as base + // and augment with message authors + const participants: { pubkey: string; role?: ParticipantRole }[] = [ + ...staticParticipants, + ]; + const seen = new Set(staticParticipants.map((p) => p.pubkey)); + + // Add message authors who aren't already in the list as members + for (const msg of messages) { + if (msg.type !== "system" && !seen.has(msg.author)) { + seen.add(msg.author); + participants.push({ pubkey: msg.author, role: "member" }); + } + } + + return participants; + } + // Other protocols: use static participants from conversation return conversation?.participants || []; }, [