president/teletype.pl

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