diff --git a/nip10/nip10.go b/nip10/nip10.go index 88f2bc0..81c1a75 100644 --- a/nip10/nip10.go +++ b/nip10/nip10.go @@ -13,12 +13,43 @@ func GetThreadRoot(tags nostr.Tags) *nostr.Tag { } func GetImmediateReply(tags nostr.Tags) *nostr.Tag { + var root *nostr.Tag + var lastE *nostr.Tag + for i := len(tags) - 1; i >= 0; i-- { tag := tags[i] - if len(tag) >= 4 && tag[0] == "e" && tag[3] == "reply" { - return &tag + + if len(tag) < 2 { + continue } + if tag[0] != "e" { + continue + } + + if len(tag) >= 4 { + if tag[3] == "reply" { + return &tag + } + if tag[3] == "root" { + // will be used as our first fallback + root = &tag + continue + } + if tag[3] == "mention" { + // this invalidates this tag as a second fallback mechanism (clients that don't add markers) + continue + } + } + + lastE = &tag // will be used as our second fallback (clients that don't add markers) } - return tags.GetLast([]string{"e", ""}) + // if we reached this point we don't have a "reply", but if we have a "root" + // that means this event is a direct reply to the root + if root != nil { + return root + } + + // if we reached this point and we have at least one "e" we'll use that (the last) + return lastE }