--- a/src/irc_conn.h Mon Mar 30 01:31:27 2009 +0300
+++ b/src/irc_conn.h Mon Mar 30 01:47:44 2009 +0300
@@ -141,9 +141,7 @@
* destination, and args[1] as the rest of the CTCP extended message payload.
*
* So for example, the following line:
- * \verbatim
- :nick!user@host PRIVMSG #foo :\001ACTION does something lame\001
- \endverbatim
+ * \verbatim :nick!user@host PRIVMSG #foo :\001ACTION does something lame\001 \endverbatim
*
* results in the following irc_line:
* \code
--- a/src/irc_log.c Mon Mar 30 01:31:27 2009 +0300
+++ b/src/irc_log.c Mon Mar 30 01:47:44 2009 +0300
@@ -255,21 +255,36 @@
}
/**
+ * Log a CTCP ACTION message on a channel
+ *
+ * :nm "CTCP ACTION" <channel> <action>
+ */
+static void irc_log_on_chan_CTCP_ACTION (const struct irc_line *line, void *arg)
+{
+ struct irc_log_chan *chan_ctx = arg;
+
+ const char *action = line->args[1];
+
+ irc_log_event(chan_ctx->ctx, chan_ctx, line->source, "ACTION", NULL, action);
+}
+
+/**
* Our low-level channel-specific message handlers for logged channels.
*
* Note that these get a `struct irc_log_chan*` as an argument.
*/
static struct irc_cmd_handler _chan_cmd_handlers[] = {
- { "NICK", &irc_log_on_chan_NICK },
- { "QUIT", &irc_log_on_chan_QUIT },
- { "JOIN", &irc_log_on_chan_generic },
- { "PART", &irc_log_on_chan_generic },
- { "MODE", &irc_log_on_chan_MODE },
- { "TOPIC", &irc_log_on_chan_generic },
- { "KICK", &irc_log_on_chan_KICK },
- { "PRIVMSG", &irc_log_on_chan_generic },
- { "NOTICE", &irc_log_on_chan_generic },
- { NULL, NULL }
+ { "NICK", &irc_log_on_chan_NICK },
+ { "QUIT", &irc_log_on_chan_QUIT },
+ { "JOIN", &irc_log_on_chan_generic },
+ { "PART", &irc_log_on_chan_generic },
+ { "MODE", &irc_log_on_chan_MODE },
+ { "TOPIC", &irc_log_on_chan_generic },
+ { "KICK", &irc_log_on_chan_KICK },
+ { "PRIVMSG", &irc_log_on_chan_generic },
+ { "NOTICE", &irc_log_on_chan_generic },
+ { "CTCP ACTION", &irc_log_on_chan_CTCP_ACTION },
+ { NULL, NULL }
};
/**
--- a/src/irc_net.c Mon Mar 30 01:31:27 2009 +0300
+++ b/src/irc_net.c Mon Mar 30 01:47:44 2009 +0300
@@ -230,6 +230,7 @@
{ "KICK", &irc_net_on_chan0 },
{ IRC_RPL_NAMREPLY, &irc_net_on_chan2 },
{ IRC_RPL_ENDOFNAMES, &irc_net_on_chan1 },
+ { "CTCP ACTION", &irc_net_on_chan0 },
// special-case handling for others
{ "NICK", &irc_net_on_NICK },
--- a/src/test.c Mon Mar 30 01:31:27 2009 +0300
+++ b/src/test.c Mon Mar 30 01:47:44 2009 +0300
@@ -911,6 +911,41 @@
irc_net_destroy(net);
}
+void _test_irc_chan_on_CTCP_ACTION (const struct irc_line *line, void *arg)
+{
+ bool *flag = arg;
+
+ log_debug("CTCP ACTION");
+
+ *flag = true;
+}
+
+static struct irc_cmd_handler _test_irc_chan_handlers[] = {
+ { "CTCP ACTION", &_test_irc_chan_on_CTCP_ACTION },
+ { NULL, NULL }
+};
+
+void test_irc_chan_CTCP_ACTION (void)
+{
+ struct test_chan_ctx ctx;
+ struct sock_test *sock = setup_sock_test();
+ struct irc_net *net = setup_irc_net(sock);
+ struct irc_chan *chan = setup_irc_chan(sock, net, "#test", &ctx);
+ bool cb_ok = false;
+
+ // add our handler
+ assert_success(irc_cmd_add(&chan->handlers, _test_irc_chan_handlers, &cb_ok));
+
+ // rename one of the users
+ log_info("test irc_conn_on_CTCP_ACTION");
+ test_sock_push(sock, ":userA!someone@somewhere PRIVMSG #test \001ACTION hello world\001\r\n");
+ assert(cb_ok);
+
+ // cleanup
+ irc_net_destroy(net);
+}
+
+
/**
* Test definition
*/
@@ -935,6 +970,7 @@
{ "irc_chan_user_part", &test_irc_chan_user_part },
{ "irc_chan_user_nick", &test_irc_chan_user_nick },
{ "irc_chan_user_quit", &test_irc_chan_user_quit },
+ { "irc_chan_CTCP_ACTION", &test_irc_chan_CTCP_ACTION },
{ NULL, NULL }
};