shithub: irc.myr

Download patch

ref: bfb4900f08c0e3a1fb742a77bb66a06b447d6e48
parent: da30c36250f4c39d63b5de5bfd05aab4ad3b4ee6
author: Ori Bernstein <ori@eigenstate.org>
date: Sun Aug 5 11:05:39 EDT 2018

Time out if we don't get pings.

--- a/irc.myr
+++ b/irc.myr
@@ -20,7 +20,6 @@
 	const cmd	: (irc : irc#, ln : byte[:] -> void)
 	const getstr	: (chars : char[:] -> byte[:])
 	const puthist	: (irc : irc#, chan : chan#, ent : (std.time, hist) -> void)
-	const ping	: (irc : irc#, srv : server# -> void)
 ;;
 
 const io = {irc, fd
@@ -32,10 +31,11 @@
 	match std.read(srv.fd, srv.buf[srv.nbuf:])
 	| `std.Err e:	closed(irc, srv, "error reading")
 	| `std.Ok 0:	closed(irc, srv, "eof")
-	| `std.Ok n:
-		srv.nbuf += n
-		srv.pong = std.now()
+	| `std.Ok n:	srv.nbuf += n
 	;;
+	if srv.death == 0
+		srv.ping = std.now()
+	;;
 
 	while true
 		match nextln(irc, srv)
@@ -60,6 +60,8 @@
 		| "375":	srvmsg(irc, args)
 		| "372":	srvmsg(irc, args)
 		| "376":	srvmsg(irc, args)
+		| "333":	srvmsg(irc, args)
+		| "470":	srvmsg(irc, args)
 		| "NOTICE":	srvmsg(irc, args)
 		| "332":	topic(irc, srv, args)
 		| "353":	addusers(irc, srv, args)
@@ -80,12 +82,6 @@
 	;;
 }
 
-const ping = {irc, srv
-	if srv.pong - std.now() > 60*std.Sec
-		send(irc, srv, "PING irc.myr")
-	;;
-}
-
 const renamed = {irc, srv, src, args
 	var a, b
 	if args.len == 0
@@ -309,7 +305,7 @@
 		-> void
 	;;
 	match sp[0]
-	| "/onconn":	std.slpush(&irc.onconn, std.sldup(text[sp[0].len:]))
+	| "/onconn":	std.slpush(&irc.onconn, std.sldup(std.strstrip(text[sp[0].len:])))
 	| "/connect":	connect(irc, sp[1:])
 	| "/join":	join(irc, sp[1:])
 	| "/leave":	leave(irc, sp[1:])
--- a/main.myr
+++ b/main.myr
@@ -51,8 +51,12 @@
 }
 
 const redial = {irc
+	var pingtime, droptime
+
 	for s : irc.srv
-		if s.death == 0 || std.now() - s.death < 60*std.Sec
+		droptime = std.now() - s.death 
+		pingtime = std.now() - s.ping
+		if pingtime < 600*std.Sec || s.death == 0 || droptime < 60*std.Sec
 			continue
 		;;
 		std.close(s.fd)
@@ -63,10 +67,10 @@
 				std.close(s.fd)
 				continue
 			;;
+			s.death = 0
 			for j : irc.onconn
 				do(irc, j)
 			;;
-			s.death = 0
 			for c : s.chan
 				send(irc, s, "JOIN {}\r\n", c.name)
 				std.usleep(200*std.Msec)
@@ -99,13 +103,10 @@
 		start = std.rand(0, pfd.len)
 		for var j = 0; j != pfd.len; j++
 			i = (j + start) % pfd.len
-			if pfd[i].revents & sys.Pollin != 0
+			if pfd[i].revents & (sys.Pollin|sys.Pollerr) != 0
 				fd = (pfd[i].fd : std.fd)
 				out = false
 			;;
-		;;
-		for s : irc.srv
-			ping(irc, s)
 		;;
 	;;
 	std.slfree(pfd)
--- a/types.myr
+++ b/types.myr
@@ -34,7 +34,7 @@
 		chan	: chan#[:]
 		focus	: std.size
 		death	: std.time
-		pong	: std.time
+		ping	: std.time
 	;;
 
 	type chan = struct
--