about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2012-10-31 21:19:08 +0000
committerJames Booth <boothj5@gmail.com>2012-10-31 21:19:08 +0000
commit3c82fb28c4e19e390159cbb60563b541d88ae343 (patch)
tree215fc5975abc7a8beb6acf32e13ceaca186fc944 /src
parent5ce977284b1d8b4243902640c3be09db214c875e (diff)
downloadprofani-tty-3c82fb28c4e19e390159cbb60563b541d88ae343.tar.gz
Added boilerplate code to handle chat states
Diffstat (limited to 'src')
-rw-r--r--src/chat_session.c19
-rw-r--r--src/chat_session.h4
-rw-r--r--src/jabber.c67
3 files changed, 71 insertions, 19 deletions
diff --git a/src/chat_session.c b/src/chat_session.c
index a272f3f6..2031dcd4 100644
--- a/src/chat_session.c
+++ b/src/chat_session.c
@@ -28,8 +28,8 @@
 #include "chat_session.h"
 #include "log.h"
 
-#define INACTIVE_TIMOUT 10.0
-#define GONE_TIMOUT 20.0
+#define INACTIVE_TIMOUT 120.0
+#define GONE_TIMOUT 600.0
 
 static ChatSession _chat_session_new(const char * const recipient,
     gboolean recipient_supports);
@@ -181,7 +181,7 @@ chat_session_gone(const char * const recipient)
 }
 
 gboolean
-chat_session_recipient_supports(const char * const recipient)
+chat_session_get_recipient_supports(const char * const recipient)
 {
     ChatSession session = g_hash_table_lookup(sessions, recipient);
 
@@ -193,6 +193,19 @@ chat_session_recipient_supports(const char * const recipient)
     }
 }
 
+void
+chat_session_set_recipient_supports(const char * const recipient,
+    gboolean recipient_supports)
+{
+    ChatSession session = g_hash_table_lookup(sessions, recipient);
+
+    if (session == NULL) {
+        log_error("No chat session found for %s.", recipient);
+    } else {
+        session->recipient_supports = recipient_supports;
+    }
+}
+
 static ChatSession
 _chat_session_new(const char * const recipient, gboolean recipient_supports)
 {
diff --git a/src/chat_session.h b/src/chat_session.h
index fc58cb49..01a85e2f 100644
--- a/src/chat_session.h
+++ b/src/chat_session.h
@@ -33,7 +33,9 @@ void chat_session_start(const char * const recipient,
     gboolean recipient_supports);
 gboolean chat_session_exists(const char * const recipient);
 void chat_session_end(const char * const recipient);
-gboolean chat_session_recipient_supports(const char * const recipient);
+gboolean chat_session_get_recipient_supports(const char * const recipient);
+void chat_session_set_recipient_supports(const char * const recipient,
+    gboolean recipient_supports);
 
 void chat_session_set_active(const char * const recipient);
 void chat_session_no_activity(const char * const recipient);
diff --git a/src/jabber.c b/src/jabber.c
index 584b8f4c..11ada5ed 100644
--- a/src/jabber.c
+++ b/src/jabber.c
@@ -158,7 +158,8 @@ jabber_send(const char * const msg, const char * const recipient)
     text = xmpp_stanza_new(jabber_conn.ctx);
     xmpp_stanza_set_text(text, coded_msg3);
 
-    if (chat_session_recipient_supports(recipient)) {
+    // always send <active/> with messages when recipient supports chat states
+    if (chat_session_get_recipient_supports(recipient)) {
         active = xmpp_stanza_new(jabber_conn.ctx);
         xmpp_stanza_set_name(active, "active");
         xmpp_stanza_set_ns(active, "http://jabber.org/protocol/chatstates");
@@ -352,26 +353,62 @@ _message_handler(xmpp_conn_t * const conn,
         }
     }
 
-    xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(stanza, "body");
 
-    // if no message, check for chatstates
-    if (body == NULL) {
+    char from_cpy[strlen(from) + 1];
+    strcpy(from_cpy, from);
+    char *short_from = strtok(from_cpy, "/");
+
+    //determine chatstate support of recipient
+    gboolean recipient_supports = FALSE;
+
+    if ((xmpp_stanza_get_child_by_name(stanza, "active") != NULL) ||
+            (xmpp_stanza_get_child_by_name(stanza, "composing") != NULL) ||
+            (xmpp_stanza_get_child_by_name(stanza, "paused") != NULL) ||
+            (xmpp_stanza_get_child_by_name(stanza, "gone") != NULL) ||
+            (xmpp_stanza_get_child_by_name(stanza, "inactive") != NULL)) {
+        recipient_supports = TRUE;
+    }
+
+    // create of update session
+    if (!chat_session_exists(short_from)) {
+        chat_session_start(short_from, recipient_supports);
+    } else {
+        chat_session_set_recipient_supports(short_from, recipient_supports);
+    }
+
+    // deal with chat states
+    if (recipient_supports) {
 
-        if (prefs_get_notify_typing() || prefs_get_intype()) {
-            if (xmpp_stanza_get_child_by_name(stanza, "active") != NULL) {
-                // active
-            } else if (xmpp_stanza_get_child_by_name(stanza, "composing") != NULL) {
-                // composing
-                prof_handle_typing(from);
+        // handle <composing/>
+        if (xmpp_stanza_get_child_by_name(stanza, "composing") != NULL) {
+            if (prefs_get_notify_typing() || prefs_get_intype()) {
+                prof_handle_typing(short_from);
             }
-        }
 
-        return 1;
+        // handle <paused/>
+        } else if (xmpp_stanza_get_child_by_name(stanza, "paused") != NULL) {
+            // do something
+
+        // handle <inactive/>
+        } else if (xmpp_stanza_get_child_by_name(stanza, "inactive") != NULL) {
+            // do something
+
+        // handle <gone/>
+        } else if (xmpp_stanza_get_child_by_name(stanza, "gone") != NULL) {
+            // do something
+
+        // handle <active/>
+        } else {
+            // do something
+        }
     }
 
-    // message body recieved
-    char *message = xmpp_stanza_get_text(body);
-    prof_handle_incoming_message(from, message);
+    // check for and deal with message
+    xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(stanza, "body");
+    if (body != NULL) {
+        char *message = xmpp_stanza_get_text(body);
+        prof_handle_incoming_message(short_from, message);
+    }
 
     return 1;
 }