#!/usr/bin/perl
use
lib
"$FindBin::Bin/../lib/"
;
my
$FILE_CONFIG
=
"$FindBin::Bin/../conf/pushbullet.json"
;
my
%opt
= ();
sub
DEBUG
{
my
$line
=
shift
;
printf
"[DEBUG] %s\n"
,
$line
if
(
$opt
{debug});
return
(
$line
);
}
sub
Read_Config_File
{
my
$file_config
=
shift
;
$file_config
||=
$FILE_CONFIG
;
if
(-r
$file_config
)
{
DEBUG(
"Read_Config_File('$file_config')"
);
my
$json
= read_file(
$file_config
);
return
(JSON->new->decode(
$json
));
}
return
(
undef
);
}
my
$status
= GetOptions(
\
%opt
,
'address|a=s'
,
'body|b=s'
,
'config|c=s'
,
'device|d=s@'
,
'file|f=s'
,
'item|i=s@'
,
'apikey|k=s'
,
'mobile|m=s'
,
'name|n=s'
,
'sms|s=s'
,
'title|t=s'
,
'url|u=s'
,
'proxy|x=s'
,
'debug|D'
,
'help|h'
,
'version|v'
,
);
pod2usage(0)
if
((!
$status
) || (
$opt
{help}));
if
(
$opt
{version})
{
printf
"WWW::PushBullet %s\n"
, WWW::PushBullet::version();
exit
0;
}
$opt
{action} =
$ARGV
[0];
my
$qr_action_list
=
qr/^(?:address|contacts|devices|file|link|list|note|sms)$/
;
pod2usage(0)
if
((!
defined
$opt
{action}) || (
$opt
{action} !~
$qr_action_list
));
my
$conf
= Read_Config_File(
$opt
{config});
my
$apikey
=
$opt
{apikey} ||
$conf
->{apikey};
my
$address
=
$opt
{address} ||
$conf
->{default_address};
my
$body
=
$opt
{body} ||
$conf
->{default_body};
my
@devices
= (
defined
$opt
{device} &&
scalar
@{
$opt
{device}}
? @{
$opt
{device}}
: (
defined
$conf
->{default_device_iden} ? @{
$conf
->{default_device_iden}} : ())
);
my
$file
=
$opt
{file} ||
$conf
->{default_file};
my
$items
= (
defined
$opt
{item} &&
scalar
@{
$opt
{item}}
?
$opt
{item}
:
$conf
->{default_items}
);
my
$name
=
$opt
{name} ||
$conf
->{default_name};
my
$title
=
$opt
{title} ||
$conf
->{default_title};
my
$proxy
=
$opt
{proxy} ||
$conf
->{proxy};
my
$url
=
$opt
{url} ||
$conf
->{default_url};
my
$mobile
=
$opt
{mobile} ||
$conf
->{default_sms_mobile};
my
$sms
=
$opt
{sms};
my
$pb
= WWW::PushBullet->new({
apikey
=>
$apikey
,
proxy
=>
$proxy
,
debug
=>
$opt
{debug}});
if
((!
scalar
@devices
) && (
$opt
{action} ne
'devices'
))
{
DEBUG(
'No device specified, get all devices from apikey account'
);
my
$devs
=
$pb
->devices();
foreach
my
$d
(@{
$devs
})
{
push
@devices
,
$d
->{iden};
}
}
if
(
$opt
{action} eq
'address'
)
{
if
((
defined
$name
) && (
defined
$address
))
{
foreach
my
$device
(
@devices
)
{
$pb
->push_address(
{
device_iden
=>
$device
,
name
=>
$name
,
address
=>
$address
}
);
}
}
else
{
printf
"pushbullet address --name name --address 'complete address'\n"
;
}
}
elsif
(
$opt
{action} eq
'contacts'
)
{
my
$contacts
=
$pb
->contacts();
foreach
my
$c
(@{
$contacts
})
{
printf
"Contact '%s' (%s) => %s\n"
,
$c
->{name},
$c
->{iden},
$c
->{email};
}
}
elsif
(
$opt
{action} eq
'devices'
)
{
my
$devices
=
$pb
->devices();
foreach
my
$d
(@{
$devices
})
{
if
(
$d
->{active})
{
printf
"Device '%s' (%s) => id %s\n"
,
$d
->{nickname},
$d
->{model},
$d
->{iden};
}
}
}
elsif
(
$opt
{action} eq
'file'
)
{
if
((
defined
$file
) && (-r
$file
))
{
foreach
my
$device
(
@devices
)
{
$pb
->push_file({
device_iden
=>
$device
,
file_name
=>
$file
,
body
=>
$body
});
}
}
else
{
printf
"pushbullet file --file filename --body 'file description'\n"
;
}
}
elsif
(
$opt
{action} eq
'link'
)
{
if
((
defined
$title
) && (
defined
$url
) && (
$url
=~ /^https?:/))
{
foreach
my
$device
(
@devices
)
{
$pb
->push_link(
{
device_iden
=>
$device
,
title
=>
$title
,
url
=>
$url
}
);
}
}
else
{
}
}
elsif
(
$opt
{action} eq
'list'
)
{
if
((
defined
$title
) && (
scalar
@{
$items
}))
{
foreach
my
$device
(
@devices
)
{
$pb
->push_list(
{
device_iden
=>
$device
,
title
=>
$title
,
items
=>
$items
}
);
}
}
else
{
printf
"pushbullet list --title title --item item1 --item item2 --item item3\n"
;
}
}
elsif
(
$opt
{action} eq
'note'
)
{
if
((
defined
$title
) && (
defined
$body
))
{
foreach
my
$device
(
@devices
)
{
$pb
->push_note(
{
device_iden
=>
$device
,
title
=>
$title
,
body
=>
$body
}
);
}
}
else
{
printf
"pushbullet note --title title --body 'body message'\n"
;
}
}
elsif
(
$opt
{action} eq
'sms'
)
{
if
((
defined
$mobile
) && (
defined
$sms
))
{
$pb
->push_sms(
{
conversation_iden
=>
$mobile
,
message
=>
$sms
,
target_device_iden
=> (
$devices
[0] ||
$conf
->{default_sms_device})
}
);
}
else
{
printf
"pushbullet sms --phone 'dest mobile number' --sms 'your sms'\n"
;
}
}
$pb
->print_limits();