diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2007-08-20 08:37:31 +0000 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2007-08-20 08:37:31 +0000 |
commit | 69bd50d74cbe22cce977e8eb81b402f58a802760 (patch) | |
tree | 5964dc02a59328770a5d34ecbdae063dbab5cad8 | |
parent | fb8bae3c78fe8e0e8deeab5eec4e8f878b58a39f (diff) | |
download | weechat-69bd50d74cbe22cce977e8eb81b402f58a802760.zip |
Fixed server option "command_delay": does not freeze WeeChat any more
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | src/common/session.c | 4 | ||||
-rw-r--r-- | src/common/session.h | 3 | ||||
-rw-r--r-- | src/common/weeconfig.c | 2 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-main.c | 8 | ||||
-rw-r--r-- | src/irc/irc-recv.c | 59 | ||||
-rw-r--r-- | src/irc/irc-server.c | 39 | ||||
-rw-r--r-- | src/irc/irc.h | 3 | ||||
-rw-r--r-- | weechat/ChangeLog | 3 | ||||
-rw-r--r-- | weechat/src/common/session.c | 4 | ||||
-rw-r--r-- | weechat/src/common/session.h | 3 | ||||
-rw-r--r-- | weechat/src/common/weeconfig.c | 2 | ||||
-rw-r--r-- | weechat/src/gui/curses/gui-curses-main.c | 8 | ||||
-rw-r--r-- | weechat/src/irc/irc-recv.c | 59 | ||||
-rw-r--r-- | weechat/src/irc/irc-server.c | 39 | ||||
-rw-r--r-- | weechat/src/irc/irc.h | 3 |
16 files changed, 154 insertions, 88 deletions
@@ -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) diff --git a/src/common/session.c b/src/common/session.c index d111b0618..b1047b612 100644 --- a/src/common/session.c +++ b/src/common/session.c @@ -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; diff --git a/src/common/session.h b/src/common/session.h index 576ff1c26..7728220f3 100644 --- a/src/common/session.h +++ b/src/common/session.h @@ -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 diff --git a/src/common/weeconfig.c b/src/common/weeconfig.c index c136010f1..d9e64f1a6 100644 --- a/src/common/weeconfig.c +++ b/src/common/weeconfig.c @@ -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\")"), diff --git a/src/gui/curses/gui-curses-main.c b/src/gui/curses/gui-curses-main.c index 118b2d0a4..8507440d9 100644 --- a/src/gui/curses/gui-curses-main.c +++ b/src/gui/curses/gui-curses-main.c @@ -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)) diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c index ec081004e..de2107873 100644 --- a/src/irc/irc-recv.c +++ b/src/irc/irc-recv.c @@ -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; } diff --git a/src/irc/irc-server.c b/src/irc/irc-server.c index 66fb685b2..a3c466762 100644 --- a/src/irc/irc-server.c +++ b/src/irc/irc-server.c @@ -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; @@ -2075,6 +2076,43 @@ irc_server_disconnect_all () } /* + * 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); diff --git a/src/irc/irc.h b/src/irc/irc.h index 3f2bee85b..dff2d1fdd 100644 --- a/src/irc/irc.h +++ b/src/irc/irc.h @@ -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 *); diff --git a/weechat/ChangeLog b/weechat/ChangeLog index da82e9fdd..d5727bda2 100644 --- a/weechat/ChangeLog +++ b/weechat/ChangeLog @@ -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) diff --git a/weechat/src/common/session.c b/weechat/src/common/session.c index d111b0618..b1047b612 100644 --- a/weechat/src/common/session.c +++ b/weechat/src/common/session.c @@ -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; diff --git a/weechat/src/common/session.h b/weechat/src/common/session.h index 576ff1c26..7728220f3 100644 --- a/weechat/src/common/session.h +++ b/weechat/src/common/session.h @@ -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 diff --git a/weechat/src/common/weeconfig.c b/weechat/src/common/weeconfig.c index c136010f1..d9e64f1a6 100644 --- a/weechat/src/common/weeconfig.c +++ b/weechat/src/common/weeconfig.c @@ -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\")"), diff --git a/weechat/src/gui/curses/gui-curses-main.c b/weechat/src/gui/curses/gui-curses-main.c index 118b2d0a4..8507440d9 100644 --- a/weechat/src/gui/curses/gui-curses-main.c +++ b/weechat/src/gui/curses/gui-curses-main.c @@ -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)) diff --git a/weechat/src/irc/irc-recv.c b/weechat/src/irc/irc-recv.c index ec081004e..de2107873 100644 --- a/weechat/src/irc/irc-recv.c +++ b/weechat/src/irc/irc-recv.c @@ -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; } diff --git a/weechat/src/irc/irc-server.c b/weechat/src/irc/irc-server.c index 66fb685b2..a3c466762 100644 --- a/weechat/src/irc/irc-server.c +++ b/weechat/src/irc/irc-server.c @@ -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; @@ -2075,6 +2076,43 @@ irc_server_disconnect_all () } /* + * 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); diff --git a/weechat/src/irc/irc.h b/weechat/src/irc/irc.h index 3f2bee85b..dff2d1fdd 100644 --- a/weechat/src/irc/irc.h +++ b/weechat/src/irc/irc.h @@ -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 *); |