implement irc_chan_callbacks::on_self_msg/on_self_notice, and add code for mod_irc_log to use them
authorTero Marttila <terom@fixme.fi>
Thu, 23 Apr 2009 21:22:15 +0300
changeset 152 dae7bcf08474
parent 151 b0b01420b99d
child 153 d35e7cb3a489
implement irc_chan_callbacks::on_self_msg/on_self_notice, and add code for mod_irc_log to use them
src/irc_chan.c
src/irc_chan.h
src/modules/irc_log.c
--- a/src/irc_chan.c	Thu Apr 23 21:14:19 2009 +0300
+++ b/src/irc_chan.c	Thu Apr 23 21:22:15 2009 +0300
@@ -381,6 +381,8 @@
 
 err_t irc_chan_PRIVMSG (struct irc_chan *chan, const char *message)
 {
+    err_t err;
+
     // correct state 
     if (!chan->joined)
         return ERR_IRC_CHAN_STATE;
@@ -389,11 +391,20 @@
         return ERR_IRC_NET_STATE;
 
     // send the PRIVMSG message
-    return irc_conn_PRIVMSG(chan->net->conn, chan->info.channel, message);
+    if ((err = irc_conn_PRIVMSG(chan->net->conn, chan->info.channel, message)))
+        return err;
+
+    // invoke callback (msg)
+    IRC_CHAN_INVOKE_CALLBACK(chan, on_self_msg, message);
+    
+    // ok
+    return SUCCESS;
 }
 
 err_t irc_chan_NOTICE (struct irc_chan *chan, const char *message)
 {
+    err_t err;
+
     // correct state 
     if (!chan->joined)
         return ERR_IRC_CHAN_STATE;
@@ -402,5 +413,13 @@
         return ERR_IRC_NET_STATE;
 
     // send the PRIVMSG message
-    return irc_conn_NOTICE(chan->net->conn, chan->info.channel, message);
+    if ((err = irc_conn_NOTICE(chan->net->conn, chan->info.channel, message)))
+        return err;
+
+    // invoke callback (msg)
+    IRC_CHAN_INVOKE_CALLBACK(chan, on_self_notice, message);
+    
+    // ok
+    return SUCCESS;
 }
+
--- a/src/irc_chan.h	Thu Apr 23 21:14:19 2009 +0300
+++ b/src/irc_chan.h	Thu Apr 23 21:22:15 2009 +0300
@@ -58,6 +58,12 @@
     /** We were kicked from the channel */
     void (*on_self_kicked) (struct irc_chan *chan, const struct irc_nm *source, const char *msg, void *arg);
 
+    /** We sent a message to the channel using irc_chan_PRIVMSG */
+    void (*on_self_msg) (struct irc_chan *chan, const char *msg, void *arg);
+
+    /** We sent a notice to the channel using irc_chan_NOTICE */
+    void (*on_self_notice) (struct irc_chan *chan, const char *msg, void *arg);
+
     /** Someone joined the channel */
     void (*on_join) (struct irc_chan *chan, const struct irc_nm *source, void *arg);
 
@@ -178,6 +184,8 @@
  * Send a normal PRIVMSG to the channel. If we're being pedantic, one should use NOTICE instead for messages sent in
  * reply to PRIVMSG's, but the real world is different.
  *
+ * This also invokes any self_msg callbacks.
+ *
  * @param chan the IRC channel
  * @param message the message to send
  */
@@ -186,6 +194,8 @@
 /**
  * Send a NOTICE message to the channel.
  *
+ * This also invokes any self_notice callbacks.
+ *
  * @param chan the IRC channel
  * @param message the message to send
  */
--- a/src/modules/irc_log.c	Thu Apr 23 21:14:19 2009 +0300
+++ b/src/modules/irc_log.c	Thu Apr 23 21:22:15 2009 +0300
@@ -277,27 +277,49 @@
  * 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        },
-    {   "CTCP ACTION",  &irc_log_on_chan_CTCP_ACTION    },
+    {   "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                            }
 };
 
 /**
+ * We sent a message ourselves
+ */
+static void irc_log_on_chan_self_msg (struct irc_chan *chan, const char *message, void *arg)
+{
+    struct irc_log_chan *chan_ctx = arg;
+    struct irc_nm nm = { chan->net->conn->nickname, NULL, NULL };
+    
+    irc_log_event(chan_ctx->ctx, chan_ctx, &nm, "PRIVMSG", NULL, message);
+}
+
+/**
+ * We sent a notice ourselves
+ */
+static void irc_log_on_chan_self_notice (struct irc_chan *chan, const char *message, void *arg)
+{
+    struct irc_log_chan *chan_ctx = arg;
+    struct irc_nm nm = { chan->net->conn->nickname, NULL, NULL };
+    
+    irc_log_event(chan_ctx->ctx, chan_ctx, &nm, "NOTICE", NULL, message);
+}
+
+/**
  * Our high-level channel-specific callbacks for logged channels.
  *
  * Note that these get a `struct irc_log_chan*` as an argument.
  */
 static struct irc_chan_callbacks _chan_callbacks = {
-    .on_self_join       = NULL,
-    .on_msg             = NULL,
+    .on_self_msg        = irc_log_on_chan_self_msg,
+    .on_self_notice     = irc_log_on_chan_self_notice,
 };
 
 /**