mirror of
https://github.com/profanity-im/profanity.git
synced 2024-12-04 14:46:46 -05:00
Added auto reconnect, and /reconnect command to control interval
This commit is contained in:
parent
66d3e6ee02
commit
921f026cba
@ -95,9 +95,7 @@ chat_session_set_composing(const char * const recipient)
|
|||||||
{
|
{
|
||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session != NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
} else {
|
|
||||||
if (session->state != CHAT_STATE_COMPOSING) {
|
if (session->state != CHAT_STATE_COMPOSING) {
|
||||||
session->sent = FALSE;
|
session->sent = FALSE;
|
||||||
}
|
}
|
||||||
@ -111,9 +109,7 @@ chat_session_no_activity(const char * const recipient)
|
|||||||
{
|
{
|
||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session != NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
} else {
|
|
||||||
if (session->active_timer != NULL) {
|
if (session->active_timer != NULL) {
|
||||||
gdouble elapsed = g_timer_elapsed(session->active_timer, NULL);
|
gdouble elapsed = g_timer_elapsed(session->active_timer, NULL);
|
||||||
|
|
||||||
@ -146,9 +142,7 @@ chat_session_set_sent(const char * const recipient)
|
|||||||
{
|
{
|
||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session != NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
} else {
|
|
||||||
session->sent = TRUE;
|
session->sent = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -159,7 +153,6 @@ chat_session_get_sent(const char * const recipient)
|
|||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else {
|
} else {
|
||||||
return session->sent;
|
return session->sent;
|
||||||
@ -178,7 +171,6 @@ chat_session_is_inactive(const char * const recipient)
|
|||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else {
|
} else {
|
||||||
return (session->state == CHAT_STATE_INACTIVE);
|
return (session->state == CHAT_STATE_INACTIVE);
|
||||||
@ -191,7 +183,6 @@ chat_session_is_active(const char * const recipient)
|
|||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else {
|
} else {
|
||||||
return (session->state == CHAT_STATE_ACTIVE);
|
return (session->state == CHAT_STATE_ACTIVE);
|
||||||
@ -203,9 +194,7 @@ chat_session_set_active(const char * const recipient)
|
|||||||
{
|
{
|
||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session != NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
} else {
|
|
||||||
session->state = CHAT_STATE_ACTIVE;
|
session->state = CHAT_STATE_ACTIVE;
|
||||||
g_timer_start(session->active_timer);
|
g_timer_start(session->active_timer);
|
||||||
session->sent = TRUE;
|
session->sent = TRUE;
|
||||||
@ -218,7 +207,6 @@ chat_session_is_paused(const char * const recipient)
|
|||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else {
|
} else {
|
||||||
return (session->state == CHAT_STATE_PAUSED);
|
return (session->state == CHAT_STATE_PAUSED);
|
||||||
@ -231,7 +219,6 @@ chat_session_is_gone(const char * const recipient)
|
|||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else {
|
} else {
|
||||||
return (session->state == CHAT_STATE_GONE);
|
return (session->state == CHAT_STATE_GONE);
|
||||||
@ -243,9 +230,7 @@ chat_session_set_gone(const char * const recipient)
|
|||||||
{
|
{
|
||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session != NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
} else {
|
|
||||||
session->state = CHAT_STATE_GONE;
|
session->state = CHAT_STATE_GONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -256,7 +241,6 @@ chat_session_get_recipient_supports(const char * const recipient)
|
|||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else {
|
} else {
|
||||||
return session->recipient_supports;
|
return session->recipient_supports;
|
||||||
@ -269,9 +253,7 @@ chat_session_set_recipient_supports(const char * const recipient,
|
|||||||
{
|
{
|
||||||
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
ChatSession session = g_hash_table_lookup(sessions, recipient);
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session != NULL) {
|
||||||
log_error("No chat session found for %s.", recipient);
|
|
||||||
} else {
|
|
||||||
session->recipient_supports = recipient_supports;
|
session->recipient_supports = recipient_supports;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,6 +109,7 @@ static gboolean _cmd_set_beep(gchar **args, struct cmd_help_t help);
|
|||||||
static gboolean _cmd_set_notify(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_set_notify(gchar **args, struct cmd_help_t help);
|
||||||
static gboolean _cmd_set_log(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_set_log(gchar **args, struct cmd_help_t help);
|
||||||
static gboolean _cmd_set_priority(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_set_priority(gchar **args, struct cmd_help_t help);
|
||||||
|
static gboolean _cmd_set_reconnect(gchar **args, struct cmd_help_t help);
|
||||||
static gboolean _cmd_set_intype(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_set_intype(gchar **args, struct cmd_help_t help);
|
||||||
static gboolean _cmd_set_flash(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_set_flash(gchar **args, struct cmd_help_t help);
|
||||||
static gboolean _cmd_set_showsplash(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_set_showsplash(gchar **args, struct cmd_help_t help);
|
||||||
@ -485,6 +486,18 @@ static struct cmd_t setting_commands[] =
|
|||||||
"Config file value : maxsize=bytes",
|
"Config file value : maxsize=bytes",
|
||||||
NULL } } },
|
NULL } } },
|
||||||
|
|
||||||
|
{ "/reconnect",
|
||||||
|
_cmd_set_reconnect, parse_args, 1, 1,
|
||||||
|
{ "/reconnect seconds", "Set reconnect interval.",
|
||||||
|
{ "/reconnect seconds",
|
||||||
|
"--------------------",
|
||||||
|
"Set the reconnect attempt interval in seconds for when the connection is lost.",
|
||||||
|
"A value of 0 will switch of reconnect attempts.",
|
||||||
|
"",
|
||||||
|
"Config file section : [jabber]",
|
||||||
|
"Config file value : reconnect=seconds",
|
||||||
|
NULL } } },
|
||||||
|
|
||||||
{ "/priority",
|
{ "/priority",
|
||||||
_cmd_set_priority, parse_args, 1, 1,
|
_cmd_set_priority, parse_args, 1, 1,
|
||||||
{ "/priority <value>", "Set priority for connection.",
|
{ "/priority <value>", "Set priority for connection.",
|
||||||
@ -1467,6 +1480,28 @@ _cmd_set_log(gchar **args, struct cmd_help_t help)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
_cmd_set_reconnect(gchar **args, struct cmd_help_t help)
|
||||||
|
{
|
||||||
|
char *value = args[0];
|
||||||
|
int intval;
|
||||||
|
|
||||||
|
if (_strtoi(value, &intval, 0, INT_MAX) == 0) {
|
||||||
|
prefs_set_reconnect(intval);
|
||||||
|
if (intval == 0) {
|
||||||
|
cons_show("Reconnect disabled.", intval);
|
||||||
|
} else {
|
||||||
|
cons_show("Reconnect interval set to %d seconds.", intval);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cons_show("Usage: %s", help.usage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: make 'level' subcommand for debug level */
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_cmd_set_priority(gchar **args, struct cmd_help_t help)
|
_cmd_set_priority(gchar **args, struct cmd_help_t help)
|
||||||
{
|
{
|
||||||
|
72
src/jabber.c
72
src/jabber.c
@ -48,6 +48,11 @@ static struct _jabber_conn_t {
|
|||||||
int priority;
|
int priority;
|
||||||
} jabber_conn;
|
} jabber_conn;
|
||||||
|
|
||||||
|
// for auto reconnect
|
||||||
|
static char *saved_user;
|
||||||
|
static char *saved_password;
|
||||||
|
static GTimer *reconnect_timer;
|
||||||
|
|
||||||
static log_level_t _get_log_level(xmpp_log_level_t xmpp_level);
|
static log_level_t _get_log_level(xmpp_log_level_t xmpp_level);
|
||||||
static xmpp_log_level_t _get_xmpp_log_level();
|
static xmpp_log_level_t _get_xmpp_log_level();
|
||||||
static void _xmpp_file_logger(void * const userdata,
|
static void _xmpp_file_logger(void * const userdata,
|
||||||
@ -98,15 +103,22 @@ jabber_conn_status_t
|
|||||||
jabber_connect(const char * const user,
|
jabber_connect(const char * const user,
|
||||||
const char * const passwd)
|
const char * const passwd)
|
||||||
{
|
{
|
||||||
log_info("Connecting as %s", user);
|
if (saved_user == NULL) {
|
||||||
|
saved_user = strdup(user);
|
||||||
|
}
|
||||||
|
if (saved_password == NULL) {
|
||||||
|
saved_password = strdup(passwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("Connecting as %s", saved_user);
|
||||||
xmpp_initialize();
|
xmpp_initialize();
|
||||||
|
|
||||||
jabber_conn.log = _xmpp_get_file_logger();
|
jabber_conn.log = _xmpp_get_file_logger();
|
||||||
jabber_conn.ctx = xmpp_ctx_new(NULL, jabber_conn.log);
|
jabber_conn.ctx = xmpp_ctx_new(NULL, jabber_conn.log);
|
||||||
jabber_conn.conn = xmpp_conn_new(jabber_conn.ctx);
|
jabber_conn.conn = xmpp_conn_new(jabber_conn.ctx);
|
||||||
|
|
||||||
xmpp_conn_set_jid(jabber_conn.conn, user);
|
xmpp_conn_set_jid(jabber_conn.conn, saved_user);
|
||||||
xmpp_conn_set_pass(jabber_conn.conn, passwd);
|
xmpp_conn_set_pass(jabber_conn.conn, saved_password);
|
||||||
|
|
||||||
if (jabber_conn.tls_disabled)
|
if (jabber_conn.tls_disabled)
|
||||||
xmpp_conn_disable_tls(jabber_conn.conn);
|
xmpp_conn_disable_tls(jabber_conn.conn);
|
||||||
@ -141,10 +153,21 @@ jabber_disconnect(void)
|
|||||||
void
|
void
|
||||||
jabber_process_events(void)
|
jabber_process_events(void)
|
||||||
{
|
{
|
||||||
|
// run xmpp event loop if connected, connecting or disconnecting
|
||||||
if (jabber_conn.conn_status == JABBER_CONNECTED
|
if (jabber_conn.conn_status == JABBER_CONNECTED
|
||||||
|| jabber_conn.conn_status == JABBER_CONNECTING
|
|| jabber_conn.conn_status == JABBER_CONNECTING
|
||||||
|| jabber_conn.conn_status == JABBER_DISCONNECTING)
|
|| jabber_conn.conn_status == JABBER_DISCONNECTING) {
|
||||||
xmpp_run_once(jabber_conn.ctx, 10);
|
xmpp_run_once(jabber_conn.ctx, 10);
|
||||||
|
|
||||||
|
// check timer and reconnect if disconnected and timer set
|
||||||
|
} else if ((jabber_conn.conn_status == JABBER_DISCONNECTED) &&
|
||||||
|
(reconnect_timer != NULL)) {
|
||||||
|
if (g_timer_elapsed(reconnect_timer, NULL) > (prefs_get_reconnect() * 1.0)) {
|
||||||
|
log_debug("Attempting reconncet as %s", saved_user);
|
||||||
|
jabber_connect(saved_user, saved_password);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -400,6 +423,8 @@ jabber_get_status(void)
|
|||||||
void
|
void
|
||||||
jabber_free_resources(void)
|
jabber_free_resources(void)
|
||||||
{
|
{
|
||||||
|
saved_user = NULL;
|
||||||
|
saved_password = NULL;
|
||||||
chat_sessions_clear();
|
chat_sessions_clear();
|
||||||
xmpp_conn_release(jabber_conn.conn);
|
xmpp_conn_release(jabber_conn.conn);
|
||||||
xmpp_ctx_free(jabber_conn.ctx);
|
xmpp_ctx_free(jabber_conn.ctx);
|
||||||
@ -624,6 +649,7 @@ _connection_handler(xmpp_conn_t * const conn,
|
|||||||
{
|
{
|
||||||
xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
|
xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
|
||||||
|
|
||||||
|
// login success
|
||||||
if (status == XMPP_CONN_CONNECT) {
|
if (status == XMPP_CONN_CONNECT) {
|
||||||
const char *jid = xmpp_conn_get_jid(conn);
|
const char *jid = xmpp_conn_get_jid(conn);
|
||||||
prof_handle_login_success(jid);
|
prof_handle_login_success(jid);
|
||||||
@ -637,26 +663,56 @@ _connection_handler(xmpp_conn_t * const conn,
|
|||||||
_jabber_roster_request();
|
_jabber_roster_request();
|
||||||
jabber_conn.conn_status = JABBER_CONNECTED;
|
jabber_conn.conn_status = JABBER_CONNECTED;
|
||||||
jabber_conn.presence = PRESENCE_ONLINE;
|
jabber_conn.presence = PRESENCE_ONLINE;
|
||||||
|
|
||||||
|
if (reconnect_timer != NULL) {
|
||||||
|
g_timer_destroy(reconnect_timer);
|
||||||
|
reconnect_timer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// received close stream response from server after disconnect
|
// received close stream response from server after disconnect
|
||||||
if (jabber_conn.conn_status == JABBER_DISCONNECTING) {
|
if (jabber_conn.conn_status == JABBER_DISCONNECTING) {
|
||||||
jabber_conn.conn_status = JABBER_DISCONNECTED;
|
jabber_conn.conn_status = JABBER_DISCONNECTED;
|
||||||
jabber_conn.presence = PRESENCE_OFFLINE;
|
jabber_conn.presence = PRESENCE_OFFLINE;
|
||||||
|
if (saved_user != NULL) {
|
||||||
|
free(saved_user);
|
||||||
|
saved_user = NULL;
|
||||||
|
}
|
||||||
|
if (saved_password != NULL) {
|
||||||
|
free(saved_password);
|
||||||
|
saved_password = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// lost connection for unkown reason
|
// lost connection for unkown reason
|
||||||
} else if (jabber_conn.conn_status == JABBER_CONNECTED) {
|
} else if (jabber_conn.conn_status == JABBER_CONNECTED) {
|
||||||
prof_handle_lost_connection();
|
prof_handle_lost_connection();
|
||||||
|
reconnect_timer = g_timer_new();
|
||||||
xmpp_stop(ctx);
|
xmpp_stop(ctx);
|
||||||
jabber_conn.conn_status = JABBER_DISCONNECTED;
|
jabber_conn.conn_status = JABBER_DISCONNECTED;
|
||||||
jabber_conn.presence = PRESENCE_OFFLINE;
|
jabber_conn.presence = PRESENCE_OFFLINE;
|
||||||
|
|
||||||
// login attempt failed
|
// login attempt failed
|
||||||
} else {
|
} else {
|
||||||
prof_handle_failed_login();
|
if (reconnect_timer == NULL) {
|
||||||
xmpp_stop(ctx);
|
prof_handle_failed_login();
|
||||||
jabber_conn.conn_status = JABBER_DISCONNECTED;
|
if (saved_user != NULL) {
|
||||||
jabber_conn.presence = PRESENCE_OFFLINE;
|
free(saved_user);
|
||||||
|
saved_user = NULL;
|
||||||
|
}
|
||||||
|
if (saved_password != NULL) {
|
||||||
|
free(saved_password);
|
||||||
|
saved_password = NULL;
|
||||||
|
}
|
||||||
|
xmpp_stop(ctx);
|
||||||
|
jabber_conn.conn_status = JABBER_DISCONNECTED;
|
||||||
|
jabber_conn.presence = PRESENCE_OFFLINE;
|
||||||
|
} else {
|
||||||
|
xmpp_stop(ctx);
|
||||||
|
g_timer_start(reconnect_timer);
|
||||||
|
jabber_conn.conn_status = JABBER_DISCONNECTED;
|
||||||
|
jabber_conn.presence = PRESENCE_OFFLINE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -240,6 +240,19 @@ prefs_set_priority(gint value)
|
|||||||
_save_prefs();
|
_save_prefs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gint
|
||||||
|
prefs_get_reconnect(void)
|
||||||
|
{
|
||||||
|
return g_key_file_get_integer(prefs, "jabber", "reconnect", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
prefs_set_reconnect(gint value)
|
||||||
|
{
|
||||||
|
g_key_file_set_integer(prefs, "jabber", "reconnect", value);
|
||||||
|
_save_prefs();
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
prefs_get_vercheck(void)
|
prefs_get_vercheck(void)
|
||||||
{
|
{
|
||||||
|
@ -76,6 +76,8 @@ void prefs_set_max_log_size(gint value);
|
|||||||
gint prefs_get_max_log_size(void);
|
gint prefs_get_max_log_size(void);
|
||||||
void prefs_set_priority(gint value);
|
void prefs_set_priority(gint value);
|
||||||
gint prefs_get_priority(void);
|
gint prefs_get_priority(void);
|
||||||
|
void prefs_set_reconnect(gint value);
|
||||||
|
gint prefs_get_reconnect(void);
|
||||||
|
|
||||||
void prefs_add_login(const char *jid);
|
void prefs_add_login(const char *jid);
|
||||||
|
|
||||||
|
@ -1103,6 +1103,15 @@ cons_prefs(void)
|
|||||||
|
|
||||||
cons_show("Priority : %d", prefs_get_priority());
|
cons_show("Priority : %d", prefs_get_priority());
|
||||||
|
|
||||||
|
gint reconnect_interval = prefs_get_reconnect();
|
||||||
|
if (reconnect_interval == 0) {
|
||||||
|
cons_show("Reconnect interval : OFF");
|
||||||
|
} else if (remind_period == 1) {
|
||||||
|
cons_show("Reconnect interval : 1 second");
|
||||||
|
} else {
|
||||||
|
cons_show("Reconnect interval : %d seconds", reconnect_interval);
|
||||||
|
}
|
||||||
|
|
||||||
cons_show("");
|
cons_show("");
|
||||||
|
|
||||||
if (current_index == 0) {
|
if (current_index == 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user