AnyEvent-Superfeedr

 view release on metacpan or  search on metacpan

lib/AnyEvent/Superfeedr.pm  view on Meta::CPAN

package AnyEvent::Superfeedr;

use strict;
use warnings;
use 5.008_001;

our $VERSION = '0.04';
use Carp;

use AnyEvent;
use AnyEvent::Superfeedr::Notification;
use AnyEvent::XMPP::Client;
use AnyEvent::XMPP::Ext::Superfeedr;
use AnyEvent::XMPP::Ext::Pubsub;
use XML::Atom::Entry;
use Scalar::Util();
use URI::Escape();

our $SERVICE = 'firehoser.superfeedr.com';

use constant SUBSCRIBE_CHUNK_SIZE => 30;

# TODO:
# debug
# tests? worthwhile?
#
# Also, maybe more direct callbacks for sub/unsub

sub new {
    my $class = shift;
    my %param = @_;

    my %filtered;
    for ( qw{ jid password debug
              on_notification on_connect on_disconnect on_error }) {
        $filtered{$_} = delete $param{$_};
    }
    croak "Unknown option(s): " . join ", ", keys %param if keys %param;

    my $superfeedr = bless {
        debug    => $filtered{debug} || 0,
        jid      => $filtered{jid},
        password => $filtered{password},
    }, ref $class || $class;

    ## can be passed to connect() too
    $superfeedr->{on_connect} = $filtered{on_connect}
        if $filtered{on_connect};

    my $on_error = $filtered{on_error} || sub {
        my ($cl, $acc, $err) = @_;
        if (Scalar::Util::blessed($err)) {
            if ($err->isa('AnyEvent::XMPP::Error')) {
                $err = $err->string;
            }
        }
        warn "Error: " . $err;
    };

    my $cl   = AnyEvent::XMPP::Client->new(
        debug => $superfeedr->{debug},
    );
    my $pass = $superfeedr->{password};
    my $jid  = $superfeedr->{jid}
        or croak "You need to specify your jid";

    $cl->add_account($jid, $pass, undef, undef, {
        dont_retrieve_roster => 1,
    });
    $cl->add_extension(my $ps = AnyEvent::XMPP::Ext::Superfeedr->new);
    $superfeedr->{xmpp_pubsub} = $ps;

    $cl->reg_cb(
        error => $on_error,
        connected => sub {
            $superfeedr->{connected} = 1;
            $superfeedr->{on_connect}->($superfeedr)
                if $superfeedr->{on_connect};
        },
        disconnect => sub {
            $superfeedr->{connected} = 0;
            (   $filtered{on_disconnect}
             || sub { warn "Got disconnected from $_[2]:$_[3], $_[4]" }
            )->($superfeedr, @_);
        },
        connect_error => sub {
            my ($cl, $account, $reason) = @_;



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