diff options
author | Michael Czigler <37268479+mcpcpc@users.noreply.github.com> | 2020-09-02 08:36:01 -0400 |
---|---|---|
committer | Michael Czigler <michaelczigler@icloud.com> | 2020-09-02 13:35:51 -0400 |
commit | 33e20863ba30737ee4c94bdd83f4f5bce4787eea (patch) | |
tree | 50cab180c7043b766dc034d6b575ce27b6f9dc17 /kirc.c | |
parent | Update README (diff) | |
download | kirc-33e20863ba30737ee4c94bdd83f4f5bce4787eea.tar.gz kirc-33e20863ba30737ee4c94bdd83f4f5bce4787eea.tar.bz2 kirc-33e20863ba30737ee4c94bdd83f4f5bce4787eea.tar.xz kirc-33e20863ba30737ee4c94bdd83f4f5bce4787eea.tar.zst kirc-33e20863ba30737ee4c94bdd83f4f5bce4787eea.zip |
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
Diffstat (limited to 'kirc.c')
-rw-r--r-- | kirc.c | 95 |
1 files changed, 46 insertions, 49 deletions
@@ -12,8 +12,8 @@ #include <sys/wait.h> #include <termios.h> -#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); } |