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