src/irc_chan.c
changeset 38 0c2e0cb46c3a
parent 37 4fe4a3c4496e
child 39 a4891d71aca9
--- a/src/irc_chan.c	Thu Mar 12 18:11:44 2009 +0200
+++ b/src/irc_chan.c	Thu Mar 12 18:35:05 2009 +0200
@@ -24,17 +24,30 @@
         chan->state.joined = true;
 
         log_info("joined channel: %s", chan->info.channel);
+        
+        // invoke callback
+        IRC_CHAN_INVOKE_CALLBACK(chan, on_self_join);
+    }
+}
 
-        // TODO: callbacks
-    }
+/**
+ * :nm PRIVMSG <channel> <message>
+ */
+static void irc_chan_on_PRIVMSG (const struct irc_line *line, void *arg)
+{
+    struct irc_chan *chan = arg;
+
+    // invoke callback (prefix, message)
+    IRC_CHAN_INVOKE_CALLBACK(chan, on_msg, line->prefix, line->args[1]);
 }
 
 /**
  * Core command handlers
  */
 struct irc_cmd_handler _cmd_handlers[] = {
-    {   "JOIN",     &irc_chan_on_JOIN   },
-    {   NULL,       NULL                }
+    {   "JOIN",     &irc_chan_on_JOIN       },
+    {   "PRIVMSG",  &irc_chan_on_PRIVMSG    },
+    {   NULL,       NULL                    }
 };
 
 err_t irc_chan_create (struct irc_chan **chan_ptr, struct irc_net *net, const struct irc_chan_info *info, struct error_info *err)
@@ -51,6 +64,7 @@
 
     // init
     irc_cmd_init(&chan->handlers);
+    CHAIN_INIT(&chan->callbacks);
     
     // add handlers
     if ((ERROR_CODE(err) = irc_cmd_add(&chan->handlers, _cmd_handlers, chan)))
@@ -73,10 +87,18 @@
     // free command handlers
     irc_cmd_free(&chan->handlers);
 
+    // free callbacks
+    chain_free(&chan->callbacks);
+
     // free chan itself
     free(chan);
 }
 
+err_t irc_chan_add_callbacks (struct irc_chan *chan, const struct irc_chan_callbacks *callbacks, void *arg)
+{
+    return chain_add(&chan->callbacks, callbacks, arg);
+}
+
 err_t irc_chan_join (struct irc_chan *chan)
 {
     err_t err;