13
13
#include <sys/socket.h>
14
14
#include <sys/ioctl.h>
15
15
16
- #define VERSION "0.1.4 "
16
+ #define VERSION "0.1.5 "
17
17
18
18
#define MSG_MAX 512 /* max message length */
19
19
#define CHA_MAX 200 /* max channel length */
@@ -437,15 +437,13 @@ static void messageWrap(char *line, size_t offset) {
437
437
for (tok = strtok (line , " " ); tok != NULL ; tok = strtok (NULL , " " )) {
438
438
wordwidth = strlen (tok );
439
439
if ((wordwidth + spacewidth ) > spaceleft ) {
440
- printf ("\n%*.s%s " , (int ) gutl + 1 , " " , tok );
440
+ printf ("\r\ n%*.s%s " , (int ) gutl + 1 , " " , tok );
441
441
spaceleft = cmax - (gutl + 1 );
442
442
} else {
443
443
printf ("%s " , tok );
444
444
}
445
445
spaceleft -= (wordwidth + spacewidth );
446
446
}
447
-
448
- puts ("\x1b[0m" );
449
447
}
450
448
451
449
static void rawParser (char * string ) {
@@ -461,39 +459,51 @@ static void rawParser(char *string) {
461
459
462
460
if (olog ) logAppend (string , olog );
463
461
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 );
468
471
size_t offset = 0 ;
469
472
470
473
if (!strncmp (command , "001" , 3 ) && chan != NULL ) {
471
474
for (tok = strtok (chan , ",|" ); tok != NULL ; tok = strtok (NULL , ",|" )) {
472
475
strcpy (chan_default , tok );
473
476
raw ("JOIN #%s\r\n" , tok );
474
477
} 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
+ }
478
485
} 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
+ }
481
490
} else if (!strncmp (command , "NICK" , 4 )) {
482
491
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 );
485
493
} else if (!strncmp (command , "PRIVMSG" , 7 )) {
486
494
if (strcmp (channel , nick ) == 0 ) {
487
495
printf ("%*s\x1b[33;1m%-.*s\x1b[36m " , s , "" , g , nickname );
488
496
} 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 );
491
499
offset += 12 + strlen (channel );
492
500
} else printf ("%*s\x1b[33;1m%-.*s\x1b[0m " , s , "" , g , nickname );
501
+ messageWrap ((message ? message : " " ), offset );
493
502
} else {
494
503
printf ("%*s\x1b[33;1m%-.*s\x1b[0m " , s , "" , g , nickname );
504
+ messageWrap ((message ? message : " " ), offset );
495
505
}
496
- messageWrap (( message ? message : " " ), offset );
506
+ puts ( "\x1b[0m\r" );
497
507
}
498
508
499
509
static char message_buffer [MSG_MAX + 1 ];
@@ -511,7 +521,8 @@ static int handleServerMessage(void) {
511
521
}
512
522
}
513
523
if (sl == 0 ) {
514
- fputs ("Connection closed\n" , stderr );
524
+ fputs ("Connection closed" , stderr );
525
+ puts ("\x1b[0F\x1b[E" );
515
526
return -1 ;
516
527
}
517
528
@@ -545,21 +556,24 @@ static void handleUserInput(char *usrin) {
545
556
usrin [msg_len - 1 ] = '\0' ;
546
557
}
547
558
559
+ printf ("\r\x1b[0K" );
548
560
if (usrin [0 ] == '/' && usrin [1 ] == '#' ) {
549
561
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 );
551
563
} 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 );
553
565
} else if (usrin [0 ] == '/' ) {
554
566
raw ("%s\r\n" , usrin + 1 );
567
+ printf ("\x1b[35m%s\x1b[0m" , usrin );
555
568
} else if (usrin [0 ] == '@' ) {
556
569
strtok_r (usrin , " " , & tok );
557
570
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 );
559
572
} else {
560
573
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 );
562
575
}
576
+ printf ("\r\n" );
563
577
}
564
578
565
579
static void usage (void ) {
@@ -619,22 +633,20 @@ int main(int argc, char **argv) {
619
633
620
634
char usrin [MSG_MAX ];
621
635
636
+ if (enableRawMode (STDIN_FILENO ) == -1 ) return -1 ;
622
637
for (;;) {
623
638
int poll_res = poll (fds , 2 , -1 );
624
639
if (poll_res != -1 ) {
625
640
if (fds [0 ].revents & POLLIN ) {
626
641
edit (usrin , MSG_MAX );
627
- printf ("\n\x1b[0F\x1b[0K" );
628
642
handleUserInput (usrin );
629
643
}
630
644
if (fds [1 ].revents & POLLIN ) {
631
- disableRawMode ();
632
645
int rc = handleServerMessage ();
633
646
if (rc != 0 ) {
634
647
if (rc == -2 ) return EXIT_FAILURE ;
635
648
return EXIT_SUCCESS ;
636
649
};
637
- if (enableRawMode (STDIN_FILENO ) == -1 ) return -1 ;
638
650
}
639
651
} else {
640
652
if (errno == EAGAIN ) continue ;
0 commit comments