Acme-Insult-Pirate

 view release on metacpan or  search on metacpan

META.json  view on Meta::CPAN

         "author",
         "builder"
      ]
   },
   "optional_features" : {
      "json" : {
         "description" : "-json support in pirate_insult.pl",
         "prereqs" : {
            "runtime" : {
               "requires" : {
                  "JSON::Tiny" : "0.58"
               }
            }
         }
      }
   },
   "prereqs" : {
      "configure" : {
         "requires" : {
            "Archive::Tar" : "0",
            "CPAN::Meta" : "0",

META.json  view on Meta::CPAN

         "web" : "https://github.com/sanko/Acme-Insult-Pirate/issues"
      },
      "homepage" : "https://github.com/sanko/Acme-Insult-Pirate",
      "repository" : {
         "type" : "git",
         "url" : "https://github.com/sanko/Acme-Insult-Pirate.git",
         "web" : "https://github.com/sanko/Acme-Insult-Pirate"
      }
   },
   "version" : "1.1",
   "x_serialization_backend" : "JSON::PP version 4.16",
   "x_static_install" : 1
}

META.yml  view on Meta::CPAN

  directory:
    - t
    - xt
    - eg
    - author
    - builder
optional_features:
  json:
    description: '-json support in pirate_insult.pl'
    requires:
      JSON::Tiny: '0.58'
provides:
  Acme::Insult::Pirate:
    file: lib/Acme/Insult/Pirate.pm
    version: '1.1'
requires:
  Getopt::Long: '0'
  HTTP::Tiny: '0.088'
  IO::Socket::SSL: '1.42'
  Mozilla::CA: '0'
  Net::SSLeay: '1.49'

cpanfile  view on Meta::CPAN

requires 'perl', '5.038000';
requires 'Getopt::Long';
requires 'HTTP::Tiny' => '0.088';
feature json => '-json support in pirate_insult.pl' => sub {
    requires 'JSON::Tiny' => '0.58';    # API returns insults as plain strings (for now)
};
requires 'IO::Socket::SSL' => '1.42';
requires 'Net::SSLeay'     => '1.49';
requires 'Mozilla::CA';
requires 'URI';
on 'test' => sub {
    requires 'Test2::V0' => 0.000159;
};
on 'configure' => sub {
    requires 'Archive::Tar';

lib/Acme/Insult/Pirate.pm  view on Meta::CPAN

package Acme::Insult::Pirate 1.1 {
    use v5.38;
    use HTTP::Tiny;

    #~ use JSON::Tiny qw[decode_json]; # Not needed here (yet)
    use URI;
    use parent 'Exporter';
    our %EXPORT_TAGS = ( all => [ our @EXPORT_OK = qw[insult] ] );
    #
    use overload '""' => sub ( $s, $u, $b ) { $s->{insult} // () };
    #
    sub _http (%params) {
        state $http
            //= HTTP::Tiny->new( default_headers => { Accept => 'application/json' }, agent => sprintf '%s/%.2f ', __PACKAGE__, our $VERSION );
        state $api //= URI->new('https://pirate.monkeyness.com/api/insult');

        #~ $api->query_form( %params );
        my $res = $http->get($api);    # {success} is true even when advice is not found but we'll at least know when we have valid JSON

        # This API only returns strings for now
        #~ $res->{success} ? decode_json( $res->{content} ) : ();
        $res->{success} ? { insult => $res->{content} } : ();
    }
    #
    sub insult (%args) { my $ref = _http(%args); $ref ? bless $ref, __PACKAGE__ : $ref }
}
1;
__END__

script/pirate_insult.pl  view on Meta::CPAN

use open qw[:std :encoding(UTF-8)];

# Test
#~ @ARGV = qw[];
#~ @ARGV = qw[-json];
#~ @ARGV = qw[-h];
#
my $raw = 0;

sub _echo ($insult) {
    $raw && eval 'require JSON::Tiny' ? JSON::Tiny::encode_json( {%$insult} ) : $insult;
}
GetOptions( \my %h, 'help' => sub { pod2usage( -exitval => 1 ) }, 'json!' => \$raw );
my $shade = Acme::Insult::Pirate::insult(%h);
exit !( $shade ? say _echo($shade) : !say( $raw ? 'null' : '' ) );
__END__

=head1 NAME

evil_insult - Generate evil insults on the terminal

=head1 SYNOPSIS

    evil_insult                                  # generate a random insult
    evil_insult -json                            # insult someone if you're a robot
    evil_insult -help                            # get help

=head1 OPTIONS

    -json               Echo raw JSON encoded data
    -help               Display this help message

=head1 DESCRIPTION

This script wraps Acme::Insult::Pirate.

=head1 LICENSE & LEGAL

Copyright (C) Sanko Robinson.



( run in 1.265 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )