Added lag indicator

This commit is contained in:
Sebastien Helleu 2005-01-23 02:14:37 +00:00
parent 63d6ee1007
commit 9d0b6fad72
34 changed files with 1240 additions and 838 deletions

4
BUGS
View File

@ -1,12 +1,12 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
WeeChat known bugs, 2005-01-01
WeeChat known bugs, 2005-01-23
- ./configure does not check that Curses headers are installed
- ./configure does not check that Gtk 2.0 libraries are installed
- ./configure does not check that Perl headers & libraries are installed
- too much nicks in the channel (> height of window) => display bug
- too much nicks in the channel (> height of window) => some nicks are hidden
- problem when resizing terminal and that some windows are outside new term size
- some IRC commands are marked as 'unknown' when received
(IRC protocol is under dev!)

View File

@ -1,10 +1,11 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
ChangeLog - 2005-01-16
ChangeLog - 2005-01-23
Version 0.1.0 (under dev!):
* 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
complete command arg for example)

15
TODO
View File

@ -1,7 +1,7 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
TODO - 2005-01-02
TODO - 2005-01-23
Legend:
# done
@ -14,22 +14,18 @@ v0.1.0:
------
* General:
- Windows version
+ Windows version
+ Solaris version
* IRC protocol:
+ "/dcc" command (for chat and sending/receiving files)
- lets user configure his CTCP version reply (partially)
* Interface:
# add lag indicator
+ "/window" command, split terminal in multiple windows
(horizontally/vertically)
+ internationalization (traduce WeeChat in many languages)
* Configuration:
+ add missing options for config file
- add key bindings to config file
Future versions:
---------------
@ -38,6 +34,7 @@ Future versions:
- *BSD version
* IRC protocol:
- customizable CTCP version reply
- complete "/list" command: add regexp search, display only channels that
match regexp
- "/ignore" and "/unignore" commands: hide all that is write by a given
@ -63,7 +60,6 @@ Future versions:
+ Gtk GUI
- color for nicks (except own nick) when nick colors are disabled
- interpret special chars in messages (color & bold for example)
- add lag indicator
- improve completion (for example complete command parameters when possible)
- understand incomplete commands if unambigous (for example: /he for /help is ok)
- tab key with empty command line should switch to next window (like F7)
@ -80,3 +76,6 @@ Future versions:
- "/python load" and "/python unload" commands to (un)load Python scripts
- Ruby plugin
- "/ruby load" and "/ruby unload" commands to (un)load Ruby scripts
* Configuration:
- add key bindings to config file

View File

