clients.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package server
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "github.com/felamaslen/go-music-player/pkg/logger"
  6. "github.com/go-redis/redis/v7"
  7. )
  8. func getClientNameFromRequest(r *http.Request) string {
  9. return r.URL.Query().Get(CLIENT_QUERY_NAME)
  10. }
  11. func endSubscription(sub *redis.PubSub) error {
  12. if err := sub.Unsubscribe(); err != nil {
  13. return err
  14. }
  15. if err := sub.Close(); err != nil {
  16. return err
  17. }
  18. return nil
  19. }
  20. func (c *Client) onConnect(l *logger.Logger, rdb *redis.Client) error {
  21. if _, err := rdb.SAdd(KEY_CLIENT_NAMES, c.name).Result(); err != nil {
  22. l.Fatal("Error adding client to set: %v\n", err)
  23. }
  24. rdb.Publish(TOPIC_CLIENT_CONNECTED, c.name)
  25. l.Printf("subscribing to TOPIC_STATE\n")
  26. stateSub := rdb.Subscribe(TOPIC_STATE)
  27. go func() {
  28. for {
  29. select {
  30. case <- c.disconnected:
  31. endSubscription(stateSub)
  32. return
  33. case msg, ok := <- stateSub.Channel():
  34. l.Debug("Received message from state pubsub: %v\n", msg)
  35. if !ok {
  36. return
  37. }
  38. var state MusicPlayer
  39. if err := json.Unmarshal([]byte(msg.Payload), &state); err != nil {
  40. l.Error("Error parsing state from pubsub: %v\n", err)
  41. return
  42. }
  43. c.conn.WriteJSON(action{
  44. ActionType: ACTION_TYPE_STATE_SET,
  45. Payload: state,
  46. })
  47. }
  48. }
  49. }()
  50. return nil
  51. }
  52. func (c *Client) onDisconnect(l *logger.Logger, rdb *redis.Client) error {
  53. close(c.disconnected)
  54. _, err := rdb.SRem(KEY_CLIENT_NAMES, c.name).Result()
  55. if err != nil {
  56. l.Fatal("Error removing client from set: %v\n", err)
  57. }
  58. rdb.Publish(TOPIC_CLIENT_DISCONNECTED, c.name)
  59. return nil
  60. }