aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorZoffix Znet <cpan@zoffix.com>2016-06-05 00:02:07 -0400
committerZoffix Znet <cpan@zoffix.com>2016-06-05 00:02:07 -0400
commitfc59edef8c4a13cb894edad8f7ded39bff3f96d8 (patch)
treed99d30b9ec8eddefaf5c2aa81894b4d0f3a0f5b0 /lib
parentc56f8b4359f2730bb9e8bccd40bf2c9fa840f433 (diff)
Promise
Diffstat (limited to 'lib')
-rw-r--r--lib/IRC/Client.pm675
1 files changed, 47 insertions, 28 deletions
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 ~~ /$<left>=(\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 }<promise> =
+ IO::Socket::Async.connect( $s-conf<host>, $s-conf<port> ).then({
+ $s-conf<sock> = .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<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;
+ for $events.grep: *.defined -> $e {
+ CATCH { warn .backtrace }
+ $!debug and debug-print $e, :in;
+ self!handle-event: $e;
+ }
}
}
- }
- $!sock.close;
- });
+ $s-conf<sock>.close;
+ })
+ }
+ say %!servers.values».<promise>;
+ await %!servers.values».<promise>;
}
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 <host password port nick username userhost userreal>;
+ $s<channels> = @.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 }<sock>.print("$msg\n");
self;
}