1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-09 03:03:12 +02:00

Add option "autorejoin_delay" for servers (task #8771), fix autorejoin on channels with key

This commit is contained in:
Sebastien Helleu
2009-12-16 15:18:00 +01:00
parent 8aa7380d65
commit 265fa492d5
20 changed files with 212 additions and 35 deletions
+61
View File
@@ -29,6 +29,7 @@
#include "irc.h"
#include "irc-channel.h"
#include "irc-buffer.h"
#include "irc-command.h"
#include "irc-config.h"
#include "irc-nick.h"
#include "irc-server.h"
@@ -244,6 +245,7 @@ irc_channel_new (struct t_irc_server *server, int channel_type,
new_channel->display_creation_date = 0;
new_channel->nick_completion_reset = 0;
new_channel->pv_remote_nick_color = NULL;
new_channel->hook_autorejoin = NULL;
new_channel->nicks_count = 0;
new_channel->nicks = NULL;
new_channel->last_nick = NULL;
@@ -615,6 +617,62 @@ irc_channel_nick_speaking_time_rename (struct t_irc_channel *channel,
}
}
/*
* irc_channel_rejoin: rejoin a channel (for example after kick)
*/
void
irc_channel_rejoin (struct t_irc_server *server, struct t_irc_channel *channel)
{
char join_args[256];
snprintf (join_args, sizeof (join_args), "%s%s%s",
channel->name,
(channel->key) ? " " : "",
(channel->key) ? channel->key : "");
irc_command_join_server (server, join_args);
}
/*
* irc_channel_autorejoin_cb: callback for autorejoin on a channel
*/
int
irc_channel_autorejoin_cb (void *data, int remaining_calls)
{
struct t_irc_server *ptr_server, *ptr_server_found;
struct t_irc_channel *ptr_channel_arg, *ptr_channel;
/* make C compiler happy */
(void) remaining_calls;
ptr_channel_arg = (struct t_irc_channel *)data;
ptr_server_found = NULL;
for (ptr_server = irc_servers; ptr_server;
ptr_server = ptr_server->next_server)
{
for (ptr_channel = ptr_server->channels; ptr_channel;
ptr_channel = ptr_channel->next_channel)
{
if (ptr_channel == ptr_channel_arg)
{
ptr_server_found = ptr_server;
break;
}
}
}
if (ptr_server_found && (ptr_channel_arg->hook_autorejoin))
{
irc_channel_rejoin (ptr_server_found, ptr_channel_arg);
ptr_channel_arg->hook_autorejoin = NULL;
}
return WEECHAT_RC_OK;
}
/*
* irc_channel_free: free a channel and remove it from channels list
*/
@@ -655,6 +713,8 @@ irc_channel_free (struct t_irc_server *server, struct t_irc_channel *channel)
free (channel->away_message);
if (channel->pv_remote_nick_color)
free (channel->pv_remote_nick_color);
if (channel->hook_autorejoin)
weechat_unhook(channel->hook_autorejoin);
if (channel->nicks_speaking[0])
weechat_list_free (channel->nicks_speaking[0]);
if (channel->nicks_speaking[1])
@@ -805,6 +865,7 @@ irc_channel_print_log (struct t_irc_channel *channel)
weechat_log_printf (" display_creation_date. . : %d", channel->display_creation_date);
weechat_log_printf (" nick_completion_reset. . : %d", channel->nick_completion_reset);
weechat_log_printf (" pv_remote_nick_color . . : '%s'", channel->pv_remote_nick_color);
weechat_log_printf (" hook_autorejoin. . . . . : 0x%lx", channel->hook_autorejoin);
weechat_log_printf (" nicks_count. . . . . . . : %d", channel->nicks_count);
weechat_log_printf (" nicks. . . . . . . . . . : 0x%lx", channel->nicks);
weechat_log_printf (" last_nick. . . . . . . . : 0x%lx", channel->last_nick);
+4
View File
@@ -54,6 +54,7 @@ struct t_irc_channel
int nick_completion_reset; /* 1 for resetting nick completion */
/* there was some join/part on chan */
char *pv_remote_nick_color; /* color for remote nick in pv */
struct t_hook *hook_autorejoin; /* this time+delay = autorejoin time */
int nicks_count; /* # nicks on channel (0 if pv) */
struct t_irc_nick *nicks; /* nicks on the channel */
struct t_irc_nick *last_nick; /* last nick on the channel */
@@ -106,6 +107,9 @@ extern void irc_channel_nick_speaking_time_add (struct t_irc_channel *channel,
extern void irc_channel_nick_speaking_time_rename (struct t_irc_channel *channel,
const char *old_nick,
const char *new_nick);
extern void irc_channel_rejoin (struct t_irc_server *server,
struct t_irc_channel *channel);
extern int irc_channel_autorejoin_cb (void *data, int remaining_calls);
extern int irc_channel_add_to_infolist (struct t_infolist *infolist,
struct t_irc_channel *channel);
extern void irc_channel_print_log (struct t_irc_channel *channel);
+13 -1
View File
@@ -985,7 +985,7 @@ irc_config_server_new_option (struct t_config_file *config_file,
new_option = weechat_config_new_option (
config_file, section,
option_name, "boolean",
N_("automatically rejoin channels when kicked"),
N_("automatically rejoin channels after kick"),
NULL, 0, 0,
default_value, value,
null_value_allowed,
@@ -993,6 +993,18 @@ irc_config_server_new_option (struct t_config_file *config_file,
callback_change, callback_change_data,
NULL, NULL);
break;
case IRC_SERVER_OPTION_AUTOREJOIN_DELAY:
new_option = weechat_config_new_option (
config_file, section,
option_name, "integer",
N_("delay (in seconds) before autorejoin (after kick)"),
NULL, 0, 3600*24,
default_value, value,
null_value_allowed,
NULL, NULL,
callback_change, callback_change_data,
NULL, NULL);
break;
case IRC_SERVER_NUM_OPTIONS:
break;
}
+9
View File
@@ -337,6 +337,15 @@ irc_display_server (struct t_irc_server *server, int with_detail)
IRC_COLOR_CHAT_VALUE,
weechat_config_boolean (server->options[IRC_SERVER_OPTION_AUTOREJOIN]) ?
_("on") : _("off"));
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_AUTOREJOIN_DELAY]))
weechat_printf (NULL, " autorejoin_delay . . : (%d %s)",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AUTOREJOIN_DELAY),
NG_("second", "seconds", IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AUTOREJOIN_DELAY)));
else
weechat_printf (NULL, " autorejoin_delay . . : %s%d %s",
IRC_COLOR_CHAT_VALUE,
weechat_config_integer (server->options[IRC_SERVER_OPTION_AUTOREJOIN_DELAY]),
NG_("second", "seconds", weechat_config_integer (server->options[IRC_SERVER_OPTION_AUTOREJOIN_DELAY])));
}
else
{
+16 -1
View File
@@ -464,7 +464,22 @@ irc_protocol_cmd_kick (struct t_irc_server *server, const char *command,
more */
irc_nick_free_all (ptr_channel);
if (IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AUTOREJOIN))
irc_command_join_server (server, ptr_channel->name);
{
if (IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AUTOREJOIN_DELAY) == 0)
{
/* immediately rejoin if delay is 0 */
irc_channel_rejoin (server, ptr_channel);
}
else
{
/* rejoin channel later, according to delay */
ptr_channel->hook_autorejoin =
weechat_hook_timer (IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AUTOREJOIN_DELAY) * 1000,
0, 1,
&irc_channel_autorejoin_cb,
ptr_channel);
}
}
}
else
{
+17 -6
View File
@@ -58,15 +58,17 @@ struct t_irc_message *irc_recv_msgq = NULL;
struct t_irc_message *irc_msgq_last_msg = NULL;
char *irc_server_option_string[IRC_SERVER_NUM_OPTIONS] =
{ "addresses", "proxy", "ipv6", "ssl", "password", "autoconnect",
"autoreconnect", "autoreconnect_delay", "nicks", "username", "realname",
"local_hostname", "command", "command_delay", "autojoin", "autorejoin",
"ssl_cert", "ssl_dhkey_size", "ssl_verify",
{ "addresses", "proxy", "ipv6", "ssl", "ssl_cert", "ssl_dhkey_size",
"ssl_verify", "password", "autoconnect", "autoreconnect",
"autoreconnect_delay", "nicks", "username", "realname", "local_hostname",
"command", "command_delay", "autojoin", "autorejoin", "autorejoin_delay",
};
char *irc_server_option_default[IRC_SERVER_NUM_OPTIONS] =
{ "", "", "off", "off", "", "off", "on", "30", "",
"", "", "", "", "0", "", "off", "", "2048", "on",
{ "", "", "off", "off", "", "2048",
"on", "", "off", "on",
"30", "", "", "", "",
"", "0", "", "off", "30",
};
@@ -3253,6 +3255,9 @@ irc_server_add_to_infolist (struct t_infolist *infolist,
if (!weechat_infolist_new_var_integer (ptr_item, "autorejoin",
IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_AUTOREJOIN)))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "autorejoin_delay",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AUTOREJOIN_DELAY)))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "temp_server", server->temp_server))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "index_current_address", server->index_current_address))
@@ -3437,6 +3442,12 @@ irc_server_print_log ()
weechat_log_printf (" autorejoin . . . . . : %s",
weechat_config_boolean (ptr_server->options[IRC_SERVER_OPTION_AUTOREJOIN]) ?
"on" : "off");
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_AUTOREJOIN_DELAY]))
weechat_log_printf (" autorejoin_delay . . : null (%d)",
IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_AUTOREJOIN_DELAY));
else
weechat_log_printf (" autorejoin_delay . . : %d",
weechat_config_integer (ptr_server->options[IRC_SERVER_OPTION_AUTOREJOIN_DELAY]));
weechat_log_printf (" temp_server. . . . . : %d", ptr_server->temp_server);
weechat_log_printf (" reloading_from_config: %d", ptr_server->reloaded_from_config);
weechat_log_printf (" reloaded_from_config : %d", ptr_server->reloaded_from_config);
+4 -3
View File
@@ -37,6 +37,9 @@ enum t_irc_server_option
IRC_SERVER_OPTION_PROXY, /* proxy used for server (optional) */
IRC_SERVER_OPTION_IPV6, /* use IPv6 protocol */
IRC_SERVER_OPTION_SSL, /* SSL protocol */
IRC_SERVER_OPTION_SSL_CERT, /* client ssl certificate file */
IRC_SERVER_OPTION_SSL_DHKEY_SIZE, /* Diffie Hellman key size */
IRC_SERVER_OPTION_SSL_VERIFY, /* check if the connection is trusted */
IRC_SERVER_OPTION_PASSWORD, /* password for server */
IRC_SERVER_OPTION_AUTOCONNECT, /* autoconnect to server at startup */
IRC_SERVER_OPTION_AUTORECONNECT, /* autoreconnect when disconnected */
@@ -49,9 +52,7 @@ enum t_irc_server_option
IRC_SERVER_OPTION_COMMAND_DELAY, /* delay after execution of command */
IRC_SERVER_OPTION_AUTOJOIN, /* channels to automatically join */
IRC_SERVER_OPTION_AUTOREJOIN, /* auto rejoin channels when kicked */
IRC_SERVER_OPTION_SSL_CERT, /* client ssl certificate file */
IRC_SERVER_OPTION_SSL_DHKEY_SIZE, /* Diffie Hellman key size */
IRC_SERVER_OPTION_SSL_VERIFY, /* check if the connection is trusted */
IRC_SERVER_OPTION_AUTOREJOIN_DELAY, /* delay before auto rejoin */
/* number of server options */
IRC_SERVER_NUM_OPTIONS,
};