@ -55,7 +55,7 @@ AH_VERBATIM([PLUGINS], [#undef PLUGINS])
AH_VERBATIM([PLUGIN_PERL], [#undef PLUGIN_PERL])
AH_VERBATIM([DEBUG], [#undef DEBUG])
AC_ARG_ENABLE(ncurses, [ --disable-ncurses Turn off NCurses interface (default=auto)],,enable_ncurses=yes)
AC_ARG_ENABLE(ncurses, [ --disable-ncurses Turn off ncurses interface (default=auto)],,enable_ncurses=yes)
AC_ARG_ENABLE(gtk, [ --enable-gtk Turn on Gtk+ interface (default=no)],enable_gtk=yes,enable_gtk=no)
AC_ARG_ENABLE(qt, [ --enable-qt Turn on Qt interface (default=no)],enable_qt=yes,enable_qt=no)
AC_ARG_ENABLE(perl, [ --enable-perl Turn on Perl plugins (default=no)],enable_perl=yes,enable_perl=no)
@ -76,7 +76,7 @@ AM_CONDITIONAL(PLUGIN_PERL, test "$enable_perl" = "yes")
if test "x$enable_ncurses" = "xyes" ; then
if test "$LIBNCURSES_FOUND" = "0" ; then
AC_MSG_ERROR([NCurses library not found! Install NCurses library or run ./configure with --disable-ncurses parameter.])
AC_MSG_ERROR([ncurses library not found! Install ncurses library or run ./configure with --disable-ncurses parameter.])
fi
NCURSES_LIBS="-lncurses"
AC_SUBST(NCURSES_LIBS)
@ -140,7 +140,7 @@ echo $PACKAGE $VERSION
listgui=
if test "x$enable_ncurses" = "xyes" ; then
listgui="$listgui NCurses"
listgui="$listgui ncurses"
fi
if test "x$enable_gtk" = "xyes" ; then
listgui="$listgui Gtk+"
@ -150,16 +150,16 @@ if test "x$enable_qt" = "xyes" ; then
fi
if test "x$listgui" = "x" ; then
AC_MSG_ERROR([No interface specified... Please specify at least NCurses, Gtk or Qt.])
AC_MSG_ERROR([No interface specified... Please specify at least ncurses, Gtk or Qt.])
fi
msg_debug_compiler="No"
msg_debug_verbose="No"
msg_debug_compiler="no"
msg_debug_verbose="no"
if test "x$debug" = "x1" || test "x$debug" = "x2" ; then
msg_debug_compiler="Yes"
msg_debug_compiler="yes"
fi
if test "x$debug" = "x2" ; then
msg_debug_verbose="Yes"
msg_debug_verbose="yes"
fi
echo

427
po/fr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -261,8 +261,6 @@ completion_build_list (t_completion *completion, void *channel)
|| (strcasecmp (completion->base_command, "lusers") == 0)
|| (strcasecmp (completion->base_command, "motd") == 0)
|| (strcasecmp (completion->base_command, "oper") == 0)
|| (strcasecmp (completion->base_command, "ping") == 0)
|| (strcasecmp (completion->base_command, "pong") == 0)
|| (strcasecmp (completion->base_command, "rehash") == 0)
|| (strcasecmp (completion->base_command, "restart") == 0)
|| (strcasecmp (completion->base_command, "service") == 0)

View File

@ -123,6 +123,25 @@ weechat_convert_encoding (char *from_code, char *to_code, char *string)
return outbuf;
}
/*
* get_timeval_diff: calculates difference between two times (return in milliseconds)
*/
long get_timeval_diff(struct timeval *tv1, struct timeval *tv2)
{
long diff_sec, diff_usec;
diff_sec = tv2->tv_sec - tv1->tv_sec;
diff_usec = tv2->tv_usec - tv1->tv_usec;
if (diff_usec < 0)
{
diff_usec += 1000000;
diff_sec--;
}
return ((diff_usec / 1000) + (diff_sec * 1000));
}
/*
* wee_log_printf: displays a message in WeeChat log (~/.weechat/weechat.log)
*/

View File

@ -26,6 +26,7 @@
#endif
#include <stdio.h>
#include <sys/time.h>
#if defined(ENABLE_NLS) && !defined(_)
#include <locale.h>
@ -102,6 +103,7 @@ extern char *weechat_home;
extern char *local_charset;
extern char *weechat_convert_encoding (char *, char *, char *);
extern long get_timeval_diff (struct timeval *, struct timeval *);
extern void wee_log_printf (char *, ...);
extern void wee_shutdown ();

View File

@ -460,6 +460,9 @@ 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_lag_check;
int cfg_irc_lag_min_show;
int cfg_irc_lag_disconnect;
t_config_option weechat_options_irc[] =
{ { "irc_display_away", N_("display message to all channels when away"),
@ -478,6 +481,18 @@ 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_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,
NULL, NULL, &cfg_irc_lag_check, NULL, config_change_noop },
{ "irc_lag_min_show", N_("minimum lag to show"),
N_("minimum lag to show (in seconds)"),
OPTION_TYPE_INT, 1, INT_MAX, 1,
NULL, NULL, &cfg_irc_lag_min_show, NULL, config_change_noop },
{ "irc_lag_disconnect", N_("disconnect after important lag"),
N_("disconnect after important lag (in minutes, 0 = never disconnect)"),
OPTION_TYPE_INT, 0, INT_MAX, 5,
NULL, NULL, &cfg_irc_lag_disconnect, NULL, config_change_noop },
{ NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
};

View File

@ -154,6 +154,9 @@ 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_lag_check;
extern int cfg_irc_lag_min_show;
extern int cfg_irc_lag_disconnect;
extern int cfg_dcc_auto_accept_files;
extern int cfg_dcc_auto_accept_chats;

View File

@ -1013,8 +1013,11 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
/* display list of other active windows (if any) with numbers */
if (hotlist)
{
gui_window_set_color (ptr_win->win_status,
COLOR_WIN_STATUS_DELIMITERS);
wprintw (ptr_win->win_status, "[");
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
wprintw (ptr_win->win_status, _("[Act: "));
wprintw (ptr_win->win_status, _("Act: "));
for (ptr_hotlist = hotlist; ptr_hotlist;
ptr_hotlist = ptr_hotlist->next_hotlist)
{
@ -1045,10 +1048,27 @@ 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);
COLOR_WIN_STATUS_DELIMITERS);
wprintw (ptr_win->win_status, "]");
}
/* display lag */
if (SERVER(ptr_win->buffer))
{
if (SERVER(ptr_win->buffer)->lag / 1000 >= cfg_irc_lag_min_show)
{
gui_window_set_color (ptr_win->win_status,
COLOR_WIN_STATUS_DELIMITERS);
wprintw (ptr_win->win_status, "[");
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
wprintw (ptr_win->win_status, _("Lag: %.1f"),
((float)(SERVER(ptr_win->buffer)->lag)) / 1000);
gui_window_set_color (ptr_win->win_status,
COLOR_WIN_STATUS_DELIMITERS);
wprintw (ptr_win->win_status, "]");
}
}
/* display "-MORE-" if last line is not displayed */
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS_MORE);
if (ptr_win->sub_lines > 0)

View File

@ -634,9 +634,10 @@ void
gui_main_loop ()
{
fd_set read_fd;
static struct timeval timeout;
static struct timeval timeout, tv;
static struct timezone tz;
t_irc_server *ptr_server;
int old_min, old_sec;
int old_min, old_sec, diff;
time_t new_time;
struct tm *local_time;
@ -680,8 +681,38 @@ gui_main_loop ()
&& (new_time >= (ptr_server->reconnect_start + ptr_server->autoreconnect_delay)))
server_reconnect (ptr_server);
else
{
if (ptr_server->is_connected)
{
/* check for lag */
if ((ptr_server->lag_check_time.tv_sec == 0)
&& (new_time >= ptr_server->lag_next_check))
{
server_sendf (ptr_server, "PING %s\r\n", ptr_server->address);
gettimeofday (&(ptr_server->lag_check_time), &tz);
}
/* lag timeout => disconnect */
if ((ptr_server->lag_check_time.tv_sec != 0)
&& (cfg_irc_lag_disconnect > 0))
{
gettimeofday (&tv, &tz);
diff = (int) get_timeval_diff (&(ptr_server->lag_check_time), &tv);
if (diff / 1000 > cfg_irc_lag_disconnect * 60)
{
irc_display_prefix (ptr_server->buffer, PREFIX_ERROR);
gui_printf (ptr_server->buffer,
_("%s lag is high, disconnecting from server...\n"),
WEECHAT_WARNING);
server_disconnect (ptr_server, 1);
continue;
}
}
}
if (ptr_server->sock4 >= 0)
FD_SET (ptr_server->sock4, &read_fd);
}
}
if (select (FD_SETSIZE, &read_fd, NULL, NULL, &timeout))
{

View File

@ -161,7 +161,7 @@ t_irc_command irc_commands[] =
{ "pong", N_("answer to a ping message"),
N_("daemon [daemon2]"), N_("daemon: daemon who has responded to Ping message\n"
"daemon2: forward message to this daemon"),
1, 2, 1, NULL, irc_cmd_send_pong, NULL },
1, 2, 1, NULL, irc_cmd_send_pong, irc_cmd_recv_pong },
{ "privmsg", N_("message received"),
"", "",
0, 0, 1, NULL, NULL, irc_cmd_recv_privmsg },

View File

@ -937,6 +937,37 @@ irc_cmd_recv_ping (t_irc_server *server, char *host, char *arguments)
return 0;
}
/*
* irc_cmd_recv_pong: 'pong' command received
*/
int
irc_cmd_recv_pong (t_irc_server *server, char *host, char *arguments)
{
struct timeval tv;
struct timezone tz;
int old_lag;
(void)host;
(void)arguments;
if (server->lag_check_time.tv_sec != 0)
{
/* calculate lag (time diff with lag check) */
old_lag = server->lag;
gettimeofday (&tv, &tz);
server->lag = (int) get_timeval_diff (&(server->lag_check_time), &tv);
if (old_lag != server->lag)
gui_draw_buffer_status (gui_current_window->buffer, 1);
/* schedule next lag check */
server->lag_check_time.tv_sec = 0;
server->lag_check_time.tv_usec = 0;
server->lag_next_check = time (NULL) + cfg_irc_lag_check;
}
return 0;
}
/*
* irc_cmd_recv_privmsg: 'privmsg' command received
*/

View File

@ -84,6 +84,10 @@ server_init (t_irc_server *server)
server->away_time = 0;
server->server_read = -1;
server->server_write = -1;
server->lag = 0;
server->lag_check_time.tv_sec = 0;
server->lag_check_time.tv_usec = 0;
server->lag_next_check = 0;
server->buffer = NULL;
server->channels = NULL;
server->last_channel = NULL;
@ -818,8 +822,6 @@ server_disconnect (t_irc_server *server, int reconnect)
irc_display_prefix (ptr_channel->buffer, PREFIX_INFO);
gui_printf (ptr_channel->buffer, _("Disconnected from server!\n"));
}
gui_draw_buffer_nick (gui_current_window->buffer, 1);
gui_draw_buffer_status (gui_current_window->buffer, 1);
}
/* close communication with server */
@ -839,6 +841,10 @@ server_disconnect (t_irc_server *server, int reconnect)
server->is_connected = 0;
server->is_away = 0;
server->away_time = 0;
server->lag = 0;
server->lag_check_time.tv_sec = 0;
server->lag_check_time.tv_usec = 0;
server->lag_next_check = 0;
if ((reconnect) && (server->autoreconnect))
{
@ -849,6 +855,8 @@ server_disconnect (t_irc_server *server, int reconnect)
}
else
server->reconnect_start = 0;
gui_redraw_buffer (gui_current_window->buffer);
}
/*

View File

@ -22,6 +22,7 @@
#define __WEECHAT_IRC_H 1
#include <time.h>
#include <sys/time.h>
#include "../gui/gui.h"
/* prefixes for chat window */
@ -142,6 +143,9 @@ struct t_irc_server
time_t away_time; /* time() when user marking as away */
int server_read; /* pipe for reading server data */
int server_write; /* pipe for sending data to server */
int lag; /* lag (in milliseconds) */
struct timeval lag_check_time; /* last time lag was checked (ping sent)*/
time_t lag_next_check; /* time for next check */
t_gui_buffer *buffer; /* GUI buffer allocated for server */
t_irc_channel *channels; /* opened channels on server */
t_irc_channel *last_channel; /* last opened channal on server */
@ -337,6 +341,7 @@ extern int irc_cmd_recv_nick (t_irc_server *, char *, char *);
extern int irc_cmd_recv_notice (t_irc_server *, char *, char *);
extern int irc_cmd_recv_part (t_irc_server *, char *, char *);
extern int irc_cmd_recv_ping (t_irc_server *, char *, char *);
extern int irc_cmd_recv_pong (t_irc_server *, char *, char *);
extern int irc_cmd_recv_privmsg (t_irc_server *, char *, char *);
extern int irc_cmd_recv_quit (t_irc_server *, char *, char *);
extern int irc_cmd_recv_server_msg (t_irc_server *, char *, char *);

