package server import ( "encoding/json" "net/http" "github.com/felamaslen/go-music-player/pkg/logger" "github.com/go-redis/redis/v7" ) func getClientNameFromRequest(r *http.Request) string { return r.URL.Query().Get(CLIENT_QUERY_NAME) } func endSubscription(sub *redis.PubSub) error { if err := sub.Unsubscribe(); err != nil { return err } if err := sub.Close(); err != nil { return err } return nil } func (c *Client) onConnect(l *logger.Logger, rdb *redis.Client) error { if _, err := rdb.SAdd(KEY_CLIENT_NAMES, c.name).Result(); err != nil { l.Fatal("Error adding client to set: %v\n", err) } rdb.Publish(TOPIC_CLIENT_CONNECTED, c.name) l.Printf("subscribing to TOPIC_STATE\n") stateSub := rdb.Subscribe(TOPIC_STATE) go func() { for { select { case <- c.disconnected: endSubscription(stateSub) return case msg, ok := <- stateSub.Channel(): l.Debug("Received message from state pubsub: %v\n", msg) if !ok { return } var state MusicPlayer if err := json.Unmarshal([]byte(msg.Payload), &state); err != nil { l.Error("Error parsing state from pubsub: %v\n", err) return } c.conn.WriteJSON(action{ ActionType: ACTION_TYPE_STATE_SET, Payload: state, }) } } }() return nil } func (c *Client) onDisconnect(l *logger.Logger, rdb *redis.Client) error { close(c.disconnected) _, err := rdb.SRem(KEY_CLIENT_NAMES, c.name).Result() if err != nil { l.Fatal("Error removing client from set: %v\n", err) } rdb.Publish(TOPIC_CLIENT_DISCONNECTED, c.name) return nil }