shithub: irc.myr

Download patch

ref: 64dd8d564b576f9b64b1e676ddef4d74c2375b3a
parent: cc395f1b257d9e7ec575ef4b3f49bbdea06277f7
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Nov 11 20:47:07 EST 2017

Mix of bugfixes.

--- a/irc.myr
+++ b/irc.myr
@@ -138,9 +138,9 @@
 		| "NOTICE":	srvmsg(irc, args)
 		| "332":	topic(irc, srv, args)
 		| "353":	addusers(irc, srv, args)
-		| "QUIT":	deluser(irc, src)
-		| "PART":	delchanuser(irc, srv, args)
-		| "366":	shownames(irc, [][:])
+		| "QUIT":	deluser(irc, srv, src)
+		| "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])
 		| "JOIN":	joined(irc, srv, src, args)
@@ -172,6 +172,8 @@
 		| `std.Some _:	/* ignore */
 		;;
 		puthist(irc, c, (std.now(), `Join std.sldup(name)))
+		irc.chandirty = true
+		irc.cmddirty = true
 	;;
 }
 
@@ -188,7 +190,11 @@
 const recievemsg = {irc, srv, src, args
 	var c
 
-	c = name2chan(irc, srv, args[0])
+	if std.sleq(args[0], srv.nick)
+		c = name2chan(irc, srv, displayname(src))
+	else
+		c = name2chan(irc, srv, args[0])
+	;;
 	chanmsg(irc, c, src, args[1])
 }
 
@@ -205,34 +211,31 @@
 		| `std.None:    std.slpush(&c.users, std.sldup(n))
 		| `std.Some _:  /* ignore */
 		;;
-		c.gutter = std.max(c.gutter, n.len + 2)
+		c.gutter = std.max(c.gutter, n.len)
 	;;
 }
 
 const deluser = {irc, srv, user
-	var nick
-
 	for c : srv.chan
-		match std.strfind(sender, "!")
-		| `std.Some i:	nick = std.sldup(sender[:i])
-		| `std.None:	nick = std.sldup(sender)
-		;;
-		match std.lsearch(c.users, nick, std.strcmp)
-		| `std.None:    /* ignore */
+		user = displayname(user)
+		match std.lsearch(c.users, user, std.strcmp)
 		| `std.Some i:  std.sldel(&c.users, i)
+		| `std.None:    continue
 		;;
+		puthist(irc, c, (std.now(), `Part std.sldup(user)))
 	;;
 }
 
