shithub: irc.myr

Download patch

ref: 9b64e70c2e444d167ceb91583e8c3f560a432377
parent: 4e0257ec951bdfa3e9d8c18368099d94000eb4cf
author: Ori Bernstein <ori@markovcorp.com>
date: Thu Nov 23 05:36:28 EST 2017

Be more targeted about nick changes.

--- a/irc.myr
+++ b/irc.myr
@@ -146,8 +146,7 @@
 		| "PING":	send(irc, srv, "PONG :{}\r\n", args[0])
 		| "JOIN":	joined(irc, srv, src, args)
 		| "NICK":	renamed(irc, srv, src, args)
-		| c:	
-			status(irc, irc.self, "unknown server command {}", ln)
+		| c:		status(irc, irc.self, "unknown server command {}", ln)
 		;;
 		std.slfree(args)
 		std.slfree(ln)
@@ -155,9 +154,18 @@
 }
 
 const renamed = {irc, srv, src, args
+	var a, b
 	if args.len > 0
 		for c : srv.chan
-			status(irc, c, "changed nick: {} => {}", displayname(src), displayname(args[0]))
+			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)
+			;;
 		;;
 	;;
 }
@@ -777,7 +785,7 @@
 }
 
 const terminput = {irc, chan
-	var s, ln
+	var ln
 
 	while true
 		match termdraw.poll(irc.term)
@@ -809,8 +817,7 @@
 		| `std.Some `termdraw.Kpgdn:	scroll(irc, chan, -std.max(1, irc.term.height - 7))
 		| `std.Some ev:
 			if !input(irc, ev)
-				s = std.fmt("{}", ev)
-				puthist(irc, irc.self, (std.now(), `Status s))
+				puthist(irc, irc.self, (std.now(), `Status std.fmt("{}", ev)))
 			;;
 		;;
 		irc.cmddirty = true
--