Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -682,6 +682,7 @@ if get_option('tests')
'tests/unittests/command/test_cmd_roster.c',
'tests/unittests/command/test_cmd_ac.c',
'tests/unittests/command/test_cmd_disconnect.c',
'tests/unittests/command/test_cmd_mucping.c',
'tests/unittests/plugins/test_callbacks.c',
'tests/unittests/plugins/test_plugins_disco.c',
'tests/unittests/unittests.c',
Expand Down
13 changes: 12 additions & 1 deletion profanity.doap
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,18 @@
</xmpp:SupportedXep>
</implements>

<!-- XEP-0454: OMEMO Media sharing -->
<!-- XEP-0410: MUC Self-Ping -->
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource='https://xmpp.org/extensions/xep-0410.html'/>
<xmpp:status>complete</xmpp:status>
<xmpp:version>1.1.0</xmpp:version>
<xmpp:since>DEV</xmpp:since>
<xmpp:note xml:lang='en'></xmpp:note>
</xmpp:SupportedXep>
</implements>

<!-- XEP-0454: OMEMO Media sharing -->
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource='https://xmpp.org/extensions/xep-0454.html'/>
Expand Down
6 changes: 6 additions & 0 deletions src/command/cmd_ac.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ static Autocomplete script_show_ac;
static Autocomplete console_ac;
static Autocomplete console_msg_ac;
static Autocomplete autoping_ac;
static Autocomplete mucping_ac;
static Autocomplete plugins_ac;
static Autocomplete plugins_load_ac;
static Autocomplete plugins_unload_ac;
Expand Down Expand Up @@ -386,6 +387,7 @@ static Autocomplete* all_acs[] = {
&console_ac,
&console_msg_ac,
&autoping_ac,
&mucping_ac,
&plugins_ac,
&filepath_ac,
&blocked_ac,
Expand Down Expand Up @@ -1035,6 +1037,9 @@ cmd_ac_init(void)
autocomplete_add(autoping_ac, "set");
autocomplete_add(autoping_ac, "timeout");

autocomplete_add(mucping_ac, "set");
autocomplete_add(mucping_ac, "timeout");

autocomplete_add(plugins_ac, "install");
autocomplete_add(plugins_ac, "update");
autocomplete_add(plugins_ac, "uninstall");
Expand Down Expand Up @@ -1855,6 +1860,7 @@ _cmd_ac_complete_params(ProfWin* window, const char* const input, gboolean previ
{ "/disco", disco_ac },
{ "/room", room_ac },
{ "/autoping", autoping_ac },
{ "/mucping", mucping_ac },
{ "/mainwin", winpos_ac },
{ "/inputwin", winpos_ac },
};
Expand Down
16 changes: 16 additions & 0 deletions src/command/cmd_defs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1963,6 +1963,22 @@ static const struct cmd_t command_defs[] = {
{ "timeout <seconds>", "Seconds to wait for autoping responses, after which the connection is considered broken." })
},

{ CMD_PREAMBLE("/mucping",
parse_args, 2, 2, &cons_mucping_setting)
CMD_MAINFUNC(cmd_mucping)
CMD_TAGS(
CMD_TAG_CONNECTION)
CMD_SYN(
"/mucping set <seconds>",
"/mucping timeout <seconds>")
CMD_DESC(
"Set the interval and timeout for MUC self-pings (XEP-0410). Recommended interval is between 300 and 900 seconds, with a timeout of 10 to 60 seconds. "
"Note that the interval must be greater than the timeout.")
CMD_ARGS(
{ "set <seconds>", "Number of seconds of idle room activity before sending a ping, a value of 0 disables MUC self-pings." },
{ "timeout <seconds>", "Seconds to wait for MUC self-ping responses, after which the room connection is considered disconnected. A value of 0 disables MUC self-pings entirely." })
},

