Refactoring: add message handler and disconnected message

This commit is contained in:
Simon Vieille 2018-02-05 18:50:29 +01:00
parent 4e76919142
commit 8dfd3318bc
No known key found for this signature in database
GPG Key ID: 919533E2B946EA10
5 changed files with 175 additions and 109 deletions

View File

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

View File

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

View File

@ -152,6 +152,10 @@
</div>
</div>
<div id="disconneced">
You are not connected. <a href="?">Refresh</a>
</div>
<script src="vendor/components/jquery/jquery.min.js"></script>
<script src="vendor/select2/select2/dist/js/select2.full.min.js"></script>
<script src="vendor/twbs/bootstrap/dist/js/bootstrap.bundle.min.js"></script>

View File

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

View File

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