From 33e20863ba30737ee4c94bdd83f4f5bce4787eea Mon Sep 17 00:00:00 2001 From: Michael Czigler <37268479+mcpcpc@users.noreply.github.com> Date: Wed, 2 Sep 2020 08:36:01 -0400 Subject: [PATCH] fix command parsed lengths bump version differentiate PRIVMSG sent user nick by color change direct PRIVMSG to nick color to cyan add descriptive pointer names in parser() function invert direct PRIVMSG to nick color --- kirc.c | 95 ++++++++++++++++++++++++++++------------------------------ 1 file changed, 46 insertions(+), 49 deletions(-) diff --git a/kirc.c b/kirc.c index 52b1ea29..d4871975 100644 --- a/kirc.c +++ b/kirc.c @@ -12,8 +12,8 @@ #include #include -#define IRC_MSG_MAX 512 /* guaranteed max message length */ -#define IRC_CHAN_MAX 200 /* gauranteed max channel length */ +#define MSG_MAX 512 /* guaranteed max message length */ +#define CHA_MAX 200 /* gauranteed max channel length */ static int conn; /* connection socket */ static int verb = 0; /* verbose output (e.g. raw stream) */ @@ -26,9 +26,8 @@ static char * nick = NULL; /* nickname */ static char * pass = NULL; /* server password */ static char * user = NULL; /* server user name */ static char * real = NULL; /* server user real name */ -static char * olog = NULL; /* log irc stream parh */ +static char * olog = NULL; /* log irc stream path */ -/* append string to specified file path */ static void printa(char *str) { FILE *out = fopen(olog, "a"); @@ -36,7 +35,6 @@ printa(char *str) { fclose(out); } -/* wait for keyboard press to interrupt stream */ static int kbhit(void) { @@ -57,7 +55,6 @@ kbhit(void) { return byteswaiting > 0; } -/* handle keyboard strokes for command input */ static void input_handler(char *usrin, int len) { @@ -71,15 +68,14 @@ input_handler(char *usrin, int len) { tcsetattr(STDIN_FILENO, TCSANOW, &save); } -/* send command to irc server */ static void raw(char *fmt, ...) { va_list ap; - char *cmd_str = malloc(sizeof(char) * (IRC_MSG_MAX + 1)); + char *cmd_str = malloc(sizeof(char) * (MSG_MAX + 1)); va_start(ap, fmt); - vsnprintf(cmd_str, IRC_MSG_MAX, fmt, ap); + vsnprintf(cmd_str, MSG_MAX, fmt, ap); va_end(ap); if (verb) printf("<< %s", cmd_str); @@ -88,7 +84,6 @@ raw(char *fmt, ...) { write(conn, cmd_str, strlen(cmd_str)); } -/* initial irc server connection */ static void irc_init() { @@ -110,16 +105,15 @@ irc_init() { fcntl(conn, F_SETFL, O_NONBLOCK); } -/* print formatted irc stream with word wrap and hanging indent */ static void printw(const char *format, ...) { va_list argptr; - char *tok, line[IRC_MSG_MAX + 1]; + char *tok, line[MSG_MAX + 1]; int i, wordwidth, spaceleft, spacewidth = 1; va_start(argptr, format); - vsnprintf(line, IRC_MSG_MAX + 1, format, argptr); + vsnprintf(line, MSG_MAX + 1, format, argptr); va_end(argptr); if (olog) printa(line); @@ -140,30 +134,34 @@ printw(const char *format, ...) { } } -/* parse irc stream */ static void parser(char *in) { - if (verb) printf(">> %s\n", in); + int len = 0; + + if (verb) printf(">> %s\n", in); if (!strncmp(in, "PING", 4)) { in[1] = 'O'; raw("%s\r\n", in); } else if (in[0] == ':') { - char *pre = strtok(in, " ") + 1; /* prefix */ - char *cmd = strtok(NULL, ":"); /* command */ - char *msg = strtok(NULL, "\r"); /* message */ - char *nic = strtok(pre, "!"); //, *usr = strtok(NULL, "@"), *hos = pre; - char *ltr = strtok(cmd, "#& "); //, *cha = cmd; - if (!strncmp(ltr, "001", 3)) raw("JOIN #%s\r\n", chan); - if (!strncmp(ltr, "QUIT", 4)) { - printw("%*.*s \x1b[34;1m%s\x1b[0m\n", gutl, gutl, "<--", nic); - } else if (!strncmp(ltr, "JOIN", 4)) { - printw("%*.*s \x1b[32;1m%s\x1b[0m\n", gutl, gutl, "-->", nic); + char *prefix = strtok(in, " ") + 1; + char *suffix = strtok(NULL, ":"); + char *message = strtok(NULL, "\r"); + char *nickname = strtok(prefix, "!"); /* , *usr = strtok(NULL, "@"), *hos = prefix; */ + char *command = strtok(suffix, "#& "), *channel = strtok(NULL, " "); + if (!strncmp(command, "001", 3)) raw("JOIN #%s\r\n", chan); + else if (!strncmp(command, "QUIT", 4)) { + printw("%*s \x1b[34;1m%s\x1b[0m\n", gutl, "<--", nickname); + } else if (!strncmp(command, "JOIN", 4)) { + printw("%*s \x1b[32;1m%s\x1b[0m\n", gutl, "-->", nickname); + } else if (!strncmp(command, "PRIVMSG", 7) && !strncmp(channel, nick, strlen(nick))) { + while (nickname[len] != '\0') len++; + printw("%*s\x1b[43;1m%-.*s\x1b[0m %s\n", \ + gutl-(len <= gutl ? len : gutl), "", gutl, nickname, message); } else { - int len = 0; - while (nic[len] != '\0') len++; + while (nickname[len] != '\0') len++; printw("%*s\x1b[33;1m%-.*s\x1b[0m %s\n", \ - gutl-(len <= gutl ? len : gutl), "", gutl, nic, msg); + gutl-(len <= gutl ? len : gutl), "", gutl, nickname, message); } } } @@ -175,19 +173,19 @@ main(int argc, char **argv) { while ((cval = getopt(argc, argv, "s:p:o:n:k:c:u:r:w:W:vV")) != -1) { switch (cval) { - case 'v' : puts("kirc 0.0.5"); return 0; - case 'V' : verb = 1; break; - case 's' : host = optarg; break; + case 'v' : puts("kirc-0.0.6"); return 0; + case 'V' : verb = 1; break; + case 's' : host = optarg; break; case 'w' : gutl = atoi(optarg); break; case 'W' : cmax = atoi(optarg); break; - case 'p' : port = optarg; break; - case 'r' : real = optarg; break; - case 'u' : user = optarg; break; - case 'o' : olog = optarg; break; - case 'n' : nick = optarg; break; - case 'k' : pass = optarg; break; - case 'c' : chan = optarg; break; - case '?' : return 1; + case 'p' : port = optarg; break; + case 'r' : real = optarg; break; + case 'u' : user = optarg; break; + case 'o' : olog = optarg; break; + case 'n' : nick = optarg; break; + case 'k' : pass = optarg; break; + case 'c' : chan = optarg; break; + case '?' : return 1; } } @@ -205,45 +203,44 @@ main(int argc, char **argv) { if (pid == 0) { int sl, i, o = 0; - char u[IRC_MSG_MAX], s, b[IRC_MSG_MAX]; + char u[MSG_MAX], s, b[MSG_MAX]; irc_init(); while ((sl = read(conn, &s, 1))) { if (sl > 0) b[o] = s; - if ((o > 0 && b[o - 1] == '\r' && b[o] == '\n') || o == IRC_MSG_MAX) { + if ((o > 0 && b[o - 1] == '\r' && b[o] == '\n') || o == MSG_MAX) { b[o + 1] = '\0'; parser(b); o = 0; } else if (sl > 0) o++; - if (read(fd[0], u, IRC_MSG_MAX) > 0) { + if (read(fd[0], u, MSG_MAX) > 0) { for (i = 0; u[i] != '\n'; i++) continue; if (u[0] != ':') raw("%-*.*s\r\n", i, i, u); } } } else { - char usrin[IRC_MSG_MAX], v1[IRC_MSG_MAX-20], v2[20], c1; + char usrin[MSG_MAX], v1[MSG_MAX - CHA_MAX], v2[CHA_MAX], c1; while (waitpid(pid, NULL, WNOHANG) == 0) { if (!kbhit()) dprintf(fd[1], ":\n"); else { - input_handler(usrin, IRC_MSG_MAX); + input_handler(usrin, MSG_MAX); if (sscanf(usrin, ":%[M] %s %[^\n]\n", &c1, v2, v1) == 3 || sscanf(usrin, ":%[Qnjpm] %[^\n]\n", &c1, v1) == 2 || sscanf(usrin, ":%[q]\n", &c1) == 1) { switch (c1) { - case 'q': dprintf(fd[1], "quit\n"); break; - case 'Q': dprintf(fd[1], "quit %s\n", v1); break; - case 'j': dprintf(fd[1], "join %s\n", v1); break; - case 'p': dprintf(fd[1], "part %s\n", v1); break; + case 'q': dprintf(fd[1], "quit\n"); break; + case 'Q': dprintf(fd[1], "quit %s\n", v1); break; + case 'j': dprintf(fd[1], "join %s\n", v1); break; + case 'p': dprintf(fd[1], "part %s\n", v1); break; case 'm': dprintf(fd[1], "privmsg #%s :%s\n", chan, v1); break; case 'n': dprintf(fd[1], "privmsg nickserv :%s\n", v1); break; case 'M': dprintf(fd[1], "privmsg %s :%s\n", v2, v1); break; - case '?': break; } } else dprintf(fd[1], "%s", usrin); }