iTrack user names to properly show joins and parts - irc - A minimalistic IRC client, forked from https://c9x.me/irc/ Err vernunftzentrum.de 70 hgit clone git://vernunftzentrum.de/irc.git URL:git://vernunftzentrum.de/irc.git vernunftzentrum.de 70 1Log /ckeen/repos/irc/log.gph vernunftzentrum.de 70 1Files /ckeen/repos/irc/files.gph vernunftzentrum.de 70 1Refs /ckeen/repos/irc/refs.gph vernunftzentrum.de 70 1README /ckeen/repos/irc/file/README.gph vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1commit e5ae717f4ac681933c42f9bb82ffd01386545522 /ckeen/repos/irc/commit/e5ae717f4ac681933c42f9bb82ffd01386545522.gph vernunftzentrum.de 70 1parent a68ac08f9543bbb869b49f1329fdf9281d412127 /ckeen/repos/irc/commit/a68ac08f9543bbb869b49f1329fdf9281d412127.gph vernunftzentrum.de 70 hAuthor: Christian Kellermann URL:mailto:ckeen@pestilenz.org vernunftzentrum.de 70 iDate: Fri, 6 Apr 2018 23:03:04 +0200 Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iTrack user names to properly show joins and parts Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iDiffstat: Err vernunftzentrum.de 70 i irc.c | 145 +++++++++++++++++++++++++++++-- Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i1 file changed, 136 insertions(+), 9 deletions(-) Err vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1diff --git a/irc.c b/irc.c /ckeen/repos/irc/file/irc.c.gph vernunftzentrum.de 70 i@@ -36,7 +36,8 @@ Err vernunftzentrum.de 70 i enum { Err vernunftzentrum.de 70 i ChanLen = 64, Err vernunftzentrum.de 70 i LineLen = 512, Err vernunftzentrum.de 70 i- MaxChans = 16, Err vernunftzentrum.de 70 i+ MaxChans = 32, Err vernunftzentrum.de 70 i+ MaxKnownUsers = 2048, Err vernunftzentrum.de 70 i BufSz = 2048, Err vernunftzentrum.de 70 i LogSz = 4096, Err vernunftzentrum.de 70 i MaxRecons = 10, /* -1 for infinitely many */ Err vernunftzentrum.de 70 i@@ -62,6 +63,12 @@ static struct Chan { Err vernunftzentrum.de 70 i char join; /* Channel was 'j'-oined. */ Err vernunftzentrum.de 70 i } chl[MaxChans]; Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i+static struct User { Err vernunftzentrum.de 70 i+ char nick[64]; Err vernunftzentrum.de 70 i+ uint32_t channels; /* Needs to match MaxChans */ Err vernunftzentrum.de 70 i+ char inuse; Err vernunftzentrum.de 70 i+} usrs[MaxKnownUsers]; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i static int ssl; Err vernunftzentrum.de 70 i static struct { Err vernunftzentrum.de 70 i int fd; Err vernunftzentrum.de 70 i@@ -84,6 +91,8 @@ static void tdrawbar(void); Err vernunftzentrum.de 70 i static void tredraw(void); Err vernunftzentrum.de 70 i static void treset(void); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i+static void usrchandrop(int); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i static void Err vernunftzentrum.de 70 i panic(const char *m) Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i@@ -326,6 +335,7 @@ chdel(char *name) Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i if (!(n = chfind(name))) Err vernunftzentrum.de 70 i return 0; Err vernunftzentrum.de 70 i+ usrchandrop(n); Err vernunftzentrum.de 70 i nch--; Err vernunftzentrum.de 70 i free(chl[n].buf); Err vernunftzentrum.de 70 i memmove(&chl[n], &chl[n + 1], (nch - n) * sizeof(struct Chan)); Err vernunftzentrum.de 70 i@@ -334,6 +344,81 @@ chdel(char *name) Err vernunftzentrum.de 70 i return 1; Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+usrchandrop(int chan) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ for (size_t i = 0; i < MaxKnownUsers; i++) Err vernunftzentrum.de 70 i+ if (usrs[i].channels == (1 << chan)) { Err vernunftzentrum.de 70 i+ usrs[i].channels = 0; Err vernunftzentrum.de 70 i+ usrs[i].inuse = 0; Err vernunftzentrum.de 70 i+ bzero(usrs[i].nick, 64); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static size_t Err vernunftzentrum.de 70 i+usrfind(char *nick) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ size_t i = 0; Err vernunftzentrum.de 70 i+ for (i = MaxKnownUsers - 1; i > 0; i--){ Err vernunftzentrum.de 70 i+ if (usrs[i].inuse && !strcmp(nick, usrs[i].nick)) Err vernunftzentrum.de 70 i+ break; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ return i; Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+usradd(char* nick, int chan) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ size_t i; Err vernunftzentrum.de 70 i+ i = usrfind(nick); Err vernunftzentrum.de 70 i+ if (!i) { Err vernunftzentrum.de 70 i+ for (i = MaxKnownUsers - 1; i > 0; i--) Err vernunftzentrum.de 70 i+ if (!usrs[i].inuse) Err vernunftzentrum.de 70 i+ break; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ if (!i) Err vernunftzentrum.de 70 i+ panic("Too many users!"); Err vernunftzentrum.de 70 i+ strlcpy(usrs[i].nick, nick, 64); Err vernunftzentrum.de 70 i+ usrs[i].channels |= 1 << chan; Err vernunftzentrum.de 70 i+ usrs[i].inuse = 1; Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+usrdel(char* nick, int chan) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ size_t h; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ h = usrfind(nick); Err vernunftzentrum.de 70 i+ if (!h) Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ if (!chan) Err vernunftzentrum.de 70 i+ usrs[h].channels = 0; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ usrs[h].channels &= ~(1 << chan); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ if (!usrs[h].channels) { Err vernunftzentrum.de 70 i+ usrs[h].inuse = 0; Err vernunftzentrum.de 70 i+ bzero(usrs[h].nick, 64); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+usrchange(char* old, char* new) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ size_t h; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ h = usrfind(old); Err vernunftzentrum.de 70 i+ if(!h) Err vernunftzentrum.de 70 i+ panic("Missed a user!"); Err vernunftzentrum.de 70 i+ strlcpy(usrs[h].nick, new, 64); Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static uint32_t Err vernunftzentrum.de 70 i+usrchans(char* nick) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ return usrs[usrfind(nick)].channels; Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i static char * Err vernunftzentrum.de 70 i pushl(char *p, char *e) Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i@@ -461,7 +546,7 @@ scmd(char *usr, char *cmd, char *par, char *data) Err vernunftzentrum.de 70 i tdrawbar(); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i } else if (!strcmp(cmd, "NICK")) { Err vernunftzentrum.de 70 i- if (!data || !pm) Err vernunftzentrum.de 70 i+ if (!data) Err vernunftzentrum.de 70 i return; Err vernunftzentrum.de 70 i if (!strcmp(usr, nick)){ Err vernunftzentrum.de 70 i for (int c=0; c < nch; c++){ Err vernunftzentrum.de 70 i@@ -469,21 +554,33 @@ scmd(char *usr, char *cmd, char *par, char *data) Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i strlcpy(nick, data, sizeof(nick)); Err vernunftzentrum.de 70 i } else { Err vernunftzentrum.de 70 i- pushf(chfind(pm), "%s - is now known as %s", usr, data); Err vernunftzentrum.de 70 i+ pushf(chfind(data), "%s - is now known as %s", usr, data); Err vernunftzentrum.de 70 i+ usrchange(usr, data); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i tredraw(); Err vernunftzentrum.de 70 i return; Err vernunftzentrum.de 70 i } else if (!strcmp(cmd, "PING")) { Err vernunftzentrum.de 70 i sndf("PONG :%s", data ? data : "(null)"); Err vernunftzentrum.de 70 i } else if (!strcmp(cmd, "PART")) { Err vernunftzentrum.de 70 i+ int ch = 0; Err vernunftzentrum.de 70 i if (!pm) Err vernunftzentrum.de 70 i return; Err vernunftzentrum.de 70 i- pushf(chfind(pm), "-!- %s has left %s", usr, pm); Err vernunftzentrum.de 70 i+ ch = chfind(pm); Err vernunftzentrum.de 70 i+ pushf(ch, "-!- %s has left %s", usr, pm); Err vernunftzentrum.de 70 i+ usrdel(usr, ch); Err vernunftzentrum.de 70 i } else if (!strcmp(cmd, "JOIN")) { /* some servers pass the channel as data :#channel */ Err vernunftzentrum.de 70 i- if (pm) Err vernunftzentrum.de 70 i- pushf(chfind(pm), "-!- %s has joined %s", usr, pm); Err vernunftzentrum.de 70 i- else if (data) Err vernunftzentrum.de 70 i- pushf(chfind(data), "-!- %s has joined %s", usr, data); Err vernunftzentrum.de 70 i+ int ch; Err vernunftzentrum.de 70 i+ char *chan; Err vernunftzentrum.de 70 i+ if (pm) { Err vernunftzentrum.de 70 i+ ch = chfind(pm); Err vernunftzentrum.de 70 i+ chan = pm; Err vernunftzentrum.de 70 i+ } else if (data) { Err vernunftzentrum.de 70 i+ ch = chfind(data); Err vernunftzentrum.de 70 i+ chan = data; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ pushf(ch, "-!- %s has joined %s", usr, chan); Err vernunftzentrum.de 70 i+ usradd(usr, ch); Err vernunftzentrum.de 70 i return; Err vernunftzentrum.de 70 i } else if (!strcmp(cmd, "470")) { /* Channel forwarding. */ Err vernunftzentrum.de 70 i char *ch = strtok(0, " "), *fch = strtok(0, " "); Err vernunftzentrum.de 70 i@@ -500,6 +597,23 @@ scmd(char *usr, char *cmd, char *par, char *data) Err vernunftzentrum.de 70 i return; Err vernunftzentrum.de 70 i pushf(chfind(chan), "Topic for %s: %s", chan, data); Err vernunftzentrum.de 70 i tredraw(); Err vernunftzentrum.de 70 i+ } else if (!strcmp(cmd, "353")) { /* RPL_NAMREPLY */ Err vernunftzentrum.de 70 i+ pushf(0, "Names %s", data ? data : ""); Err vernunftzentrum.de 70 i+ if ((pm = strtok(0, " ")) && (!strcmp(pm, "=") || !strcmp(pm, "*") || !strcmp(pm, "@"))) { Err vernunftzentrum.de 70 i+ char *n; Err vernunftzentrum.de 70 i+ char *chan = strtok(0, " "); Err vernunftzentrum.de 70 i+ int c = chfind(chan); Err vernunftzentrum.de 70 i+ if (!chan || !data || !c) Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ n = strtok(data, " "); Err vernunftzentrum.de 70 i+ if (!n) Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ do { Err vernunftzentrum.de 70 i+ if (n[0] == '@' || n[0] == '+') Err vernunftzentrum.de 70 i+ n+=1; Err vernunftzentrum.de 70 i+ usradd(n, c); Err vernunftzentrum.de 70 i+ } while ((n = strtok(0, " "))); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i } else if (!strcmp(cmd, "471") || !strcmp(cmd, "473") Err vernunftzentrum.de 70 i || !strcmp(cmd, "474") || !strcmp(cmd, "475")) { /* Join error. */ Err vernunftzentrum.de 70 i if ((pm = strtok(0, " "))) { Err vernunftzentrum.de 70 i@@ -513,7 +627,19 @@ scmd(char *usr, char *cmd, char *par, char *data) Err vernunftzentrum.de 70 i return; Err vernunftzentrum.de 70 i pushf(0, "-!- Cannot change to nick %s: %s", pm, data); Err vernunftzentrum.de 70 i tredraw(); Err vernunftzentrum.de 70 i- } else if (!strcmp(cmd, "QUIT")) { /* Commands we don't care about. */ Err vernunftzentrum.de 70 i+ } else if (!strcmp(cmd, "QUIT")) { Err vernunftzentrum.de 70 i+ char *msg = ""; Err vernunftzentrum.de 70 i+ if (!usr) Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ uint64_t chans = usrchans(usr); Err vernunftzentrum.de 70 i+ usrdel(usr, 0); Err vernunftzentrum.de 70 i+ if (data) Err vernunftzentrum.de 70 i+ msg = data; Err vernunftzentrum.de 70 i+ for (int c = 0; c < MaxChans; c++) { Err vernunftzentrum.de 70 i+ if (1<