Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

$Roster = $Connection->Roster(); and RosterGet does not work properly together #10

Open
dhyannataraj opened this issue Feb 26, 2016 · 0 comments

Comments

@dhyannataraj
Copy link

I am trying to use Net::XMPP to get buddy list from a server and I have some
problems.

I wanted to get user list from my old jabber server, so I took an example
client.pl removed all unnecessary things and added

my $Roster = $Connection->Roster();

right after authorization. See the code at the end of thi report

Documentation says that thus Roster object will catch all incoming iq files and
I will get full roaster at the end.

But this is not what happened. I get only a few iq that came after I set my
presence. The main part of roster xml can be seen in a log but not processed
by $Roster object for some reason.

I've dug into problem and found out that if I replace RosterGet with
RosterRequest everything starts working well.

This happens because of the conflict of reply catcher. $Connection->Roster()
catches roster items via SetXPathCallBacks

But if I send roster request with RosterGet, it will send request with
specified ID, and reply catcher would be catching this reply.

And it would catch this reply before SetXPathCallBacks would be able to try to
catch it. So there would be no roster in $Roster, through we actually got
necessary data via net.

This was really confusing.

May be this is an expected behavior, I do not completely understand the
philosophy of Net::XMPP. But I doubt it.

May be something should be fixed on code or/and documentation. But I do not
understand in what direction this fix should go.

May be you have an Idea what to do with this.

#!/usr/bin/perl

use Net::XMPP;
use strict;

my $server = "irrc.ru";
my $port = 5222;
my $username = "shaplov";
my $password = "*********";
my $resource = "scrtipt2";


my $Connection = new Net::XMPP::Client(
 debuglevel=>1, debugfile=>"$0.debug.out", debuftime=>1
);

my $status = $Connection->Connect(
                                   tls =>1,
                                   hostname=>$server,
                                   port=>$port
                                  );

if ($status != 1)
{
    print "ERROR:  Jabber server is down or connection was not allowed.\n";
    print "        ($!)\n";
    print $Connection->GetErrorCode();
    exit(0);
}

my @result = $Connection->AuthSend(username=>$username,
                                   password=>$password,
                                   resource=>$resource);

if ($result[0] ne "ok")
{
    print "ERROR: Authorization failed: $result[0] - $result[1]\n";
    exit(0);
}

print "Logged in to $server:$port...\n";

my $Roster = $Connection->Roster();

###############################################
#
# FIXME if one change RosterRequest to RosterGet, script will not print compleat buddy list
#
################################################

#$Connection->RosterGet();
$Connection->RosterRequest();

$Connection->PresenceSend();

my $count = 0;
while(defined($Connection->Process(1)))
{
  print ".";
  $count ++;
  last if $count >20;
}
print "\n";

foreach my $JID ($Roster->jids())
{
  print $JID->GetJID("base"), "\n";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant