aboutsummaryrefslogtreecommitdiff
path: root/lib
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 /lib
parente3d18b7f1a7c415a41d793c7a3f5a02ab4b19d40 (diff)
Make reconnect stuff work
Diffstat (limited to 'lib')
-rw-r--r--lib/IRC/Client.pm684
-rw-r--r--lib/IRC/Client/Server.pm62
2 files changed, 55 insertions, 31 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 }