about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2012-11-19 22:15:53 +0000
committerJames Booth <boothj5@gmail.com>2012-11-19 22:15:53 +0000
commitb3e1d473a2a509122400f8830dc8dfecdce8f423 (patch)
tree68b71a534ba4e6c5b67b5e27bd60fa6f809f1298
parentdb15494e2289bcf6c07a4b4e71e0a3791569236d (diff)
downloadprofani-tty-b3e1d473a2a509122400f8830dc8dfecdce8f423.tar.gz
Handle room broadcasts
-rw-r--r--src/jabber.c34
-rw-r--r--src/profanity.c8
-rw-r--r--src/profanity.h2
-rw-r--r--src/room_chat.c7
-rw-r--r--src/room_chat.h1
-rw-r--r--src/ui.h2
-rw-r--r--src/windows.c22
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
@@ -239,6 +239,14 @@ prof_handle_room_subject(const char * const room_jid, const char * const subject
 }
 
 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)
 {
     room_set_roster_received(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
@@ -882,6 +882,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)
 {
     WINDOW *win = _wins[_curr_prof_win].win;