func (h *DBHandler) Login(head *protocol.PackageHead, jsonBody []byte, tail *protocol.PackageTail) (result []byte) { var req protocol.LoginRequest var rsp protocol.LoginResponse errCode := 0 var err error = nil defer func() { rsp.ErrorCode = proto.Uint32(uint32(errCode)) syslog.Debug(rsp.String()) result, err = proto.Marshal(&rsp) if err != nil { syslog.Debug(err) } }() if err := proto.Unmarshal(jsonBody, &req); err != nil { errCode = errors.Code(errors.CLIENT_ERR_UNKNOW_ERROR) return } phonenum := req.GetUsername() password := req.GetPassword() userInfo, _ := user.GetUserInfoByPhoneNum(phonenum) if userInfo == nil { errCode = errors.Code(errors.CLIENT_ERR_USER_NOT_EXIST) return } if userInfo.Password != password { errCode = errors.Code(errors.CLIENT_ERR_PASSWORD_ERROR) return } us, err := user.GetUserState(userInfo.Uid) if err != nil { syslog.Info("GetUserState failed!!!", err) } us.Uid = userInfo.Uid us.Sid = tail.SID us.ConnIP = tail.IP us.ConnPort = tail.Port //us.SetupId = req.SetupId us.Online = true if err := user.SetUserState(us); err != nil { syslog.Info("SetUserState failed", us) } rsp.UserId = proto.Uint64(userInfo.Uid) tail.UID = userInfo.Uid return }
func (h *Handler) HandleMessage(message *nsq.Message) error { dataPackage := common.GetDataPackage() defer common.PutDataPackage(dataPackage) if err := dataPackage.Unpackage(message.Body); err != nil { syslog.Warn(err) return nil } head := &dataPackage.Head jsonStr := dataPackage.BodyData() tail := &dataPackage.Tail switch head.Command { case common.XXX_CMD_SEND_USER_MSG: default: syslog.Warn("Invalid Cmd :", head.Command, *tail) } // get user state us, err := user.GetUserState(tail.UID) if err != nil { syslog.Info("GetUserState failed!!!", tail) return nil } // not online if us.Online == false { syslog.Debug("client not online!!! uid:", tail.UID) return nil } tail.IP = us.ConnIP tail.Port = us.ConnPort tail.SID = us.Sid tail.UID = us.Uid respBuf := common.GetBuffer() defer common.PutBuffer(respBuf) if err := common.Package(respBuf, head, jsonStr, tail); err != nil { syslog.Info(err) return nil } topic := fmt.Sprintf("conn_%s_%d", util.IPToStr(tail.IP), tail.Port) common.NsqPublish(topic, respBuf.Bytes()) return nil }
func (c *Client) Stop() { if 0 < atomic.LoadInt32(&c.MsgCount) { time.AfterFunc(time.Second*30, c.Stop) return } syslog.Debug("client ", c.Uid, "Sid ", c.Sid, " disconnect!!", c.Conn.RemoteAddr()) c.Conn.Close() us, err := user.GetUserState(c.Uid) if err != nil { syslog.Info("GetUserState failed!!!", err) } if us.Uid == c.Uid && us.Sid == c.Sid { if err := user.SetUserState(&user.UserState{Uid: c.Uid}); err != nil { syslog.Info("SetUserState failed!!!", err) } } c.Stat = CLIENT_STATE_OFFLINE c.Service.RWMutex.Lock() delete(c.Service.ClientMap, c.Sid) c.Service.RWMutex.Unlock() atomic.AddInt32(&c.Service.ClientCount, -1) PutClient(c) }