| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- 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
- }
|