105 lines
1.9 KiB
Perl
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;
|