subscribemmanager.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package handler
  2. import (
  3. "bet24.com/log"
  4. notification "bet24.com/servers/micros/notification/proto"
  5. pb "bet24.com/servers/micros/privateroom/proto"
  6. "encoding/json"
  7. "sync"
  8. "time"
  9. )
  10. var subsmgr *subsmanager
  11. const subs_timeout = 60
  12. func getSubsManager() *subsmanager {
  13. if subsmgr == nil {
  14. subsmgr = new(subsmanager)
  15. subsmgr.run()
  16. }
  17. return subsmgr
  18. }
  19. type subsmanager struct {
  20. userlist map[int]int64
  21. lock *sync.RWMutex
  22. }
  23. func (sm *subsmanager) run() {
  24. sm.userlist = make(map[int]int64)
  25. sm.lock = &sync.RWMutex{}
  26. go sm.checkTimeout()
  27. }
  28. func (sm *subsmanager) checkTimeout() {
  29. time.AfterFunc(20*time.Second, sm.checkTimeout)
  30. now := time.Now().Unix()
  31. var toRemove []int
  32. sm.lock.RLock()
  33. for k, v := range sm.userlist {
  34. if now-v >= subs_timeout {
  35. toRemove = append(toRemove, k)
  36. }
  37. }
  38. sm.lock.RUnlock()
  39. if len(toRemove) <= 0 {
  40. return
  41. }
  42. log.Debug("subsmanager.checkTimeout removing users %v", toRemove)
  43. sm.lock.Lock()
  44. for _, v := range toRemove {
  45. delete(sm.userlist, v)
  46. }
  47. sm.lock.Unlock()
  48. }
  49. func (sm *subsmanager) userSubscribeRoomStatus(userId int) {
  50. sm.lock.Lock()
  51. sm.userlist[userId] = time.Now().Unix()
  52. sm.lock.Unlock()
  53. }
  54. func (sm *subsmanager) userDesubscribeRoomStatus(userId int) {
  55. sm.lock.Lock()
  56. delete(sm.userlist, userId)
  57. sm.lock.Unlock()
  58. }
  59. func (sm *subsmanager) publishRawData(data string) {
  60. sm.lock.RLock()
  61. for k := range sm.userlist {
  62. go notification.AddNotification(k, notification.Notification_PrivateRoom, data)
  63. }
  64. sm.lock.RUnlock()
  65. }
  66. func (sm *subsmanager) publishRoomCreated(roomNo int) {
  67. r := getRoomManager().getRoomInfo(roomNo)
  68. if r == nil {
  69. log.Release("subsmanager publishRoomCreated [%d] not found", roomNo)
  70. return
  71. }
  72. msg := Match_notificationInfo{Msg: room_created, RoomNo: roomNo, RoomInfo: &r.RoomInfo}
  73. d, _ := json.Marshal(msg)
  74. sm.publishRawData(string(d))
  75. }
  76. func (sm *subsmanager) publishRoomClosed(roomNo int) {
  77. msg := Match_notificationInfo{Msg: room_closed, RoomNo: roomNo}
  78. d, _ := json.Marshal(msg)
  79. sm.publishRawData(string(d))
  80. }
  81. func (sm *subsmanager) publishRoomInfo(roomInfo pb.RoomInfo) {
  82. msg := Match_notificationInfo{Msg: room_info, RoomNo: roomInfo.RoomNo, RoomInfo: &roomInfo}
  83. d, _ := json.Marshal(msg)
  84. sm.publishRawData(string(d))
  85. }
  86. func (sm *subsmanager) publishRoomCallAdded(roomNo int) {
  87. r := getRoomManager().getRoomInfo(roomNo)
  88. if r == nil {
  89. log.Release("subsmanager publishRoomCallAdded [%d] not found", roomNo)
  90. return
  91. }
  92. msg := Match_notificationInfo{Msg: room_call_added, RoomNo: roomNo}
  93. d, _ := json.Marshal(msg)
  94. sm.publishRawData(string(d))
  95. }
  96. func (sm *subsmanager) publishRoomCallRemoved(roomNo int) {
  97. msg := Match_notificationInfo{Msg: room_call_removed, RoomNo: roomNo}
  98. d, _ := json.Marshal(msg)
  99. sm.publishRawData(string(d))
  100. }