1 | #!/opt/bin/perl |
1 | #!/opt/bin/perl |
2 | |
2 | |
3 | use AnyEvent; |
3 | use common::sense; |
4 | use AnyEvent::Handle; |
|
|
5 | use AnyEvent::MP; |
4 | use AnyEvent::MP; |
6 | |
5 | |
7 | my $server_node = "127.0.0.1:1299"; |
6 | my ($nick, $servernode) = @ARGV; |
8 | |
7 | |
9 | initialise_node "slave/", $server_node; |
8 | initialise_node "slave/", $servernode; |
10 | |
9 | |
11 | print "initialized client\n"; |
10 | $| = 1; |
12 | |
11 | |
13 | my $client_port = port; |
12 | my $servernode = (resolve_node $servernode)->recv; |
14 | |
13 | |
15 | snd $server_node, lookup => "chatter", $client_port, "resolved"; |
14 | my $port = port; |
16 | |
15 | |
17 | my $resolved_cv = AnyEvent->condvar; |
16 | my ($client, $server); |
18 | my $server_port; |
|
|
19 | |
17 | |
20 | # setup a receiver callback for the 'resolved' message: |
18 | sub server_connect { |
21 | rcv $client_port, resolved => sub { |
19 | print "\rconnecting...\n"; |
22 | my ($tag, $chatter_port_id) = @_; |
|
|
23 | |
20 | |
24 | print "Resolved the server port 'chatter' to $chatter_port_id\n"; |
21 | $client = port { |
25 | $server_port = $chatter_port_id; |
22 | print "\r \r@_\n> "; |
|
|
23 | 0 |
|
|
24 | }; |
|
|
25 | mon $client, sub { |
|
|
26 | print "\rdisconnected @_\n"; |
|
|
27 | &server_connect; |
|
|
28 | }; |
26 | |
29 | |
27 | $resolved_cv->send; |
30 | $server = spawn $servernode, "::client_connect", $client, $nick; |
28 | 1 |
31 | mon $server, $client; |
|
|
32 | } |
|
|
33 | |
|
|
34 | server_connect; |
|
|
35 | |
|
|
36 | my $w = AE::io 0, 0, sub { |
|
|
37 | chomp (my $line = <STDIN>); |
|
|
38 | print "> "; |
|
|
39 | snd $server, $line; |
29 | }; |
40 | }; |
30 | |
41 | |
31 | # lets block the client until we have resolved the server port. |
42 | print "> "; |
32 | $resolved_cv->recv; |
43 | AE::cv->recv; |
33 | |
44 | |
34 | # now setup another receiver callback for the chat messages: |
|
|
35 | rcv $client_port, message => sub { |
|
|
36 | my ($tag, $msg) = @_; |
|
|
37 | |
|
|
38 | print "chat> $msg\n"; |
|
|
39 | 0 |
|
|
40 | }; |
|
|
41 | |
|
|
42 | # send a 'join' message to the server: |
|
|
43 | snd $server_port, join => "$client_port"; |
|
|
44 | |
|
|
45 | sub send_message { |
|
|
46 | my ($msg) = @_; |
|
|
47 | |
|
|
48 | snd $server_port, message => $msg; |
|
|
49 | } |
|
|
50 | |
|
|
51 | # make an AnyEvent condition variable for the 'quit' condition |
|
|
52 | # (when we want to exit the client). |
|
|
53 | my $quit_cv = AnyEvent->condvar; |
|
|
54 | |
|
|
55 | my $stdin_hdl = AnyEvent::Handle->new ( |
|
|
56 | fh => *STDIN, |
|
|
57 | on_error => sub { $quit_cv->send }, |
|
|
58 | on_read => sub { |
|
|
59 | my ($hdl) = @_; |
|
|
60 | |
|
|
61 | $hdl->push_read (line => sub { |
|
|
62 | my ($hdl, $line) = @_; |
|
|
63 | |
|
|
64 | if ($line =~ /^\/quit/) { # /quit will end the client |
|
|
65 | $quit_cv->send; |
|
|
66 | } else { |
|
|
67 | send_message ($line); |
|
|
68 | } |
|
|
69 | }); |
|
|
70 | } |
|
|
71 | ); |
|
|
72 | |
|
|
73 | $quit_cv->recv; |
|
|