1 | #!/opt/bin/perl |
1 | #!/opt/bin/perl |
|
|
2 | |
|
|
3 | # Usage: ./chat_server |
|
|
4 | # implement a chat server using "traditional message passing" |
2 | |
5 | |
3 | use common::sense; |
6 | use common::sense; |
4 | use AnyEvent::MP; |
7 | use AnyEvent::MP; |
5 | use AnyEvent::MP::Global; |
8 | use AnyEvent::MP::Global; |
6 | |
9 | |
7 | initialise_node; |
10 | initialise_node; |
8 | |
|
|
9 | AnyEvent::MP::Global::register $NODE, "eg_chat_server"; |
|
|
10 | |
11 | |
11 | my %clients; |
12 | my %clients; |
12 | |
13 | |
13 | sub msg { |
14 | sub msg { |
14 | print "relaying: $_[0]\n"; |
15 | print "relaying: $_[0]\n"; |
15 | snd $_, $_[0] |
16 | snd $_, $_[0] |
16 | for values %clients; |
17 | for values %clients; |
17 | } |
18 | } |
18 | |
19 | |
19 | sub client_connect { |
20 | our $server = port; |
20 | my ($client, $name) = @_; |
|
|
21 | |
21 | |
22 | mon $client; |
22 | rcv $server, join => sub { |
23 | mon $client, sub { |
23 | my ($client, $nick) = @_; |
24 | delete $clients{$client}; |
|
|
25 | msg "$name (quits, @_)"; |
|
|
26 | }; |
|
|
27 | |
24 | |
28 | $clients{$client} = $client; |
25 | $clients{$client} = $client; |
29 | |
26 | |
|
|
27 | mon $client, sub { |
|
|
28 | delete $clients{$client}; |
|
|
29 | msg "$nick (quits, @_)"; |
|
|
30 | }; |
30 | msg "$name (joins)"; |
31 | msg "$nick (joins)"; |
|
|
32 | }; |
31 | |
33 | |
32 | rcv $SELF, sub { msg "$name: $_[0]" }; |
34 | rcv $server, privmsg => sub { |
33 | } |
35 | my ($nick, $msg) = @_; |
|
|
36 | msg "$nick: $msg"; |
|
|
37 | }; |
|
|
38 | |
|
|
39 | AnyEvent::MP::Global::register $server, "eg_chat_server"; |
34 | |
40 | |
35 | warn "server ready.\n"; |
41 | warn "server ready.\n"; |
36 | |
42 | |
37 | AE::cv->recv; |
43 | AE::cv->recv; |