AnyEvent-XMPP
view release on metacpan or search on metacpan
lib/AnyEvent/XMPP/IM/Connection.pm view on Meta::CPAN
use AnyEvent::XMPP::Connection;
my $con = AnyEvent::XMPP::Connection->new;
=head1 DESCRIPTION
This module represents a XMPP instant messaging connection and implements
RFC 3921.
This module is a subclass of C<AnyEvent::XMPP::Connection> and inherits all methods.
For example C<reg_cb> and the stanza sending routines.
For additional events that can be registered to look below in the EVENTS section.
=head1 METHODS
=over 4
=item B<new (%args)>
This is the constructor. It takes the same arguments as
the constructor of L<AnyEvent::XMPP::Connection> along with a
few others:
=over 4
=item dont_retrieve_roster => $bool
Set this to a true value if no roster should be requested on connection
establishment. You can retrieve the roster later if you want to
with the C<retrieve_roster> method.
The internal roster will be set even if this option is active, and
even presences will be stored in there, except that the C<get_contacts>
method on the roster object won't return anything as there are
no roster items.
=item initial_presence => $priority
This sets whether the initial presence should be sent. C<$priority>
should be the priority of the initial presence. The default value
for the initial presence C<$priority> is 10.
If you pass a undefined value as C<$priority> no initial presence will
be sent!
=back
=cut
sub new {
my $this = shift;
my $class = ref($this) || $this;
my %args = @_;
unless (exists $args{initial_presence}) {
$args{initial_presence} = 10;
}
my $self = $class->SUPER::new (%args);
$self->{roster} = AnyEvent::XMPP::IM::Roster->new (connection => $self);
$self->reg_cb (message_xml =>
sub { shift @_; $self->handle_message (@_); });
$self->reg_cb (presence_xml =>
sub { shift @_; $self->handle_presence (@_); });
$self->reg_cb (iq_set_request_xml =>
sub { shift @_; $self->handle_iq_set (@_); });
$self->reg_cb (disconnect =>
sub { shift @_; $self->handle_disconnect (@_); });
$self->reg_cb (stream_ready => sub {
my ($jid) = @_;
if ($self->features ()->find_all ([qw/session session/])) {
$self->send_session_iq;
} else {
$self->init_connection;
}
});
my $proxy_cb = sub {
my ($self, $er) = @_;
$self->event (error => $er);
};
$self->reg_cb (
session_error => $proxy_cb,
roster_error => $proxy_cb,
presence_error => $proxy_cb,
message_error => $proxy_cb,
);
$self
}
sub send_session_iq {
my ($self) = @_;
$self->send_iq (set => sub {
my ($w) = @_;
$w->addPrefix (xmpp_ns ('session'), '');
$w->emptyTag ([xmpp_ns ('session'), 'session']);
}, sub {
my ($node, $error) = @_;
if ($node) {
$self->init_connection;
} else {
$self->event (session_error => $error);
}
});
}
sub init_connection {
my ($self) = @_;
if ($self->{dont_retrieve_roster}) {
$self->initial_presence;
$self->{session_active} = 1;
$self->event ('session_ready');
( run in 0.661 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )