degesch: support CAP DEL, request cap-notify

It doesn't require much effort to cancel capabilities, plus with
the newer version we get the respective notification anyway.
This commit is contained in:
Přemysl Eric Janouch 2021-05-28 01:44:46 +02:00
parent 61f15ead8a
commit bb451a5050
Signed by: p
GPG Key ID: A0420B94F92B9493
2 changed files with 19 additions and 6 deletions

2
NEWS
View File

@ -2,7 +2,7 @@
* degesch: added a /squery command for IRCnet * degesch: added a /squery command for IRCnet
* degesch: now supporting IRCv3.2 capability negotiation * degesch: now supporting IRCv3.2 capability negotiation, including CAP DEL
1.1.0 (2020-10-31) "What Do You Mean By 'This Isn't Germany'?" 1.1.0 (2020-10-31) "What Do You Mean By 'This Isn't Germany'?"

View File

@ -2340,7 +2340,7 @@ static struct config_schema g_config_server[] =
.type = CONFIG_ITEM_STRING_ARRAY, .type = CONFIG_ITEM_STRING_ARRAY,
.validate = config_validate_nonjunk_string, .validate = config_validate_nonjunk_string,
.default_ = "\"multi-prefix,invite-notify,server-time,echo-message," .default_ = "\"multi-prefix,invite-notify,server-time,echo-message,"
"message-tags,away-notify\"" }, "message-tags,away-notify,cap-notify\"" },
{ .name = "tls", { .name = "tls",
.comment = "Whether to use TLS", .comment = "Whether to use TLS",
@ -6576,6 +6576,15 @@ irc_process_cap_ls (struct server *s)
free (chosen_str); free (chosen_str);
} }
static void
irc_toggle_cap (struct server *s, const char *cap, bool active)
{
if (!strcasecmp_ascii (cap, "echo-message"))
s->cap_echo_message = active;
if (!strcasecmp_ascii (cap, "away-notify"))
s->cap_away_notify = active;
}
static void static void
irc_handle_cap (struct server *s, const struct irc_message *msg) irc_handle_cap (struct server *s, const struct irc_message *msg)
{ {
@ -6601,10 +6610,7 @@ irc_handle_cap (struct server *s, const struct irc_message *msg)
active = false; active = false;
cap++; cap++;
} }
if (!strcasecmp_ascii (cap, "echo-message")) irc_toggle_cap (s, cap, active);
s->cap_echo_message = active;
if (!strcasecmp_ascii (cap, "away-notify"))
s->cap_away_notify = active;
} }
irc_send (s, "CAP END"); irc_send (s, "CAP END");
} }
@ -6614,6 +6620,13 @@ irc_handle_cap (struct server *s, const struct irc_message *msg)
"#s: #S", "Capabilities not acknowledged", args); "#s: #S", "Capabilities not acknowledged", args);
irc_send (s, "CAP END"); irc_send (s, "CAP END");
} }
else if (!strcasecmp_ascii (subcommand, "DEL"))
{
log_server_error (s, s->buffer,
"#s: #S", "Capabilities deleted", args);
for (size_t i = 0; i < v.len; i++)
irc_toggle_cap (s, v.vector[i], false);
}
else if (!strcasecmp_ascii (subcommand, "LS")) else if (!strcasecmp_ascii (subcommand, "LS"))
{ {