AnyEvent-XMPP
view release on metacpan or search on metacpan
lib/AnyEvent/XMPP/Ext/MUC/Room.pm view on Meta::CPAN
my $user = $self->{users}->{$nnick} = delete $self->{users}->{$nick};
if ($user) {
$user->update ($node);
$self->event (nick_change_leave => $user, $nick, $new_nick);
} else {
warn "User with '$nick' not found in room $self->{jid} for nickchange!\n";
}
} else {
my $nick = prep_res_jid $from;
my $pre = $self->{users}->{$nick};
my $in_nick_change = $pre ? $pre->is_in_nick_change : undef;
my $user = $self->add_user_xml ($node);
if ($pre) {
if ($in_nick_change) {
$self->event (nick_change => $user, $user->{old_nick}, $user->nick);
} else {
$self->event (presence => $user);
}
} else {
$self->event (join => $user);
}
}
}
}
sub we_left_room {
my ($self) = @_;
$self->{users} = {};
$self->{status} = LEFT;
delete $self->{me};
}
=item B<get_user ($nick)>
This method returns the user with the C<$nick> in the room.
=cut
sub get_user {
my ($self, $nick) = @_;
$self->{users}->{$nick}
}
=item B<get_me>
This method returns the L<AnyEvent::XMPP::Ext::MUC::User> object of yourself
in the room. If will return undef if we are not in the room anymore.
=cut
sub get_me {
my ($self) = @_;
$self->{me}
}
=item B<get_user_jid ($jid)>
This method looks whether a user with the JID C<$jid> exists
in the room. That means whether the node and domain part of the
JID match the rooms node and domain part, and the resource part of the
JID matches a joined nick.
=cut
sub get_user_jid {
my ($self, $jid) = @_;
my ($room, $srv, $nick) = split_jid ($jid);
return unless prep_join_jid ($room, $srv) eq prep_bare_jid $self->jid;
$self->{users}->{$nick}
}
=item B<get_users>
This method returns the list of occupants as L<AnyEvent::XMPP::Ext::MUC::User> objects.
=cut
sub get_users {
my ($self) = @_;
values %{$self->{users}};
}
sub add_user_xml {
my ($self, $node) = @_;
my $from = $node->attr ('from');
my $nick = prep_res_jid ($from);
my $user = $self->{users}->{$nick};
unless ($user) {
$user = $self->{users}->{$nick} =
AnyEvent::XMPP::Ext::MUC::User->new (room => $self);
}
$user->update ($node);
$user
}
sub _join_jid_nick {
my ($jid, $nick) = @_;
my ($node, $host) = split_jid $jid;
join_jid ($node, $host, $nick);
}
sub check_online {
my ($self) = @_;
unless ($self->is_connected) {
warn "room $self not connected anymore!";
return 0;
}
1
}
sub send_join {
my ($self, $nick, $password, $history) = @_;
$self->check_online or return;
$self->{nick_jid} = _join_jid_nick ($self->{jid}, $nick);
( run in 2.560 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )