From fc59edef8c4a13cb894edad8f7ded39bff3f96d8 Mon Sep 17 00:00:00 2001 From: Zoffix Znet Date: Sun, 5 Jun 2016 00:02:07 -0400 Subject: Promise --- lib/IRC/Client.pm6 | 75 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 28 deletions(-) (limited to 'lib') diff --git a/lib/IRC/Client.pm6 b/lib/IRC/Client.pm6 index afc4303..e1fffbf 100644 --- a/lib/IRC/Client.pm6 +++ b/lib/IRC/Client.pm6 @@ -13,36 +13,45 @@ has Str:D $.userhost = 'localhost'; has Str:D $.userreal = 'Perl6 IRC Client'; has Str:D @.channels = ['#perl6']; has @.plugins; -has @.servers; -has IO::Socket::Async $!sock; +has %.servers; method run { - await IO::Socket::Async.connect( $!host, $!port ).then({ - $!sock = .result; - self!ssay: "PASS $!password" if $!password.defined; - self!ssay: "NICK $!nick"; - self!ssay: "USER $!username $!username $!host :$!userreal"; - - react { - CATCH { warn .backtrace } - - whenever $!sock.Supply :bin -> $buf is copy { - state $left-overs = ''; - my $str = try $buf.decode: 'utf8'; - $str or $str = $buf.decode: 'latin-1'; - $str = $left-overs ~ $str; - - (my $events, $left-overs) = self!parse: $str; - $str ~~ /$=(\N*)$/; - for $events.grep: *.defined -> $e { - CATCH { warn .backtrace } - $!debug and debug-print $e, :in; - self!handle-event: $e; + self!prep-servers; + + for %!servers.kv -> $s-name, $s-conf { + %!servers{ $s-name } = + IO::Socket::Async.connect( $s-conf, $s-conf ).then({ + $s-conf = .result; + + self!ssay: "PASS $!password", :server($s-name) + if $!password.defined; + self!ssay: "NICK $!nick", :server($s-name); + self!ssay: + "USER $!username $!username $!host :$!userreal", + :server($s-name); + + react { + CATCH { warn .backtrace } + + whenever $s-conf.Supply :bin -> $buf is copy { + state $left-overs = ''; + my $str = try $buf.decode: 'utf8'; + $str or $str = $buf.decode: 'latin-1'; + $str = $left-overs ~ $str; + + (my $events, $left-overs) = self!parse: $str; + for $events.grep: *.defined -> $e { + CATCH { warn .backtrace } + $!debug and debug-print $e, :in; + self!handle-event: $e; + } } } - } - $!sock.close; - }); + $s-conf.close; + }) + } + say %!servers.values».; + await %!servers.values».; } method send-cmd ($cmd, *@args) { @@ -50,6 +59,16 @@ method send-cmd ($cmd, *@args) { self!ssay: join ' ', $cmd, @args; } +method !prep-servers { + %!servers = '*' => {} unless %!servers; + + for %!servers.values -> $s { + $s{$_} //= self."$_"() + for ; + $s = @.channels; + } +} + method !handle-event ($e) { given $e.command { when '001' { self!ssay: "JOIN @.channels[]"; } @@ -72,9 +91,9 @@ method !plugs-that-can ($method) { return @!plugins.grep(*.^can: $method); } -method !ssay (Str:D $msg) { +method !ssay (Str:D $msg, :$server = '*') { $!debug and debug-print $msg, :out; - $!sock.print("$msg\n"); + %!servers{ $server }.print("$msg\n"); self; } -- cgit v1.1