diff options
author | James Booth <boothj5@gmail.com> | 2012-10-31 21:19:08 +0000 |
---|---|---|
committer | James Booth <boothj5@gmail.com> | 2012-10-31 21:19:08 +0000 |
commit | 3c82fb28c4e19e390159cbb60563b541d88ae343 (patch) | |
tree | 215fc5975abc7a8beb6acf32e13ceaca186fc944 /src | |
parent | 5ce977284b1d8b4243902640c3be09db214c875e (diff) | |
download | profani-tty-3c82fb28c4e19e390159cbb60563b541d88ae343.tar.gz |
Added boilerplate code to handle chat states
Diffstat (limited to 'src')
-rw-r--r-- | src/chat_session.c | 19 | ||||
-rw-r--r-- | src/chat_session.h | 4 | ||||
-rw-r--r-- | src/jabber.c | 67 |
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; } |