commit 566c2a1a76b9c6ea5ebfba095500f4615d8cddff Author: Iru Sensei Date: Sun Nov 23 13:54:05 2025 +0100 load config diff --git a/config.go b/config.go new file mode 100644 index 0000000..fbec92f --- /dev/null +++ b/config.go @@ -0,0 +1,95 @@ +package main + +import ( + "flag" + //"github.com/nbd-wtf/go-nostr" + //"github.com/nbd-wtf/go-nostr/nip19" + "fiatjaf.com/nostr" + "fiatjaf.com/nostr/nip19" + "log" + "os" + "strconv" + "strings" +) + +type Config struct { + Port int + NSec string + NPub string + Relays []string +} + +func check(e error) { + if e != nil { + log.Fatal("Fatal: %s", e) + } +} + +func LoadConfig() *Config { + var nsecfile string + var config Config + var portarg int + var nsecarg string + var npubarg string + var relayargs string + + flag.IntVar(&portarg, "port", 49160, "HTTP listen port. Defaults to 49160/TCP. Can be set through WEBHOOK_PORT env") + flag.StringVar(&nsecarg, "nsec", "", "Path to file containing bech32-encoded nsec. Can be set through NOSTR_NSEC_FILE env or generated on first run") + flag.StringVar(&npubarg, "npub", "", "Bech32-encoded npub of the account who will receive notifications. Can be set through NOSTR_NPUB env. You can also set a by alert target by setting the \"npub\" label on the alert properties.") + flag.StringVar(&relayargs, "relays", "", "Comma separated list of relays you want to send your notifications to. Can be set through NOSTR_RELAYS env.") + flag.Parse() + + port, ok := os.LookupEnv("WEBHOOK_PORT") + if ok { + port, err := strconv.Atoi(port) + check(err) + config.Port = port + } else { + config.Port = portarg + } + + nsecvar, ok := os.LookupEnv("NOSTR_NSEC_FILE") + if ok { + nsecfile = nsecvar + } + if nsecarg != "" { + nsecfile = nsecarg + } + + if nsecfile != "" { + data, err := os.ReadFile(nsecfile) + check(err) + nsec := strings.TrimSpace(string(data)) + prefix, decoded, err := nip19.Decode(nsec) + sk := decoded.(nostr.SecretKey) + check(err) + if prefix != "nsec" { + log.Fatalf("not an nsec, got %s", prefix) + } + + pk := nostr.GetPublicKey(sk) + npub := nip19.EncodeNpub(pk) + log.Printf("Loading private key from file %s. Will send alerts from %s", nsecfile, npub) + config.NSec = nsec + } else { + sk := nostr.Generate() + pk := nostr.GetPublicKey(sk) + nsec := nip19.EncodeNsec(sk) + npub := nip19.EncodeNpub(pk) + log.Printf("Using random private key. Will send alerts from %s", npub) + config.NSec = nsec + } + + npub, ok := os.LookupEnv("NOSTR_NPUB") + if ok { + config.NPub = npub + } else { + config.NPub = npubarg + } + + relays, ok := os.LookupEnv("NOSTR_RELAYS") + if ok { + config.Relays = strings.Split(relays, ",") + } + return &config +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..8d683c8 --- /dev/null +++ b/main.go @@ -0,0 +1,13 @@ +package main + +import ( + "log" +) + +func main() { + cfg := LoadConfig() + log.Printf("Port: %s", cfg.Port) + log.Printf("Nsec: %s", cfg.NSec) + log.Printf("Npub: %s", cfg.NPub) + log.Printf("Relays: %s", cfg.Relays) +} diff --git a/parser.dis b/parser.dis new file mode 100644 index 0000000..a32545c --- /dev/null +++ b/parser.dis @@ -0,0 +1,55 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" +) + +type Alert struct { + Status string `json:"status"` + StartsAt string `json:"startsAt"` + EndsAt string `json:"endsAt"` + GeneratorURL string `json:"generatorURL"` + Fingerprint string `json:"fingerprint"` + SilenceURL string `json:"silenceURL"` + DashboardURL string `json:"dashboardURL"` + PanelURL string `json:"panelURL"` + ValueString string `json:"valueString"` + OrgId int `json:"orgId"` + Labels map[string]any `json:"labels"` + Annotations map[string]any `json:"annotations"` + values map[int]any `json:"values"` +} + +type Payload struct { + Receiver string `json:"receiver"` + Status string `json:"firing"` + ExternalURL string `json:"externalURL"` + Version string `json:"version"` + GroupKey string `json:"groupKey"` + TruncatedAlerts int `json:"truncatedAlerts"` + OrgID int `json:"orgId"` + Title string `json:"title"` + State string `json"state"` + Message string `json:"message"` + Alerts []Alert `json:"alerts"` + GroupLabels map[string]any `json:"groupLabels"` + CommonLabels map[string]any `json:"groupLabels"` + CommonAnnotations map[string]any `json:"commonAnnotations"` +} + +func check(e error) { + if e != nil { + panic(e) + } +} + +func main() { + data, err := os.ReadFile("./alert.json") + check(err) + var payload Payload + p1 := json.Unmarshal([]byte(data), &payload) + check(p1) + fmt.Printf("Full payload: %+v\n", payload) +}