{ CMD_PREAMBLE("/ping",
parse_args, 0, 1, NULL)
CMD_MAINFUNC(cmd_ping)
Expand Down
66 changes: 65 additions & 1 deletion src/command/cmd_funcs.c
Original file line number Diff line number Diff line change
Expand Up @@ -6297,7 +6297,7 @@ cmd_reconnect(ProfWin* window, const char* const command, gchar** args)
} else if (strtoi_range(value, &intval, 0, INT_MAX, &err_msg)) {
prefs_set_reconnect(intval);
if (intval == 0) {
cons_show("Reconnect disabled.", intval);
cons_show("Reconnect disabled.");
} else {
cons_show("Reconnect interval set to %d seconds.", intval);
}
Expand Down Expand Up @@ -6355,6 +6355,70 @@ cmd_autoping(ProfWin* window, const char* const command, gchar** args)
return TRUE;
}

gboolean
cmd_mucping(ProfWin* window, const char* const command, gchar** args)
{
char* cmd = args[0];
char* value = args[1];

if (g_strcmp0(cmd, "set") == 0) {
int intval = 0;
auto_char char* err_msg = NULL;
gboolean res = strtoi_range(value, &intval, 0, INT_MAX, &err_msg);
if (res) {
gint timeout = prefs_get_muc_ping_timeout();
if (intval != 0 && timeout == 0) {
timeout = (intval > 60) ? 60 : (intval / 2);
if (timeout == 0) {
timeout = 1;
}
prefs_set_muc_ping_timeout(timeout);
}
if (intval != 0 && intval <= timeout) {
cons_show_error("MUC self-ping interval must be greater than timeout (%d seconds).", timeout);
} else {
prefs_set_muc_ping_interval(intval);
if (intval == 0) {
cons_show("MUC self-ping disabled.");
} else {
cons_show("MUC self-ping interval set to %d seconds.", intval);
}
}
} else {
cons_show(err_msg);
cons_bad_cmd_usage(command);
}

} else if (g_strcmp0(cmd, "timeout") == 0) {
int intval = 0;
auto_char char* err_msg = NULL;
gboolean res = strtoi_range(value, &intval, 0, INT_MAX, &err_msg);
if (res) {
if (intval == 0) {
prefs_set_muc_ping_interval(0);
prefs_set_muc_ping_timeout(0);
cons_show("MUC self-ping disabled.");
} else {
gint interval = prefs_get_muc_ping_interval();
if (interval != 0 && intval >= interval) {
cons_show_error("MUC self-ping timeout must be less than interval (%d seconds).", interval);
} else {
prefs_set_muc_ping_timeout(intval);
cons_show("MUC self-ping timeout set to %d seconds.", intval);
}
}
} else {
cons_show(err_msg);
cons_bad_cmd_usage(command);
}

} else {
cons_bad_cmd_usage(command);
}

return TRUE;
}

gboolean
cmd_ping(ProfWin* window, const char* const command, gchar** args)
{
Expand Down
1 change: 1 addition & 0 deletions src/command/cmd_funcs.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ gboolean cmd_about(ProfWin* window, const char* const command, gchar** args);
gboolean cmd_autoaway(ProfWin* window, const char* const command, gchar** args);
gboolean cmd_autoconnect(ProfWin* window, const char* const command, gchar** args);
gboolean cmd_autoping(ProfWin* window, const char* const command, gchar** args);
gboolean cmd_mucping(ProfWin* window, const char* const command, gchar** args);
gboolean cmd_beep(ProfWin* window, const char* const command, gchar** args);
gboolean cmd_caps(ProfWin* window, const char* const command, gchar** args);
gboolean cmd_logging(ProfWin* window, const char* const command, gchar** args);
Expand Down
32 changes: 32 additions & 0 deletions src/config/preferences.c
Original file line number Diff line number Diff line change
Expand Up @@ -836,6 +836,38 @@ prefs_set_autoping_timeout(gint value)
g_key_file_set_integer(prefs, PREF_GROUP_CONNECTION, "autoping.timeout", value);
}

