3 # Copyright (c) 2020-2023 Mischa Peters <mischa @ openbsd.amsterdam>
5 # Permission to use, copy, modify, and distribute this software for any
6 # purpose with or without fee is hereby granted, provided that the above
7 # copyright notice and this permission notice appear in all copies.
9 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
27 "message=s" => \(my $MESSAGE),
28 "title=s" => \(my $TITLE = "Notification"),
29 "priority=i" => \(my $PRIORITY = 0),
30 "url=s" => \(my $URL),
31 "application=s" => \(my $APPLICATION = '_'),
32 "config=s" => \(my $CONFIG),
35 my $USAGE = <<"END_USAGE";
36 Usage: $0 -m message [-t title] [-p priority] [-u url] [-a application] [-c config]
39 -t | --title text | (default: Notification)
40 -p | --priority [0|1] (default: 0)
41 -u | --url text (no default)
42 -a | --application text (default: root property of config)
43 -c | --config text (no default)
46 $MESSAGE || die($USAGE);
47 my @config_files = $CONFIG || grep { -e } ('./_pushover.conf', './.pushover.conf', './pushover.conf', "$ENV{'HOME'}/_pushover.conf", "$ENV{'HOME'}/.pushover.conf", "$ENV{'HOME'}/pushover.conf");
48 my $config = Config::Tiny->read($config_files[-1], 'utf8');
49 my $TOKEN = $config->{$APPLICATION}->{token} || die("$USAGE\nError: TOKEN not found.\n");
50 my $USER = $config->{$APPLICATION}->{user} || die("$USAGE\nError: USER not found.\n");
52 my $http = HTTP::Tiny->new;
53 my %HEADERS = ("Content-Type" => "application/json");
54 my $uri = "https://api.pushover.net/1/messages.json";
55 my $request = HTTP::Tiny->new('default_headers' => \%HEADERS);
56 my $json = {token => "$TOKEN", user => "$USER", title => "$TITLE", message => "$MESSAGE", priority => "$PRIORITY"};
57 $json->{'url'} = $URL if $URL;
58 my $body = JSON::PP->new->encode($json);
59 my $response = $request->post($uri, {'content' => $body});
60 print "Pushover: $response->{'status'} $response->{'reason'}\n";