aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <natanael.copa@gmail.com>2010-03-03 15:09:19 +0100
committerNatanael Copa <natanael.copa@gmail.com>2010-03-03 15:09:19 +0100
commit2e831d8c5afed965465a163769ea5dcd62394eef (patch)
tree85e229505cb0edf1fb82b51a402a21e4e3c597fd
parent68c1c4514426385e025e2e2d55a2da9008b26fa6 (diff)
downloadsircbot-2e831d8c5afed965465a163769ea5dcd62394eef.tar.bz2
sircbot-2e831d8c5afed965465a163769ea5dcd62394eef.tar.xz
handle to get kicked out from a channel
wait 5 seconds before joining again
-rw-r--r--sircbot.c36
1 files 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;