src/irc_chan.h
changeset 38 0c2e0cb46c3a
parent 37 4fe4a3c4496e
child 45 71e65564afd2
--- 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.