From 85bd530a88bdb1e6d50e538c9f2235de6c209612 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Sat, 5 Feb 2005 17:39:48 +0000 Subject: [PATCH] Away check is now customizable (with new irc_away_check option) --- ChangeLog | 6 +++--- src/common/weeconfig.c | 22 +++++++++++++++++++++- src/common/weeconfig.h | 2 ++ src/gui/curses/gui-input.c | 17 ++++++++++++----- src/irc/irc-channel.c | 19 +++++++++++++++++++ src/irc/irc-recv.c | 3 ++- src/irc/irc-server.c | 20 ++++++++++++++++++++ src/irc/irc.h | 4 ++-- weechat/ChangeLog | 6 +++--- weechat/src/common/weeconfig.c | 22 +++++++++++++++++++++- weechat/src/common/weeconfig.h | 2 ++ weechat/src/gui/curses/gui-input.c | 17 ++++++++++++----- weechat/src/irc/irc-channel.c | 19 +++++++++++++++++++ weechat/src/irc/irc-recv.c | 3 ++- weechat/src/irc/irc-server.c | 20 ++++++++++++++++++++ weechat/src/irc/irc.h | 4 ++-- 16 files changed, 162 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8edcae283..a398b64b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,12 +1,12 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -ChangeLog - 2005-02-01 +ChangeLog - 2005-02-05 Version 0.1.0 (under dev!): - * away nicks are now displayed with another color - * added away indicator + * away nicks are now displayed with another color (new option: "irc_away_check") + * added away indicator in status bar * added lag indicator (and auto-disconnect after a delay if important lag) * improved completion: now completes commands arguments (IRC and internal), when only one completion matches, completion mechanism is stoped (to diff --git a/src/common/weeconfig.c b/src/common/weeconfig.c index 995fc0f65..f1722e050 100644 --- a/src/common/weeconfig.c +++ b/src/common/weeconfig.c @@ -465,6 +465,7 @@ int cfg_irc_display_away; char *cfg_irc_default_msg_away; char *cfg_irc_default_msg_part; char *cfg_irc_default_msg_quit; +int cfg_irc_away_check; int cfg_irc_lag_check; int cfg_irc_lag_min_show; int cfg_irc_lag_disconnect; @@ -486,6 +487,10 @@ t_config_option weechat_options_irc[] = N_("default quit message ('%v' will be replaced by WeeChat version in string)"), OPTION_TYPE_STRING, 0, 0, 0, "WeeChat %v", NULL, NULL, &cfg_irc_default_msg_quit, config_change_noop }, + { "irc_away_check", N_("interval between two checks for away"), + N_("interval between two checks for away (in minutes, 0 = never check)"), + OPTION_TYPE_INT, 0, INT_MAX, 1, + NULL, NULL, &cfg_irc_away_check, NULL, config_change_away_check }, { "irc_lag_check", N_("interval between two checks for lag"), N_("interval between two checks for lag (in seconds)"), OPTION_TYPE_INT, 30, INT_MAX, 60, @@ -749,11 +754,26 @@ config_change_buffer_content () */ void -config_change_color() +config_change_color () { gui_init_colors (); } +/* + * config_change_away_check: called when away check is changed + */ + +void +config_change_away_check () +{ + check_away = 0; + if (cfg_irc_away_check == 0) + { + /* reset away flag for all nicks/chans/servers */ + server_remove_away (); + } +} + /* * config_option_set_value: set new value for an option * return: 0 if success diff --git a/src/common/weeconfig.h b/src/common/weeconfig.h index 1b89e4987..bc90ace0f 100644 --- a/src/common/weeconfig.h +++ b/src/common/weeconfig.h @@ -155,6 +155,7 @@ extern int cfg_irc_display_away; extern char *cfg_irc_default_msg_away; extern char *cfg_irc_default_msg_part; extern char *cfg_irc_default_msg_quit; +extern int cfg_irc_away_check; extern int cfg_irc_lag_check; extern int cfg_irc_lag_min_show; extern int cfg_irc_lag_disconnect; @@ -182,6 +183,7 @@ extern void config_change_title (); extern void config_change_buffers (); extern void config_change_buffer_content (); extern void config_change_color (); +extern void config_change_away_check (); extern int config_option_set_value (t_config_option *, char *); extern t_config_option *config_option_search (char *); extern int config_set_value (char *, char *); diff --git a/src/gui/curses/gui-input.c b/src/gui/curses/gui-input.c index cb222f9fb..ad43813db 100644 --- a/src/gui/curses/gui-input.c +++ b/src/gui/curses/gui-input.c @@ -659,10 +659,12 @@ gui_main_loop () gui_draw_buffer_infobar (gui_current_window->buffer, 1); } - /* second has changed ? => count down time for infobar, if needed */ + /* second has changed ? */ if (local_time->tm_sec != old_sec) { old_sec = local_time->tm_sec; + + /* infobar count down */ if (gui_infobar && gui_infobar->remaining_time > 0) { gui_infobar->remaining_time--; @@ -672,11 +674,16 @@ gui_main_loop () gui_draw_buffer_infobar (gui_current_window->buffer, 1); } } - check_away++; - if (check_away >= CHECK_AWAY_DELAY) + + /* away check */ + if (cfg_irc_away_check != 0) { - check_away = 0; - server_check_away (); + check_away++; + if (check_away >= (cfg_irc_away_check * 60)) + { + check_away = 0; + server_check_away (); + } } } diff --git a/src/irc/irc-channel.c b/src/irc/irc-channel.c index 5e1339826..c4ba4e9b2 100644 --- a/src/irc/irc-channel.c +++ b/src/irc/irc-channel.c @@ -155,6 +155,25 @@ string_is_channel (char *string) return (strpbrk (first_char, CHANNEL_PREFIX)) ? 1 : 0; } +/* + * channel_remove_away: remove away for all nicks on a channel + */ + +void +channel_remove_away (t_irc_channel *channel) +{ + t_irc_nick *ptr_nick; + + if (channel->type == CHAT_CHANNEL) + { + for (ptr_nick = channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick) + { + ptr_nick->is_away = 0; + } + gui_draw_buffer_nick (channel->buffer, 0); + } +} + /* * channel_check_away: check for away on a channel */ diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c index 7f226e3fe..23439076e 100644 --- a/src/irc/irc-recv.c +++ b/src/irc/irc-recv.c @@ -3011,7 +3011,8 @@ irc_cmd_recv_366 (t_irc_server *server, char *host, char *arguments) gui_printf_color (ptr_channel->buffer, COLOR_WIN_CHAT_DARK, ")\n"); irc_cmd_send_mode (server, ptr_channel->name); - channel_check_away (server, ptr_channel); + if (cfg_irc_away_check > 0) + channel_check_away (server, ptr_channel); } else { diff --git a/src/irc/irc-server.c b/src/irc/irc-server.c index c0767d666..e1d9bff15 100644 --- a/src/irc/irc-server.c +++ b/src/irc/irc-server.c @@ -932,6 +932,26 @@ server_name_already_exists (char *name) return 0; } +/* + * server_remove_away: remove away for all chans/nicks (for all servers) + */ + +void +server_remove_away () +{ + t_irc_server *ptr_server; + t_irc_channel *ptr_channel; + + for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server) + { + for (ptr_channel = ptr_server->channels; ptr_channel; ptr_channel = ptr_channel->next_channel) + { + if (ptr_channel->type == CHAT_CHANNEL) + channel_remove_away (ptr_channel); + } + } +} + /* * server_check_away: check for away on all channels (for all servers) */ diff --git a/src/irc/irc.h b/src/irc/irc.h index 6f1af694c..cb079c406 100644 --- a/src/irc/irc.h +++ b/src/irc/irc.h @@ -56,8 +56,6 @@ #define DEFAULT_IRC_PORT 6667 -#define CHECK_AWAY_DELAY 60 - /* DCC types & status */ #define DCC_CHAT_RECV 0 /* receiving DCC chat */ @@ -242,6 +240,7 @@ extern void server_disconnect_all (); extern t_irc_server *server_search (char *); extern int server_get_number_connected (); extern int server_name_already_exists (char *); +extern void server_remove_away (); extern void server_check_away (); extern void server_set_away (t_irc_server *, char *, int); @@ -252,6 +251,7 @@ extern void channel_free (t_irc_server *, t_irc_channel *); extern void channel_free_all (t_irc_server *); extern t_irc_channel *channel_search (t_irc_server *, char *); extern int string_is_channel (char *); +extern void channel_remove_away (t_irc_channel *); extern void channel_check_away (t_irc_server *, t_irc_channel *); extern void channel_set_away (t_irc_channel *, char *, int); diff --git a/weechat/ChangeLog b/weechat/ChangeLog index 8edcae283..a398b64b1 100644 --- a/weechat/ChangeLog +++ b/weechat/ChangeLog @@ -1,12 +1,12 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -ChangeLog - 2005-02-01 +ChangeLog - 2005-02-05 Version 0.1.0 (under dev!): - * away nicks are now displayed with another color - * added away indicator + * away nicks are now displayed with another color (new option: "irc_away_check") + * added away indicator in status bar * added lag indicator (and auto-disconnect after a delay if important lag) * improved completion: now completes commands arguments (IRC and internal), when only one completion matches, completion mechanism is stoped (to diff --git a/weechat/src/common/weeconfig.c b/weechat/src/common/weeconfig.c index 995fc0f65..f1722e050 100644 --- a/weechat/src/common/weeconfig.c +++ b/weechat/src/common/weeconfig.c @@ -465,6 +465,7 @@ int cfg_irc_display_away; char *cfg_irc_default_msg_away; char *cfg_irc_default_msg_part; char *cfg_irc_default_msg_quit; +int cfg_irc_away_check; int cfg_irc_lag_check; int cfg_irc_lag_min_show; int cfg_irc_lag_disconnect; @@ -486,6 +487,10 @@ t_config_option weechat_options_irc[] = N_("default quit message ('%v' will be replaced by WeeChat version in string)"), OPTION_TYPE_STRING, 0, 0, 0, "WeeChat %v", NULL, NULL, &cfg_irc_default_msg_quit, config_change_noop }, + { "irc_away_check", N_("interval between two checks for away"), + N_("interval between two checks for away (in minutes, 0 = never check)"), + OPTION_TYPE_INT, 0, INT_MAX, 1, + NULL, NULL, &cfg_irc_away_check, NULL, config_change_away_check }, { "irc_lag_check", N_("interval between two checks for lag"), N_("interval between two checks for lag (in seconds)"), OPTION_TYPE_INT, 30, INT_MAX, 60, @@ -749,11 +754,26 @@ config_change_buffer_content () */ void -config_change_color() +config_change_color () { gui_init_colors (); } +/* + * config_change_away_check: called when away check is changed + */ + +void +config_change_away_check () +{ + check_away = 0; + if (cfg_irc_away_check == 0) + { + /* reset away flag for all nicks/chans/servers */ + server_remove_away (); + } +} + /* * config_option_set_value: set new value for an option * return: 0 if success diff --git a/weechat/src/common/weeconfig.h b/weechat/src/common/weeconfig.h index 1b89e4987..bc90ace0f 100644 --- a/weechat/src/common/weeconfig.h +++ b/weechat/src/common/weeconfig.h @@ -155,6 +155,7 @@ extern int cfg_irc_display_away; extern char *cfg_irc_default_msg_away; extern char *cfg_irc_default_msg_part; extern char *cfg_irc_default_msg_quit; +extern int cfg_irc_away_check; extern int cfg_irc_lag_check; extern int cfg_irc_lag_min_show; extern int cfg_irc_lag_disconnect; @@ -182,6 +183,7 @@ extern void config_change_title (); extern void config_change_buffers (); extern void config_change_buffer_content (); extern void config_change_color (); +extern void config_change_away_check (); extern int config_option_set_value (t_config_option *, char *); extern t_config_option *config_option_search (char *); extern int config_set_value (char *, char *); diff --git a/weechat/src/gui/curses/gui-input.c b/weechat/src/gui/curses/gui-input.c index cb222f9fb..ad43813db 100644 --- a/weechat/src/gui/curses/gui-input.c +++ b/weechat/src/gui/curses/gui-input.c @@ -659,10 +659,12 @@ gui_main_loop () gui_draw_buffer_infobar (gui_current_window->buffer, 1); } - /* second has changed ? => count down time for infobar, if needed */ + /* second has changed ? */ if (local_time->tm_sec != old_sec) { old_sec = local_time->tm_sec; + + /* infobar count down */ if (gui_infobar && gui_infobar->remaining_time > 0) { gui_infobar->remaining_time--; @@ -672,11 +674,16 @@ gui_main_loop () gui_draw_buffer_infobar (gui_current_window->buffer, 1); } } - check_away++; - if (check_away >= CHECK_AWAY_DELAY) + + /* away check */ + if (cfg_irc_away_check != 0) { - check_away = 0; - server_check_away (); + check_away++; + if (check_away >= (cfg_irc_away_check * 60)) + { + check_away = 0; + server_check_away (); + } } } diff --git a/weechat/src/irc/irc-channel.c b/weechat/src/irc/irc-channel.c index 5e1339826..c4ba4e9b2 100644 --- a/weechat/src/irc/irc-channel.c +++ b/weechat/src/irc/irc-channel.c @@ -155,6 +155,25 @@ string_is_channel (char *string) return (strpbrk (first_char, CHANNEL_PREFIX)) ? 1 : 0; } +/* + * channel_remove_away: remove away for all nicks on a channel + */ + +void +channel_remove_away (t_irc_channel *channel) +{ + t_irc_nick *ptr_nick; + + if (channel->type == CHAT_CHANNEL) + { + for (ptr_nick = channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick) + { + ptr_nick->is_away = 0; + } + gui_draw_buffer_nick (channel->buffer, 0); + } +} + /* * channel_check_away: check for away on a channel */ diff --git a/weechat/src/irc/irc-recv.c b/weechat/src/irc/irc-recv.c index 7f226e3fe..23439076e 100644 --- a/weechat/src/irc/irc-recv.c +++ b/weechat/src/irc/irc-recv.c @@ -3011,7 +3011,8 @@ irc_cmd_recv_366 (t_irc_server *server, char *host, char *arguments) gui_printf_color (ptr_channel->buffer, COLOR_WIN_CHAT_DARK, ")\n"); irc_cmd_send_mode (server, ptr_channel->name); - channel_check_away (server, ptr_channel); + if (cfg_irc_away_check > 0) + channel_check_away (server, ptr_channel); } else { diff --git a/weechat/src/irc/irc-server.c b/weechat/src/irc/irc-server.c index c0767d666..e1d9bff15 100644 --- a/weechat/src/irc/irc-server.c +++ b/weechat/src/irc/irc-server.c @@ -932,6 +932,26 @@ server_name_already_exists (char *name) return 0; } +/* + * server_remove_away: remove away for all chans/nicks (for all servers) + */ + +void +server_remove_away () +{ + t_irc_server *ptr_server; + t_irc_channel *ptr_channel; + + for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server) + { + for (ptr_channel = ptr_server->channels; ptr_channel; ptr_channel = ptr_channel->next_channel) + { + if (ptr_channel->type == CHAT_CHANNEL) + channel_remove_away (ptr_channel); + } + } +} + /* * server_check_away: check for away on all channels (for all servers) */ diff --git a/weechat/src/irc/irc.h b/weechat/src/irc/irc.h index 6f1af694c..cb079c406 100644 --- a/weechat/src/irc/irc.h +++ b/weechat/src/irc/irc.h @@ -56,8 +56,6 @@ #define DEFAULT_IRC_PORT 6667 -#define CHECK_AWAY_DELAY 60 - /* DCC types & status */ #define DCC_CHAT_RECV 0 /* receiving DCC chat */ @@ -242,6 +240,7 @@ extern void server_disconnect_all (); extern t_irc_server *server_search (char *); extern int server_get_number_connected (); extern int server_name_already_exists (char *); +extern void server_remove_away (); extern void server_check_away (); extern void server_set_away (t_irc_server *, char *, int); @@ -252,6 +251,7 @@ extern void channel_free (t_irc_server *, t_irc_channel *); extern void channel_free_all (t_irc_server *); extern t_irc_channel *channel_search (t_irc_server *, char *); extern int string_is_channel (char *); +extern void channel_remove_away (t_irc_channel *); extern void channel_check_away (t_irc_server *, t_irc_channel *); extern void channel_set_away (t_irc_channel *, char *, int);