1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-07 18:23:13 +02:00

auto-reconnection to server (new options: server_autoreconnect (on/off), server_autoreconnect_delay (in seconds)), disconnections are now managed without problem by WeeChat

This commit is contained in:
Sebastien Helleu
2004-12-27 16:22:39 +00:00
parent 486e55be02
commit f4f2ec3668
20 changed files with 1096 additions and 798 deletions
+12 -12
View File
@@ -1026,7 +1026,6 @@ int
weechat_cmd_connect (int argc, char **argv)
{
t_irc_server *ptr_server;
t_irc_channel *ptr_channel;
/* make gcc happy */
(void) argc;
@@ -1048,13 +1047,9 @@ weechat_cmd_connect (int argc, char **argv)
}
if (server_connect (ptr_server))
{
ptr_server->reconnect_start = 0;
ptr_server->reconnect_join = (ptr_server->channels) ? 1 : 0;
irc_login (ptr_server);
for (ptr_channel = ptr_server->channels; ptr_channel;
ptr_channel = ptr_channel->next_channel)
{
if (ptr_channel->type == CHAT_CHANNEL)
server_sendf (ptr_server, "JOIN %s\r\n", ptr_channel->name);
}
}
}
else
@@ -1082,14 +1077,17 @@ weechat_cmd_disconnect (int argc, char **argv)
ptr_server = server_search (argv[0]);
if (ptr_server)
{
if (!ptr_server->is_connected)
if ((!ptr_server->is_connected) && (ptr_server->reconnect_start == 0))
{
gui_printf (NULL,
gui_printf (ptr_server->buffer,
_("%s not connected to server \"%s\"!\n"),
WEECHAT_ERROR, argv[0]);
return -1;
}
server_disconnect (ptr_server);
if (ptr_server->reconnect_start > 0)
gui_printf (ptr_server->buffer,
_("Auto-reconnection is cancelled\n"));
server_disconnect (ptr_server, 0);
gui_draw_buffer_status (gui_current_window->buffer, 1);
}
else
@@ -1603,8 +1601,10 @@ weechat_cmd_server (int argc, char **argv)
}
/* create new server */
new_server = server_new (server.name, server.autoconnect, 0,
server.address, server.port, server.password,
new_server = server_new (server.name, server.autoconnect,
server.autoreconnect,
server.autoreconnect_delay,
0, server.address, server.port, server.password,
server.nick1, server.nick2, server.nick3,
server.username, server.realname,
server.command, 1, server.autojoin, 1);
+4 -2
View File
@@ -228,8 +228,10 @@ wee_parse_args (int argc, char *argv[])
}
else
{
if (!server_new (server_tmp.name, 0, 1,
server_tmp.address, server_tmp.port,
if (!server_new (server_tmp.name, server_tmp.autoconnect,
server_tmp.autoreconnect,
server_tmp.autoreconnect_delay,
1, server_tmp.address, server_tmp.port,
server_tmp.password, server_tmp.nick1,
server_tmp.nick2, server_tmp.nick3,
NULL, NULL, NULL, 0, server_tmp.autojoin, 1))
+14 -1
View File
@@ -534,6 +534,14 @@ t_config_option weechat_options_server[] =
N_("automatically connect to server when WeeChat is starting"),
OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
NULL, NULL, &(cfg_server.autoconnect), NULL, NULL },
{ "server_autoreconnect", N_("automatically reconnect to server"),
N_("automatically reconnect to server when disconnected"),
OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
NULL, NULL, &(cfg_server.autoreconnect), NULL, NULL },
{ "server_autoreconnect_delay", N_("delay before trying again to reconnect"),
N_("delay (in deconds) before trying again to reconnect to server"),
OPTION_TYPE_INT, 0, 65535, 30,
NULL, NULL, &(cfg_server.autoreconnect_delay), NULL, NULL },
{ "server_address", N_("server address or hostname"),
N_("IP address or hostname of IRC server"),
OPTION_TYPE_STRING, 0, 0, 0,
@@ -815,7 +823,8 @@ config_allocate_server (char *filename, int line_number)
return 0;
}
if (!server_new (cfg_server.name,
cfg_server.autoconnect, 0, cfg_server.address, cfg_server.port,
cfg_server.autoconnect, cfg_server.autoreconnect,
cfg_server.autoreconnect_delay, 0, cfg_server.address, cfg_server.port,
cfg_server.password, cfg_server.nick1, cfg_server.nick2,
cfg_server.nick3, cfg_server.username, cfg_server.realname,
cfg_server.command, cfg_server.command_delay, cfg_server.autojoin,
@@ -1374,6 +1383,10 @@ config_write (char *config_name)
fprintf (file, "server_name=%s\n", ptr_server->name);
fprintf (file, "server_autoconnect=%s\n",
(ptr_server->autoconnect) ? "on" : "off");
fprintf (file, "server_autoreconnect=%s\n",
(ptr_server->autoreconnect) ? "on" : "off");
fprintf (file, "server_autoreconnect_delay=%d\n",
ptr_server->autoreconnect_delay);
fprintf (file, "server_address=%s\n", ptr_server->address);
fprintf (file, "server_port=%d\n", ptr_server->port);
fprintf (file, "server_password=%s\n",
+8 -2
View File
@@ -627,8 +627,14 @@ gui_main_loop ()
for (ptr_server = irc_servers; ptr_server;
ptr_server = ptr_server->next_server)
{
if (ptr_server->sock4 >= 0)
FD_SET (ptr_server->sock4, &read_fd);
/* check if reconnection is pending */
if ((!ptr_server->is_connected)
&& (ptr_server->reconnect_start > 0)
&& (new_time >= (ptr_server->reconnect_start + ptr_server->autoreconnect_delay)))
server_reconnect (ptr_server);
else
if (ptr_server->sock4 >= 0)
FD_SET (ptr_server->sock4, &read_fd);
}
if (select (FD_SETSIZE, &read_fd, NULL, NULL, &timeout))
{
+37 -10
View File
@@ -99,7 +99,7 @@ irc_cmd_recv_error (t_irc_server *server, char *host, char *arguments)
if (strncmp (arguments, "Closing Link", 12) == 0)
{
server_disconnect (server);
server_disconnect (server, 1);
return 0;
}
@@ -1500,6 +1500,7 @@ int
irc_cmd_recv_004 (t_irc_server *server, char *host, char *arguments)
{
char *pos;
t_irc_channel *ptr_channel;
/* make gcc happy */
(void) host;
@@ -1528,9 +1529,23 @@ irc_cmd_recv_004 (t_irc_server *server, char *host, char *arguments)
sleep (server->command_delay);
}
/* autojoin */
if (server->autojoin && server->autojoin[0])
return irc_cmd_send_join (server, server->autojoin);
/* auto-join after disconnection (only rejoins opened channels) */
if (server->reconnect_join)
{
for (ptr_channel = server->channels; ptr_channel;
ptr_channel = ptr_channel->next_channel)
{
if (ptr_channel->type == CHAT_CHANNEL)
server_sendf (server, "JOIN %s\r\n", ptr_channel->name);
}
server->reconnect_join = 0;
}
else
{
/* auto-join when connecting to server for first time */
if (server->autojoin && server->autojoin[0])
return irc_cmd_send_join (server, server->autojoin);
}
return 0;
}
@@ -2919,12 +2934,24 @@ irc_cmd_recv_433 (t_irc_server *server, char *host, char *arguments)
}
else
{
gui_printf (server->buffer,
_("%s: all declared nicknames are already in use, "
"closing connection with server!\n"),
PACKAGE_NAME);
server_disconnect (server);
return 0;
if (strcmp (server->nick, server->nick3) == 0)
{
gui_printf (server->buffer,
_("%s: all declared nicknames are already in use, "
"closing connection with server!\n"),
PACKAGE_NAME);
server_disconnect (server, 1);
return 0;
}
else
{
gui_printf (server->buffer,
_("%s: nickname \"%s\" is already in use, "
"trying 1st nickname \"%s\"\n"),
PACKAGE_NAME, server->nick, server->nick1);
free (server->nick);
server->nick = strdup (server->nick1);
}
}
}
+68 -16
View File
@@ -59,7 +59,9 @@ void
server_init (t_irc_server *server)
{
server->name = NULL;
server->autoconnect = 0;
server->autoconnect = 1;
server->autoreconnect = 1;
server->autoreconnect_delay = 30;
server->command_line = 0;
server->address = NULL;
server->port = -1;
@@ -74,6 +76,8 @@ server_init (t_irc_server *server)
server->autojoin = NULL;
server->nick = NULL;
server->is_connected = 0;
server->reconnect_start = 0;
server->reconnect_join = 0;
server->sock4 = -1;
server->is_away = 0;
server->server_read = -1;
@@ -291,10 +295,11 @@ server_free_all ()
*/
t_irc_server *
server_new (char *name, int autoconnect, int command_line, char *address,
int port, char *password, char *nick1, char *nick2, char *nick3,
char *username, char *realname, char *command, int command_delay,
char *autojoin, int autorejoin)
server_new (char *name, int autoconnect, int autoreconnect, int autoreconnect_delay,
int command_line, char *address, int port, char *password,
char *nick1, char *nick2, char *nick3, char *username,
char *realname, char *command, int command_delay, char *autojoin,
int autorejoin)
{
t_irc_server *new_server;
@@ -316,6 +321,8 @@ server_new (char *name, int autoconnect, int command_line, char *address,
{
new_server->name = strdup (name);
new_server->autoconnect = autoconnect;
new_server->autoreconnect = autoreconnect;
new_server->autoreconnect_delay = autoreconnect_delay;
new_server->command_line = command_line;
new_server->address = strdup (address);
new_server->port = port;
@@ -591,8 +598,9 @@ server_recv (t_irc_server *server)
else
{
gui_printf (server->buffer,
_("%s cannot read data from socket, disconnecting from server...\n"));
server_disconnect (server);
_("%s cannot read data from socket, disconnecting from server...\n"),
WEECHAT_ERROR);
server_disconnect (server, 1);
}
}
@@ -700,6 +708,29 @@ server_connect (t_irc_server *server)
return 1;
}
/*
* server_reconnect: reconnect to a server (after disconnection)
*/
void
server_reconnect (t_irc_server *server)
{
gui_printf (server->buffer, _("Reconnecting to server...\n"));
server->reconnect_start = 0;
if (server_connect (server))
{
server->reconnect_join = 1;
irc_login (server);
}
else
{
server->reconnect_start = time (NULL);
gui_printf (server->buffer, _("Reconnecting to server in %d seconds\n"),
server->autoreconnect_delay);
}
}
/*
* server_auto_connect: auto-connect to servers (called at startup)
*/
@@ -727,7 +758,7 @@ server_auto_connect (int command_line)
*/
void
server_disconnect (t_irc_server *server)
server_disconnect (t_irc_server *server, int reconnect)
{
t_irc_channel *ptr_channel;
@@ -737,17 +768,38 @@ server_disconnect (t_irc_server *server)
for (ptr_channel = server->channels; ptr_channel;
ptr_channel = ptr_channel->next_channel)
{
nick_free_all (ptr_channel);
irc_display_prefix (ptr_channel->buffer, PREFIX_INFO);
gui_printf (ptr_channel->buffer, _("Disconnected from server!\n"));
}
/* close communication with server */
close (server->server_read);
close (server->server_write);
close (server->sock4);
server->is_connected = 0;
server->sock4 = -1;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
gui_draw_buffer_status (gui_current_window->buffer, 1);
}
/* close communication with server */
if (server->server_read >= 0)
close (server->server_read);
server->server_read = -1;
if (server->server_write >= 0)
close (server->server_write);
server->server_write = -1;
if (server->sock4 >= 0)
close (server->sock4);
server->sock4 = -1;
server->is_connected = 0;
if ((reconnect) && (server->autoreconnect))
{
server->reconnect_start = time (NULL);
gui_printf (server->buffer, _("Reconnecting to server in %d seconds\n"),
server->autoreconnect_delay);
}
else
server->reconnect_start = 0;
}
/*
@@ -760,7 +812,7 @@ server_disconnect_all ()
t_irc_server *ptr_server;
for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server)
server_disconnect (ptr_server);
server_disconnect (ptr_server, 0);
}
/*
+10 -5
View File
@@ -116,6 +116,8 @@ struct t_irc_server
/* user choices */
char *name; /* name of server (only for display) */
int autoconnect; /* = 1 if auto connect at startup */
int autoreconnect; /* = 1 if auto reco when disconnected */
int autoreconnect_delay; /* delay before trying again reconnect */
int command_line; /* server was given on command line */
char *address; /* address of server (IP or name) */
int port; /* port for server (6667 by default) */
@@ -133,6 +135,8 @@ struct t_irc_server
/* internal vars */
char *nick; /* current nickname */
int is_connected; /* 1 if WeeChat is connected to server */
time_t reconnect_start; /* this time + delay = reconnect time */
int reconnect_join; /* 1 if channels opened to rejoin */
int sock4; /* socket for server */
int is_away; /* 1 is user is marker as away */
time_t away_time; /* time() when user marking as away */
@@ -214,15 +218,16 @@ extern t_irc_server *server_alloc ();
extern void server_destroy (t_irc_server *);
extern void server_free (t_irc_server *);
extern void server_free_all ();
extern t_irc_server *server_new (char *, int, int, char *, int, char *, char *,
char *, char *, char *, char *, char *, int,
char *, int);
extern t_irc_server *server_new (char *, int, int, int, int, char *, int, char *,
char *, char *, char *, char *, char *, char *,
int, char *, int);
extern int server_send (t_irc_server *, char *, int);
extern void server_sendf (t_irc_server *, char *, ...);
extern void server_recv (t_irc_server *);
extern int server_connect ();
extern int server_connect (t_irc_server *);
extern void server_reconnect (t_irc_server *);
extern void server_auto_connect (int);
extern void server_disconnect (t_irc_server *);
extern void server_disconnect (t_irc_server *, int);
extern void server_disconnect_all ();
extern t_irc_server *server_search (char *);
extern int server_get_number_connected ();