implement CTCP-ACTION for irc_log and test
authorTero Marttila <terom@fixme.fi>
Mon, 30 Mar 2009 01:47:44 +0300
changeset 88 233916a00429
parent 87 f0db6ebf18b9
child 89 68345a9b99a3
implement CTCP-ACTION for irc_log and test
src/irc_conn.h
src/irc_log.c
src/irc_net.c
src/test.c
--- 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                        }
 };