From 2e831d8c5afed965465a163769ea5dcd62394eef Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Wed, 3 Mar 2010 15:09:19 +0100 Subject: handle to get kicked out from a channel wait 5 seconds before joining again --- sircbot.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/sircbot.c b/sircbot.c index cbfe51c..81d2deb 100644 --- a/sircbot.c +++ b/sircbot.c @@ -39,6 +39,7 @@ struct sircbot_channel { char *fifo; int fd; time_t last_data_sent; + time_t last_closetime; /* last time we got kicked */ TQ_STRINGLIST queue_head; /* queue of in-data */ }; @@ -128,15 +129,16 @@ int init_fifo(struct sircbot_channel *chan) return 0; } -int close_fifo(struct sircbot_channel *chan) +int close_fifo(struct sircbot_channel *chan, time_t closetime) { close(chan->fd); chan->fd = -1; - unlink(chan->fifo); + chan->last_closetime = closetime; + return unlink(chan->fifo); } -int find_channel(struct sircbot_channel *chan, int numchan, char *name) +int join_channel(struct sircbot_channel *chan, int numchan, char *name) { int i; for (i = 0; i < numchan; i++) { @@ -146,6 +148,18 @@ int find_channel(struct sircbot_channel *chan, int numchan, char *name) return 0; } +int kick_channel(struct sircbot_channel *chan, int numchan, char *name) +{ + int i; + time_t now = time(NULL); + printf("got kicked from %s\n", name); + for (i = 0; i < numchan; i++) { + if (strcmp(chan[i].name, name) == 0) + return close_fifo(&chan[i], now); + } + return 0; +} + int run_hooks(char *user, char *rcpt, char* data) { int pid = fork(); @@ -190,7 +204,9 @@ int handle_response(struct irc_session *sess, char *user, char *cmd, char *data, } else if (strncmp(cmd, "PONG", 4) == 0) { sess->last_pong = time(NULL); } else if (strncmp(cmd, "JOIN", 4) == 0) { - return find_channel(chan, numchan, data); + return join_channel(chan, numchan, data); + } else if (strncmp(cmd, "KICK", 4) == 0) { + return kick_channel(chan, numchan, data); } else if (strncmp(cmd, "PRIVMSG", 7) == 0) { char *p = strchr(data, ' '); if (p) { @@ -289,14 +305,17 @@ static int irc_loop(struct irc_session *sess, struct sircbot_channel *chan, struct timespec tv; time_t now, last_ping; - for (i = 0; i < numchan; i++) - irc_send(sess, "JOIN", chan[i].name); - sigemptyset(&sigmask); sigaddset(&sigmask, SIGTERM); tv.tv_sec = 1; tv.tv_nsec = 0; while (!sigterm) { + now = time(NULL); + /* wait atleast 5 secs before we join a channel */ + for (i = 0; i < numchan; i++) + if ((now - chan[i].last_closetime) > 5) + irc_send(sess, "JOIN", chan[i].name); + irc_reset_pollfds(sess, fds, chan, numchan); r = ppoll(fds, numchan+1, &tv, &sigmask); @@ -414,6 +433,7 @@ int main(int argc, char *argv[]) for (i = 0; i < argc; i++) { chan[i].fd = -1; chan[i].name = strdup(argv[i]); + chan[i].last_closetime = 0; asprintf(&chan[i].fifo, "/var/run/sircbot/%s", argv[i]); unlink(chan[i].fifo); TAILQ_INIT(&chan[i].queue_head); @@ -441,7 +461,7 @@ int main(int argc, char *argv[]) irc_close(s, "bye"); /* reset fifos */ for (i = 0; i < argc; i++) - close_fifo(&chan[i]); + close_fifo(&chan[i], 0); } unlink(pidfile); return 0; -- cgit v1.2.3