mirror of
https://github.com/weechat/weechat.git
synced 2026-07-09 11:13:12 +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:
+37
-10
@@ -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
@@ -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
@@ -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 ();
|
||||
|
||||
Reference in New Issue
Block a user