src/irc_chan.c
changeset 45 71e65564afd2
parent 39 a4891d71aca9
child 67 aa94bf2b5f9b
equal deleted inserted replaced
44:6bd70113e1ed 45:71e65564afd2
    18     struct irc_chan *chan = arg;
    18     struct irc_chan *chan = arg;
    19 
    19 
    20     // us?
    20     // us?
    21     if (irc_prefix_cmp_nick(line->prefix, chan->net->conn->nickname) == 0) {
    21     if (irc_prefix_cmp_nick(line->prefix, chan->net->conn->nickname) == 0) {
    22         // twiddle state
    22         // twiddle state
    23         chan->state.joining = false;
    23         chan->joining = false;
    24         chan->state.joined = true;
    24         chan->joined = true;
    25 
    25 
    26         log_info("joined channel: %s", chan->info.channel);
    26         log_info("joined channel: %s", chan->info.channel);
    27         
    27         
    28         // invoke callback
    28         // invoke callback
    29         IRC_CHAN_INVOKE_CALLBACK(chan, on_self_join);
    29         IRC_CHAN_INVOKE_CALLBACK(chan, on_self_join);
       
    30 
       
    31     } else {
       
    32         // XXX: who cares
       
    33         
    30     }
    34     }
    31 }
    35 }
    32 
    36 
    33 /**
    37 /**
    34  * :nm PRIVMSG <channel> <message>
    38  * :nm PRIVMSG <channel> <message>
    35  */
    39  */
    36 static void irc_chan_on_PRIVMSG (const struct irc_line *line, void *arg)
    40 static void irc_chan_on_PRIVMSG (const struct irc_line *line, void *arg)
    37 {
    41 {
    38     struct irc_chan *chan = arg;
    42     struct irc_chan *chan = arg;
       
    43     char prefix_buf[IRC_PREFIX_MAX];
       
    44     struct irc_nm *nm;
       
    45     err_t err;
    39 
    46 
    40     // invoke callback (prefix, message)
    47     const char *msg = line->args[1];
    41     IRC_CHAN_INVOKE_CALLBACK(chan, on_msg, line->prefix, line->args[1]);
    48 
       
    49     // parse nickmask
       
    50     if ((err = irc_nm_parse(nm, prefix_buf, line->prefix))) {
       
    51         log_warn("invalid prefix: %s", line->prefix);
       
    52         
       
    53         // invoke callback with NULL prefix
       
    54         IRC_CHAN_INVOKE_CALLBACK(chan, on_msg, NULL, msg);
       
    55 
       
    56     } else {
       
    57         // invoke callback (prefix, message)
       
    58         IRC_CHAN_INVOKE_CALLBACK(chan, on_msg, nm, msg);
       
    59     }
    42 }
    60 }
    43 
    61 
    44 /**
    62 /**
    45  * Core command handlers
    63  * Core command handlers
    46  */
    64  */
   102 err_t irc_chan_join (struct irc_chan *chan)
   120 err_t irc_chan_join (struct irc_chan *chan)
   103 {
   121 {
   104     err_t err;
   122     err_t err;
   105 
   123 
   106     // XXX: error instead?
   124     // XXX: error instead?
   107     assert(!chan->state.joining && !chan->state.joined);
   125     assert(!chan->joining && !chan->joined);
       
   126     assert(chan->net->conn);
   108 
   127 
   109     // send JOIN message on the appropriate connection
   128     // send JOIN message on the appropriate connection
   110     if ((err = irc_conn_JOIN(chan->net->conn, chan->info.channel)))
   129     if ((err = irc_conn_JOIN(chan->net->conn, chan->info.channel)))
   111         // XXX: error state?
   130         // XXX: error state?
   112         return err;
   131         return err;
   113 
   132 
   114     // ok
   133     // ok
   115     chan->state.joining = true;
   134     chan->joining = true;
   116 
   135 
   117     return SUCCESS;
   136     return SUCCESS;
   118 }
   137 }
   119 
   138