--- 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;