aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoffix Znet <cpan@zoffix.com>2016-07-28 21:15:14 -0400
committerZoffix Znet <cpan@zoffix.com>2016-07-28 21:15:14 -0400
commit63c2a163e193ea53e159e2a7ffb8c73bddf9074b (patch)
tree87bcec932d188c50e8f69b1ff088ca5afe31e256
parente3d18b7f1a7c415a41d793c7a3f5a02ab4b19d40 (diff)
Make reconnect stuff work
-rw-r--r--lib/IRC/Client.pm684
-rw-r--r--lib/IRC/Client/Server.pm62
-rw-r--r--test.p642
3 files changed, 55 insertions, 73 deletions
diff --git a/lib/IRC/Client.pm6 b/lib/IRC/Client.pm6
index fd72caa..f463296 100644
--- a/lib/IRC/Client.pm6
+++ b/lib/IRC/Client.pm6
@@ -15,8 +15,9 @@ has @.filters where .all ~~ Callable;
has %.servers where .values.all ~~ IRC::Client::Server;
has @.plugins;
has $.debug;
-has Lock $!lock = Lock.new;
-has Channel $!event-pipe = Channel.new;
+has Lock $!lock = Lock.new;
+has Channel $!event-pipe = Channel.new;
+has Channel $!socket-pipe = Channel.new;
my &colored = try {
require Terminal::ANSIColor;
@@ -105,35 +106,15 @@ method run {
CATCH { default { warn $_; warn .backtrace } }
}
- for %!servers.values -> $server {
- $server.promise
- = IO::Socket::Async.connect($server.host, $server.port).then: {
- $server.socket = .result;
-
- self!ssay: "PASS $server.password()", :$server
- if $server.password.defined;
- self!ssay: "NICK {$server.nick[0]}", :$server;
-
- self!ssay: :$server, join ' ', 'USER', $server.username,
- $server.username, $server.host, ':' ~ $server.userreal;
-
- my $left-overs = '';
- react {
- whenever $server.socket.Supply :bin -> $buf is copy {
- my $str = try $buf.decode: 'utf8';
- $str or $str = $buf.decode: 'latin-1';
- $str = ($left-overs//'') ~ $str;
-
- (my $events, $left-overs) = self!parse: $str, :$server;
- $!event-pipe.send: $_ for $events.grep: *.defined;
- }
- CATCH { default { warn $_; warn .backtrace } }
- }
- $server.socket.close;
- CATCH { default { warn $_; warn .backtrace } }
- };
+ self!connect-socket: $_ for %!servers.values;
+ loop {
+ my $s = $!socket-pipe.receive;
+ self!connect-socket: $s unless $s.has-quit;
+ unless %!servers.values.grep({!.has-quit}) {
+ $!debug and debug-print 'All servers quit by user. Exiting', :sys;
+ last;
+ }
}
- await Promise.allof: %!servers.values».promise;
}
method send (:$where!, :$text!, :$server, :$notice) {
@@ -182,6 +163,49 @@ method send-cmd ($cmd, *@args is copy, :$prefix = '', :$server) {
###############################################################################
###############################################################################
+method !connect-socket ($server) {
+ $!debug and debug-print 'Attempting to connect to server', :sys, :$server;
+ IO::Socket::Async.connect($server.host, $server.port).then: sub ($prom) {
+ if $prom.status ~~ Broken {
+ $!debug and debug-print 'Could not connect', :sys, :$server;
+ sleep 5;
+ $!socket-pipe.send: $server;
+ return;
+ }
+
+ $server.socket = $prom.result;
+
+ self!ssay: "PASS $server.password()", :$server
+ if $server.password.defined;
+ self!ssay: "NICK {$server.nick[0]}", :$server;
+
+ self!ssay: :$server, join ' ', 'USER', $server.username,
+ $server.username, $server.host, ':' ~ $server.userreal;
+
+ my $left-overs = '';
+ react {
+ whenever $server.socket.Supply :bin -> $buf is copy {
+ my $str = try $buf.decode: 'utf8';
+ $str or $str = $buf.decode: 'latin-1';
+ $str = ($left-overs//'') ~ $str;
+
+ (my $events, $left-overs) = self!parse: $str, :$server;
+ $!event-pipe.send: $_ for $events.grep: *.defined;
+
+ CATCH { default { warn $_; warn .backtrace } }
+ }
+ }
+
+ unless $server.has-quit {
+ $!debug and debug-print "Connection closed", :sys, :$server;
+ sleep 5;
+ }
+
+ $!socket-pipe.send: $server;
+ CATCH { default { warn $_; warn .backtrace; } }
+ }
+}
+
method !handle-event ($e) {
my $s = %!servers{ $e.server };
given $e.command {
diff --git a/lib/IRC/Client/Server.pm6 b/lib/IRC/Client/Server.pm6
index 86f5253..1857fcc 100644
--- a/lib/IRC/Client/Server.pm6
+++ b/lib/IRC/Client/Server.pm6
@@ -10,8 +10,8 @@ has Str $.username;
has Str $.userhost;
has Str $.userreal;
has Str $.current-nick is rw;
-has Promise $.promise is rw;
has Bool $.is-connected is rw;
+has Bool $.has-quit is rw;
has IO::Socket::Async $.socket is rw;
method Str { $!label }
diff --git a/test.p6 b/test.p6
deleted file mode 100644
index 5a6e969..0000000
--- a/test.p6
+++ /dev/null
@@ -1,42 +0,0 @@
-
-my @s = %( :host<localhost>, :6667port, :promise(''), :sock(''), :!q, :0e ),
- %( :host<localhost>, :4444port, :promise(''), :sock(''), :!q, :0e );
-
-my Channel $c .= new;
-
-sub connect-it ($s) {
- say "Connecting $s<host>:$s<port>";
- $s<sock> = '';
- $s<promise> = IO::Socket::Async.connect(|$s<host port>).then: sub ($_) {
- if .status ~~ Broken {
- dd "ZOMFG! Can't connect!";
- $s<q> = True if $s<e>++ > 4;
- sleep 1;
- $c.send: ['broken', $s];
- return;
- }
-
- $s<sock> = .result;
- react {
- say "Loooop";
- whenever $s<sock>.Supply {
- say "Got stuff! $_";
- }
- }
- $s<q> = True if $s<e>++ > 3;
- $c.send: ['closed', $s];
- CATCH { default { warn $_; warn .backtrace; } }
- }
-}
-
-connect-it $_ for @s;
-loop {
- say "Starting listen";
- my $v = $c.receive;
- dd $v;
- connect-it $v[1] unless $v[1]<q>;
- unless @s.grep({!.<q>}) {
- say 'Bailing out';
- last;
- }
-}