diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index e89fa62d..c1c6ff0b 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -1967,12 +1967,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 c575de6a..53631b6b 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -6363,6 +6363,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 96af4af6..e13f04d1 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -2243,6 +2243,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: @@ -2592,6 +2593,8 @@ _get_key(preference_t pref) return "force-encryption.enabled"; case PREF_FORCE_ENCRYPTION_MODE: return "force-encryption.policy"; + case PREF_AUTOPING_WARNING: + return "autoping.warning"; default: return NULL; } @@ -2645,6 +2648,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_PGP_PUBKEY_AUTOIMPORT: case PREF_FORCE_ENCRYPTION: diff --git a/src/config/preferences.h b/src/config/preferences.h index 49ffb900..47c4dc9a 100644 --- a/src/config/preferences.h +++ b/src/config/preferences.h @@ -192,7 +192,8 @@ typedef enum { PREF_VCARD_PHOTO_CMD, PREF_STATUSBAR_TABMODE, PREF_FORCE_ENCRYPTION, - PREF_FORCE_ENCRYPTION_MODE + PREF_FORCE_ENCRYPTION_MODE, + PREF_AUTOPING_WARNING } preference_t; typedef struct prof_alias_t diff --git a/src/ui/console.c b/src/ui/console.c index e27ffd21..41d687e2 100644 --- a/src/ui/console.c +++ b/src/ui/console.c @@ -1739,6 +1739,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"); @@ -2039,21 +2044,27 @@ 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 24b5f1be..38e3b5ef 100644 --- a/src/xmpp/iq.c +++ b/src/xmpp/iq.c @@ -129,6 +129,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); @@ -2439,6 +2440,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); @@ -2446,6 +2448,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) {