src/irc_chan.c
changeset 45 71e65564afd2
parent 39 a4891d71aca9
child 67 aa94bf2b5f9b
--- 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;
 }