From 63c2a163e193ea53e159e2a7ffb8c73bddf9074b Mon Sep 17 00:00:00 2001 From: Zoffix Znet Date: Thu, 28 Jul 2016 21:15:14 -0400 Subject: Make reconnect stuff work --- lib/IRC/Client.pm6 | 84 ++++++++++++++++++++++++++++++----------------- lib/IRC/Client/Server.pm6 | 2 +- test.p6 | 42 ------------------------ 3 files changed, 55 insertions(+), 73 deletions(-) delete mode 100644 test.p6 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, :6667port, :promise(''), :sock(''), :!q, :0e ), - %( :host, :4444port, :promise(''), :sock(''), :!q, :0e ); - -my Channel $c .= new; - -sub connect-it ($s) { - say "Connecting $s:$s"; - $s = ''; - $s = IO::Socket::Async.connect(|$s).then: sub ($_) { - if .status ~~ Broken { - dd "ZOMFG! Can't connect!"; - $s = True if $s++ > 4; - sleep 1; - $c.send: ['broken', $s]; - return; - } - - $s = .result; - react { - say "Loooop"; - whenever $s.Supply { - say "Got stuff! $_"; - } - } - $s = True if $s++ > 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]; - unless @s.grep({!.}) { - say 'Bailing out'; - last; - } -} -- cgit v1.1