--- outline: deep --- # Generating custom live events Suppose you want to generate a new event every time a goal is scored on some soccer game and send that to all clients subscribed to a given game according to a tag `t`. We'll assume you'll be polling some HTTP API that gives you the game's current score, and that in your `main` function you'll start the function that does the polling: ```go func main () { // other stuff here relay := khatru.NewRelay() go startPollingGame(relay) // other stuff here } type GameStatus struct { TeamA int `json:"team_a"` TeamB int `json:"team_b"` } func startPollingGame(relay *khatru.Relay) { current := GameStatus{0, 0} for { newStatus, err := fetchGameStatus() if err != nil { continue } if newStatus.TeamA > current.TeamA { // team A has scored a goal, here we generate an event evt := nostr.Event{ CreatedAt: nostr.Now(), Kind: 1, Content: "team A has scored!", Tags: nostr.Tags{{"t", "this-game"}} } evt.Sign(global.RelayPrivateKey) // calling BroadcastEvent will send the event to everybody who has been listening for tag "t=[this-game]" // there is no need to do any code to keep track of these clients or who is listening to what, khatru // does that already in the background automatically relay.BroadcastEvent(evt) // just calling BroadcastEvent won't cause this event to be be stored, // if for any reason you want to store these events you must call the store functions manually for _, store := range relay.StoreEvent { store(context.TODO(), evt) } } if newStatus.TeamB > current.TeamB { // same here, if team B has scored a goal // ... } } } func fetchGameStatus() (GameStatus, error) { // implementation of calling some external API goes here } ```