1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-09-22 19:45:54 -04:00

Implemented /autoaway mode idle

This commit is contained in:
James Booth 2012-12-01 17:46:25 +00:00
parent f7d0bcba4c
commit fae848ea64
6 changed files with 46 additions and 16 deletions

View File

@ -546,7 +546,7 @@ static struct cmd_t setting_commands[] =
" away - Sends an away presence.",
" off - Disabled (default).",
"time : Number of minutes before the presence change is sent, the default is 15.",
"message : Optional message to send with the presence change.",
"message : Optional message to send with the presence change, use no value to clear.",
"check : on|off, when enabled, checks for activity and sends online presence, default is 'on'.",
"",
"Example: /autoaway mode idle",
@ -1765,8 +1765,13 @@ _cmd_set_autoaway(gchar **args, struct cmd_help_t help)
}
if (strcmp(setting, "message") == 0) {
if (strcmp(value, "off") == 0) {
prefs_set_autoaway_message(NULL);
cons_show("Auto away message cleared.");
} else {
prefs_set_autoaway_message(value);
cons_show("Auto away message set to: \"%s\".", value);
}
return TRUE;
}
@ -1789,7 +1794,7 @@ _cmd_set_priority(gchar **args, struct cmd_help_t help)
char *status = jabber_get_status();
prefs_set_priority((int)intval);
// update presence with new priority
jabber_update_presence(jabber_get_presence(), status);
jabber_update_presence(jabber_get_presence(), status, 0);
if (status != NULL)
free(status);
cons_show("Priority set to %d.", intval);
@ -1899,7 +1904,7 @@ _update_presence(const jabber_presence_t presence,
if (conn_status != JABBER_CONNECTED) {
cons_show("You are not currently connected.");
} else {
jabber_update_presence(presence, msg);
jabber_update_presence(presence, msg, 0);
title_bar_set_status(presence);
if (msg != NULL) {
cons_show("Status set to %s, \"%s\"", show, msg);

View File

@ -324,7 +324,8 @@ jabber_leave_chat_room(const char * const room_jid)
}
void
jabber_update_presence(jabber_presence_t status, const char * const msg)
jabber_update_presence(jabber_presence_t status, const char * const msg,
int idle)
{
int pri;
char *show;
@ -379,6 +380,17 @@ jabber_update_presence(jabber_presence_t status, const char * const msg)
xmpp_stanza_add_child(priority, value);
xmpp_stanza_add_child(presence, priority);
}
if (idle > 0) {
xmpp_stanza_t *query = xmpp_stanza_new(jabber_conn.ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
xmpp_stanza_set_ns(query, STANZA_NS_LASTACTIVITY);
char idle_str[10];
snprintf(idle_str, sizeof(idle_str), "%d", idle);
xmpp_stanza_set_attribute(query, STANZA_ATTR_SECONDS, idle_str);
xmpp_stanza_add_child(presence, query);
}
xmpp_send(jabber_conn.conn, presence);
// send presence for each room
@ -891,7 +903,7 @@ _roster_handler(xmpp_conn_t * const conn,
* presence rather than PRESENCE_ONLINE. It will be helpful
* when I set dnd status and reconnect for some reason */
// send initial presence
jabber_update_presence(PRESENCE_ONLINE, NULL);
jabber_update_presence(PRESENCE_ONLINE, NULL, 0);
}
return 1;

View File

@ -62,7 +62,8 @@ void jabber_send_inactive(const char * const recipient);
void jabber_send_composing(const char * const recipient);
void jabber_send_paused(const char * const recipient);
void jabber_send_gone(const char * const recipient);
void jabber_update_presence(jabber_presence_t status, const char * const msg);
void jabber_update_presence(jabber_presence_t status, const char * const msg,
int idle);
const char * jabber_get_jid(void);
jabber_conn_status_t jabber_get_connection_status(void);
int jabber_get_priority(void);

View File

@ -389,7 +389,11 @@ prefs_get_autoaway_message(void)
void
prefs_set_autoaway_message(gchar *value)
{
if (value == NULL) {
g_key_file_remove_key(prefs, "autoaway", "message", NULL);
} else {
g_key_file_set_string(prefs, "autoaway", "message", value);
}
_save_prefs();
}

View File

@ -452,8 +452,10 @@ _handle_idle_time()
if (!idle) {
if (idle_ms >= prefs_time) {
idle = TRUE;
// handle away mode
if (strcmp(prefs_get_autoaway_mode(), "away") == 0) {
jabber_update_presence(PRESENCE_AWAY, prefs_get_autoaway_message());
jabber_update_presence(PRESENCE_AWAY, prefs_get_autoaway_message(), 0);
if (prefs_get_autoaway_message() != NULL) {
cons_show("Idle for %d minutes, status set to away, \"%s\".",
prefs_get_autoaway_time(), prefs_get_autoaway_message());
@ -465,24 +467,28 @@ _handle_idle_time()
title_bar_set_status(PRESENCE_AWAY);
win_current_page_off();
}
// handle idle mode
} else if (strcmp(prefs_get_autoaway_mode(), "idle") == 0) {
cons_show("IDLE");
win_current_page_off();
jabber_update_presence(PRESENCE_ONLINE,
prefs_get_autoaway_message(), idle_ms / 1000);
}
}
} else {
if (idle_ms < prefs_time) {
idle = FALSE;
// handle check
if (prefs_get_autoaway_check()) {
if (strcmp(prefs_get_autoaway_mode(), "away") == 0) {
jabber_update_presence(PRESENCE_ONLINE, NULL);
cons_show("Auto presence online.");
jabber_update_presence(PRESENCE_ONLINE, NULL, 0);
cons_show("No longer idle, status set to online.");
title_bar_set_status(PRESENCE_ONLINE);
win_current_page_off();
} else if (strcmp(prefs_get_autoaway_mode(), "idle") == 0) {
cons_show("BACK");
win_current_page_off();
jabber_update_presence(PRESENCE_ONLINE, NULL, 0);
title_bar_set_status(PRESENCE_ONLINE);
}
}
}

View File

@ -71,6 +71,7 @@
#define STANZA_ATTR_NICK "nick"
#define STANZA_ATTR_ASK "ask"
#define STANZA_ATTR_ID "id"
#define STANZA_ATTR_SECONDS "seconds"
#define STANZA_TEXT_AWAY "away"
#define STANZA_TEXT_DND "dnd"
@ -82,6 +83,7 @@
#define STANZA_NS_MUC "http://jabber.org/protocol/muc"
#define STANZA_NS_MUC_USER "http://jabber.org/protocol/muc#user"
#define STANZA_NS_PING "urn:xmpp:ping"
#define STANZA_NS_LASTACTIVITY "jabber:iq:last"
xmpp_stanza_t* stanza_create_chat_state(xmpp_ctx_t *ctx,
const char * const recipient, const char * const state);