shithub: irc.myr

Download patch

ref: df15f8864de803d47d28227233f504623ea3d874
parent: d993f492a7374c719ec879c0659e3224ec1b7fd3
author: Ori Bernstein <ori@eigenstate.org>
date: Sun Mar 18 19:42:20 EDT 2018

A few cleanups/robustness improvements.

--- a/irc.myr
+++ b/irc.myr
@@ -24,7 +24,7 @@
 ;;
 
 const io = {irc, fd
-	var src, cmd, args
+	var src, cmd, args, a0
 	var srv, ln
 
 	srv = fd2srv(irc, fd)
@@ -43,6 +43,7 @@
 		| `std.None:	-> void
 		;;
 		(src, cmd, args) = parse(ln)
+		a0 = args.len > 0 ? args[0] : ""
 		uppercase(cmd)
 		match cmd
 		| "001":	srvmsg(irc, args)
@@ -66,10 +67,12 @@
 		| "PART":	delchanuser(irc, srv, src, args)
 		| "366":	shownames(irc, srv, args, 1)
 		| "PRIVMSG":	recievemsg(irc, srv, src, args)
-		| "PING":	send(irc, srv, "PONG :{}\r\n", args[0])
+		| "PING":	send(irc, srv, "PONG :{}\r\n", a0)
 		| "JOIN":	joined(irc, srv, src, args)
 		| "NICK":	renamed(irc, srv, src, args)
 		| "PONG":	/* ignore; we update the time in the read */
+		| "MODE":	/* ignore: nothing to do here */
+		| "KICK":	status(irc, curchan(irc), "kicked {}\n", a0)
 		| c:		status(irc, irc.self, "unknown server command {}", ln)
 		;;
 		std.slfree(args)
@@ -85,17 +88,18 @@
 
 const renamed = {irc, srv, src, args
 	var a, b
-	if args.len > 0
-		for c : srv.chan
-			a = displayname(src)
-			b = displayname(args[0])
-			match std.lsearch(c.users, a, std.strcmp)
-			| `std.None:	/* skip */
-			| `std.Some i:
-				std.slfree(c.users[i])
-				c.users[i] = std.sldup(b)
-				status(irc, c, "changed nick: {} => {}", a, b)
-			;;
+	if args.len == 0
+		-> void
+	;;
+	for c : srv.chan
+		a = displayname(src)
+		b = displayname(args[0])
+		match std.lsearch(c.users, a, std.strcmp)
+		| `std.None:	/* skip */
+		| `std.Some i:
+			std.slfree(c.users[i])
+			c.users[i] = std.sldup(b)
+			status(irc, c, "changed nick: {} => {}", a, b)
 		;;
 	;;
 }
@@ -154,7 +158,7 @@
 	;;
 	c = name2chan(irc, srv, args[2])
 	for n : std.bysplit(args[3], " ")
-		n = std.strstrip(n)
+		n = displayname(n)
 		match std.lsearch(c.users, n, std.strcmp)
 		| `std.None:    std.slpush(&c.users, std.sldup(n))
 		| `std.Some _:  /* ignore */
@@ -517,8 +521,6 @@
 		;;
 		srv = irc.srv[irc.focus]
 		if srv.chan.len > 0
-			srv.chan[srv.focus].stale = false
-			srv.chan[srv.focus].flagged = false
 			break
 		;;
 	;;
--- a/main.myr
+++ b/main.myr
@@ -34,8 +34,10 @@
 
 	irc = mkirc(rcfile, logdir)
 	while true
-		redraw(irc)
 		c = curchan(irc)
+		c.stale = false
+		c.flagged = false
+		redraw(irc)
 		fd = poll(irc)
 		/* we can get interrupted by sigwinch */
 		if fd <= 0
--