diff -r 6bd70113e1ed -r 71e65564afd2 src/irc_chan.c --- a/src/irc_chan.c Thu Mar 12 22:06:01 2009 +0200 +++ b/src/irc_chan.c Thu Mar 12 22:50:08 2009 +0200 @@ -20,13 +20,17 @@ // us? if (irc_prefix_cmp_nick(line->prefix, chan->net->conn->nickname) == 0) { // twiddle state - chan->state.joining = false; - chan->state.joined = true; + chan->joining = false; + chan->joined = true; log_info("joined channel: %s", chan->info.channel); // invoke callback IRC_CHAN_INVOKE_CALLBACK(chan, on_self_join); + + } else { + // XXX: who cares + } } @@ -36,9 +40,23 @@ static void irc_chan_on_PRIVMSG (const struct irc_line *line, void *arg) { struct irc_chan *chan = arg; + char prefix_buf[IRC_PREFIX_MAX]; + struct irc_nm *nm; + err_t err; - // invoke callback (prefix, message) - IRC_CHAN_INVOKE_CALLBACK(chan, on_msg, line->prefix, line->args[1]); + const char *msg = line->args[1]; + + // parse nickmask + if ((err = irc_nm_parse(nm, prefix_buf, line->prefix))) { + log_warn("invalid prefix: %s", line->prefix); + + // invoke callback with NULL prefix + IRC_CHAN_INVOKE_CALLBACK(chan, on_msg, NULL, msg); + + } else { + // invoke callback (prefix, message) + IRC_CHAN_INVOKE_CALLBACK(chan, on_msg, nm, msg); + } } /** @@ -104,7 +122,8 @@ err_t err; // XXX: error instead? - assert(!chan->state.joining && !chan->state.joined); + assert(!chan->joining && !chan->joined); + assert(chan->net->conn); // send JOIN message on the appropriate connection if ((err = irc_conn_JOIN(chan->net->conn, chan->info.channel))) @@ -112,7 +131,7 @@ return err; // ok - chan->state.joining = true; + chan->joining = true; return SUCCESS; }