/**
  * 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;
     }
 }
 /**
  * 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;
             }
         }
     }
 }