| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- package handler
- import (
- "bet24.com/log"
- notification "bet24.com/servers/micros/notification/proto"
- pb "bet24.com/servers/micros/privateroom/proto"
- "encoding/json"
- "sync"
- "time"
- )
- var subsmgr *subsmanager
- const subs_timeout = 60
- func getSubsManager() *subsmanager {
- if subsmgr == nil {
- subsmgr = new(subsmanager)
- subsmgr.run()
- }
- return subsmgr
- }
- type subsmanager struct {
- userlist map[int]int64
- lock *sync.RWMutex
- }
- func (sm *subsmanager) run() {
- sm.userlist = make(map[int]int64)
- sm.lock = &sync.RWMutex{}
- go sm.checkTimeout()
- }
- func (sm *subsmanager) checkTimeout() {
- time.AfterFunc(20*time.Second, sm.checkTimeout)
- now := time.Now().Unix()
- var toRemove []int
- sm.lock.RLock()
- for k, v := range sm.userlist {
- if now-v >= subs_timeout {
- toRemove = append(toRemove, k)
- }
- }
- sm.lock.RUnlock()
- if len(toRemove) <= 0 {
- return
- }
- log.Debug("subsmanager.checkTimeout removing users %v", toRemove)
- sm.lock.Lock()
- for _, v := range toRemove {
- delete(sm.userlist, v)
- }
- sm.lock.Unlock()
- }
- func (sm *subsmanager) userSubscribeRoomStatus(userId int) {
- sm.lock.Lock()
- sm.userlist[userId] = time.Now().Unix()
- sm.lock.Unlock()
- }
- func (sm *subsmanager) userDesubscribeRoomStatus(userId int) {
- sm.lock.Lock()
- delete(sm.userlist, userId)
- sm.lock.Unlock()
- }
- func (sm *subsmanager) publishRawData(data string) {
- sm.lock.RLock()
- for k := range sm.userlist {
- go notification.AddNotification(k, notification.Notification_PrivateRoom, data)
- }
- sm.lock.RUnlock()
- }
- func (sm *subsmanager) publishRoomCreated(roomNo int) {
- r := getRoomManager().getRoomInfo(roomNo)
- if r == nil {
- log.Release("subsmanager publishRoomCreated [%d] not found", roomNo)
- return
- }
- msg := Match_notificationInfo{Msg: room_created, RoomNo: roomNo, RoomInfo: &r.RoomInfo}
- d, _ := json.Marshal(msg)
- sm.publishRawData(string(d))
- }
- func (sm *subsmanager) publishRoomClosed(roomNo int) {
- msg := Match_notificationInfo{Msg: room_closed, RoomNo: roomNo}
- d, _ := json.Marshal(msg)
- sm.publishRawData(string(d))
- }
- func (sm *subsmanager) publishRoomInfo(roomInfo pb.RoomInfo) {
- msg := Match_notificationInfo{Msg: room_info, RoomNo: roomInfo.RoomNo, RoomInfo: &roomInfo}
- d, _ := json.Marshal(msg)
- sm.publishRawData(string(d))
- }
- func (sm *subsmanager) publishRoomCallAdded(roomNo int) {
- r := getRoomManager().getRoomInfo(roomNo)
- if r == nil {
- log.Release("subsmanager publishRoomCallAdded [%d] not found", roomNo)
- return
- }
- msg := Match_notificationInfo{Msg: room_call_added, RoomNo: roomNo}
- d, _ := json.Marshal(msg)
- sm.publishRawData(string(d))
- }
- func (sm *subsmanager) publishRoomCallRemoved(roomNo int) {
- msg := Match_notificationInfo{Msg: room_call_removed, RoomNo: roomNo}
- d, _ := json.Marshal(msg)
- sm.publishRawData(string(d))
- }
|