mirror of
https://github.com/fiatjaf/khatru.git
synced 2025-06-02 19:19:22 +02:00
65 lines
1.8 KiB
Markdown
65 lines
1.8 KiB
Markdown
---
|
|
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
|
|
}
|
|
```
|