150 lines
4.1 KiB
PHP
Executable file
150 lines
4.1 KiB
PHP
Executable file
#!/usr/bin/env php
|
|
<?php
|
|
|
|
require __DIR__.'/vendor/autoload.php';
|
|
|
|
use Ratchet\Server\IoServer;
|
|
use Ratchet\Http\HttpServer;
|
|
use Ratchet\WebSocket\WsServer;
|
|
use Ratchet\ConnectionInterface;
|
|
|
|
$server = new Server();
|
|
$shell = new Shell();
|
|
|
|
$server->addMessageHandler('pointer', function (ConnectionInterface $from, array $data) use ($shell) {
|
|
$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);
|
|
|
|
$shell->exec('xdotool mousemove %s %s', $mouseX, $mouseY);
|
|
} elseif ($click !== null) {
|
|
if ($click === 'left') {
|
|
$shell->exec('xdotool click 1');
|
|
} elseif ($click === 'middle') {
|
|
$shell->exec('xdotool click 2');
|
|
} elseif ($click === 'right') {
|
|
$shell->exec('xdotool click 3');
|
|
}
|
|
}
|
|
});
|
|
|
|
$server->addMessageHandler('scroll', function (ConnectionInterface $from, array $data) use ($shell) {
|
|
$value = $data['value'] ?? null;
|
|
|
|
if ($value === 'down') {
|
|
$shell->exec('xdotool click 5 && xdotool click 5');
|
|
} elseif ($value === 'up') {
|
|
$shell->exec('xdotool click 4 && xdotool click 4');
|
|
}
|
|
});
|
|
|
|
$server->addMessageHandler('workspace', function (ConnectionInterface $from, array $data) use ($shell) {
|
|
$value = $data['value'] ?? null;
|
|
|
|
if (!empty($value)) {
|
|
$shell->exec("i3-msg 'workspace \"%s\"'", $value);
|
|
}
|
|
});
|
|
|
|
$server->addMessageHandler('volume', function (ConnectionInterface $from, array $data) use ($shell) {
|
|
$value = $data['value'] ?? null;
|
|
|
|
if ($value === null) {
|
|
return;
|
|
}
|
|
|
|
if ($value === 'up') {
|
|
$shell->exec('amixer set Master 2%+');
|
|
} elseif ($value === 'down') {
|
|
$shell->exec('amixer set Master 2%-');
|
|
} else {
|
|
$shell->exec('amixer set Master %d%%', (int) $value);
|
|
}
|
|
});
|
|
|
|
$server->addMessageHandler('media', function (ConnectionInterface $from, array $data) use ($shell) {
|
|
$value = $data['value'] ?? null;
|
|
|
|
if ($value === 'playpause') {
|
|
$cmd = 'play-pause';
|
|
} elseif ($value === 'next') {
|
|
$cmd = 'next';
|
|
} elseif ($value === 'prev') {
|
|
$cmd = 'previous';
|
|
}
|
|
|
|
if (!empty($cmd)) {
|
|
$shell->exec('playerctl -p spotify %s', $cmd);
|
|
}
|
|
});
|
|
|
|
$server->addMessageHandler('keys', function (ConnectionInterface $from, array $data) use ($shell) {
|
|
$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);
|
|
|
|
$shell->exec('xdotool key %s', escapeshellarg($value));
|
|
}
|
|
});
|
|
|
|
$server->addMessageHandler('key', function (ConnectionInterface $from, array $data) use ($shell) {
|
|
$value = $data['value'] ?? null;
|
|
$map = [
|
|
'up' => 'Up',
|
|
'down' => 'Down',
|
|
'left' => 'Left',
|
|
'right' => 'Right',
|
|
'tab' => 'Tab',
|
|
'backspace' => 'BackSpace',
|
|
'enter' => 'Return',
|
|
'space' => 'space',
|
|
'escape' => 'Escape',
|
|
];
|
|
|
|
if (!empty($value) && isset($map[$value])) {
|
|
$shell->exec('xdotool key %s', $map[$value]);
|
|
}
|
|
});
|
|
|
|
$server->addMessageHandler('text', function (ConnectionInterface $from, array $data) use ($shell) {
|
|
$value = $data['value'] ?? null;
|
|
|
|
if (!empty($value)) {
|
|
$shell->exec('xdotool type %s', escapeshellarg($value));
|
|
}
|
|
});
|
|
|
|
$server->addMessageHandler('messages', function (ConnectionInterface $from, array $data) use ($server) {
|
|
$value = $data['value'] ?? [];
|
|
|
|
foreach ($value as $msg) {
|
|
$server->onMessage($from, json_encode($msg));
|
|
}
|
|
});
|
|
|
|
$webSocker = IoServer::factory(
|
|
new HttpServer(new WsServer($server)),
|
|
14598
|
|
);
|
|
|
|
$webSocker->run();
|