1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-27 21:36:37 +02:00

Fixed server option "command_delay": does not freeze WeeChat any more

This commit is contained in:
Sebastien Helleu
2007-08-20 08:37:31 +00:00
parent fb8bae3c78
commit 69bd50d74c
16 changed files with 154 additions and 88 deletions
+2 -1
View File
@@ -1,10 +1,11 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
ChangeLog - 2007-08-17
ChangeLog - 2007-08-20
Version 0.2.6 (under dev!):
* fixed server option "command_delay": does not freeze WeeChat any more
* added paste detection, new options look_paste_max_lines and
col_input_actions (task #5442)
* fixed bug with highlight and UTF-8 chars around word (bug #20753)
+4
View File
@@ -260,6 +260,7 @@ session_save_servers (FILE *file)
rc = rc && (session_write_str (file, SESSION_SERV_NICK_MODES, ptr_server->nick_modes));
rc = rc && (session_write_str (file, SESSION_SERV_PREFIX, ptr_server->prefix));
rc = rc && (session_write_buf (file, SESSION_SERV_RECONNECT_START, &(ptr_server->reconnect_start), sizeof (time_t)));
rc = rc && (session_write_buf (file, SESSION_SERV_COMMAND_TIME, &(ptr_server->command_time), sizeof (time_t)));
rc = rc && (session_write_int (file, SESSION_SERV_RECONNECT_JOIN, ptr_server->reconnect_join));
rc = rc && (session_write_int (file, SESSION_SERV_IS_AWAY, ptr_server->is_away));
rc = rc && (session_write_str (file, SESSION_SERV_AWAY_MESSAGE, ptr_server->away_message));
@@ -993,6 +994,9 @@ session_load_server (FILE *file)
case SESSION_SERV_RECONNECT_START:
rc = rc && (session_read_buf (file, &(session_current_server->reconnect_start), sizeof (time_t)));
break;
case SESSION_SERV_COMMAND_TIME:
rc = rc && (session_read_buf (file, &(session_current_server->command_time), sizeof (time_t)));
break;
case SESSION_SERV_RECONNECT_JOIN:
rc = rc && (session_read_int (file, &(session_current_server->reconnect_join)));
break;
+2 -1
View File
@@ -92,7 +92,8 @@ enum t_session_server
SESSION_SERV_HOSTNAME,
SESSION_SERV_NICK_MODES,
SESSION_SERV_AWAY_MESSAGE,
SESSION_SERV_PREFIX
SESSION_SERV_PREFIX,
SESSION_SERV_COMMAND_TIME
};
enum t_session_channel
+1 -1
View File
@@ -1049,7 +1049,7 @@ t_config_option weechat_options_server[] =
"", NULL, NULL, &(cfg_server.command), NULL },
{ "server_command_delay", N_("delay (in seconds) after command was executed"),
N_("delay (in seconds) after command was executed (example: give some time for authentication)"),
OPTION_TYPE_INT, 0, 5, 0,
OPTION_TYPE_INT, 0, 3600, 0,
NULL, NULL, &(cfg_server.command_delay), NULL, NULL },
{ "server_autojoin", N_("list of channels to join when connected to server"),
N_("comma separated list of channels to join when connected to server (example: \"#chan1,#chan2,#chan3 key1,key2\")"),
+8
View File
@@ -253,6 +253,14 @@ gui_main_loop ()
continue;
}
}
/* check if it's time to autojoin channels (after command delay) */
if ((ptr_server->command_time != 0)
&& (new_time >= ptr_server->command_time + ptr_server->command_delay))
{
irc_server_autojoin_channels (ptr_server);
ptr_server->command_time = 0;
}
}
if (!ptr_server->is_connected && (ptr_server->child_pid > 0))
+18 -41
View File
@@ -2421,7 +2421,6 @@ irc_recv_cmd_001 (t_irc_server *server, char *host, char *nick, char *arguments)
{
char *pos;
char **commands, **ptr, *vars_replaced;
t_irc_channel *ptr_channel;
char *away_msg;
pos = strchr (arguments, ' ');
@@ -2438,8 +2437,17 @@ irc_recv_cmd_001 (t_irc_server *server, char *host, char *nick, char *arguments)
/* connection to IRC server is ok! */
server->is_connected = 1;
server->lag_next_check = time (NULL) + cfg_irc_lag_check;
gui_status_draw (server->buffer, 1);
gui_input_draw (server->buffer, 1);
/* set away message if user was away (before disconnection for example) */
if (server->away_message && server->away_message[0])
{
away_msg = strdup (server->away_message);
if (away_msg)
{
irc_send_away (server, away_msg);
free (away_msg);
}
}
/* execute command when connected */
if (server->command && server->command[0])
@@ -2460,46 +2468,15 @@ irc_recv_cmd_001 (t_irc_server *server, char *host, char *nick, char *arguments)
}
if (server->command_delay > 0)
sleep (server->command_delay);
}
/* auto-join after disconnection (only rejoins opened channels) */
if (!server->disable_autojoin && server->reconnect_join && server->channels)
{
for (ptr_channel = server->channels; ptr_channel;
ptr_channel = ptr_channel->next_channel)
{
if (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)
{
if (ptr_channel->key)
irc_server_sendf (server, "JOIN %s %s",
ptr_channel->name, ptr_channel->key);
else
irc_server_sendf (server, "JOIN %s",
ptr_channel->name);
}
}
server->reconnect_join = 0;
server->command_time = time (NULL) + 1;
else
irc_server_autojoin_channels (server);
}
else
{
/* auto-join when connecting to server for first time */
if (!server->disable_autojoin && server->autojoin && server->autojoin[0])
return irc_send_cmd_join (server, NULL, server->autojoin);
}
/* set away message if user was away (before disconnection for example) */
if (server->away_message && server->away_message[0])
{
away_msg = strdup (server->away_message);
if (away_msg)
{
irc_send_away (server, away_msg);
free (away_msg);
}
}
server->disable_autojoin = 0;
irc_server_autojoin_channels (server);
gui_status_draw (server->buffer, 1);
gui_input_draw (server->buffer, 1);
return 0;
}
+39
View File
@@ -116,6 +116,7 @@ irc_server_init (t_irc_server *server)
server->nick_modes = NULL;
server->prefix = NULL;
server->reconnect_start = 0;
server->command_time = 0;
server->reconnect_join = 0;
server->disable_autojoin = 0;
server->is_away = 0;
@@ -2074,6 +2075,43 @@ irc_server_disconnect_all ()
irc_server_disconnect (ptr_server, 0);
}
/*
* irc_server_autojoin_channels: autojoin (or rejoin) channels
*/
void
irc_server_autojoin_channels (t_irc_server *server)
{
t_irc_channel *ptr_channel;
/* auto-join after disconnection (only rejoins opened channels) */
if (!server->disable_autojoin && server->reconnect_join && server->channels)
{
for (ptr_channel = server->channels; ptr_channel;
ptr_channel = ptr_channel->next_channel)
{
if (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)
{
if (ptr_channel->key)
irc_server_sendf (server, "JOIN %s %s",
ptr_channel->name, ptr_channel->key);
else
irc_server_sendf (server, "JOIN %s",
ptr_channel->name);
}
}
server->reconnect_join = 0;
}
else
{
/* auto-join when connecting to server for first time */
if (!server->disable_autojoin && server->autojoin && server->autojoin[0])
irc_send_cmd_join (server, NULL, server->autojoin);
}
server->disable_autojoin = 0;
}
/*
* irc_server_search: return pointer on a server with a name
*/
@@ -2355,6 +2393,7 @@ irc_server_print_log (t_irc_server *server)
weechat_log_printf (" nick_modes. . . . . : '%s'\n", server->nick_modes);
weechat_log_printf (" prefix. . . . . . . : '%s'\n", server->prefix);
weechat_log_printf (" reconnect_start . . : %ld\n", server->reconnect_start);
weechat_log_printf (" command_time. . . . : %ld\n", server->command_time);
weechat_log_printf (" reconnect_join. . . : %d\n", server->reconnect_join);
weechat_log_printf (" disable_autojoin. . : %d\n", server->disable_autojoin);
weechat_log_printf (" is_away . . . . . . : %d\n", server->is_away);
+3
View File
@@ -172,6 +172,8 @@ struct t_irc_server
char *nick_modes; /* nick modes */
char *prefix; /* nick prefix allowed (from msg 005) */
time_t reconnect_start; /* this time + delay = reconnect time */
time_t command_time; /* this time + command_delay = time to */
/* autojoin channels */
int reconnect_join; /* 1 if channels opened to rejoin */
int disable_autojoin; /* 1 if user asked to not autojoin chans */
int is_away; /* 1 is user is marked as away */
@@ -384,6 +386,7 @@ extern void irc_server_reconnect (t_irc_server *);
extern void irc_server_auto_connect (int, int);
extern void irc_server_disconnect (t_irc_server *, int);
extern void irc_server_disconnect_all ();
extern void irc_server_autojoin_channels ();
extern t_irc_server *irc_server_search (char *);
extern int irc_server_get_number_connected ();
extern void irc_server_get_number_buffer (t_irc_server *, int *, int *);
+2 -1
View File
@@ -1,10 +1,11 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
ChangeLog - 2007-08-17
ChangeLog - 2007-08-20
Version 0.2.6 (under dev!):
* fixed server option "command_delay": does not freeze WeeChat any more
* added paste detection, new options look_paste_max_lines and
col_input_actions (task #5442)
* fixed bug with highlight and UTF-8 chars around word (bug #20753)
+4
View File
@@ -260,6 +260,7 @@ session_save_servers (FILE *file)
rc = rc && (session_write_str (file, SESSION_SERV_NICK_MODES, ptr_server->nick_modes));
rc = rc && (session_write_str (file, SESSION_SERV_PREFIX, ptr_server->prefix));
rc = rc && (session_write_buf (file, SESSION_SERV_RECONNECT_START, &(ptr_server->reconnect_start), sizeof (time_t)));
rc = rc && (session_write_buf (file, SESSION_SERV_COMMAND_TIME, &(ptr_server->command_time), sizeof (time_t)));
rc = rc && (session_write_int (file, SESSION_SERV_RECONNECT_JOIN, ptr_server->reconnect_join));
rc = rc && (session_write_int (file, SESSION_SERV_IS_AWAY, ptr_server->is_away));
rc = rc && (session_write_str (file, SESSION_SERV_AWAY_MESSAGE, ptr_server->away_message));
@@ -993,6 +994,9 @@ session_load_server (FILE *file)
case SESSION_SERV_RECONNECT_START:
rc = rc && (session_read_buf (file, &(session_current_server->reconnect_start), sizeof (time_t)));
break;
case SESSION_SERV_COMMAND_TIME:
rc = rc && (session_read_buf (file, &(session_current_server->command_time), sizeof (time_t)));
break;
case SESSION_SERV_RECONNECT_JOIN:
rc = rc && (session_read_int (file, &(session_current_server->reconnect_join)));
break;
+2 -1
View File
@@ -92,7 +92,8 @@ enum t_session_server
SESSION_SERV_HOSTNAME,
SESSION_SERV_NICK_MODES,
SESSION_SERV_AWAY_MESSAGE,
SESSION_SERV_PREFIX
SESSION_SERV_PREFIX,
SESSION_SERV_COMMAND_TIME
};
enum t_session_channel
+1 -1
View File
@@ -1049,7 +1049,7 @@ t_config_option weechat_options_server[] =
"", NULL, NULL, &(cfg_server.command), NULL },
{ "server_command_delay", N_("delay (in seconds) after command was executed"),
N_("delay (in seconds) after command was executed (example: give some time for authentication)"),
OPTION_TYPE_INT, 0, 5, 0,
OPTION_TYPE_INT, 0, 3600, 0,
NULL, NULL, &(cfg_server.command_delay), NULL, NULL },
{ "server_autojoin", N_("list of channels to join when connected to server"),
N_("comma separated list of channels to join when connected to server (example: \"#chan1,#chan2,#chan3 key1,key2\")"),
+8
View File
@@ -253,6 +253,14 @@ gui_main_loop ()
continue;
}
}
/* check if it's time to autojoin channels (after command delay) */
if ((ptr_server->command_time != 0)
&& (new_time >= ptr_server->command_time + ptr_server->command_delay))
{
irc_server_autojoin_channels (ptr_server);
ptr_server->command_time = 0;
}
}
if (!ptr_server->is_connected && (ptr_server->child_pid > 0))
+18 -41
View File
@@ -2421,7 +2421,6 @@ irc_recv_cmd_001 (t_irc_server *server, char *host, char *nick, char *arguments)
{
char *pos;
char **commands, **ptr, *vars_replaced;
t_irc_channel *ptr_channel;
char *away_msg;
pos = strchr (arguments, ' ');
@@ -2438,8 +2437,17 @@ irc_recv_cmd_001 (t_irc_server *server, char *host, char *nick, char *arguments)
/* connection to IRC server is ok! */
server->is_connected = 1;
server->lag_next_check = time (NULL) + cfg_irc_lag_check;
gui_status_draw (server->buffer, 1);
gui_input_draw (server->buffer, 1);
/* set away message if user was away (before disconnection for example) */
if (server->away_message && server->away_message[0])
{
away_msg = strdup (server->away_message);
if (away_msg)
{
irc_send_away (server, away_msg);
free (away_msg);
}
}
/* execute command when connected */
if (server->command && server->command[0])
@@ -2460,46 +2468,15 @@ irc_recv_cmd_001 (t_irc_server *server, char *host, char *nick, char *arguments)
}
if (server->command_delay > 0)
sleep (server->command_delay);
}
/* auto-join after disconnection (only rejoins opened channels) */
if (!server->disable_autojoin && server->reconnect_join && server->channels)
{
for (ptr_channel = server->channels; ptr_channel;
ptr_channel = ptr_channel->next_channel)
{
if (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)
{
if (ptr_channel->key)
irc_server_sendf (server, "JOIN %s %s",
ptr_channel->name, ptr_channel->key);
else
irc_server_sendf (server, "JOIN %s",
ptr_channel->name);
}
}
server->reconnect_join = 0;
server->command_time = time (NULL) + 1;
else
irc_server_autojoin_channels (server);
}
else
{
/* auto-join when connecting to server for first time */
if (!server->disable_autojoin && server->autojoin && server->autojoin[0])
return irc_send_cmd_join (server, NULL, server->autojoin);
}
/* set away message if user was away (before disconnection for example) */
if (server->away_message && server->away_message[0])
{
away_msg = strdup (server->away_message);
if (away_msg)
{
irc_send_away (server, away_msg);
free (away_msg);
}
}
server->disable_autojoin = 0;
irc_server_autojoin_channels (server);
gui_status_draw (server->buffer, 1);
gui_input_draw (server->buffer, 1);
return 0;
}
+39
View File
@@ -116,6 +116,7 @@ irc_server_init (t_irc_server *server)
server->nick_modes = NULL;
server->prefix = NULL;
server->reconnect_start = 0;
server->command_time = 0;
server->reconnect_join = 0;
server->disable_autojoin = 0;
server->is_away = 0;
@@ -2074,6 +2075,43 @@ irc_server_disconnect_all ()
irc_server_disconnect (ptr_server, 0);
}
/*
* irc_server_autojoin_channels: autojoin (or rejoin) channels
*/
void
irc_server_autojoin_channels (t_irc_server *server)
{
t_irc_channel *ptr_channel;
/* auto-join after disconnection (only rejoins opened channels) */
if (!server->disable_autojoin && server->reconnect_join && server->channels)
{
for (ptr_channel = server->channels; ptr_channel;
ptr_channel = ptr_channel->next_channel)
{
if (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)
{
if (ptr_channel->key)
irc_server_sendf (server, "JOIN %s %s",
ptr_channel->name, ptr_channel->key);
else
irc_server_sendf (server, "JOIN %s",
ptr_channel->name);
}
}
server->reconnect_join = 0;
}
else
{
/* auto-join when connecting to server for first time */
if (!server->disable_autojoin && server->autojoin && server->autojoin[0])
irc_send_cmd_join (server, NULL, server->autojoin);
}
server->disable_autojoin = 0;
}
/*
* irc_server_search: return pointer on a server with a name
*/
@@ -2355,6 +2393,7 @@ irc_server_print_log (t_irc_server *server)
weechat_log_printf (" nick_modes. . . . . : '%s'\n", server->nick_modes);
weechat_log_printf (" prefix. . . . . . . : '%s'\n", server->prefix);
weechat_log_printf (" reconnect_start . . : %ld\n", server->reconnect_start);
weechat_log_printf (" command_time. . . . : %ld\n", server->command_time);
weechat_log_printf (" reconnect_join. . . : %d\n", server->reconnect_join);
weechat_log_printf (" disable_autojoin. . : %d\n", server->disable_autojoin);
weechat_log_printf (" is_away . . . . . . : %d\n", server->is_away);
+3
View File
@@ -172,6 +172,8 @@ struct t_irc_server
char *nick_modes; /* nick modes */
char *prefix; /* nick prefix allowed (from msg 005) */
time_t reconnect_start; /* this time + delay = reconnect time */
time_t command_time; /* this time + command_delay = time to */
/* autojoin channels */
int reconnect_join; /* 1 if channels opened to rejoin */
int disable_autojoin; /* 1 if user asked to not autojoin chans */
int is_away; /* 1 is user is marked as away */
@@ -384,6 +386,7 @@ extern void irc_server_reconnect (t_irc_server *);
extern void irc_server_auto_connect (int, int);
extern void irc_server_disconnect (t_irc_server *, int);
extern void irc_server_disconnect_all ();
extern void irc_server_autojoin_channels ();
extern t_irc_server *irc_server_search (char *);
extern int irc_server_get_number_connected ();
extern void irc_server_get_number_buffer (t_irc_server *, int *, int *);