game.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package game
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "strings"
  7. "sync"
  8. "git.jiaxianghudong.com/go/logs"
  9. "git.jiaxianghudong.com/webs/pkg/rds"
  10. "github.com/go-redis/redis"
  11. )
  12. var RdsXueLiu = "activegamexueliu"
  13. var ChannelXueLIU = "channel_activegamexueliu"
  14. var syncMap sync.Map
  15. var (
  16. Conf Data // 血流6红中
  17. ConfMs Data // 血流免输(也叫血流8红中)
  18. ConfHzvs Data // 血流2v2
  19. ConfXl4hz Data // 血流4红中
  20. ConfGb Data // 国标免洗麻将
  21. ConfGbxz Data // 国标血战麻将
  22. )
  23. type Data struct {
  24. List []*GameXueLiu `json:"list"`
  25. TextList []string `json:"text_list"`
  26. mu sync.RWMutex
  27. }
  28. type GameXueLiu struct {
  29. HuType string `json:"hu_type"`
  30. BeiShu int `json:"bei_shu"`
  31. FuziData [][]string `json:"fuzi_data"`
  32. Msg string `json:"msg"`
  33. FuziShowType []string `json:"fuzi_show_type"`
  34. }
  35. func (d *Data) Store(version string) (err error) {
  36. if len(d.List) != 0 {
  37. marshal, _ := json.Marshal(d)
  38. err = rds.Redis.Set(RdsXueLiu+version, marshal, -1).Err()
  39. PubMessage(ChannelXueLIU, "refresh")
  40. logs.Infof("更新规则配置,TextList=%+v", d.TextList)
  41. for k, v := range d.List {
  42. logs.Infof("%d--list=%+v", k, *v)
  43. }
  44. } else {
  45. return errors.New("没有正确格式")
  46. }
  47. return err
  48. }
  49. func (d *Data) ReLoad(version string) error {
  50. Conf.mu.Lock()
  51. defer Conf.mu.Unlock()
  52. val := rds.Redis.Get(RdsXueLiu + version).Val()
  53. if val != "" {
  54. json.Unmarshal([]byte(val), d)
  55. }
  56. syncMap.Store(version, d)
  57. return nil
  58. }
  59. func (d *Data) LoadConf(version string) error {
  60. Conf.mu.RLock()
  61. defer Conf.mu.RUnlock()
  62. if version == "" {
  63. d.List = Conf.List
  64. d.TextList = Conf.TextList
  65. } else {
  66. load, ok := syncMap.Load(version)
  67. if ok {
  68. t := load.(*Data)
  69. d.List = t.List
  70. d.TextList = t.TextList
  71. }
  72. }
  73. return nil
  74. }
  75. func PubMessage(channel, msg string) {
  76. rds.Redis.Publish(channel, msg)
  77. }
  78. func SubMessage() {
  79. rds.Redis = rds.Register("redis")
  80. Conf.ReLoad("")
  81. ConfMs.ReLoad("xueliums")
  82. ConfHzvs.ReLoad("hzvs")
  83. ConfXl4hz.ReLoad("xl4hz")
  84. ConfGb.ReLoad("xueliugb")
  85. ConfGbxz.ReLoad("xueliugbxz")
  86. pubsub := rds.Redis.Subscribe(ChannelXueLIU)
  87. go func() {
  88. fmt.Println("配置订阅启动3")
  89. var receipt interface{}
  90. var err error
  91. for {
  92. receipt, err = pubsub.Receive()
  93. if err != nil {
  94. if strings.Contains(err.Error(), "close") {
  95. fmt.Println("closedd", err)
  96. return
  97. }
  98. }
  99. switch v := receipt.(type) {
  100. case *redis.Message: // 单个订阅subscribe
  101. fmt.Printf("%s: message: %s\n", v.Channel, v.Payload)
  102. switch v.Payload {
  103. case "refresh":
  104. Conf.ReLoad("")
  105. ConfMs.ReLoad("xueliums")
  106. ConfHzvs.ReLoad("hzvs")
  107. ConfXl4hz.ReLoad("xl4hz")
  108. ConfGb.ReLoad("xueliugb")
  109. ConfGbxz.ReLoad("xueliugbxz")
  110. break
  111. default:
  112. }
  113. case error:
  114. fmt.Println("你好")
  115. return
  116. default:
  117. fmt.Println("pong....")
  118. }
  119. }
  120. }()
  121. }