From 76c4d4d427d0541d9d09e9c90817efb6914311e3 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Sun, 17 Oct 2004 09:13:54 +0000 Subject: Auto-rejoin channels when kicked (new config option: server_autorejoin on/off) --- src/common/command.c | 2 +- src/common/weechat.c | 2 +- src/common/weeconfig.c | 9 ++++++++- src/gui/curses/gui-display.c | 10 +++++++--- src/irc/irc-recv.c | 18 +++++++++++++++--- src/irc/irc-server.c | 9 ++++++--- src/irc/irc.h | 4 +++- 7 files changed, 41 insertions(+), 13 deletions(-) (limited to 'src') 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 *); -- cgit v1.2.3