AnyEvent-Plurk
view release on metacpan or search on metacpan
lib/AnyEvent/Plurk.pm view on Meta::CPAN
package AnyEvent::Plurk;
our $VERSION = "0.12";
use 5.008;
use common::sense 2.02;
use parent 0.223 "Object::Event";
use AnyEvent 5.202;
use AnyEvent::HTTP 1.44;
use JSON 2.15 qw(to_json from_json);
use URI;
use Carp "croak";
use POSIX qw(strftime);
# Sub
sub current_time_offset() {
my @t = gmtime;
return strftime('%Y-%m-%dT%H:%M:%S', @t);
}
sub plurk_api_uri {
my ($x, %form) = @_;
$x = "/$x" unless index($x, "/Users/") == 0;
my $u = URI->new("http://www.plurk.com");
$u->scheme("https") if index($x, "/Users/") == 0;
$u->path("/API$x");
$u->query_form(%form);
return $u
}
# Method
sub send_request {
my ($self, $path, $form, $cb) = @_;
$form->{api_key} = $self->{api_key};
my $v = AE::cv;
my ($data, $header);
$self->{__current_request} = http_request(
GET => plurk_api_uri($path, %$form),
cookie_jar => $self->{__cookie_jar},
$cb || sub {
($data, $header) = @_;
$data = from_json($data);
$v->send;
}
);
$v->recv if !$cb;
return wantarray ? ($data, $header) : $data;
}
sub new {
my $this = shift;
my $class = ref($this) || $this;
my $self = $class->SUPER::new(@_);
unless (defined $self->{api_key}) {
croak "no 'api_key' given to AnyEvent::Plurk\n";
}
unless (defined $self->{username}) {
croak "no 'username' given to AnyEvent::Plurk\n";
}
unless (defined $self->{password}) {
croak "no 'password' given to AnyEvent::Plurk\n";
}
$self->{__cookie_jar} = {};
return $self
}
sub login {
my $self = shift;
my $cb = shift;
$self->send_request(
"Users/login", {
username => $self->{username},
password => $self->{password}
}
)
}
sub _start_polling {
my $self = shift;
$self->{__polling_time_offset} ||= current_time_offset;
$self->send_request(
"Polling/getPlurks",
{
offset => $self->{__polling_time_offset}
},
sub {
my ($data, $header) = @_;
if ($header->{Status} == 400) {
# say $data;
}
else {
$data = from_json($data);
my $unread_plurks = $data->{plurks};
if (@$unread_plurks) {
my $users = $data->{plurk_users};
for my $pu (@$unread_plurks) {
$pu->{owner} = $users->{$pu->{owner_id}} if $users->{$pu->{owner_id}};
}
$self->event("unread_plurks" => $unread_plurks);
$self->{__polling_time_offset} = current_time_offset;
}
}
$self->{__polling_timer} = AE::timer 60, 0, sub {
undef $self->{__polling_timer};
( run in 2.696 seconds using v1.01-cache-2.11-cpan-e1769b4cff6 )