action.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package daemon
  2. import (
  3. "errors"
  4. "git.beejay.kim/WatchDog/ward/internal/download"
  5. "git.beejay.kim/WatchDog/ward/model"
  6. "git.beejay.kim/WatchDog/ward/platform"
  7. "git.beejay.kim/tool/service/config"
  8. "github.com/rs/zerolog/log"
  9. "github.com/urfave/cli/v2"
  10. "google.golang.org/protobuf/proto"
  11. "time"
  12. )
  13. var action = func(ctx *cli.Context) error {
  14. var (
  15. cfg = config.Get[Configuration](ctx)
  16. p platform.Platform
  17. downloader *download.HLS
  18. chMessage = make(chan proto.Message, 256)
  19. chStream chan []byte
  20. err error
  21. )
  22. defer func() {
  23. for i := range players {
  24. if players[i] == nil {
  25. continue
  26. }
  27. _ = players[i].Close()
  28. }
  29. close(chMessage)
  30. close(ctrlSignal)
  31. if chStream != nil {
  32. close(chStream)
  33. }
  34. }()
  35. if cfg == nil {
  36. return errors.New("could not load Configuration")
  37. }
  38. if p, err = cfg.Platform.Detect(pid, bid); err != nil {
  39. return err
  40. }
  41. go func() {
  42. if err = p.Connect(chMessage); err != nil {
  43. exit <- err
  44. }
  45. }()
  46. if len(players) > 0 {
  47. if downloader, err = download.NewHLS(p.HLSStream, download.HLSOptions{
  48. Timeout: time.Second * 10,
  49. MaxAttempts: 9,
  50. }); err != nil {
  51. return err
  52. }
  53. for i := range players {
  54. if err = players[i].Start(exit); err != nil {
  55. return err
  56. }
  57. }
  58. chStream = downloader.Start()
  59. }
  60. for {
  61. select {
  62. case err := <-exit:
  63. return err
  64. case buff := <-chStream:
  65. if buff == nil {
  66. continue
  67. }
  68. for i := range players {
  69. if err = players[i].Write(buff); err != nil {
  70. return err
  71. }
  72. }
  73. case m := <-chMessage:
  74. switch t := m.(type) {
  75. case *model.Message:
  76. log.Info().
  77. Any("user", t.User).
  78. Str("text", t.Text).
  79. Bool("emoticon", t.Sticker).
  80. Msg("message")
  81. case *model.RosterChange:
  82. //TODO:
  83. case *model.Online:
  84. log.Info().
  85. Uint64("total", t.Total).
  86. Uint64("mobile", t.DeviceMobile).
  87. Uint64("pc", t.DevicePc).
  88. Msg("online")
  89. case *model.Donation:
  90. log.Info().
  91. Any("user", t.User).
  92. Uint64("amount", t.Amount).
  93. Msg("donation")
  94. default:
  95. log.Info().Any("data", m).Msg("message")
  96. }
  97. }
  98. }
  99. }