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 |