View File

@ -1,12 +1,12 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
WeeChat known bugs, 2005-01-01
WeeChat known bugs, 2005-01-23
- ./configure does not check that Curses headers are installed
- ./configure does not check that Gtk 2.0 libraries are installed
- ./configure does not check that Perl headers & libraries are installed
- too much nicks in the channel (> height of window) => display bug
- too much nicks in the channel (> height of window) => some nicks are hidden
- problem when resizing terminal and that some windows are outside new term size
- some IRC commands are marked as 'unknown' when received
(IRC protocol is under dev!)

View File

@ -1,10 +1,11 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
ChangeLog - 2005-01-16
ChangeLog - 2005-01-23
Version 0.1.0 (under dev!):
* 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
complete command arg for example)

View File

@ -1,7 +1,7 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
TODO - 2005-01-02
TODO - 2005-01-23
Legend:
# done
@ -14,22 +14,18 @@ v0.1.0:
------
* General:
- Windows version
+ Windows version
+ Solaris version
* IRC protocol:
+ "/dcc" command (for chat and sending/receiving files)
- lets user configure his CTCP version reply (partially)
* Interface:
# add lag indicator
+ "/window" command, split terminal in multiple windows
(horizontally/vertically)
+ internationalization (traduce WeeChat in many languages)
* Configuration:
+ add missing options for config file
- add key bindings to config file
Future versions:
---------------
@ -38,6 +34,7 @@ Future versions:
- *BSD version
* IRC protocol:
- customizable CTCP version reply
- complete "/list" command: add regexp search, display only channels that
match regexp
- "/ignore" and "/unignore" commands: hide all that is write by a given
@ -63,7 +60,6 @@ Future versions:
+ Gtk GUI
- color for nicks (except own nick) when nick colors are disabled
- interpret special chars in messages (color & bold for example)
- add lag indicator
- improve completion (for example complete command parameters when possible)
- understand incomplete commands if unambigous (for example: /he for /help is ok)
- tab key with empty command line should switch to next window (like F7)
@ -80,3 +76,6 @@ Future versions:
- "/python load" and "/python unload" commands to (un)load Python scripts
- Ruby plugin
- "/ruby load" and "/ruby unload" commands to (un)load Ruby scripts
* Configuration:
- add key bindings to config file

