package main import ( "context" "flag" "log" "time" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" pb "northwest.io/nostr-grpc/api/nostr/v1" "northwest.io/nostr-grpc/internal/nostr" ) func main() { addr := flag.String("addr", "localhost:50051", "relay address") flag.Parse() conn, err := grpc.NewClient(*addr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("failed to connect: %v", err) } defer conn.Close() client := pb.NewNostrRelayClient(conn) ctx := context.Background() key, err := nostr.GenerateKey() if err != nil { log.Fatalf("failed to generate key: %v", err) } log.Printf("Generated key: %s", key.Npub()) event := &nostr.Event{ PubKey: key.Public(), CreatedAt: time.Now().Unix(), Kind: 1, Tags: nostr.Tags{}, Content: "Hello from gRPC client!", } if err := key.Sign(event); err != nil { log.Fatalf("failed to sign event: %v", err) } pbEvent := &pb.Event{ Id: event.ID, Pubkey: event.PubKey, CreatedAt: event.CreatedAt, Kind: int32(event.Kind), Tags: []*pb.Tag{}, Content: event.Content, Sig: event.Sig, } log.Println("Publishing event...") resp, err := client.PublishEvent(ctx, &pb.PublishEventRequest{Event: pbEvent}) if err != nil { log.Fatalf("failed to publish: %v", err) } if resp.Accepted { log.Printf("✓ Event published successfully: %s", event.ID) } else { log.Printf("✗ Event rejected: %s", resp.Message) return } log.Println("Querying events...") queryResp, err := client.QueryEvents(ctx, &pb.QueryRequest{ Filters: []*pb.Filter{ {Authors: []string{key.Public()}}, }, }) if err != nil { log.Fatalf("failed to query: %v", err) } log.Printf("Found %d events", len(queryResp.Events)) for _, e := range queryResp.Events { log.Printf(" - %s: %s", e.Id[:16], e.Content) } }