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 )