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, argsvar 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, topicvar 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, idxvar 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))))
}
--
⑨