summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2007-08-20 08:37:31 +0000
committerSebastien Helleu <flashcode@flashtux.org>2007-08-20 08:37:31 +0000
commit69bd50d74cbe22cce977e8eb81b402f58a802760 (patch)
tree5964dc02a59328770a5d34ecbdae063dbab5cad8
parentfb8bae3c78fe8e0e8deeab5eec4e8f878b58a39f (diff)
downloadweechat-69bd50d74cbe22cce977e8eb81b402f58a802760.zip
Fixed server option "command_delay": does not freeze WeeChat any more
-rw-r--r--ChangeLog3
-rw-r--r--src/common/session.c4
-rw-r--r--src/common/session.h3
-rw-r--r--src/common/weeconfig.c2
-rw-r--r--src/gui/curses/gui-curses-main.c8
-rw-r--r--src/irc/irc-recv.c59
-rw-r--r--src/irc/irc-server.c39
-rw-r--r--src/irc/irc.h3
-rw-r--r--weechat/ChangeLog3
-rw-r--r--weechat/src/common/session.c4
-rw-r--r--weechat/src/common/session.h3
-rw-r--r--weechat/src/common/weeconfig.c2
-rw-r--r--weechat/src/gui/curses/gui-curses-main.c8
-rw-r--r--weechat/src/irc/irc-recv.c59
-rw-r--r--weechat/src/irc/irc-server.c39
-rw-r--r--weechat/src/irc/irc.h3
16 files changed, 154 insertions, 88 deletions
diff --git a/ChangeLog b/ChangeLog
index da82e9fdd..d5727bda2 100644
--- a/ChangeLog
+++ b/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/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 *);