diff --git a/src/command.c b/src/command.c index d5245e0d..938142e4 100644 --- a/src/command.c +++ b/src/command.c @@ -65,6 +65,7 @@ static gboolean _cmd_about(const char * const inp, struct cmd_help_t help); static gboolean _cmd_prefs(const char * const inp, struct cmd_help_t help); static gboolean _cmd_who(const char * const inp, struct cmd_help_t help); static gboolean _cmd_connect(const char * const inp, struct cmd_help_t help); +static gboolean _cmd_disconnect(const char * const inp, struct cmd_help_t help); static gboolean _cmd_msg(const char * const inp, struct cmd_help_t help); static gboolean _cmd_tiny(const char * const inp, struct cmd_help_t help); static gboolean _cmd_close(const char * const inp, struct cmd_help_t help); @@ -124,6 +125,15 @@ static struct cmd_t main_commands[] = "Example: /connect myuser@gmail.com", NULL } } }, + { "/disconnect", + _cmd_disconnect, + { "/disconnect", "Logout of current jabber session.", + { "/disconnect", + "------------------", + "Disconnect from the current jabber session.", + "See the /connect command for connecting again.", + NULL } } }, + { "/prefs", _cmd_prefs, { "/prefs", "Show current preferences.", @@ -564,6 +574,27 @@ _cmd_connect(const char * const inp, struct cmd_help_t help) return result; } +static gboolean +_cmd_disconnect(const char * const inp, struct cmd_help_t help) +{ + char *jid = strdup(jabber_get_jid()); + gboolean wait_response = jabber_disconnect(); + + if (wait_response) { + while (jabber_get_connection_status() == JABBER_DISCONNECTING) { + jabber_process_events(); + } + jabber_free_resources(); + } + + contact_list_clear(); + jabber_restart(); + cons_show("%s logged out successfully.", jid); + free(jid); + + return TRUE; +} + static gboolean _cmd_quit(const char * const inp, struct cmd_help_t help) { diff --git a/src/jabber.c b/src/jabber.c index ea7e38c4..2a199676 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -70,6 +70,13 @@ jabber_init(const int disable_tls) jabber_conn.tls_disabled = disable_tls; } +void +jabber_restart(void) +{ + jabber_conn.conn_status = JABBER_STARTED; + jabber_conn.presence = PRESENCE_OFFLINE; +} + jabber_conn_status_t jabber_connect(const char * const user, const char * const passwd) diff --git a/src/jabber.h b/src/jabber.h index b7e3f87c..a03566a7 100644 --- a/src/jabber.h +++ b/src/jabber.h @@ -51,5 +51,6 @@ void jabber_update_presence(jabber_presence_t status, const char * const msg); const char * jabber_get_jid(void); jabber_conn_status_t jabber_get_connection_status(void); void jabber_free_resources(void); +void jabber_restart(void); #endif diff --git a/src/profanity.c b/src/profanity.c index c13e13a9..11270d3e 100644 --- a/src/profanity.c +++ b/src/profanity.c @@ -134,7 +134,7 @@ loop_out: void prof_handle_login_success(const char *jid) { - const char *msg = " logged in successfully."; + const char *msg = "logged in successfully."; cons_show("%s %s", jid, msg); title_bar_set_status(PRESENCE_ONLINE); log_info("%s %s", jid, msg); @@ -201,7 +201,7 @@ prof_handle_roster(GSList *roster) } static void -_create_config_directory() +_create_config_directory(void) { GString *dir = g_string_new(getenv("HOME")); g_string_append(dir, "/.profanity");