Skip to content

Commit 6ebc2e5

Browse files
authored
0.1.5 (#60)
* raw mode only server messages * bump version * remove unnecessary escape codes * join/part new line fix * remove redundant returns * add channel indicator for JOIN/PART
1 parent 1c4d2f9 commit 6ebc2e5

File tree

1 file changed

+38
-26
lines changed

1 file changed

+38
-26
lines changed

kirc.c

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include <sys/socket.h>
1414
#include <sys/ioctl.h>
1515

16-
#define VERSION "0.1.4"
16+
#define VERSION "0.1.5"
1717

1818
#define MSG_MAX 512 /* max message length */
1919
#define CHA_MAX 200 /* max channel length */
@@ -437,15 +437,13 @@ static void messageWrap(char *line, size_t offset) {
437437
for (tok = strtok(line, " "); tok != NULL; tok = strtok(NULL, " ")) {
438438
wordwidth = strlen(tok);
439439
if ((wordwidth + spacewidth) > spaceleft) {
440-
printf("\n%*.s%s ", (int) gutl + 1, " ", tok);
440+
printf("\r\n%*.s%s ", (int) gutl + 1, " ", tok);
441441
spaceleft = cmax - (gutl + 1);
442442
} else {
443443
printf("%s ", tok);
444444
}
445445
spaceleft -= (wordwidth + spacewidth);
446446
}
447-
448-
puts("\x1b[0m");
449447
}
450448

451449
static void rawParser(char *string) {
@@ -461,39 +459,51 @@ static void rawParser(char *string) {
461459

462460
if (olog) logAppend(string, olog);
463461

464-
char *tok, *prefix = strtok(string, " ") + 1, *suffix = strtok(NULL, ":"),
465-
*message = strtok(NULL, "\r"), *nickname = strtok(prefix, "!"),
466-
*command = strtok(suffix, "#& "), *channel = strtok(NULL, " ");
467-
int g = gutl, s = gutl - (strlen(nickname) <= gutl ? strlen(nickname) : gutl);
462+
char *tok;
463+
char *prefix = strtok(string, " ") + 1;
464+
char *suffix = strtok(NULL, ":");
465+
char *message = strtok(NULL, "\r");
466+
char *nickname = strtok(prefix, "!");
467+
char *command = strtok(suffix, "#& ");
468+
char *channel = strtok(NULL, " \r");
469+
int g = gutl;
470+
int s = gutl - (strlen(nickname) <= gutl ? strlen(nickname) : gutl);
468471
size_t offset = 0;
469472

470473
if (!strncmp(command, "001", 3) && chan != NULL) {
471474
for (tok = strtok(chan, ",|"); tok != NULL; tok = strtok(NULL, ",|")) {
472475
strcpy(chan_default, tok);
473476
raw("JOIN #%s\r\n", tok);
474477
} return;
475-
} else if (!strncmp(command, "QUIT", 4) || !strncmp(command, "PART", 4)) {
476-
printf("%*s<-- \x1b[34;1m%s\x1b[0m\n", g - 3, "", nickname);
477-
return;
478+
} else if (!strncmp(command, "QUIT", 4)) {
479+
printf("%*s<<< \x1b[34;1m%s\x1b[0m", g - 3, "", nickname);
480+
} else if (!strncmp(command, "PART", 4)) {
481+
printf("%*s<-- \x1b[34;1m%s\x1b[0m", g - 3, "", nickname);
482+
if (strstr(channel, chan_default) == NULL) {
483+
printf(" [\x1b[33m%s\x1b[0m] ", channel);
484+
}
478485
} else if (!strncmp(command, "JOIN", 4)) {
479-
printf("%*s--> \x1b[32;1m%s\x1b[0m\n", g - 3, "", nickname);
480-
return;
486+
printf("%*s--> \x1b[32;1m%s\x1b[0m", g - 3, "", nickname);
487+
if (strstr(channel, chan_default) == NULL) {
488+
printf(" [\x1b[33m%s\x1b[0m] ", channel);
489+
}
481490
} else if (!strncmp(command, "NICK", 4)) {
482491
printf("\x1b[35;1m%*s\x1b[0m ", g - 4, nickname);
483-
printf("--> \x1b[35;1m%s\x1b[0m\n", message);
484-
return;
492+
printf("--> \x1b[35;1m%s\x1b[0m", message);
485493
} else if (!strncmp(command, "PRIVMSG", 7)) {
486494
if (strcmp(channel, nick) == 0) {
487495
printf("%*s\x1b[33;1m%-.*s\x1b[36m ", s, "", g, nickname);
488496
} else if (strstr(channel, chan_default) == NULL) {
489-
printf("%*s\x1b[33;1m%-.*s\x1b[0m ", s, "", g, nickname);
490-
printf("[\x1b[33m%s\x1b[0m] ", channel);
497+
printf("%*s\x1b[33;1m%-.*s\x1b[0m", s, "", g, nickname);
498+
printf(" [\x1b[33m%s\x1b[0m] ", channel);
491499
offset += 12 + strlen(channel);
492500
} else printf("%*s\x1b[33;1m%-.*s\x1b[0m ", s, "", g, nickname);
501+
messageWrap((message ? message : " "), offset);
493502
} else {
494503
printf("%*s\x1b[33;1m%-.*s\x1b[0m ", s, "", g, nickname);
504+
messageWrap((message ? message : " "), offset);
495505
}
496-
messageWrap((message ? message : " "), offset);
506+
puts("\x1b[0m\r");
497507
}
498508

499509
static char message_buffer[MSG_MAX + 1];
@@ -511,7 +521,8 @@ static int handleServerMessage(void) {
511521
}
512522
}
513523
if (sl == 0) {
514-
fputs("Connection closed\n", stderr);
524+
fputs("Connection closed", stderr);
525+
puts("\x1b[0F\x1b[E");
515526
return -1;
516527
}
517528

@@ -545,21 +556,24 @@ static void handleUserInput(char *usrin) {
545556
usrin[msg_len - 1] = '\0';
546557
}
547558

559+
printf("\r\x1b[0K");
548560
if (usrin[0] == '/' && usrin[1] == '#') {
549561
strcpy(chan_default, usrin + 2);
550-
printf("\x1b[35mnew channel: #%s\x1b[0m\x1b[0F\n\n", chan_default);
562+
printf("\x1b[35mnew channel: #%s\x1b[0m", chan_default);
551563
} else if (usrin[0] == '/' && usrin[1] == '?') {
552-
printf("\x1b[35mcurrent channel: #%s\x1b[0m\x1b[0F\n\n", chan_default);
564+
printf("\x1b[35mcurrent channel: #%s\x1b[0m", chan_default);
553565
} else if (usrin[0] == '/') {
554566
raw("%s\r\n", usrin + 1);
567+
printf("\x1b[35m%s\x1b[0m", usrin);
555568
} else if (usrin[0] == '@') {
556569
strtok_r(usrin, " ", &tok);
557570
raw("privmsg %s :%s\r\n", usrin + 1, tok);
558-
printf("\x1b[35mprivmsg %s :%s\x1b[0m\x1b[0F\n\n", usrin + 1, tok);
571+
printf("\x1b[35mprivmsg %s :%s\x1b[0m", usrin + 1, tok);
559572
} else {
560573
raw("privmsg #%s :%s\r\n", chan_default, usrin);
561-
printf("\x1b[35mprivmsg #%s :%s\x1b[0m\x1b[0F\n\n", chan_default, usrin);
574+
printf("\x1b[35mprivmsg #%s :%s\x1b[0m", chan_default, usrin);
562575
}
576+
printf("\r\n");
563577
}
564578

565579
static void usage(void) {
@@ -619,22 +633,20 @@ int main(int argc, char **argv) {
619633

620634
char usrin[MSG_MAX];
621635

636+
if (enableRawMode(STDIN_FILENO) == -1) return -1;
622637
for (;;) {
623638
int poll_res = poll(fds, 2, -1);
624639
if (poll_res != -1) {
625640
if (fds[0].revents & POLLIN) {
626641
edit(usrin, MSG_MAX);
627-
printf("\n\x1b[0F\x1b[0K");
628642
handleUserInput(usrin);
629643
}
630644
if (fds[1].revents & POLLIN) {
631-
disableRawMode();
632645
int rc = handleServerMessage();
633646
if (rc != 0) {
634647
if (rc == -2) return EXIT_FAILURE;
635648
return EXIT_SUCCESS;
636649
};
637-
if (enableRawMode(STDIN_FILENO) == -1) return -1;
638650
}
639651
} else {
640652
if (errno == EAGAIN) continue;

0 commit comments

Comments
 (0)