diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index e3e26ddf..146df104 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -1964,12 +1964,14 @@ static const struct cmd_t command_defs[] = { CMD_TAG_CONNECTION) CMD_SYN( "/autoping set ", - "/autoping timeout ") + "/autoping timeout ", + "/autoping warning enable|disable") CMD_DESC( "Set the interval between sending ping requests to the server to ensure the connection is kept alive.") CMD_ARGS( { "set ", "Number of seconds between sending pings, a value of 0 disables autoping." }, - { "timeout ", "Seconds to wait for autoping responses, after which the connection is considered broken." }) + { "timeout ", "Seconds to wait for autoping responses, after which the connection is considered broken." }, + {"warning enable|disable", "Enable or disable autoping availability warning."}) }, { CMD_PREAMBLE("/ping", diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 3fad000a..7fbc5f05 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -6374,6 +6374,8 @@ cmd_autoping(ProfWin* window, const char* const command, gchar** args) cons_bad_cmd_usage(command); } + } else if (g_strcmp0(cmd, "warning") == 0) { + _cmd_set_boolean_preference(value, "Autoping availability warning", PREF_AUTOPING_WARNING); } else { cons_bad_cmd_usage(command); } diff --git a/src/config/preferences.c b/src/config/preferences.c index 9f9db2e8..04d3dda5 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -2290,6 +2290,7 @@ _get_group(preference_t pref) case PREF_TRAY: case PREF_TRAY_READ: case PREF_ADV_NOTIFY_DISCO_OR_VERSION: + case PREF_AUTOPING_WARNING: return PREF_GROUP_NOTIFICATIONS; case PREF_DBLOG: case PREF_CHLOG: @@ -2646,6 +2647,8 @@ _get_key(preference_t pref) return "enabled"; case PREF_SPELLCHECK_LANG: return "lang"; + case PREF_AUTOPING_WARNING: + return "autoping.warning"; default: return NULL; } @@ -2699,6 +2702,7 @@ _get_default_boolean(preference_t pref) case PREF_MOOD: case PREF_STROPHE_SM_ENABLED: case PREF_STROPHE_SM_RESEND: + case PREF_AUTOPING_WARNING: return TRUE; case PREF_SPELLCHECK_ENABLE: case PREF_PGP_PUBKEY_AUTOIMPORT: diff --git a/src/config/preferences.h b/src/config/preferences.h index 962e607b..4e422a05 100644 --- a/src/config/preferences.h +++ b/src/config/preferences.h @@ -169,6 +169,7 @@ typedef enum { PREF_FORCE_ENCRYPTION_MODE, PREF_SPELLCHECK_ENABLE, PREF_SPELLCHECK_LANG, + PREF_AUTOPING_WARNING } preference_t; typedef struct prof_alias_t diff --git a/src/ui/console.c b/src/ui/console.c index a98577a7..637cdd1c 100644 --- a/src/ui/console.c +++ b/src/ui/console.c @@ -1703,6 +1703,11 @@ cons_notify_setting(void) else cons_show("Subscription requests (/notify sub) : OFF"); + if (prefs_get_boolean(PREF_AUTOPING_WARNING)) + cons_show("Autoping warning (/autoping warn) : ON"); + else + cons_show("Autoping warning (/autoping warn) : OFF"); + gint remind_period = prefs_get_notify_remind(); if (remind_period == 0) { cons_show("Reminder period (/notify remind) : OFF"); @@ -2003,21 +2008,26 @@ cons_autoping_setting(void) { gint autoping_interval = prefs_get_autoping(); if (autoping_interval == 0) { - cons_show("Autoping interval (/autoping) : OFF"); + cons_show("Autoping interval (/autoping) : OFF"); } else if (autoping_interval == 1) { - cons_show("Autoping interval (/autoping) : 1 second"); + cons_show("Autoping interval (/autoping) : 1 second"); } else { - cons_show("Autoping interval (/autoping) : %d seconds", autoping_interval); + cons_show("Autoping interval (/autoping) : %d seconds", autoping_interval); } gint autoping_timeout = prefs_get_autoping_timeout(); if (autoping_timeout == 0) { - cons_show("Autoping timeout (/autoping) : OFF"); + cons_show("Autoping timeout (/autoping) : OFF"); } else if (autoping_timeout == 1) { - cons_show("Autoping timeout (/autoping) : 1 second"); + cons_show("Autoping timeout (/autoping) : 1 second"); } else { - cons_show("Autoping timeout (/autoping) : %d seconds", autoping_timeout); + cons_show("Autoping timeout (/autoping) : %d seconds", autoping_timeout); } + + if (prefs_get_boolean(PREF_AUTOPING_WARNING)) + cons_show("Autoping warning (/autoping warn) : ON"); + else + cons_show("Autoping warning (/autoping warn) : OFF"); } void diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c index 377f444c..6511a49c 100644 --- a/src/xmpp/iq.c +++ b/src/xmpp/iq.c @@ -103,6 +103,7 @@ static void _ping_get_handler(xmpp_stanza_t* const stanza); static int _version_result_id_handler(xmpp_stanza_t* const stanza, void* const userdata); static int _disco_info_response_id_handler(xmpp_stanza_t* const stanza, void* const userdata); static int _disco_info_response_id_handler_onconnect(xmpp_stanza_t* const stanza, void* const userdata); +static int _disco_autoping_warning_message(GHashTable* features); static int _http_upload_response_id_handler(xmpp_stanza_t* const stanza, void* const upload_ctx); static int _last_activity_response_id_handler(xmpp_stanza_t* const stanza, void* const userdata); static int _room_info_response_id_handler(xmpp_stanza_t* const stanza, void* const userdata); @@ -2429,6 +2430,7 @@ _disco_info_response_id_handler_onconnect(xmpp_stanza_t* const stanza, void* con } child = xmpp_stanza_get_next(child); } + _disco_autoping_warning_message(features); } connection_features_received(from); @@ -2436,6 +2438,22 @@ _disco_info_response_id_handler_onconnect(xmpp_stanza_t* const stanza, void* con return 0; } +static int +_disco_autoping_warning_message(GHashTable* features) +{ + gboolean server_supports_ping = g_hash_table_contains(features, "urn:xmpp:ping"); + gboolean users_prefers_warning = prefs_get_boolean(PREF_AUTOPING_WARNING); + gboolean is_autoping_enabled = prefs_get_autoping() != 0; + + if (!is_autoping_enabled && server_supports_ping && users_prefers_warning) { + cons_show("This server supports XEP-0199: XMPP Ping (better keepalive detection),\n" + "but autoping feature is currently disabled in settings.\n" + "Consider enabling it (e.g., `/autoping set 30`) for improved connection stability.\n" + "Use `/autoping warn disable` to disable this message."); + } + return 0; +} + static int _http_upload_response_id_handler(xmpp_stanza_t* const stanza, void* const userdata) {