Advertisement
Guest User

perl6 chat server

a guest
Jan 16th, 2019
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6 1.46 KB | None | 0 0
  1. unit module ChatServer ;
  2. use Cro ;
  3. use Cro::TCP ;
  4. our $chat = Supplier.new() ;
  5. sub message(Str $string) {
  6.   Cro::TCP::Message.new(data => $string.encode('utf-8')) ;
  7. }
  8. sub fromMessage($message) {
  9.   $message.data().decode('utf-8') ;
  10. }
  11. sub msgMap($message, &code) {
  12.   message(&code(fromMessage($message))) ;
  13. }
  14. class Chat does Cro::Transform {
  15.     method consumes() { Cro::TCP::Message }
  16.     method produces() { Cro::TCP::Message }
  17.     method transformer(Supply $source) {
  18.         my $output = $chat.Supply ;
  19.         my $name ;
  20.         my $prompt = "Please, enter your name:\r\n" ;
  21.         my $answer = supply {
  22.             emit(message("Welcome to Perl Chat!\r\n"));
  23.             emit(message($prompt));
  24.             whenever $source -> $message {
  25.                 if $name {
  26.                   say "message: " ~ $message.data().decode('utf-8') ;
  27.                   $chat.emit(msgMap($message,-> $string {"$name: $string";})) ;
  28.                 } else {
  29.                   my $string = chomp(fromMessage($message)) ;
  30.                   if $string !~~ /\w+/ {emit(message($prompt));} else {$name = $string ;}
  31.                 }
  32.             }
  33.             whenever $output -> $message {if $name { emit $message ; } else { ... }}
  34.           }
  35.         return $answer ;
  36.     }
  37. }
  38. my Cro::Service $chat-server = Cro.compose(
  39.     Cro::TCP::Listener.new(port => 8000),
  40.     Chat
  41. );
  42. $chat-server.start();
  43. react whenever signal(SIGINT) {
  44.     $chat-server.stop;
  45.     exit;
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement