Bot-Cobalt
view release on metacpan or search on metacpan
lib/Bot/Cobalt/Plugin/Extras/CPAN.pm view on Meta::CPAN
package Bot::Cobalt::Plugin::Extras::CPAN;
$Bot::Cobalt::Plugin::Extras::CPAN::VERSION = '0.021003';
use strictures 2;
use Bot::Cobalt;
use Bot::Cobalt::Common;
use Bot::Cobalt::Serializer;
our $Serializer = Bot::Cobalt::Serializer->new('JSON');
use HTTP::Request;
use Module::CoreList;
use Try::Tiny;
our $HelpText
= 'try: dist, latest, tests, abstract, changes, belongs, license';
## FIXME cachedb?
sub new { bless [], shift }
sub Cobalt_register {
my ($self, $core) = splice @_, 0, 2;
register $self, SERVER => qw/
public_cmd_cpan
public_cmd_corelist
mcpan_plug_resp_recv
/;
logger->info("Loaded: !cpan");
PLUGIN_EAT_NONE
}
sub Cobalt_unregister {
my ($self, $core) = splice @_, 0, 2;
logger->info("Bye!");
PLUGIN_EAT_NONE
}
sub Bot_public_cmd_corelist {
my ($self, $core) = splice @_, 0, 2;
my $msg = ${ $_[0] };
my $dist = $msg->message_array->[0];
unless ($dist) {
broadcast( 'message',
$msg->context, $msg->channel,
"corelist needs a module name."
);
return PLUGIN_EAT_ALL
}
my $resp;
my $vers = $msg->message_array->[1];
if (my $first = Module::CoreList->first_release($dist, $vers)) {
$resp = $vers ?
"$dist ($vers) was released with $first"
: "$dist was released with $first"
} else {
$resp = "Module not found in core."
}
broadcast( 'message',
$msg->context, $msg->channel,
join(', ', $msg->src_nick, $resp)
);
lib/Bot/Cobalt/Plugin/Extras/CPAN.pm view on Meta::CPAN
Dist => $dist,
Link => "http://www.metacpan.org${url}",
};
CMD: {
if ($cmd eq 'latest' || $cmd eq 'release') {
$hints->{Type} = 'latest';
last CMD
}
if ($cmd eq 'dist') {
$hints->{Type} = 'dist';
last CMD
}
if ($cmd eq 'test' || $cmd eq 'tests') {
$hints->{Type} = 'tests';
last CMD
}
if ($cmd eq 'info' || $cmd eq 'abstract') {
$hints->{Type} = 'abstract';
last CMD
}
if ($cmd eq 'license') {
$hints->{Type} = 'license';
last CMD
}
if ($cmd eq 'belongs') {
$hints->{Type} = 'belongs';
$url = "/module/$dist";
last CMD
}
if ($cmd eq 'changes') {
$hints->{Type} = 'changes';
$url = "/module/$dist";
last CMD
}
broadcast( 'message', $msg->context, $msg->channel,
"Unknown query; $HelpText"
);
}
$self->_request($url, $hints) if defined $hints->{Type};
PLUGIN_EAT_ALL
}
sub _request {
my ($self, $url, $hints) = @_;
my $base_url = 'http://api.metacpan.org';
my $this_url = $base_url . $url;
logger->debug("metacpan request: $this_url");
my $request = HTTP::Request->new(GET => $this_url);
broadcast( 'www_request',
$request,
'mcpan_plug_resp_recv',
$hints
);
}
sub Bot_mcpan_plug_resp_recv {
my ($self, $core) = splice @_, 0, 2;
my $response = ${ $_[1] };
my $hints = ${ $_[2] };
my $dist = $hints->{Dist};
my $type = $hints->{Type};
my $link = $hints->{Link};
unless ($response->is_success) {
my $status = $response->code;
if ($status == 404) {
broadcast( 'message',
$hints->{Context}, $hints->{Channel},
"No such distribution: $dist"
);
} else {
broadcast( 'message',
$hints->{Context}, $hints->{Channel},
"Could not get release info for $dist ($status)"
);
}
return PLUGIN_EAT_ALL
}
my $json = $response->content;
unless ($json) {
broadcast('message',
$hints->{Context}, $hints->{Channel},
"Unknown failure -- no data received for $dist",
);
return PLUGIN_EAT_ALL
}
my $d_hash =
try { $Serializer->thaw($json) }
catch {
broadcast( 'message',
$hints->{Context}, $hints->{Channel},
"thaw failure; err: $_",
);
undef
} or return PLUGIN_EAT_ALL;
unless ($d_hash && ref $d_hash eq 'HASH') {
broadcast( 'message',
$hints->{Context}, $hints->{Channel},
"thaw failure for $dist; expected a HASH but got '$d_hash'"
);
return PLUGIN_EAT_ALL
}
( run in 0.921 second using v1.01-cache-2.11-cpan-d7f47b0818f )