/** * 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; } } } }
/** * Send a pong message to a specific client * * @param \WebSocketServer\Socket\Message $message The ping message being responded to */ private function sendPong(Message $ping) { $this->log('Sending pong frame to client #' . $this->id); $this->log('Message data: ' . $ping->getData(), Loggable::LEVEL_DEBUG); $this->writeObject($this->messageEncoder->encodeString($ping->getData(), Frame::OP_PONG)); }