Hello all! I have a problem with my code. I want to get a string from
callback function, but AnyEvent::XMPP::Client uses non-blocked sockets and I
can't get a string. There is example from my code:

use AnyEvent::XMPP::Client;
my $j       = AnyEvent->condvar;
my $cl      = AnyEvent::XMPP::Client->new (debug => $DEBUG);

my %muc_commands = (
    "version" => \&version_comm,
);

# AnyEvent::XMPP::Client have callback message and I use it.
$cl->->reg_cb(
        message => \&muc_incoming_message,
);

$cl->start;
$j->wait;

sub muc_incoming_message {
  # Here I parse incoming message and if message is command for jabber bot,
then I call function from hash of commands.

  if(defined(my $result = &{$muc_commands{$1}}($msg, $2))) {
  # And here i make answer object and send message with result.
  my $answer = new AnyEvent::XMPP::Ext::MUC::Message->new(
                    body => "$from_nick: $result"
  );
  $msg->make_reply($answer);
  $answer->send;
}

sub version_comm {
my ($msg, $nick) = @_;
my $version_obj = AnyEvent::XMPP::Ext::Version->new;
our $version_ans;
      $version_obj->request_version($msg->room->connection, $nick,
        sub {
            my ($result, $error) = @_;
            if(defined $error) {
                $version_ans = "Can't get user's version.";
            }
            $version_ans = $result->{'name'};
            print "$version_ans";
        }
    );
print "$version_ans";
return $version_ans;
}

d...@dzen$ ./jbot.pl
Use of uninitialized value in concatenation (.) or string at
./jbot_new.plline 257.
Tkabber

Word "Tkabber" wrote command print "$version_ans"; from request_version
callback, but version_comm finished BEFORE callback function starts.
I tried use $j->send and $j->$recv from AnyEvent kernel(example in the
bottom of the message), but I have error : "AnyEvent::CondVar: recursive
blocking wait detected at ./jbot.pl line 258" because I use $j->wait in my
code.
How can I get this string $result->{'name'} from callback to version_comm???

sub version_comm {
my ($msg, $nick) = @_;
my $version_obj = AnyEvent::XMPP::Ext::Version->new;
our $version_ans;
      $version_obj->request_version($msg->room->connection, $nick,
        sub {
            my ($result, $error) = @_;
            if(defined $error) {
                $version_ans = "Can't get user's version.";
            }
            $version_ans = $result->{'name'};
            print "$version_ans";
            $j->send;
        }
    );
$j->recv;
print "$version_ans";
return $version_ans;
}

Reply via email to