From 5be478918632703b8e15017afbcf197545a2e4cd Mon Sep 17 00:00:00 2001 From: Ruben Date: Tue, 1 Nov 2016 22:07:56 +0100 Subject: [PATCH] Trigger websocket update after score & image upload --- bin/socket_server.php | 26 +++++++++++++++ composer.json | 4 ++- src/Api/ScoreControllerProvider.php | 16 +++++++++ src/Server/Websockets.php | 51 +++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 bin/socket_server.php create mode 100644 src/Server/Websockets.php diff --git a/bin/socket_server.php b/bin/socket_server.php new file mode 100644 index 0000000..57e012c --- /dev/null +++ b/bin/socket_server.php @@ -0,0 +1,26 @@ +run(); \ No newline at end of file diff --git a/composer.json b/composer.json index c2f70cd..04d686d 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,9 @@ "cnam/security-jwt-service-provider": "2.*", "jms/serializer": "^1.3", "danielstjules/php-pretty-datetime": "dev-master", - "fustundag/tokenbucket": "dev-master" + "fustundag/tokenbucket": "dev-master", + "cboden/ratchet": "^0.3.5", + "textalk/websocket": "^1.2" }, "autoload": { "psr-4": { diff --git a/src/Api/ScoreControllerProvider.php b/src/Api/ScoreControllerProvider.php index ced86f1..50dc20e 100644 --- a/src/Api/ScoreControllerProvider.php +++ b/src/Api/ScoreControllerProvider.php @@ -7,6 +7,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\JsonResponse; use Silex\Api\ControllerProviderInterface; use EmotionHero\Models; +use EmotionHero\Server\Websockets; class ScoreControllerProvider implements ControllerProviderInterface { @@ -140,6 +141,13 @@ class ScoreControllerProvider implements ControllerProviderInterface $userRepo = $this->_eh->getEm()->getRepository(Models\User::class); $userRepo->updateTotalForUser($user); + // trigger update of client: + try{ + Websockets::triggerUpdate('game'); + }catch(\Throwable $e) { + // nothing + } + return new JsonResponse(['success' => true, 'id' => $game->getId(), 'hits' => $hits_array, 'achievements' => $achievement_ids], 200); }); @@ -205,6 +213,14 @@ class ScoreControllerProvider implements ControllerProviderInterface } $em->flush(); + + + // trigger update of client: + try{ + Websockets::triggerUpdate('images'); + }catch(\Throwable $e) { + // nothing + } return new JsonResponse(['success' => true, 'message' => "images saved."], 200); }); diff --git a/src/Server/Websockets.php b/src/Server/Websockets.php new file mode 100644 index 0000000..eaedf37 --- /dev/null +++ b/src/Server/Websockets.php @@ -0,0 +1,51 @@ +send(json_encode(['action'=>'update', 'method'=>$type])); + $client->receive(); + unset($client); + } + + public function __construct() { + $this->clients = new \SplObjectStorage; + } + + public function onOpen(ConnectionInterface $conn) { + // Store the new connection to send messages to later + $this->clients->attach($conn); + + echo "New connection! ({$conn->resourceId})\n"; + } + + public function onMessage(ConnectionInterface $from, $msg) { + echo sprintf('Connection %d sending message "%s"' . "\n" + , $from->resourceId, $msg); + + foreach ($this->clients as $client) { + if ($from !== $client) { + // The sender is not the receiver, send to each client connected + $client->send("update"); + } + } + } + + public function onClose(ConnectionInterface $conn) { + // The connection is closed, remove it, as we can no longer send it messages + $this->clients->detach($conn); + + echo "Connection {$conn->resourceId} has disconnected\n"; + } + + public function onError(ConnectionInterface $conn, \Exception $e) { + echo "An error has occurred: {$e->getMessage()}\n"; + + $conn->close(); + } +} \ No newline at end of file