shithub: irc.myr

Download patch

ref: 2d30cf874bc539745eda2ffaa228800254a80d86
parent: a9bb2f8762610797c91392d936d894fa5232c28a
author: Ori Bernstein <ori@markovcorp.com>
date: Tue Jun 13 05:34:44 EDT 2017

Add a few more commands.

--- a/irc.myr
+++ b/irc.myr
@@ -3,6 +3,7 @@
 use bio
 use thread
 use termdraw
+use fileutil	/* for homedir() */
 
 pkg =
 	const status	: (cli : client#, fmt : byte[:], args : ... -> void)
@@ -9,8 +10,6 @@
 	const send	: (cli : client#, srv : server#, fmt : byte[:], args : ... -> void)
 ;;
 
-const Cfg = ".ircrc"
-
 type client = struct
 	srv	: server#[:]
 	self	: chan#
@@ -60,7 +59,7 @@
 			termdraw.checksize(cli.term)
 		elif fd == std.In
 			terminput(cli, c)
-		else
+		elif fd >= 0
 			io(cli, fd)
 		;;
 		redial(cli)
@@ -235,28 +234,33 @@
 }
 
 const mkclient = {
-	var cli, cfg, t
+	var cli, home, path, t
+	var nick, user
 
 	t = termdraw.mk(std.In)
 	termdraw.raw(t)
+	user = std.getenvv("user", std.getenvv("USER", "user"))
+	nick = user
 	cli = std.mk([
 		.srv = [][:],
-		.user = std.getenvv("user", std.getenvv("USER", "user")),
-		.nick = std.getenvv("user", std.getenvv("USER", "user")),
+		.user = std.sldup(user),
+		.nick = std.sldup(nick),
 		.self = mkchan("status", "status"),
 		.focus = -1,
 		.term = t,
 	])
 
-	match bio.open(Cfg, bio.Rd)
-	| `std.Ok f:	cfg = f
-	| `std.Err e:	-> cli
+	home = fileutil.homedir()
+	path = std.pathcat(home, ".ircrc")
+	match bio.open(path, bio.Rd)
+	| `std.Ok cfg:
+		for ln in bio.byline(cfg)
+			do(cli, ln)
+		;;
+	| `std.Err e:
 	;;
+	std.slfree(path)
 
-	for ln in bio.byline(cfg)
-		do(cli, ln)
-	;;
-
 	-> cli
 }
 
@@ -266,8 +270,8 @@
 		.ds=std.sldup(ds),
 		.chan=[][:],
 		.focus=-1,
-		.user=cli.user,
-		.nick=cli.nick,
+		.user=std.sldup(cli.user),
+		.nick=std.sldup(cli.nick),
 	])
 }
 
@@ -314,11 +318,47 @@
 	| "win":	switch(cli, sp[1:])
 	| "quit":	quit(cli, sp[1:])
 	| "help":	help(cli, sp[1:])
+	| "nick":	changenick(cli, sp[1:])
+	| "user":	changeuser(cli, sp[1:])
 	| c:		status(cli, "unknown command: /{}\n", text)
 	;;
 	std.slfree(sp)
 }
 
+const changenick = {cli, args
+	if args.len != 1
+		status(cli, "/nick: invalid args {j= }\n", args)
+		-> void
+	;;
+
+	match cursrv(cli)
+	| `std.None:
+		std.slfree(cli.nick)
+		cli.nick = std.sldup(args[0])
+	| `std.Some srv:
+		std.slfree(cli.nick)
+		srv.nick = std.sldup(args[0])
+		send(cli, srv, "NICK {}\r\n", srv.nick)
+	;;
+}
+
+const changeuser = {cli, args
+	if args.len != 1
+		status(cli, "/nick: invalid args {j= }\n", args)
+		-> void
+	;;
+
+	match cursrv(cli)
+	| `std.None:
+		std.slfree(cli.user)
+		cli.user = std.sldup(args[0])
+	| `std.Some srv:
+		std.slfree(cli.user)
+		srv.user = std.sldup(args[0])
+		send(cli, srv, "NICK {}\r\n", srv.user)
+	;;
+}
+
 const connect = {cli, args
 	var ds, srv
 
@@ -580,7 +620,6 @@
 	| `termdraw.Kup:
 	| `termdraw.Kdown:
 	| `termdraw.Winsz _:
-		redraw(cli)
 	| r:
 		s = std.fmt("{}\n", r)
 		std.sljoin(&cli.self.buf, s)
@@ -596,8 +635,9 @@
 const redraw = {cli
 	var c, x, y, w, h
 
-	if cli.term.width < 3 || cli.term.height < 4
-		termdraw.cls(cli.term)
+	termdraw.cls(cli.term)
+	if cli.term.width < 10 || cli.term.height < 5
+		-> void
 	;;
 
 	x = 0
--