gint
prefs_get_muc_ping_interval(void)
{
if (!g_key_file_has_key(prefs, PREF_GROUP_CONNECTION, "muc.ping.interval", NULL)) {
return 600;
} else {
return g_key_file_get_integer(prefs, PREF_GROUP_CONNECTION, "muc.ping.interval", NULL);
}
}

void
prefs_set_muc_ping_interval(gint value)
{
g_key_file_set_integer(prefs, PREF_GROUP_CONNECTION, "muc.ping.interval", value);
}

gint
prefs_get_muc_ping_timeout(void)
{
if (!g_key_file_has_key(prefs, PREF_GROUP_CONNECTION, "muc.ping.timeout", NULL)) {
return 60;
} else {
return g_key_file_get_integer(prefs, PREF_GROUP_CONNECTION, "muc.ping.timeout", NULL);
}
}

void
prefs_set_muc_ping_timeout(gint value)
{
g_key_file_set_integer(prefs, PREF_GROUP_CONNECTION, "muc.ping.timeout", value);
}

gint
prefs_get_autoaway_time(void)
{
Expand Down
4 changes: 4 additions & 0 deletions src/config/preferences.h
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,10 @@ void prefs_set_autoping(gint value);
gint prefs_get_autoping(void);
void prefs_set_autoping_timeout(gint value);
gint prefs_get_autoping_timeout(void);
void prefs_set_muc_ping_interval(gint value);
gint prefs_get_muc_ping_interval(void);
void prefs_set_muc_ping_timeout(gint value);
gint prefs_get_muc_ping_timeout(void);
gint prefs_get_inpblock(void);
void prefs_set_inpblock(gint value);

Expand Down
25 changes: 25 additions & 0 deletions src/ui/console.c
Original file line number Diff line number Diff line change
Expand Up @@ -1817,6 +1817,8 @@ cons_show_chat_prefs(void)
cons_history_setting();
cons_carbons_setting();
cons_receipts_setting();
cons_mam_setting();
cons_silence_setting();

cons_alert(NULL);
}
Expand Down Expand Up @@ -2033,6 +2035,28 @@ cons_autoping_setting(void)
}
}

void
cons_mucping_setting(void)
{
gint muc_ping_interval = prefs_get_muc_ping_interval();
if (muc_ping_interval == 0) {
cons_show("MUC self-ping interval (/mucping) : OFF");
} else if (muc_ping_interval == 1) {
cons_show("MUC self-ping interval (/mucping) : 1 second");
} else {
cons_show("MUC self-ping interval (/mucping) : %d seconds", muc_ping_interval);
}

gint muc_ping_timeout = prefs_get_muc_ping_timeout();
if (muc_ping_timeout == 0) {
cons_show("MUC self-ping timeout (/mucping) : OFF");
} else if (muc_ping_timeout == 1) {
cons_show("MUC self-ping timeout (/mucping) : 1 second");
} else {
cons_show("MUC self-ping timeout (/mucping) : %d seconds", muc_ping_timeout);
}
}

void
cons_color_setting(void)
{
Expand Down Expand Up @@ -2146,6 +2170,7 @@ cons_show_connection_prefs(void)
cons_show("");
cons_reconnect_setting();
cons_autoping_setting();
cons_mucping_setting();
cons_autoconnect_setting();
cons_rooms_cache_setting();
cons_strophe_setting();
Expand Down
1 change: 1 addition & 0 deletions src/ui/ui.h
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ void cons_logging_setting(void);
void cons_autoaway_setting(void);
void cons_reconnect_setting(void);
void cons_autoping_setting(void);
void cons_mucping_setting(void);
void cons_autoconnect_setting(void);
void cons_room_cache_setting(void);
void cons_inpblock_setting(void);
Expand Down
Loading
Loading