summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/command.c125
-rw-r--r--src/common/completion.c37
-rw-r--r--src/irc/irc-recv.c6
-rw-r--r--src/irc/irc-server.c10
-rw-r--r--src/irc/irc.h3
5 files changed, 120 insertions, 61 deletions
diff --git a/src/common/command.c b/src/common/command.c
index cff08dca7..3d0152505 100644
--- a/src/common/command.c
+++ b/src/common/command.c
@@ -96,10 +96,11 @@ t_weechat_command weechat_commands[] =
"number: clear buffer by number"),
"-all", 0, 1, 0, weechat_cmd_clear, NULL },
{ "connect", N_("connect to server(s)"),
- N_("[-all | servername [servername ...]]"),
+ N_("[-all [-nojoin] | [-nojoin] servername [servername ...]]"),
N_(" -all: connect to all servers\n"
- "servername: server name to connect"),
- "%S|-all", 0, MAX_ARGS, 0, weechat_cmd_connect, NULL },
+ "servername: server name to connect\n"
+ " -nojoin: do not join any channel (even if autojoin is enabled on server)"),
+ "%S|-all|-nojoin|%*", 0, MAX_ARGS, 0, weechat_cmd_connect, NULL },
{ "disconnect", N_("disconnect from server(s)"),
N_("[-all | servername [servername ...]]"),
N_(" -all: disconnect from all servers\n"
@@ -166,10 +167,11 @@ t_weechat_command weechat_commands[] =
"Without argument, /plugin command lists loaded plugins."),
"list|listfull|load|autoload|reload|unload %P", 0, 2, 0, weechat_cmd_plugin, NULL },
{ "reconnect", N_("reconnect to server(s)"),
- N_("[-all | servername [servername ...]]"),
+ N_("[-all [-nojoin] | servername [servername ...]] [-nojoin]"),
N_(" -all: reconnect to all servers\n"
- "servername: server name to reconnect"),
- "%S|-all", 0, MAX_ARGS, 0, weechat_cmd_reconnect, NULL },
+ "servername: server name to reconnect\n"
+ " -nojoin: do not join any channel (even if autojoin is enabled on server)"),
+ "%S|-all|-nojoin|%*", 0, MAX_ARGS, 0, weechat_cmd_reconnect, NULL },
{ "server", N_("list, add or remove servers"),
N_("[servername] | "
"[servername hostname port [-auto | -noauto] [-ipv6] [-ssl] [-pwd password] [-nicks nick1 "
@@ -1547,7 +1549,8 @@ weechat_cmd_clear (t_irc_server *server, t_irc_channel *channel,
*/
int
-weechat_cmd_connect_one_server (t_irc_server *server, t_gui_window *window)
+weechat_cmd_connect_one_server (t_gui_window *window, t_irc_server *server,
+ int no_join)
{
if (server->is_connected)
{
@@ -1571,7 +1574,7 @@ weechat_cmd_connect_one_server (t_irc_server *server, t_gui_window *window)
BUFFER_TYPE_STANDARD, 1))
return 0;
}
- if (irc_server_connect (server))
+ if (irc_server_connect (server, no_join))
{
server->reconnect_start = 0;
server->reconnect_join = (server->channels) ? 1 : 0;
@@ -1593,36 +1596,49 @@ weechat_cmd_connect (t_irc_server *server, t_irc_channel *channel,
t_gui_window *window;
t_gui_buffer *buffer;
t_irc_server *ptr_server;
- int i, connect_ok;
+ int i, nb_connect, connect_ok, all_servers, no_join;
gui_buffer_find_context (server, channel, &window, &buffer);
+
+ nb_connect = 0;
+ connect_ok = 1;
- if (argc == 0)
- connect_ok = weechat_cmd_connect_one_server (server, window);
- else
+ all_servers = 0;
+ no_join = 0;
+ for (i = 0; i < argc; i++)
{
- connect_ok = 1;
-
- if (ascii_strcasecmp (argv[0], "-all") == 0)
+ if (ascii_strcasecmp (argv[i], "-all") == 0)
+ all_servers = 1;
+ if (ascii_strcasecmp (argv[i], "-nojoin") == 0)
+ no_join = 1;
+ }
+
+ if (all_servers)
+ {
+ for (ptr_server = irc_servers; ptr_server;
+ ptr_server = ptr_server->next_server)
{
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
+ nb_connect++;
+ if (!ptr_server->is_connected && (ptr_server->child_pid == 0))
{
- if (!ptr_server->is_connected && (ptr_server->child_pid == 0))
- {
- if (!weechat_cmd_connect_one_server (ptr_server, window))
- connect_ok = 0;
- }
+ if (!weechat_cmd_connect_one_server (window, ptr_server,
+ no_join))
+ connect_ok = 0;
}
}
- else
+ }
+ else
+ {
+ for (i = 0; i < argc; i++)
{
- for (i = 0; i < argc; i++)
+ if (argv[i][0] != '-')
{
+ nb_connect++;
ptr_server = irc_server_search (argv[i]);
if (ptr_server)
{
- if (!weechat_cmd_connect_one_server (ptr_server, window))
+ if (!weechat_cmd_connect_one_server (window, ptr_server,
+ no_join))
connect_ok = 0;
}
else
@@ -1636,6 +1652,9 @@ weechat_cmd_connect (t_irc_server *server, t_irc_channel *channel,
}
}
+ if (nb_connect == 0)
+ connect_ok = weechat_cmd_connect_one_server (window, server, no_join);
+
if (!connect_ok)
return -1;
@@ -2767,7 +2786,7 @@ weechat_cmd_plugin (t_irc_server *server, t_irc_channel *channel,
*/
int
-weechat_cmd_reconnect_one_server (t_irc_server *server)
+weechat_cmd_reconnect_one_server (t_irc_server *server, int no_join)
{
if ((!server->is_connected) && (server->child_pid == 0))
{
@@ -2779,7 +2798,7 @@ weechat_cmd_reconnect_one_server (t_irc_server *server)
}
irc_send_quit_server (server, NULL);
irc_server_disconnect (server, 0);
- if (irc_server_connect (server))
+ if (irc_server_connect (server, no_join))
{
server->reconnect_start = 0;
server->reconnect_join = (server->channels) ? 1 : 0;
@@ -2800,36 +2819,47 @@ weechat_cmd_reconnect (t_irc_server *server, t_irc_channel *channel,
{
t_gui_buffer *buffer;
t_irc_server *ptr_server;
- int i, reconnect_ok;
+ int i, nb_reconnect, reconnect_ok, all_servers, no_join;
- gui_buffer_find_context (server, channel, NULL, &buffer);
+ gui_buffer_find_context (server, channel, NULL, &buffer);
- if (argc == 0)
- reconnect_ok = weechat_cmd_reconnect_one_server (server);
- else
+ nb_reconnect = 0;
+ reconnect_ok = 1;
+
+ all_servers = 0;
+ no_join = 0;
+ for (i = 0; i < argc; i++)
{
- reconnect_ok = 1;
-
- if (ascii_strcasecmp (argv[0], "-all") == 0)
+ if (ascii_strcasecmp (argv[i], "-all") == 0)
+ all_servers = 1;
+ if (ascii_strcasecmp (argv[i], "-nojoin") == 0)
+ no_join = 1;
+ }
+
+ if (all_servers)
+ {
+ for (ptr_server = irc_servers; ptr_server;
+ ptr_server = ptr_server->next_server)
{
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
+ nb_reconnect++;
+ if ((ptr_server->is_connected) || (ptr_server->child_pid != 0))
{
- if ((ptr_server->is_connected) || (ptr_server->child_pid != 0))
- {
- if (!weechat_cmd_reconnect_one_server (ptr_server))
- reconnect_ok = 0;
- }
+ if (!weechat_cmd_reconnect_one_server (ptr_server, no_join))
+ reconnect_ok = 0;
}
}
- else
+ }
+ else
+ {
+ for (i = 0; i < argc; i++)
{
- for (i = 0; i < argc; i++)
+ if (argv[i][0] != '-')
{
+ nb_reconnect++;
ptr_server = irc_server_search (argv[i]);
if (ptr_server)
{
- if (!weechat_cmd_reconnect_one_server (ptr_server))
+ if (!weechat_cmd_reconnect_one_server (ptr_server, no_join))
reconnect_ok = 0;
}
else
@@ -2843,6 +2873,9 @@ weechat_cmd_reconnect (t_irc_server *server, t_irc_channel *channel,
}
}
+ if (nb_reconnect == 0)
+ reconnect_ok = weechat_cmd_reconnect_one_server (server, no_join);
+
if (!reconnect_ok)
return -1;
@@ -3160,7 +3193,7 @@ weechat_cmd_server (t_irc_server *server, t_irc_channel *channel,
{
(void) gui_buffer_new (window, new_server, NULL,
BUFFER_TYPE_STANDARD, 1);
- irc_server_connect (new_server);
+ irc_server_connect (new_server, 0);
}
irc_server_destroy (&server_tmp);
diff --git a/src/common/completion.c b/src/common/completion.c
index cbd7d9ff6..0b4bb5dfe 100644
--- a/src/common/completion.c
+++ b/src/common/completion.c
@@ -1019,6 +1019,8 @@ completion_build_list_template (t_completion *completion, char *template)
free (word);
return;
break;
+ case '*': /* repeat last completion (do nothing there) */
+ break;
case 'a': /* alias */
completion_list_add_alias (completion);
break;
@@ -1114,8 +1116,10 @@ completion_build_list_template (t_completion *completion, char *template)
void
completion_build_list (t_completion *completion)
{
- char *template, *pos_space;
- int max_arg, i;
+ char *template, *pos_template, *pos_space;
+ int repeat_last, max_arg, i, length;
+
+ repeat_last = 0;
completion_get_command_infos (completion, &template, &max_arg);
if (!template || (strcmp (template, "-") == 0) ||
@@ -1124,25 +1128,40 @@ completion_build_list (t_completion *completion)
completion_stop (completion);
return;
}
+
+ length = strlen (template);
+ if (length >= 2)
+ {
+ if (strcmp (template + length - 2, "%*") == 0)
+ repeat_last = 1;
+ }
+
i = 1;
- while (template && template[0])
+ pos_template = template;
+ while (pos_template && pos_template[0])
{
- pos_space = strchr (template, ' ');
+ pos_space = strchr (pos_template, ' ');
if (i == completion->base_command_arg)
{
- completion_build_list_template (completion, template);
+ completion_build_list_template (completion, pos_template);
return;
}
if (pos_space)
{
- template = pos_space;
- while (template[0] == ' ')
- template++;
+ pos_template = pos_space;
+ while (pos_template[0] == ' ')
+ pos_template++;
}
else
- template = NULL;
+ pos_template = NULL;
i++;
}
+ if (repeat_last)
+ {
+ pos_space = rindex (template, ' ');
+ completion_build_list_template (completion,
+ (pos_space) ? pos_space + 1 : template);
+ }
}
/*
diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c
index c6686b389..193bb05f5 100644
--- a/src/irc/irc-recv.c
+++ b/src/irc/irc-recv.c
@@ -2446,7 +2446,7 @@ irc_recv_cmd_001 (t_irc_server *server, char *host, char *nick, char *arguments)
}
/* auto-join after disconnection (only rejoins opened channels) */
- if (server->reconnect_join && server->channels)
+ if (!server->disable_autojoin && server->reconnect_join && server->channels)
{
for (ptr_channel = server->channels; ptr_channel;
ptr_channel = ptr_channel->next_channel)
@@ -2466,7 +2466,7 @@ irc_recv_cmd_001 (t_irc_server *server, char *host, char *nick, char *arguments)
else
{
/* auto-join when connecting to server for first time */
- if (server->autojoin && server->autojoin[0])
+ if (!server->disable_autojoin && server->autojoin && server->autojoin[0])
return irc_send_cmd_join (server, NULL, server->autojoin);
}
@@ -2480,6 +2480,8 @@ irc_recv_cmd_001 (t_irc_server *server, char *host, char *nick, char *arguments)
free (away_msg);
}
}
+
+ server->disable_autojoin = 0;
return 0;
}
diff --git a/src/irc/irc-server.c b/src/irc/irc-server.c
index b5be7c329..8f6d9cce2 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->prefix = NULL;
server->reconnect_start = 0;
server->reconnect_join = 0;
+ server->disable_autojoin = 0;
server->is_away = 0;
server->away_message = NULL;
server->away_time = 0;
@@ -1741,7 +1742,7 @@ irc_server_child (t_irc_server *server)
*/
int
-irc_server_connect (t_irc_server *server)
+irc_server_connect (t_irc_server *server, int disable_autojoin)
{
int child_pipe[2], set;
#ifndef __CYGWIN__
@@ -1882,6 +1883,8 @@ irc_server_connect (t_irc_server *server)
server->child_pid = pid;
#endif
+ server->disable_autojoin = disable_autojoin;
+
return 1;
}
@@ -1897,7 +1900,7 @@ irc_server_reconnect (t_irc_server *server)
PACKAGE_NAME);
server->reconnect_start = 0;
- if (irc_server_connect (server))
+ if (irc_server_connect (server, 0))
server->reconnect_join = 1;
else
irc_server_reconnect_schedule (server);
@@ -1921,7 +1924,7 @@ irc_server_auto_connect (int auto_connect, int command_line)
(void) gui_buffer_new (gui_current_window, ptr_server, NULL,
BUFFER_TYPE_STANDARD, 1);
gui_window_redraw_buffer (gui_current_window->buffer);
- if (!irc_server_connect (ptr_server))
+ if (!irc_server_connect (ptr_server, 0))
irc_server_reconnect_schedule (ptr_server);
}
}
@@ -2244,6 +2247,7 @@ irc_server_print_log (t_irc_server *server)
weechat_log_printf (" prefix. . . . . . . : '%s'\n", server->prefix);
weechat_log_printf (" reconnect_start . . : %ld\n", server->reconnect_start);
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);
weechat_log_printf (" away_message. . . . : '%s'\n", server->away_message);
weechat_log_printf (" away_time . . . . . : %ld\n", server->away_time);
diff --git a/src/irc/irc.h b/src/irc/irc.h
index 7590e164e..3954629a4 100644
--- a/src/irc/irc.h
+++ b/src/irc/irc.h
@@ -184,6 +184,7 @@ struct t_irc_server
char *prefix; /* nick prefix allowed (from msg 005) */
time_t reconnect_start; /* this time + delay = reconnect time */
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 */
char *away_message; /* away message, NULL if not away */
time_t away_time; /* time() when user marking as away */
@@ -388,7 +389,7 @@ extern int irc_server_resolve (char *, char *, int *);
extern int irc_server_pass_socks4proxy (int, char*, int, char*);
extern int irc_server_pass_socks5proxy (int, char*, int);
extern int irc_server_pass_proxy (int, char*, int, char*);
-extern int irc_server_connect (t_irc_server *);
+extern int irc_server_connect (t_irc_server *, int);
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);