/**
  * Callback when a client sends a message
  *
  * @param \WebSocketServer\Event\Event    $event   The event
  * @param \WebSocketServer\Socket\Client  $client  The client
  * @param \WebSocketServer\Socket\Message $message The message
  */
 public function onMessage(Event $event, Client $client, Message $message)
 {
     if ($message->getOpcode() === Message::OP_TEXT) {
         if ($message->getData() == '!!staph') {
             $client->getServer()->broadcast($client->getAppData('user')->getId() . ' stopped the server');
             $client->getServer()->stop();
         } else {
             $data = json_decode($message->getData());
             $user = $client->getAppData('user');
             switch ($data->event) {
                 case 'listRooms':
                     $client->sendText(json_encode(['event' => $data->event, 'rooms' => $this->roomManager->getAllNames()]));
                     return;
                 case 'connect':
                     // check whether username is set
                     if (!trim($data->username)) {
                         $client->sendText(json_encode(['event' => 'error', 'errors' => [['name' => 'username', 'message' => 'Username is required']]]));
                         return;
                     }
                     // check whether room is set or created
                     if (!trim($data->roomId) && !trim($data->roomName)) {
                         $client->sendText(json_encode(['event' => 'error', 'errors' => [['name' => 'room', 'message' => 'Room is required']]]));
                         return;
                     }
                     if (!trim($data->roomId)) {
                         $room = $this->roomManager->create($data->roomName);
                     } else {
                         $room = $this->roomManager->getById($data->roomId);
                     }
                     $user->setUsername($data->username);
                     $room->addUser($user);
                     $client->sendText(json_encode(['event' => $data->event, 'roomId' => $room->getId(), 'result' => 'success']));
                     $client->getServer()->sendToAllButClient(json_encode(['event' => 'userConnected', 'id' => $user->getHashedId(), 'username' => $user->getUsername(), 'avatarHash' => md5($user->getUsername()), 'message' => $user->getUsername() . ' entered the room.']), $client);
                     return;
                 case 'loadRoom':
                     $user->setStatus(UserEntity::STATUS_ONLINE);
                     $room = $this->roomManager->getById($data->roomId);
                     if ($room === null) {
                         $client->sendText(json_encode(['event' => 'error', 'errors' => [['name' => 'room', 'message' => 'Invalid room chosen']]]));
                         return;
                     }
                     $userCollection = $room->getUsers();
                     $users = [];
                     foreach ($userCollection as $user) {
                         $users[] = $user->getInfo();
                     }
                     $client->sendText(json_encode(['event' => $data->event, 'users' => $users, 'messages' => []]));
                     return;
                 case 'userStartedTyping':
                     $client->getServer()->broadcast(json_encode(['event' => 'userChangedStatus', 'id' => $user->getHashedId(), 'status' => 'typing']));
                     return;
                 case 'userStoppedTyping':
                     $client->getServer()->broadcast(json_encode(['event' => $data->event, 'id' => $user->getHashedId()]));
                     return;
                 case 'sendMessage':
                     $room = $this->roomManager->getById($data->roomId);
                     $client->getServer()->broadcast(json_encode(['event' => $data->event, 'message' => ['type' => 'post', 'text' => $data->message, 'user' => ['id' => $user->getHashedId(), 'username' => $user->getUsername(), 'avatarHash' => md5($user->getUsername())]]]));
                     return;
             }
         }
     }
 }
Пример #2
0
 /**
  * Disconnect client
  *
  * @param \WebSocketServer\Socket\Client $client The client to disconnect
  *
  * @throws \OutOfRangeException When passed client does not belong to this server
  */
 public function removeClient(Client $client)
 {
     if ($client->getServer() !== $this) {
         throw new \OutOfRangeException('Client does not belong to this server');
     }
     if ($client->isConnected()) {
         $client->disconnect();
     }
     $id = $client->getId();
     if (isset($this->clients[$id])) {
         unset($this->clients[$id], $this->sockets[$id]);
         $this->trigger('clientremove', $this, $client);
     }
 }