// Command nostrino-discover lists chain-data gateways announced on relays. package main import ( "context" "encoding/json" "flag" "fmt" "os" "strings" "time" "git.smesh.lol/nostrino/pkg/registry" "git.smesh.lol/nostrino/pkg/relay" ) type stringsFlag []string func (s *stringsFlag) String() string { return strings.Join(*s, ",") } func (s *stringsFlag) Set(v string) error { for _, part := range strings.Split(v, ",") { if part = strings.TrimSpace(part); part != "" { *s = append(*s, part) } } return nil } func main() { var relays stringsFlag fs := flag.NewFlagSet("nostrino-discover", flag.ContinueOnError) fs.Var(&relays, "relay", "relay URL; repeat or comma-separate") chain := fs.String("chain", "btc", "chain name to discover") collect := fs.Duration("collect", 1500*time.Millisecond, "how long to collect announcements after EOSE") timeout := fs.Duration("timeout", 20*time.Second, "overall timeout") asJSON := fs.Bool("json", false, "print JSON") if err := fs.Parse(os.Args[1:]); err != nil { os.Exit(2) } if len(relays) == 0 { fmt.Fprintln(os.Stderr, "nostrino-discover: at least one -relay is required") os.Exit(2) } ctx, cancel := context.WithTimeout(context.Background(), *timeout) defer cancel() infos, err := registry.Discover(ctx, relay.DialTransport, relays, *chain, *collect) if err != nil { fmt.Fprintln(os.Stderr, "nostrino-discover:", err) os.Exit(1) } if *asJSON { out, _ := json.MarshalIndent(infos, "", " ") fmt.Println(string(out)) return } if len(infos) == 0 { fmt.Println("no gateways announced") return } for _, info := range infos { fmt.Printf("%s updated=%s tip=%d\n", info.URI, time.Unix(info.UpdatedAt, 0).Format(time.RFC3339), info.Tip) if info.Version != "" { fmt.Printf(" version=%s chains=%s\n", info.Version, strings.Join(info.Chains, ",")) } } }