From db6939bd6085d9eef1a58e963f44c8b618d38030 Mon Sep 17 00:00:00 2001 From: Přemysl Janouch Date: Sun, 28 Jun 2015 16:57:08 +0200 Subject: degesch: fix /ctcp with CAP echo-message --- degesch.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/degesch.c b/degesch.c index c1eebca..69fb927 100644 --- a/degesch.c +++ b/degesch.c @@ -2554,6 +2554,11 @@ log_full (struct app_context *ctx, struct server *s, struct buffer *buffer, #define log_outcoming_action(s, buffer, who, text) \ log_server ((s), (buffer), 0, " #a*#r #n #m", ATTR_ACTION, (who), (text)) +#define log_ctcp_query(s, target, tag) \ + log_server_status ((s), (s)->buffer, "CTCP query to #S: #S", target, tag) +#define log_ctcp_reply(s, target, reply /* freed! */) \ + log_server_status ((s), (s)->buffer, "CTCP reply to #S: #&S", target, reply) + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - static struct buffer * @@ -4593,8 +4598,13 @@ static void irc_handle_ctcp_reply (struct server *s, const struct irc_message *msg, struct ctcp_chunk *chunk) { - log_server_status (s, s->buffer, "CTCP reply from #n: #S #S", - msg->prefix, chunk->tag.str, chunk->text.str); + const char *target = msg->params.vector[0]; + if (irc_is_this_us (s, msg->prefix)) + log_ctcp_reply (s, target, + xstrdup_printf ("%s %s", chunk->tag.str, chunk->text.str)); + else + log_server_status (s, s->buffer, "CTCP reply from #n: #S #S", + msg->prefix, chunk->tag.str, chunk->text.str); } static void @@ -4716,24 +4726,26 @@ irc_send_ctcp_reply (struct server *s, va_end (ap); irc_send (s, "NOTICE %s :\x01%s\x01", recipient, m.str); - // FIXME: CAP echo-message? - log_server_status (s, s->buffer, - "CTCP reply to #S: #&S", recipient, str_steal (&m)); + if (!s->cap_echo_message) + log_ctcp_reply (s, recipient, str_steal (&m)); + else + str_free (&m); } static void irc_handle_ctcp_request (struct server *s, const struct irc_message *msg, struct ctcp_chunk *chunk) { - char *nickname = irc_cut_nickname (msg->prefix); + const char *target = msg->params.vector[0]; + if (irc_is_this_us (s, msg->prefix)) + log_ctcp_query (s, target, chunk->tag.str); log_server_status (s, s->buffer, - "CTCP requested by #n: #S", nickname, chunk->tag.str); + "CTCP requested by #n: #S", msg->prefix, chunk->tag.str); - const char *target = msg->params.vector[0]; - const char *recipient = nickname; - if (irc_is_channel (s, target)) - recipient = target; + char *recipient = irc_is_channel (s, target) + ? irc_cut_nickname (msg->prefix) + : xstrdup (target); if (!strcmp (chunk->tag.str, "CLIENTINFO")) irc_send_ctcp_reply (s, recipient, "CLIENTINFO %s %s %s %s", @@ -4758,7 +4770,7 @@ irc_handle_ctcp_request (struct server *s, irc_send_ctcp_reply (s, recipient, "TIME %s", buf); } - free (nickname); + free (recipient); } static void @@ -6366,7 +6378,8 @@ handle_command_ctcp (struct handler_args *a) else irc_send (a->s, "PRIVMSG %s :\x01%s\x01", target, tag); - log_server_status (a->s, a->s->buffer, "CTCP query to #S: #S", target, tag); + if (!a->s->cap_echo_message) + log_ctcp_query (a->s, target, tag); return true; } -- cgit v1.2.3-70-g09d2