88 lines
No EOL
1.5 KiB
Perl
88 lines
No EOL
1.5 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) = @_;
|
|
|
|
my ($stdout, $stderr) = capture {system('/usr/bin/uqmi', '-d', $device)};
|
|
|
|
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->@*;
|
|
my $fut = _call(qw/--get_message/, $mid);
|
|
return $fut;
|
|
} else {
|
|
return undef;
|
|
}
|
|
}
|
|
|
|
sub pop_sms {
|
|
my $message_list = _sms_list()->get();
|
|
|
|
if ($message_list->@*) {
|
|
my $mid = pop $message_list->@*;
|
|
my $fut = _call(qw/--get_message/, $mid);
|
|
$fut->on_done(sub {
|
|
return _call(qw/--delete-message/, $mid);
|
|
});
|
|
return $fut;
|
|
} else {
|
|
return undef;
|
|
}
|
|
}
|
|
|
|
sub send_sms {
|
|
my ($to, $contents) = @_;
|
|
|
|
my $fut = _call(qw/--send_message/, $contents, qw/--send_message-target/, $to);
|
|
return $fut;
|
|
} |