AnyEvent-XMPP
view release on metacpan or search on metacpan
lib/AnyEvent/XMPP/Client.pm view on Meta::CPAN
=head2 disconnect ($msg)
Disconnect all accounts.
=cut
sub disconnect {
my ($self, $msg) = @_;
for my $acc (values %{$self->{accounts}}) {
if ($acc->is_connected) { $acc->connection ()->disconnect ($msg) }
}
}
=head2 remove_accounts ($reason)
Removes all accounts and disconnects. C<$reason> should be some descriptive
reason why this account was removed (just for logging purposes).
=cut
sub remove_accounts {
my ($self, $reason) = @_;
for my $acc (keys %{$self->{accounts}}) {
$self->remove_account ($acc, $reason);
}
}
=head2 remove_account ($acc, $reason)
Removes and disconnects account C<$acc> (which is a L<AnyEvent::XMPP::IM::Account> object).
The reason for the removal can be given via C<$reason>.
=cut
sub remove_account {
my ($self, $acc, $reason) = @_;
my $acca = $self->{accounts}->{$acc};
$self->event (removed_account => $acca);
if ($acca->is_connected) { $acca->connection ()->disconnect ($reason) }
delete $self->{accounts}->{$acc};
}
=head2 set_accounts (%$accounts)
Sets the set of (to be connected) accounts. C<$accounts> must be a hash
reference which contains the JIDs of the accounts as keys and the values for
C<$password>, C<$domain>, C<$port> and C<$connection_args> as described in
C<add_account> above.
If the account is not yet connected it will be connected on the next call to
C<update_connections> and if an account is connected that is not in
C<$accounts> it will be disconnected.
=cut
sub set_accounts {
my ($self, $accounts) = @_;
for my $accid (keys %{$self->{accounts}}) {
my $acca = $self->{accounts}->{$accid};
if (!grep { cmp_bare_jid ($acca->jid, $_) } keys %$accounts) {
$self->remove_account ($accid, "removed from set");
}
}
for my $acc_jid (keys %$accounts) {
$self->add_account ($acc_jid, @{$accounts->{$acc_jid}});
}
}
=head2 send_message ($msg, $dest_jid, $src, $type)
Sends a message to the destination C<$dest_jid>.
C<$msg> can either be a string or a L<AnyEvent::XMPP::IM::Message> object.
If C<$msg> is such an object C<$dest_jid> is optional, but will, when
passed, override the destination of the message.
NOTE: C<$dest_jid> is transformed into a bare JID and the routing
is done by the conversation tracking mechanism which keeps track of
which resource should get the message.
C<$src> is optional. It specifies which account to use
to send the message. If it is not passed L<AnyEvent::XMPP::Client> will try
to find an account itself. First it will look through all rosters
to find C<$dest_jid> and if none found it will pick any of the accounts that
are connected.
C<$src> can either be a JID or a L<AnyEvent::XMPP::IM::Account> object as returned
by C<add_account> and C<get_account>.
C<$type> is optional but overrides the type of the message object in C<$msg>
if C<$msg> is such an object.
C<$type> should be 'chat' for normal chatter. If no C<$type> is specified
the type of the message defaults to the value documented in L<AnyEvent::XMPP::IM::Message>
(should be 'normal').
=cut
sub send_message {
my ($self, $msg, $dest_jid, $src, $type) = @_;
unless (ref $msg) {
$msg = AnyEvent::XMPP::IM::Message->new (body => $msg);
}
if (defined $dest_jid) {
my $jid = stringprep_jid $dest_jid
or die "send_message: \$dest_jid is not a proper JID";
$msg->to ($jid);
}
$msg->type ($type) if defined $type;
my $srcacc;
if (ref $src) {
$srcacc = $src;
} elsif (defined $src) {
$srcacc = $self->get_account ($src)
} else {
$srcacc = $self->find_account_for_dest_jid ($dest_jid);
}
( run in 0.533 second using v1.01-cache-2.11-cpan-39bf76dae61 )