static void _presence_join_room(char *room, char *nick, char * passwd) { Jid *jid = jid_create_from_bare_and_resource(room, nick); log_debug("Sending room join presence to: %s", jid->fulljid); xmpp_ctx_t *ctx = connection_get_ctx(); xmpp_conn_t *conn = connection_get_conn(); resource_presence_t presence_type = accounts_get_last_presence(jabber_get_account_name()); const char *show = stanza_get_presence_string_from_type(presence_type); char *status = jabber_get_presence_message(); int pri = accounts_get_priority_for_presence_type(jabber_get_account_name(), presence_type); xmpp_stanza_t *presence = stanza_create_room_join_presence(ctx, jid->fulljid, passwd); stanza_attach_show(ctx, presence, show); stanza_attach_status(ctx, presence, status); stanza_attach_priority(ctx, presence, pri); stanza_attach_caps(ctx, presence); xmpp_send(conn, presence); xmpp_stanza_release(presence); jid_destroy(jid); }
static void _presence_change_room_nick(const char * const room, const char * const nick) { assert(room != NULL); assert(nick != NULL); log_debug("Sending room nickname change to: %s, nick: %s", room, nick); xmpp_ctx_t *ctx = connection_get_ctx(); xmpp_conn_t *conn = connection_get_conn(); resource_presence_t presence_type = accounts_get_last_presence(jabber_get_account_name()); const char *show = stanza_get_presence_string_from_type(presence_type); char *status = jabber_get_presence_message(); int pri = accounts_get_priority_for_presence_type(jabber_get_account_name(), presence_type); char *full_room_jid = create_fulljid(room, nick); xmpp_stanza_t *presence = stanza_create_room_newnick_presence(ctx, full_room_jid); stanza_attach_show(ctx, presence, show); stanza_attach_status(ctx, presence, status); stanza_attach_priority(ctx, presence, pri); stanza_attach_caps(ctx, presence); xmpp_send(conn, presence); xmpp_stanza_release(presence); free(full_room_jid); }
void ui_update_presence(const resource_presence_t resource_presence, const char *const message, const char *const show) { contact_presence_t contact_presence = contact_presence_from_resource_presence(resource_presence); title_bar_set_presence(contact_presence); gint priority = accounts_get_priority_for_presence_type(session_get_account_name(), resource_presence); if (message) { cons_show("Status set to %s (priority %d), \"%s\".", show, priority, message); } else { cons_show("Status set to %s (priority %d).", show, priority); } }
static void _presence_update(const resource_presence_t presence_type, const char * const msg, const int idle) { if (jabber_get_connection_status() != JABBER_CONNECTED) { log_warning("Error setting presence, not connected."); return; } if (msg != NULL) { log_debug("Updating presence: %s, \"%s\"", string_from_resource_presence(presence_type), msg); } else { log_debug("Updating presence: %s", string_from_resource_presence(presence_type)); } xmpp_ctx_t * const ctx = connection_get_ctx(); xmpp_conn_t * const conn = connection_get_conn(); const int pri = accounts_get_priority_for_presence_type(jabber_get_account_name(), presence_type); const char *show = stanza_get_presence_string_from_type(presence_type); connection_set_presence_message(msg); connection_set_priority(pri); xmpp_stanza_t *presence = stanza_create_presence(ctx); char *id = create_unique_id("presence"); xmpp_stanza_set_id(presence, id); stanza_attach_show(ctx, presence, show); stanza_attach_status(ctx, presence, msg); stanza_attach_priority(ctx, presence, pri); stanza_attach_last_activity(ctx, presence, idle); stanza_attach_caps(ctx, presence); xmpp_send(conn, presence); _send_room_presence(conn, presence); xmpp_stanza_release(presence); // set last presence for account const char *last = show; if (last == NULL) { last = STANZA_TEXT_ONLINE; } accounts_set_last_presence(jabber_get_account_name(), last); free(id); }
void cons_show_login_success(ProfAccount *account) { win_print_time(console, '-'); wprintw(console->win, "%s logged in successfully, ", account->jid); resource_presence_t presence = accounts_get_login_presence(account->name); const char *presence_str = string_from_resource_presence(presence); win_presence_colour_on(console, presence_str); wprintw(console->win, "%s", presence_str); win_presence_colour_off(console, presence_str); wprintw(console->win, " (priority %d)", accounts_get_priority_for_presence_type(account->name, presence)); wprintw(console->win, ".\n"); ui_console_dirty(); cons_alert(); }
static void _check_autoaway() { jabber_conn_status_t conn_status = jabber_get_connection_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 = jabber_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); ui_titlebar_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); ui_titlebar_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); ui_titlebar_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); ui_titlebar_presence(contact_pres); } break; } prefs_free_string(mode); }
void presence_send(const resource_presence_t presence_type, const int idle, char *signed_status) { if (connection_get_status() != JABBER_CONNECTED) { log_warning("Error setting presence, not connected."); return; } char *msg = connection_get_presence_msg(); if (msg) { log_debug("Updating presence: %s, \"%s\"", string_from_resource_presence(presence_type), msg); } else { log_debug("Updating presence: %s", string_from_resource_presence(presence_type)); } const int pri = accounts_get_priority_for_presence_type(session_get_account_name(), presence_type); connection_set_priority(pri); xmpp_ctx_t * const ctx = connection_get_ctx(); xmpp_stanza_t *presence = xmpp_presence_new(ctx); char *id = create_unique_id("presence"); xmpp_stanza_set_id(presence, id); free(id); const char *show = stanza_get_presence_string_from_type(presence_type); stanza_attach_show(ctx, presence, show); stanza_attach_status(ctx, presence, msg); if (signed_status) { xmpp_stanza_t *x = xmpp_stanza_new(ctx); xmpp_stanza_set_name(x, STANZA_NAME_X); xmpp_stanza_set_ns(x, STANZA_NS_SIGNED); xmpp_stanza_t *signed_text = xmpp_stanza_new(ctx); xmpp_stanza_set_text(signed_text, signed_status); xmpp_stanza_add_child(x, signed_text); xmpp_stanza_release(signed_text); xmpp_stanza_add_child(presence, x); xmpp_stanza_release(x); } stanza_attach_priority(ctx, presence, pri); if (idle > 0) { stanza_attach_last_activity(ctx, presence, idle); } stanza_attach_caps(ctx, presence); _send_presence_stanza(presence); _send_room_presence(presence); xmpp_stanza_release(presence); // set last presence for account const char *last = show; if (last == NULL) { last = STANZA_TEXT_ONLINE; } char *account = session_get_account_name(); accounts_set_last_presence(account, last); accounts_set_last_status(account, msg); }
static void _handle_idle_time() { gint prefs_time = prefs_get_autoaway_time() * 60000; resource_presence_t current_presence = accounts_get_last_presence(jabber_get_account_name()); unsigned long idle_ms = ui_get_idle_time(); if (!idle) { if ((current_presence == RESOURCE_ONLINE) || (current_presence == RESOURCE_CHAT)) { if (idle_ms >= prefs_time) { idle = TRUE; // handle away mode if (strcmp(prefs_get_string(PREF_AUTOAWAY_MODE), "away") == 0) { presence_update(RESOURCE_AWAY, prefs_get_string(PREF_AUTOAWAY_MESSAGE), 0); if (prefs_get_string(PREF_AUTOAWAY_MESSAGE) != NULL) { int pri = accounts_get_priority_for_presence_type(jabber_get_account_name(), RESOURCE_AWAY); cons_show("Idle for %d minutes, status set to away (priority %d), \"%s\".", prefs_get_autoaway_time(), pri, prefs_get_string(PREF_AUTOAWAY_MESSAGE)); title_bar_set_presence(CONTACT_AWAY); ui_current_page_off(); } else { int pri = accounts_get_priority_for_presence_type(jabber_get_account_name(), RESOURCE_AWAY); cons_show("Idle for %d minutes, status set to away (priority %d).", prefs_get_autoaway_time(), pri); title_bar_set_presence(CONTACT_AWAY); ui_current_page_off(); } // handle idle mode } else if (strcmp(prefs_get_string(PREF_AUTOAWAY_MODE), "idle") == 0) { presence_update(RESOURCE_ONLINE, prefs_get_string(PREF_AUTOAWAY_MESSAGE), idle_ms / 1000); } } } } else { if (idle_ms < prefs_time) { idle = FALSE; // handle check if (prefs_get_boolean(PREF_AUTOAWAY_CHECK)) { if (strcmp(prefs_get_string(PREF_AUTOAWAY_MODE), "away") == 0) { presence_update(RESOURCE_ONLINE, NULL, 0); int pri = accounts_get_priority_for_presence_type(jabber_get_account_name(), RESOURCE_ONLINE); cons_show("No longer idle, status set to online (priority %d).", pri); title_bar_set_presence(CONTACT_ONLINE); ui_current_page_off(); } else if (strcmp(prefs_get_string(PREF_AUTOAWAY_MODE), "idle") == 0) { presence_update(RESOURCE_ONLINE, NULL, 0); title_bar_set_presence(CONTACT_ONLINE); } } } } }