--- a/src/irc_chan.h Thu Mar 12 18:11:44 2009 +0200
+++ b/src/irc_chan.h Thu Mar 12 18:35:05 2009 +0200
@@ -29,9 +29,27 @@
struct irc_chan_callbacks {
/** Joined the channel */
void (*on_self_join) (struct irc_chan *chan, void *arg);
+
+ /** Someone sent a message to the channel */
+ void (*on_msg) (struct irc_chan *chan, const char *prefix, const char *msg, void *arg);
};
/**
+ * Invoke the given callback with the given args
+ */
+#define IRC_CHAN_INVOKE_CALLBACK(chan, _cb_name_, ...) \
+ do { \
+ struct chain_head *head; \
+ \
+ CHAIN_FOREACH(&(chan)->callbacks, head) { \
+ const struct irc_chan_callbacks *callbacks = head->chain; \
+ \
+ if (callbacks->_cb_name_) \
+ callbacks->_cb_name_((chan), ## __VA_ARGS__, head->arg); \
+ } \
+ } while (0);
+
+/**
* IRC channel state
*/
struct irc_chan {
@@ -56,6 +74,9 @@
/** General command handlers */
irc_cmd_handlers_t handlers;
+
+ /** High-level user callbacks */
+ struct chain_list callbacks;
};
/**
@@ -81,6 +102,11 @@
void irc_chan_destroy (struct irc_chan *chan);
/**
+ * Add high-level irc_chan callbacks
+ */
+err_t irc_chan_add_callbacks (struct irc_chan *chan, const struct irc_chan_callbacks *callbacks, void *arg);
+
+/**
* Send the initial JOIN message.
*
* The channel must be in the IRC_CHAN_INIT state, and will transition to the IRC_CHAN_JOINING state.