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); } }
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() . ') '); } }
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; }
public function isSessionReachable(Session $session) { /* @var SwooleSession $session */ return $session && $this->isFdReachable($session->getFd()); }
public function isValidSession(Session $session) { return null !== $session && $session->getFd() && $session->getUserId() && $session->getSessionId(); }
protected function isConnectedToNoneServer(Session $session) { return !$session->getServerAddress() || !$session->getServerPort(); }