void sendbuf(struct client_data *client) {
send_log(client->FD, databuf.buf, databuf.len, 0);
}
+void chanlog_time(time_t timestamp) {
+ extern FILE *fchanlog;
+ if (fchanlog) {
+ fprintf(fchanlog, "$%lu %.*s", (unsigned long)timestamp, (int)databuf.len, databuf.buf);
+ fflush(fchanlog);
+ }
+}
+void chanlog() {
+ extern FILE *fchanlog;
+ if (fchanlog) {
+ fprintf(fchanlog, "%.*s", (int)databuf.len, databuf.buf);
+ fflush(fchanlog);
+ }
+}
void sendbuf_chan(struct channel *chan) {
struct trie_find *f = NULL;
if (trie_findfirst(&f, &chan->members) == 1)
chan->topic_when = get_time();
}
msg_topic(client, chan);
+ chanlog_time(chan->topic_when);
sendbuf_chan(chan);
}
} else if(strcmp(command, "PRIVMSG") == 0 || strcmp(command, "NOTICE") == 0) {
break;
SETBIT(chan->dmode, DMODE_PERSIST, is_plus);
MSG_CHANDMODE("P");
- sendbuf_chan(chan);
+ chanlog(), sendbuf_chan(chan);
break;
case 'i':
SETBIT(chan->dmode, DMODE_INVITEONLY, is_plus);
MSG_CHANDMODE("i");
- sendbuf_chan(chan);
+ chanlog(), sendbuf_chan(chan);
break;
case 'm':
SETBIT(chan->dmode, DMODE_MODERATED, is_plus);
MSG_CHANDMODE("m");
- sendbuf_chan(chan);
+ chanlog(), sendbuf_chan(chan);
break;
case 'n':
SETBIT(chan->dmode, DMODE_NOEXTERNAL, is_plus);
MSG_CHANDMODE("n");
- sendbuf_chan(chan);
+ chanlog(), sendbuf_chan(chan);
break;
case 's':
SETBIT(chan->dmode, DMODE_SECRET, is_plus);
MSG_CHANDMODE("s");
- sendbuf_chan(chan);
+ chanlog(), sendbuf_chan(chan);
break;
case 't':
SETBIT(chan->dmode, DMODE_TOPICPROT, is_plus);
MSG_CHANDMODE("t");
- sendbuf_chan(chan);
+ chanlog(), sendbuf_chan(chan);
break;
case 'l':
if (is_plus) {
copy_strf(&databuf, ":%s!%s@%s MODE %s +l %u\r\n",
client->nick, client->username, client->hostname,
chan->name, x);
- sendbuf_chan(chan);
+ chanlog(), sendbuf_chan(chan);
argp++;
}
} else {
chan->member_limit = -1;
MSG_CHANDMODE("l");
- sendbuf_chan(chan);
+ chanlog(), sendbuf_chan(chan);
}
break;
case 'k':
copy_strf(&databuf, ":%s!%s@%s MODE %s %sk %s\r\n",
client->nick, client->username, client->hostname,
chan->name, is_plus?"+":"-", is_plus?*argp:"*");
- sendbuf_chan(chan);
+ chanlog(), sendbuf_chan(chan);
break;
case 'b':
case 'e':
strcpy(key, channel);
stringlower(key);
struct channel *chan = trie_get(&channel_map, key);
+ int newchan = !chan;
if (!chan) {
chan = malloc(sizeof(struct channel));
if (!chan) abort();
chan->member_count++;
// send JOIN to everyone
msg_join(client, chan);
+ if (newchan)
+ chanlog_time(chan->creation);
sendbuf_chan(chan);
// send topic
channel_sendtopic(client, chan, 1);