From b3e1d473a2a509122400f8830dc8dfecdce8f423 Mon Sep 17 00:00:00 2001 From: James Booth Date: Mon, 19 Nov 2012 22:15:53 +0000 Subject: Handle room broadcasts --- src/jabber.c | 34 +++++++++++++++++++++++++--------- src/profanity.c | 8 ++++++++ src/profanity.h | 2 ++ src/room_chat.c | 7 +++++++ src/room_chat.h | 1 + src/ui.h | 2 ++ src/windows.c | 22 ++++++++++++++++++++++ 7 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/jabber.c b/src/jabber.c index 42051ffb..3ceb238d 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -426,18 +426,34 @@ _groupchat_message_handler(xmpp_stanza_t * const stanza) char *room = NULL; char *nick = NULL; char *message = NULL; - xmpp_stanza_t *subject = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_SUBJECT); gchar *room_jid = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); - // handle subject - if (subject != NULL) { - message = xmpp_stanza_get_text(subject); - if (message != NULL) { - room = room_get_room_from_full_jid(room_jid); - prof_handle_room_subject(room, message); - } + // handle room broadcasts + if (room_from_jid_is_room(room_jid)) { + xmpp_stanza_t *subject = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_SUBJECT); - return 1; + // handle subject + if (subject != NULL) { + message = xmpp_stanza_get_text(subject); + if (message != NULL) { + room = room_get_room_from_full_jid(room_jid); + prof_handle_room_subject(room, message); + } + + return 1; + + // handle other room broadcasts + } else { + xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_BODY); + if (body != NULL) { + message = xmpp_stanza_get_text(body); + if (message != NULL) { + prof_handle_room_broadcast(room_jid, message); + } + } + + return 1; + } } // room jid not of form room/nick diff --git a/src/profanity.c b/src/profanity.c index debfa448..a008a88a 100644 --- a/src/profanity.c +++ b/src/profanity.c @@ -238,6 +238,14 @@ prof_handle_room_subject(const char * const room_jid, const char * const subject win_page_off(); } +void +prof_handle_room_broadcast(const char *const room_jid, + const char * const message) +{ + win_show_room_broadcast(room_jid, message); + win_page_off(); +} + void prof_handle_room_roster_complete(const char * const room) { diff --git a/src/profanity.h b/src/profanity.h index b97796fa..d60e9352 100644 --- a/src/profanity.h +++ b/src/profanity.h @@ -59,5 +59,7 @@ void prof_handle_room_member_nick_change(const char * const room, const char * const old_nick, const char * const nick); void prof_handle_room_nick_change(const char * const room, const char * const nick); +void prof_handle_room_broadcast(const char *const room_jid, + const char * const message); #endif diff --git a/src/room_chat.c b/src/room_chat.c index 21d8e1df..cc295c18 100644 --- a/src/room_chat.c +++ b/src/room_chat.c @@ -153,6 +153,13 @@ room_get_room_from_full_jid(const char * const full_room_jid) } } +gboolean +room_from_jid_is_room(const char * const room_jid) +{ + gchar *result = g_strrstr(room_jid, "/"); + return (result == NULL); +} + char * room_get_nick_from_full_jid(const char * const full_room_jid) { diff --git a/src/room_chat.h b/src/room_chat.h index 9a210bbe..0761bc48 100644 --- a/src/room_chat.h +++ b/src/room_chat.h @@ -41,6 +41,7 @@ void room_add_pending_nick_change(const char * const room, char* room_complete_pending_nick_change(const char * const room, const char * const nick); gboolean room_nick_in_roster(const char * const room, const char * const nick); +gboolean room_from_jid_is_room(const char * const room_jid); GList * room_get_roster(const char * const room); void room_set_roster_received(const char * const room); diff --git a/src/ui.h b/src/ui.h index 62f95526..0ef70a1f 100644 --- a/src/ui.h +++ b/src/ui.h @@ -125,6 +125,8 @@ void win_show_room_message(const char * const room_jid, const char * const nick, const char * const message); void win_show_room_subject(const char * const room_jid, const char * const subject); +void win_show_room_broadcast(const char * const room_jid, + const char * const message); void win_show_room_member_offline(const char * const room, const char * const nick); void win_show_room_member_online(const char * const room, const char * const nick, const char * const show, const char * const status); diff --git a/src/windows.c b/src/windows.c index dd0cec21..ecaa3c27 100644 --- a/src/windows.c +++ b/src/windows.c @@ -881,6 +881,28 @@ win_show_room_subject(const char * const room_jid, const char * const subject) } } +void +win_show_room_broadcast(const char * const room_jid, const char * const message) +{ + int win_index = _find_prof_win_index(room_jid); + WINDOW *win = _wins[win_index].win; + + wattron(win, COLOUR_INC); + wprintw(win, "Room message: "); + wattroff(win, COLOUR_INC); + wprintw(win, "%s\n", message); + + // currently in groupchat window + if (win_index == _curr_prof_win) { + status_bar_active(win_index); + dirty = TRUE; + + // not currenlty on groupchat window + } else { + status_bar_new(win_index); + } +} + void win_show(const char * const msg) { -- cgit 1.4.1-2-gfad0