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, argsvar 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 = {clivar 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
--
⑨