sms-worker/lib/UQMI.pm
2018-06-28 17:22:08 -07:00

95 lines
No EOL
1.6 KiB
Perl

package UQMI;
use v5.24;
use warnings;
use IO::Async::Function;
use JSON::MaybeXS;
use Capture::Tiny;
my $device = '/dev/cdc-wdm0';
my $function = IO::Async::Function->new(
code => \&_command,
max_workers => 5,
min_workers => 1,
idle_timeout => 5,
exit_on_die => 1,
);
sub init {$_[0]->add($function)}
sub set_device {$device = $_[0] // $device;}
sub _command {
my ($is_json, @args) = @_;
print "Running /sbin/uqmi -d $device ", join(' ', @args), "\n";
my ($stdout, $stderr) = capture {system('/sbin/uqmi', '-d', $device, @args)};
if ($stderr) {
die "Got error from uqmi: $stderr";
}
if ($is_json) {
my $data = decode_json $stdout;
return $data;
} else {
return $stdout;
}
}
sub _call {
return $function->call(args => \@_);
}
sub _sms_list {
my $fut = _call(qw/--list-messages/);
return $fut;
}
sub get_sms_count {
my $list = _sms_list->get();
return scalar $list->@*;
}
sub peek_sms {
my $message_list = _sms_list()->get();
if ($message_list->@*) {
my $mid = pop $message_list->@*;
return get_message($mid);
} else {
return undef;
}
}
sub get_message {
my $mid = shift;
my $fut = _call(1, qw/--get-message/, $mid);
return $fut;
}
sub pop_sms {
my $message_list = _sms_list()->get();
if ($message_list->@*) {
my $mid = pop $message_list->@*;
my $fut = get_message($mid);
$fut->on_done(sub {
return _call(1, qw/--delete-message/, $mid);
});
return $fut;
} else {
return undef;
}
}
sub send_sms {
my ($to, $contents) = @_;
my $fut = _call(0, qw/--send-message/, $contents, qw/--send-message-target/, $to);
return $fut;
}