From b947a2e4bc6b944191bca1b521b15004110c04b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Janouch?= Date: Sat, 18 Jul 2015 14:12:34 +0200 Subject: [PATCH] degesch: add a "command_delay" option to servers E.g. for channels that are for registered users only. --- degesch.c | 50 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/degesch.c b/degesch.c index e90904a..5876af0 100644 --- a/degesch.c +++ b/degesch.c @@ -1132,6 +1132,7 @@ struct server struct poller_timer ping_tmr; ///< We should send a ping struct poller_timer timeout_tmr; ///< Connection seems to be dead struct poller_timer reconnect_tmr; ///< We should reconnect now + struct poller_timer autojoin_tmr; ///< Re/join channels as appropriate // IRC: @@ -1173,6 +1174,7 @@ struct server static void on_irc_timeout (void *user_data); static void on_irc_ping_timeout (void *user_data); +static void on_irc_autojoin_timeout (void *user_data); static void irc_initiate_connect (struct server *s); static void @@ -1236,6 +1238,10 @@ server_init (struct server *self, struct poller *poller) self->reconnect_tmr.dispatcher = (poller_timer_fn) irc_initiate_connect; self->reconnect_tmr.user_data = self; + poller_timer_init (&self->autojoin_tmr, poller); + self->autojoin_tmr.dispatcher = on_irc_autojoin_timeout; + self->autojoin_tmr.user_data = self; + str_map_init (&self->irc_users); self->irc_users.key_xfrm = irc_strxfrm; str_map_init (&self->irc_channels); @@ -1276,6 +1282,7 @@ server_free (struct server *self) poller_timer_reset (&self->ping_tmr); poller_timer_reset (&self->timeout_tmr); poller_timer_reset (&self->reconnect_tmr); + poller_timer_reset (&self->autojoin_tmr); str_map_free (&self->irc_users); str_map_free (&self->irc_channels); @@ -1563,6 +1570,11 @@ static struct config_schema g_config_server[] = { .name = "command", .comment = "Command to execute after a successful connect", .type = CONFIG_ITEM_STRING }, + { .name = "command_delay", + .comment = "Delay between executing \"command\" and joining channels", + .type = CONFIG_ITEM_INTEGER, + .validate = config_validate_nonnegative, + .default_ = "0" }, { .name = "reconnect", .comment = "Whether to reconnect on error", .type = CONFIG_ITEM_BOOLEAN, @@ -3464,14 +3476,15 @@ irc_cancel_timers (struct server *s) poller_timer_reset (&s->timeout_tmr); poller_timer_reset (&s->ping_tmr); poller_timer_reset (&s->reconnect_tmr); + poller_timer_reset (&s->autojoin_tmr); } static void irc_reset_connection_timeouts (struct server *s) { - irc_cancel_timers (s); poller_timer_set (&s->timeout_tmr, 3 * 60 * 1000); poller_timer_set (&s->ping_tmr, (3 * 60 + 30) * 1000); + poller_timer_reset (&s->reconnect_tmr); } static int64_t @@ -3741,6 +3754,25 @@ on_irc_timeout (void *user_data) irc_send (s, "PING :%" PRIi64, (int64_t) time (NULL)); } +static void +on_irc_autojoin_timeout (void *user_data) +{ + struct server *s = user_data; + + // TODO: split autojoin at commas and make a joined set with regular rejoins + const char *autojoin = get_config_string (s->config, "autojoin"); + if (autojoin) + irc_send (s, "JOIN :%s", autojoin); + + struct str_map_iter iter; + str_map_iter_init (&iter, &s->irc_channels); + + struct channel *channel; + while ((channel = str_map_iter_next (&iter))) + if (!channel->left_manually) + irc_send (s, "JOIN :%s", channel->name); +} + // --- Server I/O -------------------------------------------------------------- static void irc_process_message @@ -5607,18 +5639,10 @@ irc_on_registered (struct server *s, const char *nickname) free (copy); } - // TODO: split autojoin at commas and make a joined set with regular rejoins - const char *autojoin = get_config_string (s->config, "autojoin"); - if (autojoin) - irc_send (s, "JOIN :%s", autojoin); - - struct str_map_iter iter; - str_map_iter_init (&iter, &s->irc_channels); - - struct channel *channel; - while ((channel = str_map_iter_next (&iter))) - if (!channel->left_manually) - irc_send (s, "JOIN :%s", channel->name); + int64_t command_delay = get_config_integer (s->config, "command_delay"); + log_server_debug (s, "Autojoining channels in #&s seconds...", + xstrdup_printf ("%" PRId64, command_delay)); + poller_timer_set (&s->autojoin_tmr, command_delay * 1000); } static void