Trigger websocket update after score & image upload

This commit is contained in:
Ruben 2016-11-01 22:07:56 +01:00
parent ec07837833
commit 5be4789186
4 changed files with 96 additions and 1 deletions

26
bin/socket_server.php Normal file
View file

@ -0,0 +1,26 @@
<?php
chdir(__DIR__);
// define('APPLICATION_ENV', 'development');
require_once __DIR__ . "/../bootstrap.php";
error_reporting(E_ALL);
ini_set('display_errors',1);
// Show table creation statements
// And (re)generate Proxies
use Ratchet\WebSocket\WsServer;
use Ratchet\Http\HttpServer;
use Ratchet\Server\IoServer;
$server = IoServer::factory(
new HttpServer(
new WsServer(
new EmotionHero\Server\Websockets()
)
),
8181
);
$server->run();

View file

@ -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": {

View file

@ -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);
});

51
src/Server/Websockets.php Normal file
View file

@ -0,0 +1,51 @@
<?php
namespace EmotionHero\Server;
use WebSocket\Client;
class Websockets
{
protected $clients;
public static function triggerUpdate(string $type) {
$client = new Client("ws://localhost:8181/");
$client->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();
}
}