From 4148f0530711dc53e34c6ad6c0c3eefe14cf0090 Mon Sep 17 00:00:00 2001 From: James Booth Date: Thu, 9 Feb 2012 21:45:31 +0000 Subject: [PATCH] Added msg command --- README | 2 +- app.c | 21 ++++++++++++++++++++- title_bar.c | 8 ++++++++ windows.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++------- windows.h | 3 ++- 5 files changed, 78 insertions(+), 10 deletions(-) diff --git a/README b/README index 58c210ec..a20cc8f2 100644 --- a/README +++ b/README @@ -15,7 +15,6 @@ WORKLIST: Features: Show login attempts in console Show roster on login - Add /msg command Handle resize terminal in X windows Secure XMPP Window buffers for scrolling, with page up and down @@ -30,3 +29,4 @@ One day: Other IM protocols Log chat history to file option Tab completion on commands + Tab completion on users diff --git a/app.c b/app.c index c43ce8da..0b2ebe8b 100644 --- a/app.c +++ b/app.c @@ -101,6 +101,25 @@ static void main_event_loop(void) jabber_roster_request(); inp_clear(); + // /msg -> send message to a user + } else if (strncmp(command, "/msg ", 5) == 0) { + char *usr_msg = NULL; + char *usr = NULL; + char *msg = NULL; + + usr_msg = strndup(command+5, strlen(command)-5); + cons_show(usr_msg); + + usr = strtok(usr_msg, " "); + if (usr != NULL) { + msg = strndup(command+5+strlen(usr)+1, strlen(command)-(5+strlen(usr)+1)); + if (msg != NULL) { + jabber_send(msg, usr); + show_outgoing_msg("me", usr, msg); + } + } + inp_clear(); + // /close -> close the current chat window, if in chat } else if (strncmp(command, "/close", 6) == 0) { if (in_chat()) { @@ -116,7 +135,7 @@ static void main_event_loop(void) char recipient[100] = ""; get_recipient(recipient); jabber_send(command, recipient); - show_outgoing_msg("me", command); + show_outgoing_msg("me", recipient, command); } else { cons_bad_command(command); } diff --git a/title_bar.c b/title_bar.c index 61e3776e..5cd18672 100644 --- a/title_bar.c +++ b/title_bar.c @@ -15,3 +15,11 @@ void create_title_bar(void) mvwprintw(title_bar, 0, 0, title); wrefresh(title_bar); } + +void title_bar_show(char *title) +{ + wclear(title_bar); + mvwprintw(title_bar, 0, 0, title); + wrefresh(title_bar); +} + diff --git a/windows.c b/windows.c index bed8d9cb..ee86c2db 100644 --- a/windows.c +++ b/windows.c @@ -44,6 +44,8 @@ void switch_to(int i) touchwin(wins[i].win); wrefresh(wins[i].win); curr_win = i; + + title_bar_show(wins[i].from); } void close_win(void) @@ -76,7 +78,7 @@ void show_incomming_msg(char *from, char *message) strcpy(from_cpy, from); char line[100]; - char *short_from = strtok(from_cpy, "@"); + char *short_from = strtok(from_cpy, "/"); char tstmp[80]; get_time(tstmp); @@ -85,7 +87,7 @@ void show_incomming_msg(char *from, char *message) // find the chat window for sender int i; for (i = 1; i < 10; i++) - if (strcmp(wins[i].from, from) == 0) + if (strcmp(wins[i].from, short_from) == 0) break; // if we didn't find a window @@ -96,7 +98,7 @@ void show_incomming_msg(char *from, char *message) break; // set it up and print the message to it - strcpy(wins[i].from, from); + strcpy(wins[i].from, short_from); wclear(wins[i].win); wprintw(wins[i].win, line); @@ -125,16 +127,54 @@ void show_incomming_msg(char *from, char *message) } } -void show_outgoing_msg(char *from, char* message) +void show_outgoing_msg(char *from, char *to, char *message) { char line[100]; char tstmp[80]; get_time(tstmp); sprintf(line, " [%s] %s: %s\n", tstmp, from, message); - wprintw(wins[curr_win].win, line); - touchwin(wins[curr_win].win); - wrefresh(wins[curr_win].win); + // find the chat window for recipient + int i; + for (i = 1; i < 10; i++) + if (strcmp(wins[i].from, to) == 0) + break; + + // if we didn't find a window + if (i == 10) { + // find the first unused one + for (i = 1; i < 10; i++) + if (strcmp(wins[i].from, "") == 0) + break; + + // set it up and print the message to it + strcpy(wins[i].from, to); + wclear(wins[i].win); + wprintw(wins[i].win, line); + + // signify active window in status bar + inp_bar_active(i); + + // if its the current window, draw it + if (curr_win == i) { + touchwin(wins[i].win); + wrefresh(wins[i].win); + } + } + // otherwise + else { + // add the line to the senders window + wprintw(wins[i].win, line); + + // signify active window in status bar + inp_bar_active(i); + + // if its the current window, draw it + if (curr_win == i) { + touchwin(wins[i].win); + wrefresh(wins[i].win); + } + } } void cons_help(void) diff --git a/windows.h b/windows.h index 05333254..a9a20188 100644 --- a/windows.h +++ b/windows.h @@ -27,12 +27,13 @@ void inp_bar_print_message(char *msg); void gui_init(void); void gui_close(void); +void title_bar_show(char *title); void switch_to(int i); void close_win(void); int in_chat(void); void get_recipient(char *recipient); void show_incomming_msg(char *from, char *message); -void show_outgoing_msg(char *from, char *message); +void show_outgoing_msg(char *from, char *to, char *message); void cons_help(void); void cons_bad_command(char *cmd); void cons_show(char *cmd);