/**
  * Callback when a client sends a message
  *
  * @param \WebSocketServer\Core\Server   $server  The websocket server
  * @param \WebSocketServer\Socket\Client $client  The client
  * @param \WebSocketServer\Socket\Frame  $frame The message
  */
 public function onMessage(Server $server, Client $client, Frame $frame)
 {
     $data = json_decode($frame->getData());
     switch ($data->event) {
         case 'listRooms':
             $client->sendText(json_encode(['event' => $data->event, 'rooms' => $this->getRooms()]));
             break;
         case 'connect':
             $client->sendText(json_encode(['event' => $data->event, 'result' => $this->connect($data->roomId, $data->username), 'roomId' => $data->roomId]));
             break;
         case 'loadRoom':
             $client->sendText(json_encode(['event' => $data->event, 'users' => $this->getUsersOfRoom($data->roomId), 'messages' => []]));
             $room = $this->roomCollection->getById($data->roomId);
             $user = $room->getUser(session_id());
             $server->sendToAllButClient(json_encode(['event' => 'userConnected', 'id' => session_id(), 'username' => $user->getUsername(), 'avatarHash' => md5($user->getUsername()), 'message' => $user->getUsername() . ' entered the room.']), $client);
             break;
         case 'userStartedTyping':
             $server->broadcast(json_encode(['event' => $data->event, 'id' => session_id()]));
             break;
         case 'userStoppedTyping':
             $server->broadcast(json_encode(['event' => $data->event, 'id' => session_id()]));
             break;
         case 'sendMessage':
             $room = $this->roomCollection->getById($data->roomId);
             $user = $room->getUser(session_id());
             $server->broadcast(json_encode(['event' => $data->event, 'message' => ['type' => 'post', 'text' => $data->message, 'user' => ['id' => session_id(), 'username' => $user->getUsername(), 'avatarHash' => md5($user->getUsername())]]]));
             break;
     }
 }
 /**
  * Remove a client (stream) of the user
  *
  * @param \WebSocketServer\Socket\Client $client The new client to remove of the user
  */
 public function removeClient(Client $client)
 {
     unset($this->clients[$client->getId()]);
 }
 /**
  * Callback when a client suffers an error
  *
  * @param \WebSocketServer\Event\Event   $event   The event
  * @param \WebSocketServer\Socket\Client $client  The client
  * @param string                         $message The error description
  */
 public function onError(Event $event, Client $client, $message)
 {
     if ($user = $client->getAppData('user')) {
         $userId = $user->getId();
     } else {
         $userId = '#' . $client->getId();
     }
     $client->getServer()->sendToAllButClient($userId . ' fell over', $client);
 }
 /**
  * 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);
     }
 }