AnyEvent-XMPP
view release on metacpan or search on metacpan
lib/AnyEvent/XMPP/Ext/MUC/Room.pm view on Meta::CPAN
}
} else {
$msg->from_node ($node);
my $is_echo = cmp_jid ($msg->from, $self->nick_jid)
&& $msg->type eq 'groupchat';
if (not (defined $msg->any_body)
&& defined $msg->any_subject) { # subject change
$self->event (subject_change => $msg, $is_echo);
return;
}
$self->event (message => $msg, $is_echo);
}
}
sub handle_presence {
my ($self, $node) = @_;
my $s = $self->{status};
my $from = $node->attr ('from');
my $type = $node->attr ('type');
my $error;
if ($type eq 'error') {
$error = AnyEvent::XMPP::Error::Presence->new (node => $node);
}
my $stati = {};
my $new_nick;
if (my ($x) = $node->find_all ([qw/muc_user x/])) {
for ($x->find_all ([qw/muc_user status/])) {
$stati->{$_->attr ('code')}++;
}
if (my ($i) = $x->find_all ([qw/muc_user item/])) {
$new_nick = $i->attr ('nick');
}
}
my $nick_change = $stati->{'303'};
if ($s == JOIN_SENT) {
if ($error) {
my $muce = AnyEvent::XMPP::Error::MUC->new (
presence_error => $error,
type => 'presence_error'
);
$self->event (join_error => $muce);
} else {
if (cmp_jid ($from, $self->nick_jid)) {
my $user = $self->add_user_xml ($node);
$self->{status} = JOINED;
$self->{me} = $user;
if ($user->did_create_room) {
if ($self->{locked_cb}) {
(delete $self->{locked_cb})->($self);
} else {
$self->event ('locked');
}
} else {
$self->event (enter => $user);
}
} else {
$self->add_user_xml ($node);
}
}
} elsif ($s == JOINED) { # nick changes?
if ($error) {
my $muce = AnyEvent::XMPP::Error::MUC->new (
presence_error => $error,
type => 'presence_error'
);
$self->event (error => $muce);
} elsif (!$nick_change && $type eq 'unavailable') {
if (cmp_jid ($from, $self->nick_jid)) {
$self->event ('leave', $self->get_me);
$self->we_left_room ();
} else {
my $nick = prep_res_jid ($from);
my $user = delete $self->{users}->{$nick};
if ($user) {
$user->update ($node);
$self->event (part => $user);
} else {
warn "User with '$nick' not found in room $self->{jid}!\n";
}
}
} elsif ($nick_change && $type eq 'unavailable') {
my $nick = prep_res_jid ($from);
my $nnick = resourceprep ($new_nick);
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 {
( run in 1.481 second using v1.01-cache-2.11-cpan-5837b0d9d2c )