… | |
… | |
11 | |
11 | |
12 | our $J = AnyEvent->condvar; |
12 | our $J = AnyEvent->condvar; |
13 | our $datafile = "conferences.stor"; |
13 | our $datafile = "conferences.stor"; |
14 | our $data = {}; |
14 | our $data = {}; |
15 | |
15 | |
16 | require "rl.pl"; |
16 | sub load_servers { |
|
|
17 | my $parser = XML::DOM::Parser->new; |
|
|
18 | my $doc = $parser->parsefile ("servers.xml"); |
|
|
19 | |
|
|
20 | my %servers; |
|
|
21 | for ($doc->findnodes ('/query/item')) { |
|
|
22 | my $n = $_->getAttributeNode ('jid'); |
|
|
23 | $servers{$n->getValue} = 1; |
|
|
24 | } |
|
|
25 | keys %servers |
|
|
26 | } |
|
|
27 | |
|
|
28 | # locking mechanism for requests |
|
|
29 | our %req; |
|
|
30 | our $id = 0; |
|
|
31 | sub addreq { my $k = $id . "_" . $_[0]; $req{$k} = 1; $id++; $k } |
|
|
32 | sub finreq { delete $req{$_[0]}; my @k = keys %req; $J->broadcast if @k == 0 } |
|
|
33 | |
|
|
34 | # timer for status output |
|
|
35 | our $t; |
|
|
36 | sub mktimer { |
|
|
37 | $t = AnyEvent->timer (after => 1, cb => sub { |
|
|
38 | my @keys = keys %req; |
|
|
39 | my @ok = grep { $_ !~ /_timer_/ } @keys; |
|
|
40 | my $timers = scalar (grep { $_ =~ /_timer_/ } @keys); |
|
|
41 | print "\t*** pending requests $timers timers, and : " . join (',', @ok) . "\n"; |
|
|
42 | mktimer (); |
|
|
43 | }); |
|
|
44 | } |
|
|
45 | mktimer; |
|
|
46 | |
|
|
47 | # server data cache |
|
|
48 | eval { $data = retrieve $datafile }; |
|
|
49 | print "finished data: " . join (',', keys %$data) . "\n"; |
|
|
50 | sub sync_data { store $data, $datafile } |
17 | |
51 | |
18 | # MAIN START |
52 | # MAIN START |
19 | my @servers = load_servers (); |
53 | my @servers = load_servers (); |
20 | my $cl = Net::XMPP2::Client->new (); |
54 | my $cl = Net::XMPP2::Client->new (); |
21 | my $d = Net::XMPP2::Ext::Disco->new; |
55 | my $d = Net::XMPP2::Ext::Disco->new; |