summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/command.c2
-rw-r--r--src/common/weechat.c2
-rw-r--r--src/common/weeconfig.c9
-rw-r--r--src/gui/curses/gui-display.c10
-rw-r--r--src/irc/irc-recv.c18
-rw-r--r--src/irc/irc-server.c9
-rw-r--r--src/irc/irc.h4
7 files changed, 41 insertions, 13 deletions
diff --git a/src/common/command.c b/src/common/command.c
index c9bf9faaa..23a5226f8 100644
--- a/src/common/command.c
+++ b/src/common/command.c
@@ -1607,7 +1607,7 @@ weechat_cmd_server (int argc, char **argv)
server.address, server.port, server.password,
server.nick1, server.nick2, server.nick3,
server.username, server.realname,
- server.command, server.autojoin);
+ server.command, server.autojoin, 1);
if (new_server)
{
irc_display_prefix (NULL, PREFIX_INFO);
diff --git a/src/common/weechat.c b/src/common/weechat.c
index 776ae4005..5e98c9b9a 100644
--- a/src/common/weechat.c
+++ b/src/common/weechat.c
@@ -232,7 +232,7 @@ wee_parse_args (int argc, char *argv[])
server_tmp.address, server_tmp.port,
server_tmp.password, server_tmp.nick1,
server_tmp.nick2, server_tmp.nick3,
- NULL, NULL, NULL, server_tmp.autojoin))
+ NULL, NULL, NULL, server_tmp.autojoin, 1))
fprintf (stderr, _("%s unable to create server ('%s'), ignored\n"),
WEECHAT_WARNING, argv[i]);
server_destroy (&server_tmp);
diff --git a/src/common/weeconfig.c b/src/common/weeconfig.c
index ddf275d89..d78d581ee 100644
--- a/src/common/weeconfig.c
+++ b/src/common/weeconfig.c
@@ -569,6 +569,10 @@ t_config_option weechat_options_server[] =
N_("comma separated list of channels to join when connected to server"),
OPTION_TYPE_STRING, 0, 0, 0,
"", NULL, NULL, &(cfg_server.autojoin), NULL },
+ { "server_autorejoin", N_("automatically rejoin channels when kicked"),
+ N_("automatically rejoin channels when kicked"),
+ OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
+ NULL, NULL, &(cfg_server.autorejoin), NULL, NULL },
{ NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
};
@@ -805,7 +809,7 @@ config_allocate_server (char *filename, int line_number)
cfg_server.autoconnect, 0, cfg_server.address, cfg_server.port,
cfg_server.password, cfg_server.nick1, cfg_server.nick2,
cfg_server.nick3, cfg_server.username, cfg_server.realname,
- cfg_server.command, cfg_server.autojoin))
+ cfg_server.command, cfg_server.autojoin, cfg_server.autorejoin))
{
server_free_all ();
gui_printf (NULL,
@@ -1235,6 +1239,7 @@ config_create_default ()
fprintf (file, "server_command=\n");
fprintf (file, "server_autojoin=\n");
+ fprintf (file, "server_autorejoin=on\n");
fclose (file);
free (filename);
@@ -1372,6 +1377,8 @@ config_write (char *config_name)
(ptr_server->command) ? ptr_server->command : "");
fprintf (file, "server_autojoin=%s\n",
(ptr_server->autojoin) ? ptr_server->autojoin : "");
+ fprintf (file, "server_autorejoin=%s\n",
+ (ptr_server->autorejoin) ? "on" : "off");
}
}
diff --git a/src/gui/curses/gui-display.c b/src/gui/curses/gui-display.c
index 4c969e625..b41d9f257 100644
--- a/src/gui/curses/gui-display.c
+++ b/src/gui/curses/gui-display.c
@@ -745,7 +745,7 @@ gui_draw_buffer_nick (t_gui_buffer *buffer, int erase)
}
}
- if (CHANNEL(buffer) && CHANNEL(buffer)->nicks)
+ if (gui_buffer_has_nicklist (buffer))
{
max_length = nick_get_max_length (CHANNEL(buffer));
if ((buffer == gui_current_window->buffer) &&
@@ -956,8 +956,12 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
wprintw (ptr_win->win_status, ":");
gui_window_set_color (ptr_win->win_status,
COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, "%s",
- CHANNEL(ptr_win->buffer)->name);
+ if (CHANNEL(ptr_win->buffer)->nicks)
+ wprintw (ptr_win->win_status, "%s",
+ CHANNEL(ptr_win->buffer)->name);
+ else
+ wprintw (ptr_win->win_status, "(%s)",
+ CHANNEL(ptr_win->buffer)->name);
if (ptr_win->buffer == CHANNEL(ptr_win->buffer)->buffer)
{
/* display channel modes */
diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c
index 70ac0118f..c328cbcbc 100644
--- a/src/irc/irc-recv.c
+++ b/src/irc/irc-recv.c
@@ -262,11 +262,23 @@ irc_cmd_recv_kick (t_irc_server *server, char *host, char *arguments)
WEECHAT_ERROR, "kick");
return -1;
}
- ptr_nick = nick_search (ptr_channel, pos_nick);
- if (ptr_nick)
+ if (strcmp (pos_nick, server->nick) == 0)
{
- nick_free (ptr_channel, ptr_nick);
+ /* my nick was kicked => free all nicks, channel is not active any more */
+ nick_free_all (ptr_channel);
gui_draw_buffer_nick (gui_current_window->buffer, 1);
+ gui_draw_buffer_status (gui_current_window->buffer, 1);
+ if (server->autorejoin)
+ irc_cmd_send_join (server, ptr_channel->name);
+ }
+ {
+ /* someone was kicked from channel (but not me) => remove only this nick */
+ ptr_nick = nick_search (ptr_channel, pos_nick);
+ if (ptr_nick)
+ {
+ nick_free (ptr_channel, ptr_nick);
+ gui_draw_buffer_nick (gui_current_window->buffer, 1);
+ }
}
return 0;
}
diff --git a/src/irc/irc-server.c b/src/irc/irc-server.c
index ba5e75808..b02111cc0 100644
--- a/src/irc/irc-server.c
+++ b/src/irc/irc-server.c
@@ -292,7 +292,8 @@ 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, char *autojoin)
+ char *username, char *realname, char *command, char *autojoin,
+ int autorejoin)
{
t_irc_server *new_server;
@@ -302,11 +303,12 @@ server_new (char *name, int autoconnect, int command_line, char *address,
#ifdef DEBUG
wee_log_printf ("creating new server (name:%s, address:%s, port:%d, pwd:%s, "
"nick1:%s, nick2:%s, nick3:%s, username:%s, realname:%s, "
- "command:%s, autojoin:%s)\n",
+ "command:%s, autojoin:%s, autorejoin:%s)\n",
name, address, port, (password) ? password : "",
(nick1) ? nick1 : "", (nick2) ? nick2 : "", (nick3) ? nick3 : "",
(username) ? username : "", (realname) ? realname : "",
- (command) ? command : "", (autojoin) ? autojoin : "");
+ (command) ? command : "", (autojoin) ? autojoin : "",
+ (autorejoin) ? "on" : "off");
#endif
if ((new_server = server_alloc ()))
@@ -328,6 +330,7 @@ server_new (char *name, int autoconnect, int command_line, char *address,
(command) ? strdup (command) : NULL;
new_server->autojoin =
(autojoin) ? strdup (autojoin) : NULL;
+ new_server->autorejoin = autorejoin;
new_server->nick = strdup (new_server->nick1);
}
else
diff --git a/src/irc/irc.h b/src/irc/irc.h
index 15724351f..4f75db621 100644
--- a/src/irc/irc.h
+++ b/src/irc/irc.h
@@ -127,6 +127,7 @@ struct t_irc_server
char *realname; /* real name */
char *command; /* command to run once connected */
char *autojoin; /* channels to automatically join */
+ int autorejoin; /* auto rejoin channels when kicked */
/* internal vars */
char *nick; /* current nickname */
@@ -213,7 +214,8 @@ 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 *, char *);
+ char *, char *, char *, char *, char *, 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 *);