191 lines
5.3 KiB
Perl
Executable File
191 lines
5.3 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use strict;
|
|
use warnings;
|
|
package teletype;
|
|
use Mojolicious::Lite -signatures;
|
|
use File::Slurp;
|
|
use Mojo::JSON qw(decode_json encode_json);
|
|
use SQL::Abstract;
|
|
use Mojo::SQLite;
|
|
use Data::Dumper;
|
|
use URI::Encode qw(uri_encode uri_decode);
|
|
use Mojo::Util qw(secure_compare);
|
|
use Time::Local;
|
|
plugin 'RenderFile';
|
|
require './subroutines.pl';
|
|
require './gb.pl';
|
|
require './watch.pl';
|
|
require './Websocket.pl';
|
|
|
|
my $config_file = read_file('./config.json');
|
|
my $config = decode_json $config_file;
|
|
my $device = &subs::device_setter();
|
|
our $logfile = &subs::home($config->{'logfile'});
|
|
`touch $logfile` if not -e $logfile;
|
|
our $log = Mojo::Log->new(path => $logfile);
|
|
my $device = &subs::device_setter();
|
|
|
|
|
|
sub auth_check($c) {
|
|
my $lock = &subs::setting_grabber({ app => 'teletype', setting => 'tauthorization' });
|
|
my $patience = &subs::setting_grabber({ app => 'teletype', setting => 'patience' });
|
|
my $authorship = `echo $lock | base64 --decode`;
|
|
my $auth = &subs::note_decrypter($patience,$authorship);
|
|
chomp $auth;
|
|
my @t = localtime(time);
|
|
my $offset = timegm(@t) - timelocal(@t);
|
|
my $server_time = time();
|
|
if ($c->param('first_check') eq 'true') {
|
|
my $tauthorization = $c->param('tauthorization');
|
|
chomp $tauthorization;
|
|
my $tty_port = $ENV{PORT_BESTOW};
|
|
if ($tauthorization && secure_compare $auth, $tauthorization) {
|
|
my $info = {
|
|
tty_port => $tty_port,
|
|
tauthorization => $lock,
|
|
result => "approved",
|
|
server_time => $server_time,
|
|
offset => $offset,
|
|
returner => "You're so in!"
|
|
};
|
|
|
|
return $info;
|
|
}
|
|
else {
|
|
return { result => "denial" };
|
|
}
|
|
}
|
|
else {
|
|
my $saved_auth = $c->param('tauthorization');
|
|
my $authors = `echo $saved_auth | base64 --decode`;
|
|
my $au = &subs::note_decrypter($patience, $authors);
|
|
chomp $au;
|
|
if ($au eq $auth) {
|
|
my $sa = `echo $saved_auth | base64 --decode`;
|
|
my $result = "You said " . $c->param('life');
|
|
|
|
return { result => "approved" , returner => $result, tauthorization => $saved_auth, server_time => $server_time, offset => $offset};
|
|
}
|
|
}
|
|
};
|
|
|
|
get '/teletype/information' => sub($c) {
|
|
my $auth_check = &auth_check($c);
|
|
if ( $auth_check->{'result'} eq 'approved') {
|
|
my ($db,$database) = &subs::database_grabber();
|
|
|
|
my $server_time = &subs::rightNow();
|
|
my $timestamp = $c->param('timestamp') * 1000;
|
|
my $life = &subs::unformat_name($c->param('life'));
|
|
my ($app,$type) = &subs::typesetter($life);
|
|
&subs::setting_setter({ app => $app, setting => 'pos', value => $type });
|
|
my $init = &subs::setting_initializer($app,$timestamp);
|
|
|
|
my $insert = &subs::db_insert('appointments', {
|
|
app => $app,
|
|
server_time => $server_time,
|
|
timestamp => $timestamp,
|
|
type => 'text',
|
|
# toggle => $b->{'toggle'}
|
|
uuid => &subs::random_string_creator(40)
|
|
});
|
|
$c->render(json => $auth_check);
|
|
my $msg = { app => $app, console => 'appointmentGrabber("' . $app . '",' . $timestamp . ')' };
|
|
&Websocket::send('server', $msg);
|
|
}
|
|
};
|
|
|
|
websocket '/teletype/ws' => sub($c) {
|
|
my $auth_check = &auth_check($c);
|
|
if ($auth_check->{'result'} eq 'approved') {
|
|
$c->on(message => sub ($ws, $msg) {
|
|
my $server_time = &subs::rightNow();
|
|
if ($msg eq 'hey') {
|
|
$c->send('Hey yourself!');
|
|
}
|
|
else { #if ( &subs::setting_grabber({ app => 'teletype', setting => 'enabled' }) eq 1) {
|
|
my ($db,$database) = &subs::database_grabber();
|
|
my $m = eval { return decode_json $msg } || {};
|
|
my $screen_size = `xprop -notype -len 16 -root _NET_DESKTOP_GEOMETRY | cut -c 25-`;
|
|
chomp $screen_size;
|
|
my @resolution = split ", ", $screen_size;
|
|
my $resolution = ($resolution[0], $resolution[1]);
|
|
my $display = ":0.0";
|
|
if ($m->{'command'} eq 'mouse') {
|
|
if ($m->{'movement'} eq "button") {
|
|
if ($m->{'value'} == 0) {
|
|
|
|
`xdotool mousedown 1` if $device eq 'computer';
|
|
}
|
|
elsif ($m->{'value'} == 1) {
|
|
`xdotool mouseup 1` if $device eq 'computer';
|
|
}
|
|
}
|
|
if ($device eq 'mobile') {
|
|
&Websocket::send('tab', $msg);
|
|
|
|
}
|
|
}
|
|
elsif ($m->{'command'} eq 'keypress') {
|
|
my $key = $m->{'key'};
|
|
my @keyboard = grep { $_->{'num'} eq $key } @{$gb::inputs};
|
|
|
|
if ($keyboard[0]->{'trigger'} eq 'key') {
|
|
my $master = $keyboard[0]->{'img'};
|
|
`xdotool key "$master"`;
|
|
}
|
|
else {
|
|
my $master = $keyboard[0]->{'c'};
|
|
`xdotool type "$master"`;
|
|
}
|
|
}
|
|
elsif ($m->{'command'} eq 'touch') {
|
|
|
|
my $resolution_x = $m->{'res_x'};
|
|
my $resolution_y = $m->{'res_y'};
|
|
my ($screen_x,$screen_y) = @resolution;
|
|
my $x = $m->{'y'};
|
|
my $y = $resolution_y - $m->{'x'};
|
|
|
|
$x = ($screen_x / $resolution_x) * $x;
|
|
$y = ($screen_y / $resolution_y) * $y;
|
|
if ($device eq 'mobile') {
|
|
my $ms = {
|
|
'x' => $m->{'x'},
|
|
'y' => $m->{'y'},
|
|
'res_x' => $resolution_x,
|
|
'res_y' => $resolution_y,
|
|
'command' => 'touch'
|
|
};
|
|
&Websocket::send('tab', $ms);
|
|
|
|
}
|
|
elsif ($device eq 'computer') {
|
|
if ($m->{'mmr'} eq "off") {
|
|
`xdotool mousemove $x $y`;
|
|
}
|
|
else {
|
|
if ($m->{'last_y'} && $m->{'last_x'} && $m->{'touching'} == 1) {
|
|
my $new_x = ($m->{'y'} - $m->{'last_y'} ) * 3;
|
|
my $new_y = ($m->{'last_x'} - $m->{'x'} ) * 3;
|
|
`xdotool mousemove_relative -- $new_x $new_y`;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
if (!$ENV{PURPOSE} || $ENV{PURPOSE} eq "teletype") {
|
|
app->start;
|
|
}
|
|
else {
|
|
1;
|
|
} |