piggybank.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. package model
  2. import (
  3. "active/constant"
  4. "active/tools"
  5. "fmt"
  6. "log"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "git.jiaxianghudong.com/go/gsdkclient"
  11. "git.jiaxianghudong.com/webs/pkg/rds"
  12. )
  13. var PiggyBankConf = &PiggyBank{}
  14. var PushChan = make(chan struct{})
  15. type PiggyBank struct {
  16. ReceiveList []struct {
  17. Diamond int64 `json:"diamond" yaml:"diamond"`
  18. BeanNumber int64 `json:"bean_number" yaml:"bean_number"`
  19. RealDiamond int64 `json:"real_diamond" yaml:"real_diamond"`
  20. Add int64 `json:"add" yaml:"add"`
  21. Level int `json:"level" yaml:"level"`
  22. } `json:"receive_list" yaml:"receive_list"`
  23. ReceiveListV2 []struct {
  24. Diamond int64 `json:"diamond" yaml:"diamond"`
  25. RealDiamond int64 `json:"real_diamond" yaml:"real_diamond"`
  26. MinBean int64 `json:"min_bean" yaml:"min_bean"`
  27. MaxBean int64 `json:"max_bean" yaml:"max_bean"`
  28. Add int64 `json:"add" yaml:"add"` //折扣
  29. Between []int `json:"between" yaml:"between"`
  30. Level int `json:"level" yaml:"level"`
  31. } `json:"receive_list_v2" yaml:"receive_list_v2"`
  32. StartTime int64 `json:"start_time" yaml:"start_time"`
  33. EndTime int64 `json:"end_time" yaml:"end_time"`
  34. Switch int64 `json:"switch" yaml:"switch"`
  35. }
  36. type PiggyBankDetail struct {
  37. Level int64 `json:"level"` //档位
  38. BeanNumber int64 `json:"bean_number"` //豆豆数
  39. }
  40. func GetPiggyBankData(userID int64, tm int64, ishost bool) (*PiggyBankDetail, error) {
  41. //fmt.Println(fmt.Sprintf(constant.PIGGYBANKDATA, tm))
  42. userIdStr := strconv.FormatInt(userID, 10)
  43. piggyBankDetail := &PiggyBankDetail{
  44. Level: 1,
  45. BeanNumber: 0,
  46. }
  47. useGameRedis := rds.GameRedis0
  48. //if ishost {
  49. // useGameRedis = rds.GameTestRedis0
  50. //}
  51. var err error
  52. data := useGameRedis.HGet(fmt.Sprintf(constant.PIGGYBANKDATA, tm), userIdStr).Val()
  53. if data == "" {
  54. return nil, fmt.Errorf("没有存豆记录")
  55. }
  56. strList := strings.Split(data, ",")
  57. if len(strList) != 2 {
  58. SetPiggyBankData(userID, tm, piggyBankDetail, ishost)
  59. return nil, err
  60. }
  61. piggyBankDetail.Level, err = strconv.ParseInt(strList[0], 10, 64)
  62. if err != nil {
  63. log.Printf("redisKey: %v Level转成int64的问题: %v \n", userIdStr, err)
  64. return nil, err
  65. }
  66. piggyBankDetail.BeanNumber, err = strconv.ParseInt(strList[1], 10, 64)
  67. if err != nil {
  68. log.Printf("redisKey: %v BeanNumber转成int64的问题: %v \n", userIdStr, err)
  69. return nil, err
  70. }
  71. return piggyBankDetail, nil
  72. }
  73. func SetPiggyBankData(userID int64, tm int64, data *PiggyBankDetail, ishost bool) bool {
  74. useGameRedis := rds.GameRedis0
  75. if ishost {
  76. useGameRedis = rds.GameTestRedis0
  77. }
  78. userIdStr := strconv.FormatInt(userID, 10)
  79. dataStr := fmt.Sprintf("%v,%v", data.Level, data.BeanNumber)
  80. err := useGameRedis.HSet(fmt.Sprintf(constant.PIGGYBANKDATA, tm), userIdStr, dataStr).Err()
  81. if err != nil {
  82. log.Printf("redisKey: %v number: %v redis.HSet-err: %v \n", userID, data, err)
  83. return false
  84. }
  85. return true
  86. }
  87. func GetPiggyBankDataV2(userID int64, tm int64, ishost bool) (*PiggyBankDetail, error) {
  88. //fmt.Println(fmt.Sprintf(constant.PIGGYBANKDATA, tm))
  89. userIdStr := strconv.FormatInt(userID, 10)
  90. piggyBankDetail := &PiggyBankDetail{
  91. Level: 1,
  92. BeanNumber: 0,
  93. }
  94. useGameRedis := rds.GameRedis0
  95. //if ishost {
  96. // useGameRedis = rds.GameTestRedis0
  97. //}
  98. var err error
  99. data := useGameRedis.HGet(fmt.Sprintf(constant.PIGGYBANKDATAV2, tm), userIdStr).Val()
  100. if data == "" {
  101. return nil, nil
  102. }
  103. strList := strings.Split(data, ",")
  104. if len(strList) != 2 {
  105. SetPiggyBankData(userID, tm, piggyBankDetail, ishost)
  106. return nil, err
  107. }
  108. piggyBankDetail.Level, err = strconv.ParseInt(strList[0], 10, 64)
  109. if err != nil {
  110. log.Printf("redisKey: %v Level转成int64的问题: %v \n", userIdStr, err)
  111. return nil, err
  112. }
  113. piggyBankDetail.BeanNumber, err = strconv.ParseInt(strList[1], 10, 64)
  114. if err != nil {
  115. log.Printf("redisKey: %v BeanNumber转成int64的问题: %v \n", userIdStr, err)
  116. return nil, err
  117. }
  118. return piggyBankDetail, nil
  119. }
  120. func SetPiggyBankDataV2(userID int64, tm int64, data *PiggyBankDetail, ishost bool) bool {
  121. useGameRedis := rds.GameRedis0
  122. if ishost {
  123. useGameRedis = rds.GameTestRedis0
  124. }
  125. userIdStr := strconv.FormatInt(userID, 10)
  126. dataStr := fmt.Sprintf("%v,%v", data.Level, data.BeanNumber)
  127. err := useGameRedis.HSet(fmt.Sprintf(constant.PIGGYBANKDATAV2, tm), userIdStr, dataStr).Err()
  128. if err != nil {
  129. log.Printf("redisKey: %v number: %v redis.HSet-err: %v \n", userID, data, err)
  130. return false
  131. }
  132. return true
  133. }
  134. func SetPiggyBankExpire() {
  135. sp := GetAllActiceByType(constant.PiggyBankType)
  136. o := &OpenTimes{}
  137. o.GetOpenTime(sp.OpenTimes)
  138. if sp.Status == "1" {
  139. end := time.Unix(PiggyBankConf.EndTime, 0).Add(72 * time.Hour)
  140. rds.GameRedis0.ExpireAt(fmt.Sprintf(constant.PIGGYBANKDATA, PiggyBankConf.StartTime), end)
  141. rds.GameRedis0.ExpireAt(fmt.Sprintf(constant.PIGGYBANKDATAV2, PiggyBankConf.StartTime), end)
  142. }
  143. }
  144. func SetPiggyBankSend(room int64, server int64) error {
  145. return rds.GameRedis0.HSet(constant.PIGGYBANKSEND, fmt.Sprintf("%v;%v", room, server), 1).Err()
  146. }
  147. func InitPubPiggybank() {
  148. <-PushChan
  149. go PubPiggyBankConf()
  150. log.Println("done push ")
  151. }
  152. func PubPiggyBankConf() []string {
  153. msgList := []string{}
  154. sp := GetAllActiceByType(constant.PiggyBankType)
  155. o := &OpenTimes{}
  156. o.GetOpenTime(sp.OpenTimes)
  157. if sp.Status == "1" {
  158. PiggyBankConf.StartTime = tools.TimeParseUnix(o.Start, "")
  159. PiggyBankConf.EndTime = tools.TimeParseUnix(o.End, "")
  160. PiggyBankConf.Switch = 1
  161. end := time.Unix(PiggyBankConf.EndTime, 0).Add(72 * time.Hour)
  162. rds.GameRedis0.ExpireAt(fmt.Sprintf(constant.PIGGYBANKDATA, PiggyBankConf.StartTime), end)
  163. rds.GameRedis0.ExpireAt(fmt.Sprintf(constant.PIGGYBANKDATAV2, PiggyBankConf.StartTime), end)
  164. } else {
  165. PiggyBankConf.StartTime = 0
  166. PiggyBankConf.EndTime = 0
  167. PiggyBankConf.Switch = 0
  168. }
  169. str := fmt.Sprintf("%v_%v_%v;", PiggyBankConf.StartTime, PiggyBankConf.EndTime, PiggyBankConf.Switch)
  170. for _, v := range PiggyBankConf.ReceiveList {
  171. str += fmt.Sprintf("%v_%v_%v_%v_%v;", v.Diamond, v.BeanNumber, v.RealDiamond, v.Add, v.Level)
  172. }
  173. str2 := fmt.Sprintf("%v_%v_%v;", PiggyBankConf.StartTime, PiggyBankConf.EndTime, PiggyBankConf.Switch)
  174. for _, v := range PiggyBankConf.ReceiveListV2 {
  175. str2 += fmt.Sprintf("%v_%v_%v_%v_%v_%v;", v.Diamond, v.MinBean, v.MaxBean, v.RealDiamond, v.Add, v.Level)
  176. }
  177. result := rds.GameTestRedis0.Set(constant.PIGGYBANK, str, -1).Err()
  178. result = rds.GameRedis0.Set(constant.PIGGYBANK, str, -1).Err()
  179. result = rds.GameRedis0.Set(constant.PIGGYBANKSTART, fmt.Sprintf("%v", PiggyBankConf.StartTime), -1).Err()
  180. rds.GameRedis0.Set(constant.PIGGYBANKV2, str2, -1)
  181. rds.GameTestRedis0.Set(constant.PIGGYBANKV2, str2, -1)
  182. if result != nil {
  183. fmt.Println(result)
  184. return nil
  185. }
  186. log.Printf("%v \n", str)
  187. // sendMap := rds.GameRedis0.HGetAll(constant.PIGGYBANKSEND).Val()
  188. if sp.IsDebug != "1" {
  189. sendMap := make(map[string]bool)
  190. var cursor uint64
  191. for {
  192. var keys []string
  193. keys, cursor = rds.GameRedis0.HScan(constant.PIGGYBANKSEND, cursor, "*", 20).Val()
  194. for _, key := range keys {
  195. sendMap[key] = true
  196. }
  197. fmt.Println("ddd", cursor)
  198. if cursor == 0 {
  199. break
  200. }
  201. }
  202. for s := range sendMap {
  203. list := strings.Split(s, ";")
  204. if len(list) != 2 {
  205. continue
  206. }
  207. server, _ := strconv.Atoi(list[0])
  208. room, _ := strconv.Atoi(list[1])
  209. if _, ok := gsdkclient.Client().RoomShell(room, server, "piggybank"); !ok {
  210. log.Printf("reidstest 推送失败 %v , %v \n", room, server)
  211. //msgList = append(msgList,fmt.Sprintf("推送失败 %v , %v \n", server.Room[i], server.Server) )
  212. } else {
  213. log.Printf("reidstest 推送成功 %v , %v \n", room, server)
  214. }
  215. }
  216. for _, server := range constant.RoomServerConfs.ServerList {
  217. for i := range server.Room {
  218. if _, ok := gsdkclient.Client().RoomShell(server.Room[i], server.Server, "piggybank"); !ok {
  219. log.Printf("推送失败 %v , %v \n", server.Room[i], server.Server)
  220. //msgList = append(msgList,fmt.Sprintf("推送失败 %v , %v \n", server.Room[i], server.Server) )
  221. } else {
  222. log.Printf("推送成功 %v , %v \n", server.Room[i], server.Server)
  223. }
  224. }
  225. }
  226. } else {
  227. rom := []constant.Server{
  228. {
  229. Room: []int{7932, 7574, 6067, 6066, 6065, 6064, 6061},
  230. Server: 24795,
  231. },
  232. }
  233. for _, server := range rom {
  234. for i := range server.Room {
  235. if _, ok := gsdkclient.Client().RoomShell(server.Room[i], server.Server, "piggybank"); !ok {
  236. log.Printf("测试推送失败 %v , %v \n", server.Room[i], server.Server)
  237. //msgList = append(msgList,fmt.Sprintf("推送失败 %v , %v \n", server.Room[i], server.Server) )
  238. } else {
  239. log.Printf("测试推送成功 %v , %v \n", server.Room[i], server.Server)
  240. }
  241. }
  242. }
  243. }
  244. return msgList
  245. }
  246. func SetPiggyBank() {
  247. sp := GetAllActiceByType(constant.PiggyBankType)
  248. o := &OpenTimes{}
  249. o.GetOpenTime(sp.OpenTimes)
  250. if sp.Status == "1" {
  251. PiggyBankConf.StartTime = tools.TimeParseUnix(o.Start, "")
  252. PiggyBankConf.EndTime = tools.TimeParseUnix(o.End, "")
  253. PiggyBankConf.Switch = 1
  254. end := time.Unix(PiggyBankConf.EndTime, 0).Add(72 * time.Hour)
  255. rds.GameRedis0.ExpireAt(fmt.Sprintf(constant.PIGGYBANKDATA, PiggyBankConf.StartTime), end)
  256. rds.GameRedis0.ExpireAt(fmt.Sprintf(constant.PIGGYBANKDATAV2, PiggyBankConf.StartTime), end)
  257. } else {
  258. PiggyBankConf.StartTime = 0
  259. PiggyBankConf.EndTime = 0
  260. PiggyBankConf.Switch = 0
  261. }
  262. //Diamond int64 `json:"diamond" yaml:"diamond"`
  263. //BeanNumber int64 `json:"bean_number" yaml:"bean_number"`
  264. //RealDiamond int64 `json:"real_diamond" yaml:"real_diamond"`
  265. //Add int64 `json:"add" yaml:"add"`
  266. //Level int `json:"level" yaml:"level"`
  267. str := fmt.Sprintf("%v_%v_%v;", PiggyBankConf.StartTime, PiggyBankConf.EndTime, PiggyBankConf.Switch)
  268. for _, v := range PiggyBankConf.ReceiveList {
  269. str += fmt.Sprintf("%v_%v_%v_%v_%v;", v.Diamond, v.BeanNumber, v.RealDiamond, v.Add, v.Level)
  270. }
  271. str2 := fmt.Sprintf("%v_%v_%v;", PiggyBankConf.StartTime, PiggyBankConf.EndTime, PiggyBankConf.Switch)
  272. for _, v := range PiggyBankConf.ReceiveListV2 {
  273. str2 += fmt.Sprintf("%v_%v_%v_%v_%v_%v;", v.Diamond, v.MinBean, v.MaxBean, v.RealDiamond, v.Add, v.Level)
  274. }
  275. rds.GameTestRedis0.Set(constant.PIGGYBANK, str, -1)
  276. rds.GameRedis0.Set(constant.PIGGYBANK, str, -1)
  277. rds.GameRedis0.Set(constant.PIGGYBANKSTART, fmt.Sprintf("%v", PiggyBankConf.StartTime), -1)
  278. rds.GameRedis0.Set(constant.PIGGYBANKV2, str2, -1)
  279. rds.GameTestRedis0.Set(constant.PIGGYBANKV2, str2, -1)
  280. }