feat: Autoping availability warning

This commit is contained in:
2026-01-27 20:56:28 +01:00
committed by jabber.developer2
parent 830479cf20
commit 0f7741fdfa
6 changed files with 45 additions and 8 deletions

View File

@@ -1964,12 +1964,14 @@ static const struct cmd_t command_defs[] = {
CMD_TAG_CONNECTION) CMD_TAG_CONNECTION)
CMD_SYN( CMD_SYN(
"/autoping set <seconds>", "/autoping set <seconds>",
"/autoping timeout <seconds>") "/autoping timeout <seconds>",
"/autoping warning enable|disable")
CMD_DESC( CMD_DESC(
"Set the interval between sending ping requests to the server to ensure the connection is kept alive.") "Set the interval between sending ping requests to the server to ensure the connection is kept alive.")
CMD_ARGS( CMD_ARGS(
{ "set <seconds>", "Number of seconds between sending pings, a value of 0 disables autoping." }, { "set <seconds>", "Number of seconds between sending pings, a value of 0 disables autoping." },
{ "timeout <seconds>", "Seconds to wait for autoping responses, after which the connection is considered broken." }) { "timeout <seconds>", "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", { CMD_PREAMBLE("/ping",

View File

@@ -6374,6 +6374,8 @@ cmd_autoping(ProfWin* window, const char* const command, gchar** args)
cons_bad_cmd_usage(command); cons_bad_cmd_usage(command);
} }
} else if (g_strcmp0(cmd, "warning") == 0) {
_cmd_set_boolean_preference(value, "Autoping availability warning", PREF_AUTOPING_WARNING);
} else { } else {
cons_bad_cmd_usage(command); cons_bad_cmd_usage(command);
} }

View File

@@ -2290,6 +2290,7 @@ _get_group(preference_t pref)
case PREF_TRAY: case PREF_TRAY:
case PREF_TRAY_READ: case PREF_TRAY_READ:
case PREF_ADV_NOTIFY_DISCO_OR_VERSION: case PREF_ADV_NOTIFY_DISCO_OR_VERSION:
case PREF_AUTOPING_WARNING:
return PREF_GROUP_NOTIFICATIONS; return PREF_GROUP_NOTIFICATIONS;
case PREF_DBLOG: case PREF_DBLOG:
case PREF_CHLOG: case PREF_CHLOG:
@@ -2646,6 +2647,8 @@ _get_key(preference_t pref)
return "enabled"; return "enabled";
case PREF_SPELLCHECK_LANG: case PREF_SPELLCHECK_LANG:
return "lang"; return "lang";
case PREF_AUTOPING_WARNING:
return "autoping.warning";
default: default:
return NULL; return NULL;
} }
@@ -2699,6 +2702,7 @@ _get_default_boolean(preference_t pref)
case PREF_MOOD: case PREF_MOOD:
case PREF_STROPHE_SM_ENABLED: case PREF_STROPHE_SM_ENABLED:
case PREF_STROPHE_SM_RESEND: case PREF_STROPHE_SM_RESEND:
case PREF_AUTOPING_WARNING:
return TRUE; return TRUE;
case PREF_SPELLCHECK_ENABLE: case PREF_SPELLCHECK_ENABLE:
case PREF_PGP_PUBKEY_AUTOIMPORT: case PREF_PGP_PUBKEY_AUTOIMPORT:

View File

@@ -169,6 +169,7 @@ typedef enum {
PREF_FORCE_ENCRYPTION_MODE, PREF_FORCE_ENCRYPTION_MODE,
PREF_SPELLCHECK_ENABLE, PREF_SPELLCHECK_ENABLE,
PREF_SPELLCHECK_LANG, PREF_SPELLCHECK_LANG,
PREF_AUTOPING_WARNING
} preference_t; } preference_t;
typedef struct prof_alias_t typedef struct prof_alias_t

View File

@@ -1703,6 +1703,11 @@ cons_notify_setting(void)
else else
cons_show("Subscription requests (/notify sub) : OFF"); 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(); gint remind_period = prefs_get_notify_remind();
if (remind_period == 0) { if (remind_period == 0) {
cons_show("Reminder period (/notify remind) : OFF"); cons_show("Reminder period (/notify remind) : OFF");
@@ -2003,21 +2008,26 @@ cons_autoping_setting(void)
{ {
gint autoping_interval = prefs_get_autoping(); gint autoping_interval = prefs_get_autoping();
if (autoping_interval == 0) { if (autoping_interval == 0) {
cons_show("Autoping interval (/autoping) : OFF"); cons_show("Autoping interval (/autoping) : OFF");
} else if (autoping_interval == 1) { } else if (autoping_interval == 1) {
cons_show("Autoping interval (/autoping) : 1 second"); cons_show("Autoping interval (/autoping) : 1 second");
} else { } 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(); gint autoping_timeout = prefs_get_autoping_timeout();
if (autoping_timeout == 0) { if (autoping_timeout == 0) {
cons_show("Autoping timeout (/autoping) : OFF"); cons_show("Autoping timeout (/autoping) : OFF");
} else if (autoping_timeout == 1) { } else if (autoping_timeout == 1) {
cons_show("Autoping timeout (/autoping) : 1 second"); cons_show("Autoping timeout (/autoping) : 1 second");
} else { } 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 void

View File

@@ -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 _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(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_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 _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 _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); 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); child = xmpp_stanza_get_next(child);
} }
_disco_autoping_warning_message(features);
} }
connection_features_received(from); connection_features_received(from);
@@ -2436,6 +2438,22 @@ _disco_info_response_id_handler_onconnect(xmpp_stanza_t* const stanza, void* con
return 0; 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 static int
_http_upload_response_id_handler(xmpp_stanza_t* const stanza, void* const userdata) _http_upload_response_id_handler(xmpp_stanza_t* const stanza, void* const userdata)
{ {