diff options
author | James Booth <boothj5@gmail.com> | 2016-07-24 16:06:19 +0100 |
---|---|---|
committer | James Booth <boothj5@gmail.com> | 2016-07-24 16:06:24 +0100 |
commit | e7bfaa643fd8f57c50390194b0c804cacd5a0de4 (patch) | |
tree | 8dcf33ed027105938c759aa2d7df118205717554 | |
parent | 0a57c4de78f8a3cd4efb631a79b000b42f16fc15 (diff) | |
download | profani-tty-e7bfaa643fd8f57c50390194b0c804cacd5a0de4.tar.gz |
Move autoaway check
-rw-r--r-- | src/profanity.c | 142 | ||||
-rw-r--r-- | src/xmpp/session.c | 141 | ||||
-rw-r--r-- | src/xmpp/session.h | 3 | ||||
-rw-r--r-- | tests/unittests/xmpp/stub_xmpp.c | 2 |
4 files changed, 149 insertions, 139 deletions
diff --git a/src/profanity.c b/src/profanity.c index 7d90c1c9..d8f546a3 100644 --- a/src/profanity.c +++ b/src/profanity.c @@ -63,6 +63,7 @@ #include "ui/ui.h" #include "ui/window_list.h" #include "xmpp/resource.h" +#include "xmpp/session.h" #include "xmpp/xmpp.h" #include "xmpp/muc.h" #include "xmpp/chat_session.h" @@ -78,24 +79,11 @@ #include "pgp/gpg.h" #endif - -static void _check_autoaway(void); static void _init(char *log_level); static void _shutdown(void); static void _create_directories(void); static void _connect_default(const char * const account); -typedef enum { - ACTIVITY_ST_ACTIVE, - ACTIVITY_ST_IDLE, - ACTIVITY_ST_AWAY, - ACTIVITY_ST_XA, -} activity_state_t; - -activity_state_t activity_state; -resource_presence_t saved_presence; -char *saved_status; - static gboolean cont = TRUE; static gboolean force_quit = FALSE; @@ -110,13 +98,12 @@ prof_run(char *log_level, char *account_name) log_info("Starting main event loop"); - activity_state = ACTIVITY_ST_ACTIVE; - saved_status = NULL; + session_init_activity(); char *line = NULL; while(cont && !force_quit) { log_stderr_handler(); - _check_autoaway(); + session_check_autoaway(); line = inp_readline(); if (line) { @@ -164,126 +151,6 @@ _connect_default(const char *const account) } static void -_check_autoaway(void) -{ - jabber_conn_status_t conn_status = connection_get_status(); - if (conn_status != JABBER_CONNECTED) { - return; - } - - char *mode = prefs_get_string(PREF_AUTOAWAY_MODE); - gboolean check = prefs_get_boolean(PREF_AUTOAWAY_CHECK); - gint away_time = prefs_get_autoaway_time(); - gint xa_time = prefs_get_autoxa_time(); - int away_time_ms = away_time * 60000; - int xa_time_ms = xa_time * 60000; - - char *account = session_get_account_name(); - resource_presence_t curr_presence = accounts_get_last_presence(account); - char *curr_status = accounts_get_last_status(account); - - unsigned long idle_ms = ui_get_idle_time(); - - switch (activity_state) { - case ACTIVITY_ST_ACTIVE: - if (idle_ms >= away_time_ms) { - if (g_strcmp0(mode, "away") == 0) { - if ((curr_presence == RESOURCE_ONLINE) || (curr_presence == RESOURCE_CHAT) || (curr_presence == RESOURCE_DND)) { - activity_state = ACTIVITY_ST_AWAY; - - // save current presence - saved_presence = curr_presence; - if (saved_status) { - free(saved_status); - } - saved_status = curr_status; - - // send away presence with last activity - char *message = prefs_get_string(PREF_AUTOAWAY_MESSAGE); - if (prefs_get_boolean(PREF_LASTACTIVITY)) { - cl_ev_presence_send(RESOURCE_AWAY, message, idle_ms / 1000); - } else { - cl_ev_presence_send(RESOURCE_AWAY, message, 0); - } - - int pri = accounts_get_priority_for_presence_type(account, RESOURCE_AWAY); - if (message) { - cons_show("Idle for %d minutes, status set to away (priority %d), \"%s\".", away_time, pri, message); - } else { - cons_show("Idle for %d minutes, status set to away (priority %d).", away_time, pri); - } - prefs_free_string(message); - - title_bar_set_presence(CONTACT_AWAY); - } - } else if (g_strcmp0(mode, "idle") == 0) { - activity_state = ACTIVITY_ST_IDLE; - - // send current presence with last activity - cl_ev_presence_send(curr_presence, curr_status, idle_ms / 1000); - } - } - break; - case ACTIVITY_ST_IDLE: - if (check && (idle_ms < away_time_ms)) { - activity_state = ACTIVITY_ST_ACTIVE; - - cons_show("No longer idle."); - - // send current presence without last activity - cl_ev_presence_send(curr_presence, curr_status, 0); - } - break; - case ACTIVITY_ST_AWAY: - if (xa_time_ms > 0 && (idle_ms >= xa_time_ms)) { - activity_state = ACTIVITY_ST_XA; - - // send extended away presence with last activity - char *message = prefs_get_string(PREF_AUTOXA_MESSAGE); - if (prefs_get_boolean(PREF_LASTACTIVITY)) { - cl_ev_presence_send(RESOURCE_XA, message, idle_ms / 1000); - } else { - cl_ev_presence_send(RESOURCE_XA, message, 0); - } - - int pri = accounts_get_priority_for_presence_type(account, RESOURCE_XA); - if (message) { - cons_show("Idle for %d minutes, status set to xa (priority %d), \"%s\".", xa_time, pri, message); - } else { - cons_show("Idle for %d minutes, status set to xa (priority %d).", xa_time, pri); - } - prefs_free_string(message); - - title_bar_set_presence(CONTACT_XA); - } else if (check && (idle_ms < away_time_ms)) { - activity_state = ACTIVITY_ST_ACTIVE; - - cons_show("No longer idle."); - - // send saved presence without last activity - cl_ev_presence_send(saved_presence, saved_status, 0); - contact_presence_t contact_pres = contact_presence_from_resource_presence(saved_presence); - title_bar_set_presence(contact_pres); - } - break; - case ACTIVITY_ST_XA: - if (check && (idle_ms < away_time_ms)) { - activity_state = ACTIVITY_ST_ACTIVE; - - cons_show("No longer idle."); - - // send saved presence without last activity - cl_ev_presence_send(saved_presence, saved_status, 0); - contact_presence_t contact_pres = contact_presence_from_resource_presence(saved_presence); - title_bar_set_presence(contact_pres); - } - break; - } - - prefs_free_string(mode); -} - -static void _init(char *log_level) { setlocale(LC_ALL, ""); @@ -376,9 +243,6 @@ _shutdown(void) cmd_uninit(); ui_close(); prefs_close(); - if (saved_status) { - free(saved_status); - } } static void diff --git a/src/xmpp/session.c b/src/xmpp/session.c index 5c9c3b4c..9fe448f8 100644 --- a/src/xmpp/session.c +++ b/src/xmpp/session.c @@ -44,6 +44,7 @@ #include "config/preferences.h" #include "plugins/plugins.h" #include "event/server_events.h" +#include "event/client_events.h" #include "xmpp/bookmark.h" #include "xmpp/blocking.h" #include "xmpp/connection.h" @@ -74,7 +75,17 @@ static struct { char *tls_policy; } saved_details; +typedef enum { + ACTIVITY_ST_ACTIVE, + ACTIVITY_ST_IDLE, + ACTIVITY_ST_AWAY, + ACTIVITY_ST_XA, +} activity_state_t; + static GTimer *reconnect_timer; +static activity_state_t activity_state; +static resource_presence_t saved_presence; +static char *saved_status; static void _session_reconnect(void); @@ -225,6 +236,9 @@ session_shutdown(void) presence_clear_sub_requests(); connection_shutdown(); + if (saved_status) { + free(saved_status); + } } void @@ -343,6 +357,133 @@ session_lost_connection(void) presence_clear_sub_requests(); } +void +session_init_activity(void) +{ + activity_state = ACTIVITY_ST_ACTIVE; + saved_status = NULL; +} + +void +session_check_autoaway(void) +{ + jabber_conn_status_t conn_status = connection_get_status(); + if (conn_status != JABBER_CONNECTED) { + return; + } + + char *mode = prefs_get_string(PREF_AUTOAWAY_MODE); + gboolean check = prefs_get_boolean(PREF_AUTOAWAY_CHECK); + gint away_time = prefs_get_autoaway_time(); + gint xa_time = prefs_get_autoxa_time(); + int away_time_ms = away_time * 60000; + int xa_time_ms = xa_time * 60000; + + char *account = session_get_account_name(); + resource_presence_t curr_presence = accounts_get_last_presence(account); + char *curr_status = accounts_get_last_status(account); + + unsigned long idle_ms = ui_get_idle_time(); + + switch (activity_state) { + case ACTIVITY_ST_ACTIVE: + if (idle_ms >= away_time_ms) { + if (g_strcmp0(mode, "away") == 0) { + if ((curr_presence == RESOURCE_ONLINE) || (curr_presence == RESOURCE_CHAT) || (curr_presence == RESOURCE_DND)) { + activity_state = ACTIVITY_ST_AWAY; + + // save current presence + saved_presence = curr_presence; + if (saved_status) { + free(saved_status); + } + saved_status = curr_status; + + // send away presence with last activity + char *message = prefs_get_string(PREF_AUTOAWAY_MESSAGE); + if (prefs_get_boolean(PREF_LASTACTIVITY)) { + cl_ev_presence_send(RESOURCE_AWAY, message, idle_ms / 1000); + } else { + cl_ev_presence_send(RESOURCE_AWAY, message, 0); + } + + int pri = accounts_get_priority_for_presence_type(account, RESOURCE_AWAY); + if (message) { + cons_show("Idle for %d minutes, status set to away (priority %d), \"%s\".", away_time, pri, message); + } else { + cons_show("Idle for %d minutes, status set to away (priority %d).", away_time, pri); + } + prefs_free_string(message); + + title_bar_set_presence(CONTACT_AWAY); + } + } else if (g_strcmp0(mode, "idle") == 0) { + activity_state = ACTIVITY_ST_IDLE; + + // send current presence with last activity + cl_ev_presence_send(curr_presence, curr_status, idle_ms / 1000); + } + } + break; + case ACTIVITY_ST_IDLE: + if (check && (idle_ms < away_time_ms)) { + activity_state = ACTIVITY_ST_ACTIVE; + + cons_show("No longer idle."); + + // send current presence without last activity + cl_ev_presence_send(curr_presence, curr_status, 0); + } + break; + case ACTIVITY_ST_AWAY: + if (xa_time_ms > 0 && (idle_ms >= xa_time_ms)) { + activity_state = ACTIVITY_ST_XA; + + // send extended away presence with last activity + char *message = prefs_get_string(PREF_AUTOXA_MESSAGE); + if (prefs_get_boolean(PREF_LASTACTIVITY)) { + cl_ev_presence_send(RESOURCE_XA, message, idle_ms / 1000); + } else { + cl_ev_presence_send(RESOURCE_XA, message, 0); + } + + int pri = accounts_get_priority_for_presence_type(account, RESOURCE_XA); + if (message) { + cons_show("Idle for %d minutes, status set to xa (priority %d), \"%s\".", xa_time, pri, message); + } else { + cons_show("Idle for %d minutes, status set to xa (priority %d).", xa_time, pri); + } + prefs_free_string(message); + + title_bar_set_presence(CONTACT_XA); + } else if (check && (idle_ms < away_time_ms)) { + activity_state = ACTIVITY_ST_ACTIVE; + + cons_show("No longer idle."); + + // send saved presence without last activity + cl_ev_presence_send(saved_presence, saved_status, 0); + contact_presence_t contact_pres = contact_presence_from_resource_presence(saved_presence); + title_bar_set_presence(contact_pres); + } + break; + case ACTIVITY_ST_XA: + if (check && (idle_ms < away_time_ms)) { + activity_state = ACTIVITY_ST_ACTIVE; + + cons_show("No longer idle."); + + // send saved presence without last activity + cl_ev_presence_send(saved_presence, saved_status, 0); + contact_presence_t contact_pres = contact_presence_from_resource_presence(saved_presence); + title_bar_set_presence(contact_pres); + } + break; + } + + prefs_free_string(mode); +} + static void _session_reconnect(void) { diff --git a/src/xmpp/session.h b/src/xmpp/session.h index 1bc67b63..2d51d65c 100644 --- a/src/xmpp/session.h +++ b/src/xmpp/session.h @@ -42,4 +42,7 @@ void session_login_failed(void); void session_lost_connection(void); void session_autoping_fail(void); +void session_init_activity(void); +void session_check_autoaway(void); + #endif diff --git a/tests/unittests/xmpp/stub_xmpp.c b/tests/unittests/xmpp/stub_xmpp.c index 064d002f..c80224a7 100644 --- a/tests/unittests/xmpp/stub_xmpp.c +++ b/tests/unittests/xmpp/stub_xmpp.c @@ -7,6 +7,8 @@ // connection functions void session_init(void) {} +void session_init_activity(void) {} +void session_check_autoaway(void) {} jabber_conn_status_t session_connect_with_details(const char * const jid, const char * const passwd, const char * const altdomain, const int port, const char *const tls_policy) |