remote-i3wm-ws/server/server

170 lines
5 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;
$options = getopt(
'v',
['verbose', 'vv']
);
$serverOutput = new Output(isset($options['v']) || isset($options['verbose']));
$messageOutput = new Output(isset($options['vv']));
$server = new Server($serverOutput);
$shell = new Shell();
$server->addMessageHandler('pointer', function (ConnectionInterface $from, array $data) use ($shell, $messageOutput) {
$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);
$messageOutput->writeln('Pointer moved');
} elseif ($click !== null) {
if ($click === 'left') {
$shell->exec('xdotool click 1');
$messageOutput->writeln('Left click');
} elseif ($click === 'middle') {
$shell->exec('xdotool click 2');
$messageOutput->writeln('Middle click');
} elseif ($click === 'right') {
$shell->exec('xdotool click 3');
$messageOutput->writeln('Right click');
}
}
});
$server->addMessageHandler('scroll', function (ConnectionInterface $from, array $data) use ($shell, $messageOutput) {
$value = $data['value'] ?? null;
if ($value === 'down') {
$shell->exec('xdotool click 5 && xdotool click 5');
$messageOutput->writeln('Scrolling down');
} elseif ($value === 'up') {
$shell->exec('xdotool click 4 && xdotool click 4');
$messageOutput->writeln('Scrolling up');
}
});
$server->addMessageHandler('workspace', function (ConnectionInterface $from, array $data) use ($shell, $messageOutput) {
$value = $data['value'] ?? null;
if (!empty($value)) {
$shell->exec("i3-msg 'workspace \"%s\"'", $value);
$messageOutput->writeln('Workspace changed');
}
});
$server->addMessageHandler('volume', function (ConnectionInterface $from, array $data) use ($shell, $messageOutput) {
$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);
}
$messageOutput->writeln('Volume modified');
});
$server->addMessageHandler('media', function (ConnectionInterface $from, array $data) use ($shell, $messageOutput) {
$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);
$messageOutput->writeln('Spotify managed');
}
});
$server->addMessageHandler('keys', function (ConnectionInterface $from, array $data) use ($shell, $messageOutput) {
$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));
$messageOutput->writeln('Key pressed');
}
});
$server->addMessageHandler('key', function (ConnectionInterface $from, array $data) use ($shell, $messageOutput) {
$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]);
$messageOutput->writeln('Key pressed');
}
});
$server->addMessageHandler('text', function (ConnectionInterface $from, array $data) use ($shell, $messageOutput) {
$value = $data['value'] ?? null;
if (trim($value) !== '') {
$shell->exec('xdotool type %s', escapeshellarg($value));
$messageOutput->writeln('Text wrote');
}
});
$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();