sms-worker/lib/UQMI.pm

105 lines
1.9 KiB
Perl

package UQMI;
use v5.24;
use warnings;
use IO::Async::Function;
use JSON::MaybeXS;
use Capture::Tiny qw/capture/;
use Future;
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) {
warn "Got error from uqmi: $stderr";
}
if ($is_json) {
my $data = decode_json $stdout;
return $data;
} else {
return $stdout;
}
}
sub _call_json {
my $fut = $function->call(args => [1, @_]);
return $fut;
}
sub _call_plain {
my $fut = $function->call(args => [0, @_]);
return $fut;
}
sub _sms_list {
my $fut = _call_json(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 Future->done();
}
}
sub get_message {
my $mid = shift;
my $fut = _call_json(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);
return $fut->then(sub {
my $data = shift;
say "Got message data ".$data;
_call_plain(qw/--delete-message/, $mid)->get();
return Future->done($data);
});
} else {
return Future->done();
}
}
sub send_sms {
my ($to, $contents) = @_;
return _call_plain(qw/--send-message/, $contents, qw/--send-message-target/, $to)->on_ready(sub {say "Message sent"});
}
1;