pushover.pl/pushover.pl

61 lines
2.4 KiB
Perl
Executable File

#!/usr/bin/env perl
#
# Copyright (c) 2020-2023 Mischa Peters <mischa @ openbsd.amsterdam>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
use 5.024;
use strict;
use warnings;
use autodie;
use Config::Tiny;
use Getopt::Long;
use HTTP::Tiny;
use JSON::PP;
GetOptions(
"message=s" => \(my $MESSAGE),
"title=s" => \(my $TITLE = "Notification"),
"priority=i" => \(my $PRIORITY = 0),
"url=s" => \(my $URL),
"application=s" => \(my $APPLICATION = '_'),
"config=s" => \(my $CONFIG),
);
my $USAGE = <<"END_USAGE";
Usage: $0 -m message [-t title] [-p priority] [-u url] [-a application] [-c config]
Options:
-m | --message text
-t | --title text | (default: Notification)
-p | --priority [0|1] (default: 0)
-u | --url text (no default)
-a | --application text (default: root property of config)
-c | --config text (no default)
END_USAGE
$MESSAGE || die($USAGE);
my @config_files = $CONFIG || grep { -e } ('./_pushover.conf', './.pushover.conf', './pushover.conf', "$ENV{'HOME'}/_pushover.conf", "$ENV{'HOME'}/.pushover.conf", "$ENV{'HOME'}/pushover.conf");
my $config = Config::Tiny->read($config_files[-1], 'utf8');
my $TOKEN = $config->{$APPLICATION}->{token} || die("$USAGE\nError: TOKEN not found.\n");
my $USER = $config->{$APPLICATION}->{user} || die("$USAGE\nError: USER not found.\n");
my $http = HTTP::Tiny->new;
my %HEADERS = ("Content-Type" => "application/json");
my $uri = "https://api.pushover.net/1/messages.json";
my $request = HTTP::Tiny->new('default_headers' => \%HEADERS);
my $json = {token => "$TOKEN", user => "$USER", title => "$TITLE", message => "$MESSAGE", priority => "$PRIORITY"};
$json->{'url'} = $URL if $URL;
my $body = JSON::PP->new->encode($json);
my $response = $request->post($uri, {'content' => $body});
print "Pushover: $response->{'status'} $response->{'reason'}\n";