package hasaki_push import ( "git.ouxuan.net/tommy/melody" "sync" ) var PushMessageSpanSecond = 5 func Send(sender int, receiver int, messageType string, Content interface{}, retries ...int) error { retry := 0 if len(retries) > 0 { retry = retries[0] } return add(&PushMessage{ Type: messageType, Sender: sender, Receiver: receiver, RetryNumber: retry, SpanSecond: PushMessageSpanSecond, Content: Content, Status: NotSend, }) } func SetStatus(uniqueId string, status MessageStatus) error { return setStatus(uniqueId, status) } type Message struct { UniqueId string `json:"unique_id"` Type string `json:"type"` Content interface{} `json:"content"` } var messageHandlerMap sync.Map type MessageHandler func(session *melody.Session, message []byte) func SetMessageHandler(messageType string, f MessageHandler) { messageHandlerMap.Store(messageType, f) } // session: 身份 - 某个点 type Node struct { *melody.Melody sessions map[string]map[string]*Session mutex sync.Mutex } func NewNode() *Node { return &Node{ Melody: melody.New(), sessions: map[string]map[string]*Session{}, mutex: sync.Mutex{}, } } func (n *Node) GetMelody() *melody.Melody { return n.Melody } func (n *Node) SetSession(uid string, session *Session) { n.mutex.Lock() if n.sessions == nil { n.sessions = map[string]map[string]*Session{} } //n.sessions[uid] = append(n.sessions[uid], session) n.mutex.Unlock() } // 身份 type IdentityType string const ( Unknown IdentityType = "unknown" // 未知 Pad IdentityType = "pad" // 平板 Admin IdentityType = "admin" // 管理员 User IdentityType = "user" // 用户 Coach IdentityType = "coach" // 教练 ) type DeviceType string const ( NoDevice DeviceType = "no_device" WebServer DeviceType = "web" Android DeviceType = "android" IosPhone DeviceType = "ios" WechatMini DeviceType = "wechat_mini" ) type Session struct { *melody.Session Identity IdentityType Device DeviceType UserId int } func NewSession(session *melody.Session) *Session { return &Session{ Identity: Unknown, Device: WechatMini, Session: session, UserId: 0, } } func (s *Session) SetUid() { }