View File

@ -55,7 +55,7 @@ AH_VERBATIM([PLUGINS], [#undef PLUGINS])
AH_VERBATIM([PLUGIN_PERL], [#undef PLUGIN_PERL])
AH_VERBATIM([DEBUG], [#undef DEBUG])
AC_ARG_ENABLE(ncurses, [ --disable-ncurses Turn off NCurses interface (default=auto)],,enable_ncurses=yes)
AC_ARG_ENABLE(ncurses, [ --disable-ncurses Turn off ncurses interface (default=auto)],,enable_ncurses=yes)
AC_ARG_ENABLE(gtk, [ --enable-gtk Turn on Gtk+ interface (default=no)],enable_gtk=yes,enable_gtk=no)
AC_ARG_ENABLE(qt, [ --enable-qt Turn on Qt interface (default=no)],enable_qt=yes,enable_qt=no)
AC_ARG_ENABLE(perl, [ --enable-perl Turn on Perl plugins (default=no)],enable_perl=yes,enable_perl=no)
@ -76,7 +76,7 @@ AM_CONDITIONAL(PLUGIN_PERL, test "$enable_perl" = "yes")
if test "x$enable_ncurses" = "xyes" ; then
if test "$LIBNCURSES_FOUND" = "0" ; then
AC_MSG_ERROR([NCurses library not found! Install NCurses library or run ./configure with --disable-ncurses parameter.])
AC_MSG_ERROR([ncurses library not found! Install ncurses library or run ./configure with --disable-ncurses parameter.])
fi
NCURSES_LIBS="-lncurses"
AC_SUBST(NCURSES_LIBS)
@ -140,7 +140,7 @@ echo $PACKAGE $VERSION
listgui=
if test "x$enable_ncurses" = "xyes" ; then
listgui="$listgui NCurses"
listgui="$listgui ncurses"
fi
if test "x$enable_gtk" = "xyes" ; then
listgui="$listgui Gtk+"
@ -150,16 +150,16 @@ if test "x$enable_qt" = "xyes" ; then
fi
if test "x$listgui" = "x" ; then
AC_MSG_ERROR([No interface specified... Please specify at least NCurses, Gtk or Qt.])
AC_MSG_ERROR([No interface specified... Please specify at least ncurses, Gtk or Qt.])
fi
msg_debug_compiler="No"
msg_debug_verbose="No"
msg_debug_compiler="no"
msg_debug_verbose="no"
if test "x$debug" = "x1" || test "x$debug" = "x2" ; then
msg_debug_compiler="Yes"
msg_debug_compiler="yes"
fi
if test "x$debug" = "x2" ; then
msg_debug_verbose="Yes"
msg_debug_verbose="yes"
fi
echo

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -261,8 +261,6 @@ completion_build_list (t_completion *completion, void *channel)
|| (strcasecmp (completion->base_command, "lusers") == 0)
|| (strcasecmp (completion->base_command, "motd") == 0)
|| (strcasecmp (completion->base_command, "oper") == 0)
|| (strcasecmp (completion->base_command, "ping") == 0)
|| (strcasecmp (completion->base_command, "pong") == 0)
|| (strcasecmp (completion->base_command, "rehash") == 0)
|| (strcasecmp (completion->base_command, "restart") == 0)
|| (strcasecmp (completion->base_command, "service") == 0)

View File

@ -123,6 +123,25 @@ weechat_convert_encoding (char *from_code, char *to_code, char *string)
return outbuf;
}
/*
* get_timeval_diff: calculates difference between two times (return in milliseconds)
*/
long get_timeval_diff(struct timeval *tv1, struct timeval *tv2)
{
long diff_sec, diff_usec;
diff_sec = tv2->tv_sec - tv1->tv_sec;
diff_usec = tv2->tv_usec - tv1->tv_usec;
if (diff_usec < 0)
{
diff_usec += 1000000;
diff_sec--;
}
return ((diff_usec / 1000) + (diff_sec * 1000));
}
/*
* wee_log_printf: displays a message in WeeChat log (~/.weechat/weechat.log)
*/

View File

@ -26,6 +26,7 @@
#endif
#include <stdio.h>
#include <sys/time.h>
#if defined(ENABLE_NLS) && !defined(_)
#include <locale.h>
@ -102,6 +103,7 @@ extern char *weechat_home;
extern char *local_charset;
extern char *weechat_convert_encoding (char *, char *, char *);
extern long get_timeval_diff (struct timeval *, struct timeval *);
extern void wee_log_printf (char *, ...);
extern void wee_shutdown ();

View File

@ -460,6 +460,9 @@ 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_lag_check;
int cfg_irc_lag_min_show;
int cfg_irc_lag_disconnect;
t_config_option weechat_options_irc[] =
{ { "irc_display_away", N_("display message to all channels when away"),
@ -478,6 +481,18 @@ 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_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,
NULL, NULL, &cfg_irc_lag_check, NULL, config_change_noop },
{ "irc_lag_min_show", N_("minimum lag to show"),
N_("minimum lag to show (in seconds)"),
OPTION_TYPE_INT, 1, INT_MAX, 1,
NULL, NULL, &cfg_irc_lag_min_show, NULL, config_change_noop },
{ "irc_lag_disconnect", N_("disconnect after important lag"),
N_("disconnect after important lag (in minutes, 0 = never disconnect)"),
OPTION_TYPE_INT, 0, INT_MAX, 5,
NULL, NULL, &cfg_irc_lag_disconnect, NULL, config_change_noop },
{ NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
};

View File

@ -154,6 +154,9 @@ 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_lag_check;
extern int cfg_irc_lag_min_show;
extern int cfg_irc_lag_disconnect;
extern int cfg_dcc_auto_accept_files;
extern int cfg_dcc_auto_accept_chats;

View File

@ -1013,8 +1013,11 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
/* display list of other active windows (if any) with numbers */
if (hotlist)
{
gui_window_set_color (ptr_win->win_status,
COLOR_WIN_STATUS_DELIMITERS);
wprintw (ptr_win->win_status, "[");
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
wprintw (ptr_win->win_status, _("[Act: "));
wprintw (ptr_win->win_status, _("Act: "));
for (ptr_hotlist = hotlist; ptr_hotlist;
ptr_hotlist = ptr_hotlist->next_hotlist)
{
@ -1045,10 +1048,27 @@ 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);
COLOR_WIN_STATUS_DELIMITERS);
wprintw (ptr_win->win_status, "]");
}
/* display lag */
if (SERVER(ptr_win->buffer))
{
if (SERVER(ptr_win->buffer)->lag / 1000 >= cfg_irc_lag_min_show)
{
gui_window_set_color (ptr_win->win_status,
COLOR_WIN_STATUS_DELIMITERS);
wprintw (ptr_win->win_status, "[");
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
wprintw (ptr_win->win_status, _("Lag: %.1f"),
((float)(SERVER(ptr_win->buffer)->lag)) / 1000);
gui_window_set_color (ptr_win->win_status,
COLOR_WIN_STATUS_DELIMITERS);
wprintw (ptr_win->win_status, "]");
}
}
/* display "-MORE-" if last line is not displayed */
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS_MORE);
if (ptr_win->sub_lines > 0)

View File

@ -634,9 +634,10 @@ void
gui_main_loop ()
{
fd_set read_fd;
static struct timeval timeout;
static struct timeval timeout, tv;
static struct timezone tz;
t_irc_server *ptr_server;
int old_min, old_sec;
int old_min, old_sec, diff;
time_t new_time;
struct tm *local_time;
@ -680,8 +681,38 @@ gui_main_loop ()
&& (new_time >= (ptr_server->reconnect_start + ptr_server->autoreconnect_delay)))
server_reconnect (ptr_server);
else
{
if (ptr_server->is_connected)
{
/* check for lag */
if ((ptr_server->lag_check_time.tv_sec == 0)
&& (new_time >= ptr_server->lag_next_check))
{
server_sendf (ptr_server, "PING %s\r\n", ptr_server->address);
gettimeofday (&(ptr_server->lag_check_time), &tz);
}
/* lag timeout => disconnect */
if ((ptr_server->lag_check_time.tv_sec != 0)
&& (cfg_irc_lag_disconnect > 0))
{
gettimeofday (&tv, &tz);
diff = (int) get_timeval_diff (&(ptr_server->lag_check_time), &tv);
if (diff / 1000 > cfg_irc_lag_disconnect * 60)
{
irc_display_prefix (ptr_server->buffer, PREFIX_ERROR);
gui_printf (ptr_server->buffer,
_("%s lag is high, disconnecting from server...\n"),
WEECHAT_WARNING);
server_disconnect (ptr_server, 1);
continue;
}
}
}
if (ptr_server->sock4 >= 0)
FD_SET (ptr_server->sock4, &read_fd);
}
}
if (select (FD_SETSIZE, &read_fd, NULL, NULL, &timeout))
{

View File

@ -161,7 +161,7 @@ t_irc_command irc_commands[] =
{ "pong", N_("answer to a ping message"),
N_("daemon [daemon2]"), N_("daemon: daemon who has responded to Ping message\n"
"daemon2: forward message to this daemon"),
1, 2, 1, NULL, irc_cmd_send_pong, NULL },
1, 2, 1, NULL, irc_cmd_send_pong, irc_cmd_recv_pong },
{ "privmsg", N_("message received"),
"", "",
0, 0, 1, NULL, NULL, irc_cmd_recv_privmsg },

View File

@ -937,6 +937,37 @@ irc_cmd_recv_ping (t_irc_server *server, char *host, char *arguments)
return 0;
}
/*
* irc_cmd_recv_pong: 'pong' command received
*/
int
irc_cmd_recv_pong (t_irc_server *server, char *host, char *arguments)
{
struct timeval tv;
struct timezone tz;
int old_lag;
(void)host;
(void)arguments;
if (server->lag_check_time.tv_sec != 0)
{
/* calculate lag (time diff with lag check) */
old_lag = server->lag;
gettimeofday (&tv, &tz);
server->lag = (int) get_timeval_diff (&(server->lag_check_time), &tv);
if (old_lag != server->lag)
gui_draw_buffer_status (gui_current_window->buffer, 1);
/* schedule next lag check */
server->lag_check_time.tv_sec = 0;
server->lag_check_time.tv_usec = 0;
server->lag_next_check = time (NULL) + cfg_irc_lag_check;
}
return 0;
}
/*
* irc_cmd_recv_privmsg: 'privmsg' command received
*/

View File

@ -84,6 +84,10 @@ server_init (t_irc_server *server)
server->away_time = 0;
server->server_read = -1;
server->server_write = -1;
server->lag = 0;
server->lag_check_time.tv_sec = 0;
server->lag_check_time.tv_usec = 0;
server->lag_next_check = 0;
server->buffer = NULL;
server->channels = NULL;
server->last_channel = NULL;
@ -818,8 +822,6 @@ server_disconnect (t_irc_server *server, int reconnect)
irc_display_prefix (ptr_channel->buffer, PREFIX_INFO);
gui_printf (ptr_channel->buffer, _("Disconnected from server!\n"));
}
gui_draw_buffer_nick (gui_current_window->buffer, 1);
gui_draw_buffer_status (gui_current_window->buffer, 1);
}
/* close communication with server */
@ -839,6 +841,10 @@ server_disconnect (t_irc_server *server, int reconnect)
server->is_connected = 0;
server->is_away = 0;
server->away_time = 0;
server->lag = 0;
server->lag_check_time.tv_sec = 0;
server->lag_check_time.tv_usec = 0;
server->lag_next_check = 0;
if ((reconnect) && (server->autoreconnect))
{
@ -849,6 +855,8 @@ server_disconnect (t_irc_server *server, int reconnect)
}
else
server->reconnect_start = 0;
gui_redraw_buffer (gui_current_window->buffer);
}
/*

View File

@ -22,6 +22,7 @@
#define __WEECHAT_IRC_H 1
#include <time.h>
#include <sys/time.h>
#include "../gui/gui.h"
/* prefixes for chat window */
@ -142,6 +143,9 @@ struct t_irc_server
time_t away_time; /* time() when user marking as away */
int server_read; /* pipe for reading server data */
int server_write; /* pipe for sending data to server */
int lag; /* lag (in milliseconds) */
struct timeval lag_check_time; /* last time lag was checked (ping sent)*/
time_t lag_next_check; /* time for next check */
t_gui_buffer *buffer; /* GUI buffer allocated for server */
t_irc_channel *channels; /* opened channels on server */
t_irc_channel *last_channel; /* last opened channal on server */
@ -337,6 +341,7 @@ extern int irc_cmd_recv_nick (t_irc_server *, char *, char *);
extern int irc_cmd_recv_notice (t_irc_server *, char *, char *);
extern int irc_cmd_recv_part (t_irc_server *, char *, char *);
extern int irc_cmd_recv_ping (t_irc_server *, char *, char *);
extern int irc_cmd_recv_pong (t_irc_server *, char *, char *);
extern int irc_cmd_recv_privmsg (t_irc_server *, char *, char *);
extern int irc_cmd_recv_quit (t_irc_server *, char *, char *);
extern int irc_cmd_recv_server_msg (t_irc_server *, char *, char *);