implement irc_chan_callbacks::on_self_msg/on_self_notice, and add code for mod_irc_log to use them
--- 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,
};
/**