degesch: add support for IRCv3.2 echo-message
This commit is contained in:
parent
935d671a57
commit
974ce75a59
32
degesch.c
32
degesch.c
|
@ -1060,6 +1060,8 @@ struct server
|
||||||
struct str irc_user_mode; ///< Our current user modes
|
struct str irc_user_mode; ///< Our current user modes
|
||||||
char *irc_user_host; ///< Our current user@host
|
char *irc_user_host; ///< Our current user@host
|
||||||
|
|
||||||
|
bool cap_echo_message; ///< Whether the server echos messages
|
||||||
|
|
||||||
// Server-specific information (from RPL_ISUPPORT):
|
// Server-specific information (from RPL_ISUPPORT):
|
||||||
|
|
||||||
/// Convert an IRC identifier character to lower-case
|
/// Convert an IRC identifier character to lower-case
|
||||||
|
@ -3207,6 +3209,7 @@ on_irc_disconnected (struct server *s)
|
||||||
s->irc_user_host = NULL;
|
s->irc_user_host = NULL;
|
||||||
|
|
||||||
// TODO: reset RPL_ISUPPORT information
|
// TODO: reset RPL_ISUPPORT information
|
||||||
|
s->cap_echo_message = false;
|
||||||
|
|
||||||
// Take any relevant actions
|
// Take any relevant actions
|
||||||
if (s->ctx->quitting)
|
if (s->ctx->quitting)
|
||||||
|
@ -3830,14 +3833,17 @@ irc_get_buffer_for_message (struct server *s,
|
||||||
}
|
}
|
||||||
else if (!buffer)
|
else if (!buffer)
|
||||||
{
|
{
|
||||||
// Implying that the target is us
|
|
||||||
|
|
||||||
// Don't make user buffers for servers (they can send NOTICEs)
|
// Don't make user buffers for servers (they can send NOTICEs)
|
||||||
if (!irc_find_userhost (msg->prefix))
|
if (!irc_find_userhost (msg->prefix))
|
||||||
return s->buffer;
|
return s->buffer;
|
||||||
|
|
||||||
char *nickname = irc_cut_nickname (msg->prefix);
|
char *nickname = irc_cut_nickname (msg->prefix);
|
||||||
|
if (irc_is_this_us (s, target))
|
||||||
buffer = irc_get_or_make_user_buffer (s, nickname);
|
buffer = irc_get_or_make_user_buffer (s, nickname);
|
||||||
|
// With the IRCv3.2 echo-message capability, we can receive messages
|
||||||
|
// as they are delivired to the target; in that case, check the origin
|
||||||
|
else if (soft_assert (irc_is_this_us (s, nickname)))
|
||||||
|
buffer = irc_get_or_make_user_buffer (s, target);
|
||||||
free (nickname);
|
free (nickname);
|
||||||
}
|
}
|
||||||
return buffer;
|
return buffer;
|
||||||
|
@ -4066,12 +4072,24 @@ irc_handle_cap (struct server *s, const struct irc_message *msg)
|
||||||
split_str_ignore_empty (msg->params.vector[2], ' ', &v);
|
split_str_ignore_empty (msg->params.vector[2], ' ', &v);
|
||||||
|
|
||||||
const char *subcommand = msg->params.vector[1];
|
const char *subcommand = msg->params.vector[1];
|
||||||
if (!strcasecmp_ascii (subcommand, "ACK")
|
if (!strcasecmp_ascii (subcommand, "ACK"))
|
||||||
|| !strcasecmp_ascii (subcommand, "NAK"))
|
|
||||||
{
|
{
|
||||||
// So far we don't need to take any other actions
|
for (size_t i = 0; i < v.len; i++)
|
||||||
|
{
|
||||||
|
const char *cap = v.vector[i];
|
||||||
|
bool active = true;
|
||||||
|
if (*cap == '-')
|
||||||
|
{
|
||||||
|
active = false;
|
||||||
|
cap++;
|
||||||
|
}
|
||||||
|
if (!strcasecmp_ascii (cap, "echo-message"))
|
||||||
|
s->cap_echo_message = active;
|
||||||
|
}
|
||||||
irc_send (s, "CAP END");
|
irc_send (s, "CAP END");
|
||||||
}
|
}
|
||||||
|
else if (!strcasecmp_ascii (subcommand, "NAK"))
|
||||||
|
irc_send (s, "CAP END");
|
||||||
else if (!strcasecmp_ascii (subcommand, "LS"))
|
else if (!strcasecmp_ascii (subcommand, "LS"))
|
||||||
{
|
{
|
||||||
struct str_vector chosen;
|
struct str_vector chosen;
|
||||||
|
@ -4082,7 +4100,8 @@ irc_handle_cap (struct server *s, const struct irc_message *msg)
|
||||||
{
|
{
|
||||||
const char *cap = v.vector[i];
|
const char *cap = v.vector[i];
|
||||||
if (!strcasecmp_ascii (cap, "multi-prefix")
|
if (!strcasecmp_ascii (cap, "multi-prefix")
|
||||||
|| !strcasecmp_ascii (cap, "invite-notify"))
|
|| !strcasecmp_ascii (cap, "invite-notify")
|
||||||
|
|| !strcasecmp_ascii (cap, "echo-message"))
|
||||||
str_vector_add (&chosen, cap);
|
str_vector_add (&chosen, cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5475,6 +5494,7 @@ send_autosplit_message (struct server *s, struct send_autosplit_args a)
|
||||||
{
|
{
|
||||||
irc_send (s, "%s %s :%s%s%s", a.command, a.target,
|
irc_send (s, "%s %s :%s%s%s", a.command, a.target,
|
||||||
a.prefix, lines.vector[i], a.suffix);
|
a.prefix, lines.vector[i], a.suffix);
|
||||||
|
if (!s->cap_echo_message)
|
||||||
a.logger (s, &a, buffer, lines.vector[i]);
|
a.logger (s, &a, buffer, lines.vector[i]);
|
||||||
}
|
}
|
||||||
end:
|
end:
|
||||||
|
|
Loading…
Reference in New Issue