public function dispatchReceivePacket(Packet $packet, Session $session)
 {
     if (!$session->isAuth()) {
         return;
     }
     /* @var \jegarn\session\SwooleSession $session
      * @var GroupChatPacket $pkt
      */
     if ($pkt = ChatroomPacket::getPacketFromPacket($packet)) {
         // check send user is a member of this group
         $cm = ChatroomManager::getInstance();
         if ($packet->isFromSystemUser() || $cm->isGroupUser($pkt->getGroupId(), $pkt->getFrom())) {
             $fromUid = $pkt->getFrom();
             if ($uidList = $cm->getGroupUsers($pkt->getGroupId())) {
                 $sm = ServerManager::getInstance();
                 foreach ($uidList as $uid) {
                     if ($uid != $fromUid) {
                         $pktCopy = clone $pkt;
                         $pktCopy->setTo($uid);
                         if ($toSession = SessionManager::getInstance()->getSessionByUserId($uid)) {
                             Logger::addInfo('user online,chatroom(uid:' . $uid . ')');
                             $sm->send($toSession, $pktCopy);
                         } else {
                             Logger::addInfo('user not online,chatroom,abandon message(uid:' . $uid . ')');
                         }
                     }
                 }
             } else {
                 Logger::addInfo('chatroom ' . $pkt->getGroupId() . ' users lost, from uid ' . $pkt->getFrom());
             }
         } else {
             Logger::addInfo('chatroom ' . $pkt->getGroupId() . ' has no user ' . $pkt->getFrom() . ' and it is not a system user');
         }
     }
 }
 public function dispatchOfflinePacket(Session $session)
 {
     // if(!$session->isAuth() || !$session->getUserId()) return; // before dispatch, both two is checked
     $ogm = OfflineGroupMessageManager::getInstance();
     $uid = $session->getUserId();
     $sm = ServerManager::getInstance();
     while ($packet = $ogm->getPacket($uid)) {
         $sm->send($session, $packet);
     }
 }
 public function dispatchOfflinePacket(Session $session)
 {
     // if(!$session->isAuth() || !$session->getUserId()) return; // before dispatch, both two is checked
     $omm = OfflineNotificationMessageManager::getInstance();
     $uid = $session->getUserId();
     $sm = ServerManager::getInstance();
     /* @var ChatPacket $packet */
     while (($packet = $omm->getPacket($uid)) && $packet instanceof NotificationPacket) {
         $sm->send($session, $packet);
     }
 }
Example #4
0
 protected function sendPacketOfCurrentProcess(Session $session, Packet $packet)
 {
     $previousReachable = $this->isFdReachable($session->getFd());
     $session->setReachable($previousReachable);
     if (false !== $this->dispatchSend($session, $packet)) {
         // if send buffer is full or other reason, send will failed, so second dispatch packet and tell them session not reachable
         $data = $packet->convertToArray();
         $data[$this->sessionKey] = $session->getSessionId();
         $packetStr = json_encode($data);
         $encodedPacketStr = $this->wsBuffProcessor->encode($packetStr);
         if (!$this->instance->send($session->getFd(), $encodedPacketStr) && $previousReachable) {
             $session->setReachable(false);
             Logger::addInfo('send directly failed, dispatch again (fd:' . $session->getFd() . ') ');
             $this->dispatchSend($session, $packet);
         } else {
             Logger::addInfo('send directly success (fd:' . $session->getFd() . ') |' . $encodedPacketStr . '|' . $packetStr . '|');
         }
     } else {
         Logger::addInfo('send dispatch failed (fd:' . $session->getFd() . ') ');
     }
 }
Example #5
0
 public function dispatchReceivePacket(Packet $packet, Session $session)
 {
     if ($session->isAuth()) {
         return true;
     }
     /* @var \jegarn\session\SwooleSession $session
      * @var AuthPacket $pkt
      */
     if ($pkt = AuthPacket::getPacketFromPacket($packet)) {
         if ($pkt->auth()) {
             $session->setUserId($pkt->getUid());
             $session->setAuth(true);
             $session->setSessionId(TextUtil::generateGUID());
             SessionManager::getInstance()->addSession($session);
             $pkt->setStatus(AuthPacket::STATUS_AUTH_SUCCESS);
         } else {
             $pkt->setStatus(AuthPacket::STATUS_AUTH_FAILED);
             Logger::addInfo('auth failed(fd:' . $session->getFd() . ')');
         }
     } else {
         $pkt = new AuthPacket();
         $pkt->setPacket($packet);
         $pkt->setStatus(AuthPacket::STATUS_NEED_AUTH);
         Logger::addInfo('auth needed(fd:' . $session->getFd() . ')');
     }
     ServerManager::getInstance()->send($session, $pkt->getReversedPacket());
     return false;
 }
Example #6
0
 public function isSessionReachable(Session $session)
 {
     /* @var SwooleSession $session */
     return $session && $this->isFdReachable($session->getFd());
 }
Example #7
0
 public function isValidSession(Session $session)
 {
     return null !== $session && $session->getFd() && $session->getUserId() && $session->getSessionId();
 }
Example #8
0
 protected function isConnectedToNoneServer(Session $session)
 {
     return !$session->getServerAddress() || !$session->getServerPort();
 }