-const delchanuser = {irc, src, args
+const delchanuser = {irc, srv, user, args
+	var c
+
 	if args.len == 0
 		-> void
 	;;
-	match std.strfind(sender, "!")
-	| `std.Some i:	nick = std.sldup(sender[:i])
-	| `std.None:	nick = std.sldup(sender)
-	;;
-	match std.lsearch(c.users, nick, std.strcmp)
+	c = name2chan(irc, srv, args[0])
+	puthist(irc, c, (std.now(), `Part std.sldup(user)))
+	user = displayname(user)
+	match std.lsearch(c.users, user, std.strcmp)
 	| `std.None:    /* ignore */
 	| `std.Some i:  std.sldel(&c.users, i)
 	;;
@@ -256,7 +259,7 @@
 		;;
 	;;
 
-	new = mkchan(irc, srv, chan, "")
+	new = mkchan(irc, chan, "")
 	std.slpush(&srv.chan, new)
 	if srv.focus == -1
 		srv.focus = srv.chan.len - 1
@@ -340,7 +343,7 @@
 	])
 }
 
-const mkchan = {irc, srv, name, topic
+const mkchan = {irc, name, topic
 	var logpath, logfd
 
 	std.mkpath(irc.logdir)
@@ -394,7 +397,6 @@
 	match sp[0]
 	| "connect":	connect(irc, sp[1:])
 	| "join":	join(irc, sp[1:])
-	| "names":	shownames(irc, sp[1:])
 	| "leave":	leave(irc, sp[1:])
 	| "chan":	chanswitch(irc, sp[1:])
 	| "win":	chanswitch(irc, sp[1:])
@@ -403,6 +405,7 @@
 	| "nick":	changenick(irc, sp[1:])
 	| "user":	changeuser(irc, sp[1:])
 	| "srv":	changeserver(irc, sp[1:])
+	| "names":	listnames(irc, sp[1:])
 	| c:		status(irc, irc.self, "unknown command: /{}", text)
 	;;
 	std.slfree(sp)
@@ -497,15 +500,21 @@
 	;;
 }
 
-const shownames = {irc, args
+const listnames = {irc, args
+	match cursrv(irc)
+	| `std.Some s:	shownames(irc, s, args, 0)
+	| `std.None:	/* nothing */
+	;;
+}
+
+const shownames = {irc, srv, args, idx
 	var c
 
-	if args.len == 0
+	if args.len > idx &&  irc.focus >= 0
+		c = name2chan(irc, srv, args[idx])
+	else
 		c = curchan(irc)
-	elif args.len == 1
-		-> status(irc, irc.self, "names: invalid arguments: {j= }", args)
 	;;
-	c = curchan(irc)
 	if c != irc.self
 		status(irc, c, "{j= }", c.users)
 	;;
@@ -534,8 +543,11 @@
 }
 
 const leave = {irc, args
-	var name, c, idx
+	var name, c, srv
 
+	if irc.focus < 0
+		-> void
+	;;
 	if args.len == 0
 		c = curchan(irc)
 		if c == irc.self
@@ -549,17 +561,19 @@
 		-> void
 	;;
 
-	for srv : irc.srv
-		idx = 0
-		for chan : srv.chan
-			idx++
-			if !std.sleq(chan.name, name)
-				continue
-			;;
+	srv = irc.srv[irc.focus]
+	for var i = 0; i < srv.chan.len; i++
+		c = srv.chan[i]
+		if std.sleq(name, c.name)
 			send(irc, srv, "PART {}\r\n", name)
-			std.sldel(&srv.chan, idx)
-			freechan(chan)
+			std.sldel(&srv.chan, i)
+			if i == srv.focus
+				irc.focus = -1
+			;;
+			freechan(c)
+			break
 		;;
+
 	;;
 }
 
@@ -872,7 +886,7 @@
 		margin = 0
 		match h
 		| `Msg (m, ln):
-			margin = c.gutter
+			margin = c.gutter + termdraw.strwidth(t, " > ")
 			width = termdraw.strwidth(t, ln)
 		| `Join user:
 			margin = termdraw.strwidth(t, "#joined: ")
@@ -907,14 +921,14 @@
 		| `Msg (m, ln):
 			x = std.clamp(x0 + c.gutter - termdraw.strwidth(t, m)  - 3, 0, dx)
 			(x, y) = draw(t, m, x, y, x1, y1)
-			(x, y) = draw(t, ">", x0 + c.gutter - 2, y, x1, y1)
-			(x, y) = draw(t, ln[off:], x0 + c.gutter, y, x1, y1)
+			(x, y) = draw(t, " > ", x, y, x1, y1)
+			(x, y) = draw(t, ln[off:], x, y, x1, y1)
 		| `Join user:
 			(x, y) = draw(t, "#joined ", x0, y, x1, y1)
 			(x, y) = draw(t, user[off:], x, y, x1, y1)
 		| `Part user:
 			(x, y) = draw(t, "#parted ", x0, y, x1, y1)
-			(x, y) = draw(t, user[off:], x, y0, y, y1)
+			(x, y) = draw(t, user[off:], x, y, y, y1)
 		| `Status msg:
 			(x, y) = draw(t, "! ", x0, y, x1, y1)
 			(x, y) = draw(t, msg[off:], x, y, x1, y1)
@@ -1079,13 +1093,8 @@
 	-> fd
 }
 
-const chanmsg = {irc, chan, sender, msg 
-	var nick
-
-	match std.strfind(sender, "!")
-	| `std.Some i:	nick = std.sldup(sender[:i])
-	| `std.None:	nick = std.sldup(sender)
-	;;
+const chanmsg = {irc, chan, nick, msg 
+	nick = std.sldup(displayname(nick))
 	puthist(irc, chan, (std.now(), `Msg (nick, std.sldup(msg))))
 }
 
--