From 8dfd3318bc931a03392b9422a8524e8d52ac7905 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Mon, 5 Feb 2018 18:50:29 +0100 Subject: [PATCH] Refactoring: add message handler and disconnected message --- client/assets/css/main.css | 14 ++++ client/assets/js/main.js | 8 ++- client/index.html | 4 ++ server/Server.php | 131 ++++++++----------------------------- server/run_server.php | 127 +++++++++++++++++++++++++++++++++-- 5 files changed, 175 insertions(+), 109 deletions(-) diff --git a/client/assets/css/main.css b/client/assets/css/main.css index 73be3bb..72da165 100644 --- a/client/assets/css/main.css +++ b/client/assets/css/main.css @@ -33,3 +33,17 @@ margin: auto; background: #ccc; } + +#disconneced { + position: absolute; + top: 0; + width: 100%; + background: #ff6161; + color: #fff; + padding: 5px; +} + +#disconneced a { + color: #fff; + font-weight: bold; +} diff --git a/client/assets/js/main.js b/client/assets/js/main.js index c6a9720..d271c66 100644 --- a/client/assets/js/main.js +++ b/client/assets/js/main.js @@ -19,7 +19,13 @@ $(function() { $(this).addClass('active'); }); - ws.onclose = function(event) {} + ws.onopen = function(event) { + $('#disconneced').hide(); + } + + ws.onclose = function(event) { + $('#disconneced').show(); + } ws.onmessage = function(event) {} diff --git a/client/index.html b/client/index.html index 897bf49..99a8ea5 100644 --- a/client/index.html +++ b/client/index.html @@ -152,6 +152,10 @@ +
+ You are not connected. Refresh +
+ diff --git a/server/Server.php b/server/Server.php index e3016ab..daa5df3 100644 --- a/server/Server.php +++ b/server/Server.php @@ -16,9 +16,9 @@ class Server implements MessageComponentInterface protected $clients; /** - * @var \SplObjectStorage + * @var array */ - protected $authenticatedClients; + protected $messageHandlers = []; /** * Constructor. @@ -28,6 +28,25 @@ class Server implements MessageComponentInterface $this->clients = new \SplObjectStorage(); } + /** + * Add a message handle. + * + * @param string $type + * @param callable $callable + * + * @return Server; + */ + public function addMessageHandler($type, callable $callable) + { + if (!isset($this->messageHandlers[$type])) { + $this->messageHandlers[$type] = []; + } + + $this->messageHandlers[$type][] = $callable; + + return $this; + } + /** * {@inheritdoc} */ @@ -49,110 +68,14 @@ class Server implements MessageComponentInterface $type = $data['type'] ?? null; - if ($type === 'pointer') { - $x = $data['x'] ?? null; - $y = $data['y'] ?? null; - $click = $data['click'] ?? null; + if ($type === null) { + return; + } - if ($x !== null && $y !== null) { - $mouseLocations = shell_exec('xdotool getmouselocation'); - preg_match('/x:(\d+) y:(\d+) /', $mouseLocations, $matches); - $mouseX = (int) ($matches[1] + $x * 2.5); - $mouseY = (int) ($matches[2] + $y * 2.5); + $handlers = $this->messageHandlers[$type] ?? []; - return shell_exec(sprintf('xdotool mousemove %s %s', $mouseX, $mouseY)); - } elseif ($click !== null) { - if ($click === 'left') { - return shell_exec('xdotool click 1'); - } elseif ($click === 'dleft') { - // return shell_exec("xdotool click 1; xdotool click 1"); - } elseif ($click === 'middle') { - return shell_exec('xdotool click 2'); - } elseif ($click === 'right') { - return shell_exec('xdotool click 3'); - } - } - } elseif ($type === 'workspace') { - $value = $data['value'] ?? null; - - if (!empty($value)) { - return shell_exec(sprintf("i3-msg 'workspace \"%s\"'", $value)); - } - } elseif ($type === 'volume') { - $value = $data['value'] ?? null; - - if ($value === null) { - return; - } - - if ($value === 'up') { - return shell_exec('amixer set Master 2%+'); - } elseif ($value === 'down') { - return shell_exec('amixer set Master 2%-'); - } else { - return shell_exec('amixer set Master '.((int) $value).'%'); - } - } elseif ($type === 'media') { - $value = $data['value'] ?? null; - - if ($value === 'playpause') { - $cmd = 'PlayPause'; - } elseif ($value === 'next') { - $cmd = 'Next'; - } elseif ($value === 'prev') { - $cmd = 'Previous'; - } - - if (!empty($cmd)) { - return shell_exec('dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.'.$cmd); - } - } elseif ($type === 'keys') { - $value = $data['value'] ?? null; - - if (!empty($value)) { - $keys = explode(',', $value); - - foreach ($keys as $k => $v) { - if ($v === 'win') { - $keys[$k] = 'super'; - } elseif ($v === 'ctrl') { - $keys[$k] = 'Control_L'; - } elseif ($v === 'alt') { - $keys[$k] = 'Alt_L'; - } - } - - $value = implode('+', $keys); - - return shell_exec(sprintf('xdotool key %s', escapeshellarg($value))); - } - } elseif ($type === 'key') { - $value = $data['value'] ?? null; - - if (!empty($value)) { - switch ($value) { - case 'up': - return shell_exec('xdotool key Up'); - case 'down': - return shell_exec('xdotool key Down'); - case 'left': - return shell_exec('xdotool key Left'); - case 'right': - return shell_exec('xdotool key Right'); - case 'tab': - return shell_exec('xdotool key Tab'); - case 'backspace': - return shell_exec('xdotool key BackSpace'); - case 'enter': - return shell_exec('xdotool key Return'); - case 'space': - return shell_exec('xdotool key space'); - case 'escape': - return shell_exec('xdotool key Escape'); - } - - return shell_exec(sprintf('xdotool type %s', escapeshellarg($value))); - } + foreach ($handlers as $handler) { + $handler($from, $data); } } diff --git a/server/run_server.php b/server/run_server.php index c61d194..631d944 100755 --- a/server/run_server.php +++ b/server/run_server.php @@ -7,10 +7,129 @@ require __DIR__.'/Server.php'; use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; +use Ratchet\ConnectionInterface; -$server = IoServer::factory( - new HttpServer(new WsServer(new \Server())), - 14598 +$server = new \Server(); + +$server->addMessageHandler('pointer', function (ConnectionInterface $from, array $data) { + $x = $data['x'] ?? null; + $y = $data['y'] ?? null; + $click = $data['click'] ?? null; + + if ($x !== null && $y !== null) { + $mouseLocations = shell_exec('xdotool getmouselocation'); + preg_match('/x:(\d+) y:(\d+) /', $mouseLocations, $matches); + $mouseX = (int) ($matches[1] + $x * 2.5); + $mouseY = (int) ($matches[2] + $y * 2.5); + + return shell_exec(sprintf('xdotool mousemove %s %s', $mouseX, $mouseY)); + } elseif ($click !== null) { + if ($click === 'left') { + return shell_exec('xdotool click 1'); + } elseif ($click === 'dleft') { + // return shell_exec("xdotool click 1; xdotool click 1"); + } elseif ($click === 'middle') { + return shell_exec('xdotool click 2'); + } elseif ($click === 'right') { + return shell_exec('xdotool click 3'); + } + } +}); + +$server->addMessageHandler('workspace', function (ConnectionInterface $from, array $data) { + $value = $data['value'] ?? null; + + if (!empty($value)) { + return shell_exec(sprintf("i3-msg 'workspace \"%s\"'", $value)); + } +}); + +$server->addMessageHandler('volume', function (ConnectionInterface $from, array $data) { + $value = $data['value'] ?? null; + + if ($value === null) { + return; + } + + if ($value === 'up') { + return shell_exec('amixer set Master 2%+'); + } elseif ($value === 'down') { + return shell_exec('amixer set Master 2%-'); + } else { + return shell_exec('amixer set Master '.((int) $value).'%'); + } +}); + +$server->addMessageHandler('media', function (ConnectionInterface $from, array $data) { + $value = $data['value'] ?? null; + + if ($value === 'playpause') { + $cmd = 'PlayPause'; + } elseif ($value === 'next') { + $cmd = 'Next'; + } elseif ($value === 'prev') { + $cmd = 'Previous'; + } + + if (!empty($cmd)) { + return shell_exec('dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.'.$cmd); + } +}); + +$server->addMessageHandler('keys', function (ConnectionInterface $from, array $data) { + $value = $data['value'] ?? null; + + if (!empty($value)) { + $keys = explode(',', $value); + + foreach ($keys as $k => $v) { + if ($v === 'win') { + $keys[$k] = 'super'; + } elseif ($v === 'ctrl') { + $keys[$k] = 'Control_L'; + } elseif ($v === 'alt') { + $keys[$k] = 'Alt_L'; + } + } + + $value = implode('+', $keys); + + return shell_exec(sprintf('xdotool key %s', escapeshellarg($value))); + } +}); + +$server->addMessageHandler('key', function (ConnectionInterface $from, array $data) { + $value = $data['value'] ?? null; + + if (!empty($value)) { + switch ($value) { + case 'up': + return shell_exec('xdotool key Up'); + case 'down': + return shell_exec('xdotool key Down'); + case 'left': + return shell_exec('xdotool key Left'); + case 'right': + return shell_exec('xdotool key Right'); + case 'tab': + return shell_exec('xdotool key Tab'); + case 'backspace': + return shell_exec('xdotool key BackSpace'); + case 'enter': + return shell_exec('xdotool key Return'); + case 'space': + return shell_exec('xdotool key space'); + case 'escape': + return shell_exec('xdotool key Escape'); + } + + return shell_exec(sprintf('xdotool type %s', escapeshellarg($value))); + } +}); + +$webSocker = IoServer::factory( + new HttpServer(new WsServer($server)), + 14598 ); -$server->run(); +$webSocker->run();