/** * User connection request * Will be triggered when the user open the fight page * @param ConnectionInterface $from * @param $data */ public function connectRequest(ConnectionInterface $from, $data) { $fight = $this->manager->getFight($data->fight); $user = FightUser::find()->where('fight_id = :id AND user_id = :user', [':id' => $data->fight, ':user' => $data->user])->one(); // Add connected player $p = $fight->getPlayer($data->index); $isReconnect = !$p->isNew(); if (!$isReconnect) { $fight->addPlayer($data->index, $from, $user, $data->index); } else { $p->connect($from); } // Set user data to manager. Will be used for disconnecting $this->manager->addClient($from, ['user' => $data->user, 'fight' => $data->fight, 'index' => $data->index]); // Log user connection event $this->manager->log("User ({$from->resourceId}) has been " . (!$isReconnect ? 'connected' : 'reconnected') . " to fight {$data->fight}"); // Send message about connecting $player = $fight->getPlayer($data->index); foreach ($fight->getPlayers() as $p) { $response = (new Response())->setAction('message')->setText($player->getName() . ' присоединился к игре'); $p->send($response); } if (!$player->isOwner() && !$isReconnect) { $fight->start(); $response = (new Response())->setAction('connect')->setId($data->user); $fight->getOpponent($data->index)->send($response); } if ($isReconnect && $fight->isFull()) { $fight->getPlayer(1)->startTimer(); $response = (new Response())->setAction('reconnect')->setPlayers($fight->getPlayers())->setFight($fight)->setIds(true); $player->send($response); } }