src/irc_chan.c
changeset 38 0c2e0cb46c3a
parent 37 4fe4a3c4496e
child 39 a4891d71aca9
equal deleted inserted replaced
37:4fe4a3c4496e 38:0c2e0cb46c3a
    22         // twiddle state
    22         // twiddle state
    23         chan->state.joining = false;
    23         chan->state.joining = false;
    24         chan->state.joined = true;
    24         chan->state.joined = true;
    25 
    25 
    26         log_info("joined channel: %s", chan->info.channel);
    26         log_info("joined channel: %s", chan->info.channel);
       
    27         
       
    28         // invoke callback
       
    29         IRC_CHAN_INVOKE_CALLBACK(chan, on_self_join);
       
    30     }
       
    31 }
    27 
    32 
    28         // TODO: callbacks
    33 /**
    29     }
    34  * :nm PRIVMSG <channel> <message>
       
    35  */
       
    36 static void irc_chan_on_PRIVMSG (const struct irc_line *line, void *arg)
       
    37 {
       
    38     struct irc_chan *chan = arg;
       
    39 
       
    40     // invoke callback (prefix, message)
       
    41     IRC_CHAN_INVOKE_CALLBACK(chan, on_msg, line->prefix, line->args[1]);
    30 }
    42 }
    31 
    43 
    32 /**
    44 /**
    33  * Core command handlers
    45  * Core command handlers
    34  */
    46  */
    35 struct irc_cmd_handler _cmd_handlers[] = {
    47 struct irc_cmd_handler _cmd_handlers[] = {
    36     {   "JOIN",     &irc_chan_on_JOIN   },
    48     {   "JOIN",     &irc_chan_on_JOIN       },
    37     {   NULL,       NULL                }
    49     {   "PRIVMSG",  &irc_chan_on_PRIVMSG    },
       
    50     {   NULL,       NULL                    }
    38 };
    51 };
    39 
    52 
    40 err_t irc_chan_create (struct irc_chan **chan_ptr, struct irc_net *net, const struct irc_chan_info *info, struct error_info *err)
    53 err_t irc_chan_create (struct irc_chan **chan_ptr, struct irc_net *net, const struct irc_chan_info *info, struct error_info *err)
    41 {
    54 {
    42     struct irc_chan *chan;
    55     struct irc_chan *chan;
    49     chan->net = net;
    62     chan->net = net;
    50     chan->info = *info;
    63     chan->info = *info;
    51 
    64 
    52     // init
    65     // init
    53     irc_cmd_init(&chan->handlers);
    66     irc_cmd_init(&chan->handlers);
       
    67     CHAIN_INIT(&chan->callbacks);
    54     
    68     
    55     // add handlers
    69     // add handlers
    56     if ((ERROR_CODE(err) = irc_cmd_add(&chan->handlers, _cmd_handlers, chan)))
    70     if ((ERROR_CODE(err) = irc_cmd_add(&chan->handlers, _cmd_handlers, chan)))
    57         goto error;
    71         goto error;
    58 
    72 
    71 void irc_chan_destroy (struct irc_chan *chan)
    85 void irc_chan_destroy (struct irc_chan *chan)
    72 {
    86 {
    73     // free command handlers
    87     // free command handlers
    74     irc_cmd_free(&chan->handlers);
    88     irc_cmd_free(&chan->handlers);
    75 
    89 
       
    90     // free callbacks
       
    91     chain_free(&chan->callbacks);
       
    92 
    76     // free chan itself
    93     // free chan itself
    77     free(chan);
    94     free(chan);
       
    95 }
       
    96 
       
    97 err_t irc_chan_add_callbacks (struct irc_chan *chan, const struct irc_chan_callbacks *callbacks, void *arg)
       
    98 {
       
    99     return chain_add(&chan->callbacks, callbacks, arg);
    78 }
   100 }
    79 
   101 
    80 err_t irc_chan_join (struct irc_chan *chan)
   102 err_t irc_chan_join (struct irc_chan *chan)
    81 {
   103 {
    82     err_t err;
   104     err_t err;