AnyEvent-XMPP
view release on metacpan or search on metacpan
lib/AnyEvent/XMPP/Ext/MUC/Room.pm view on Meta::CPAN
=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);
$self->{status} = JOIN_SENT;
my @chlds;
if (defined $password) {
push @chlds, { name => 'password', childs => [ $password ] };
}
if (defined $history) {
my $h;
push @{$h->{attrs}}, ('maxchars', $history->{chars})
if defined $history->{chars};
push @{$h->{attrs}}, ('maxstanzas', $history->{stanzas})
if defined $history->{stanzas};
push @{$h->{attrs}}, ('seconds', $history->{seconds})
if defined $history->{seconds};
if (defined $h->{attrs}) {
$h->{name} = 'history';
push @chlds, $h;
}
}
my $con = $self->{connection};
$con->send_presence (undef, {
defns => 'muc', node => { ns => 'muc', name => 'x', childs => [ @chlds ] }
}, to => $self->{nick_jid});
}
=item B<make_instant ($cb)>
If you just created a room you can create an instant room with this
method instead of going through room configuration for a reserved room.
If you want to create a reserved room instead don't forget to unset the
C<create_instant> argument of the C<join_room> method of L<AnyEvent::XMPP::Ext::MUC>!
See also the C<request_configuration> method below for the reserved room config.
C<$cb> is the callback that will be called when the instant room creation is
finished. If successful the first argument will be this room object
(C<$self>), if unsuccessful the first argument will be undef and the second
will be a L<AnyEvent::XMPP::Error::IQ> object.
=cut
sub make_instant {
my ($self, $cb) = @_;
$self->check_online or return;
my $df = AnyEvent::XMPP::Ext::DataForm->new;
$df->set_form_type ('submit');
my $sxl = $df->to_simxml;
$self->{connection}->send_iq (
set => {
defns => 'muc_owner', node => {
name => 'query', childs => [ $sxl ]
}
}, sub {
my ($n, $e) = @_;
if ($e) {
$cb->(undef, $e);
} else {
$cb->($self, undef);
( run in 0.718 second using v1.01-cache-2.11-cpan-39bf76dae61 )