summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rw-r--r--src/irc/Makefile12
-rw-r--r--src/irc/irc-recv.c129
-rw-r--r--src/irc/irc-send.c9
-rw-r--r--weechat/ChangeLog2
-rw-r--r--weechat/src/irc/Makefile12
-rw-r--r--weechat/src/irc/irc-recv.c129
-rw-r--r--weechat/src/irc/irc-send.c9
8 files changed, 242 insertions, 62 deletions
diff --git a/ChangeLog b/ChangeLog
index a9d70e251..33b3952e1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,7 +11,7 @@ Version 0.0.3 (under dev!):
* french translation
* new IRC command: /stats, /service, /squit, /motd, /lusers, /links, /time,
/trace, /admin, /info, /servlist, /squery, /who, /whowas, /die, /summon,
- /users, /wallops, /userhost, /ison
+ /users, /wallops, /userhost, /ison, /ctcp ping
* code cleanup
Version 0.0.2 (2003-10-05):
diff --git a/src/irc/Makefile b/src/irc/Makefile
index 09ca6dc0d..245a59213 100644
--- a/src/irc/Makefile
+++ b/src/irc/Makefile
@@ -23,6 +23,18 @@ OUTPUT=irc.a
OBJS=irc-commands.o irc-send.o irc-recv.o irc-display.o irc-server.o irc-channel.o irc-nick.o
DEFINES=WEE_CURSES
+ifeq ($(GUI), curses)
+DEFINES=WEE_CURSES
+endif
+ifeq ($(GUI), gtk)
+INCLUDES=`pkg-config --cflags gtk+-2.0`
+DEFINES=WEE_GTK
+endif
+ifeq ($(GUI), qt)
+DEFINES=WEE_QT
+endif
+
+
all: $(OBJS)
ar r $(OUTPUT) $(OBJS)
diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c
index e2ec08e6c..8ac1ea50a 100644
--- a/src/irc/irc-recv.c
+++ b/src/irc/irc-recv.c
@@ -28,6 +28,7 @@
#include <unistd.h>
#include <stdio.h>
#include <string.h>
+#include <sys/time.h>
#include <time.h>
#include <sys/utsname.h>
@@ -522,7 +523,10 @@ irc_cmd_recv_nick (t_irc_server *server, char *host, char *arguments)
int
irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments)
{
- char *pos, *pos2;
+ char *pos, *pos2, *pos_usec;
+ struct timeval tv;
+ struct timezone tz;
+ long sec1, usec1, sec2, usec2, difftime;
if (host)
{
@@ -548,13 +552,13 @@ irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments)
WEECHAT_ERROR, "notice");
return -1;
}
- irc_display_prefix (server->window, PREFIX_SERVER);
if (strncmp (pos, "\01VERSION", 8) == 0)
{
pos += 9;
pos2 = strchr (pos, '\01');
if (pos2)
pos2[0] = '\0';
+ irc_display_prefix (server->window, PREFIX_SERVER);
gui_printf_color (server->window, COLOR_WIN_CHAT, "CTCP ");
gui_printf_color (server->window, COLOR_WIN_CHAT_CHANNEL, "VERSION ");
gui_printf_color (server->window, COLOR_WIN_CHAT, _("reply from"));
@@ -562,7 +566,48 @@ irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments)
gui_printf_color (server->window, COLOR_WIN_CHAT, ": %s\n", pos);
}
else
- gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", pos);
+ {
+ if (strncmp (pos, "\01PING", 5) == 0)
+ {
+ pos += 5;
+ while (pos[0] == ' ')
+ pos++;
+ pos_usec = strchr (pos, ' ');
+ if (pos_usec)
+ {
+ pos_usec[0] = '\0';
+ pos_usec++;
+ pos2 = strchr (pos_usec, '\01');
+ if (pos2)
+ {
+ pos2[0] = '\0';
+
+ gettimeofday (&tv, &tz);
+ sec1 = atol (pos);
+ usec1 = atol (pos_usec);
+ sec2 = tv.tv_sec;
+ usec2 = tv.tv_usec;
+
+ difftime = ((sec2 * 1000000) + usec2) - ((sec1 * 1000000) + usec1);
+
+ irc_display_prefix (server->window, PREFIX_SERVER);
+ gui_printf_color (server->window, COLOR_WIN_CHAT, "CTCP ");
+ gui_printf_color (server->window, COLOR_WIN_CHAT_CHANNEL, "PING ");
+ gui_printf_color (server->window, COLOR_WIN_CHAT, _("reply from"));
+ gui_printf_color (server->window, COLOR_WIN_CHAT_NICK, " %s", host);
+ gui_printf_color (server->window, COLOR_WIN_CHAT,
+ _(": %ld.%ld seconds\n"),
+ difftime / 1000000,
+ (difftime % 1000000) / 1000);
+ }
+ }
+ }
+ else
+ {
+ irc_display_prefix (server->window, PREFIX_SERVER);
+ gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", pos);
+ }
+ }
return 0;
}
@@ -784,6 +829,7 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments)
if (pos[0] == ':')
pos++;
+ /* version asked by another user => answer with WeeChat version */
if (strcmp (pos, "\01VERSION\01") == 0)
{
buf = (struct utsname *) malloc (sizeof (struct utsname));
@@ -808,38 +854,61 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments)
}
else
{
- /* private message received */
- ptr_channel = channel_search (server, host);
- if (!ptr_channel)
+ /* ping request from another user => answer */
+ if (strncmp (pos, "\01PING", 5) == 0)
{
- ptr_channel = channel_new (server, CHAT_PRIVATE, host);
+ pos += 5;
+ while (pos[0] == ' ')
+ pos++;
+ pos2 = strchr (pos, '\01');
+ if (pos2)
+ pos2[0] = '\0';
+ else
+ pos = NULL;
+ if (pos && !pos[0])
+ pos = NULL;
+ if (pos)
+ server_sendf (server, "NOTICE %s :\01PING %s\01\r\n",
+ host, pos);
+ else
+ server_sendf (server, "NOTICE %s :\01PING\01\r\n",
+ host);
+ }
+ else
+ {
+ /* private message received => display it */
+ ptr_channel = channel_search (server, host);
if (!ptr_channel)
{
- gui_printf (server->window,
- _("%s cannot create new private window \"%s\"\n"),
- WEECHAT_ERROR, host);
- return -1;
+ ptr_channel = channel_new (server, CHAT_PRIVATE, host);
+ if (!ptr_channel)
+ {
+ gui_printf (server->window,
+ _("%s cannot create new private window \"%s\"\n"),
+ WEECHAT_ERROR, host);
+ return -1;
+ }
}
+ if (!ptr_channel->topic)
+ {
+ ptr_channel->topic = strdup (host2);
+ gui_redraw_window_title (ptr_channel->window);
+ }
+
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_NICK,
+ COLOR_WIN_CHAT_DARK, "<");
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_NICK,
+ COLOR_WIN_NICK_PRIVATE,
+ "%s", host);
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_NICK,
+ COLOR_WIN_CHAT_DARK, "> ");
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_MSG,
+ COLOR_WIN_CHAT, "%s\n", pos);
}
- if (!ptr_channel->topic)
- {
- ptr_channel->topic = strdup (host2);
- gui_redraw_window_title (ptr_channel->window);
- }
-
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_NICK,
- COLOR_WIN_CHAT_DARK, "<");
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_NICK,
- COLOR_WIN_NICK_PRIVATE,
- "%s", host);
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_NICK,
- COLOR_WIN_CHAT_DARK, "> ");
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_MSG,
- COLOR_WIN_CHAT, "%s\n", pos);
}
}
else
diff --git a/src/irc/irc-send.c b/src/irc/irc-send.c
index f27edbf72..c672f7fbb 100644
--- a/src/irc/irc-send.c
+++ b/src/irc/irc-send.c
@@ -28,6 +28,7 @@
#include <unistd.h>
#include <stdio.h>
#include <string.h>
+#include <sys/time.h>
#include <time.h>
#include <sys/utsname.h>
@@ -126,6 +127,8 @@ int
irc_cmd_send_ctcp (t_irc_server *server, char *arguments)
{
char *pos, *pos2;
+ struct timeval tv;
+ struct timezone tz;
pos = strchr (arguments, ' ');
if (pos)
@@ -163,6 +166,12 @@ irc_cmd_send_ctcp (t_irc_server *server, char *arguments)
server_sendf (server, "PRIVMSG %s :\01ACTION\01\r\n",
arguments);
}
+ if (strcasecmp (pos, "ping") == 0)
+ {
+ gettimeofday (&tv, &tz);
+ server_sendf (server, "PRIVMSG %s :\01PING %d %d\01\r\n",
+ arguments, tv.tv_sec, tv.tv_usec);
+ }
}
return 0;
diff --git a/weechat/ChangeLog b/weechat/ChangeLog
index a9d70e251..33b3952e1 100644
--- a/weechat/ChangeLog
+++ b/weechat/ChangeLog
@@ -11,7 +11,7 @@ Version 0.0.3 (under dev!):
* french translation
* new IRC command: /stats, /service, /squit, /motd, /lusers, /links, /time,
/trace, /admin, /info, /servlist, /squery, /who, /whowas, /die, /summon,
- /users, /wallops, /userhost, /ison
+ /users, /wallops, /userhost, /ison, /ctcp ping
* code cleanup
Version 0.0.2 (2003-10-05):
diff --git a/weechat/src/irc/Makefile b/weechat/src/irc/Makefile
index 09ca6dc0d..245a59213 100644
--- a/weechat/src/irc/Makefile
+++ b/weechat/src/irc/Makefile
@@ -23,6 +23,18 @@ OUTPUT=irc.a
OBJS=irc-commands.o irc-send.o irc-recv.o irc-display.o irc-server.o irc-channel.o irc-nick.o
DEFINES=WEE_CURSES
+ifeq ($(GUI), curses)
+DEFINES=WEE_CURSES
+endif
+ifeq ($(GUI), gtk)
+INCLUDES=`pkg-config --cflags gtk+-2.0`
+DEFINES=WEE_GTK
+endif
+ifeq ($(GUI), qt)
+DEFINES=WEE_QT
+endif
+
+
all: $(OBJS)
ar r $(OUTPUT) $(OBJS)
diff --git a/weechat/src/irc/irc-recv.c b/weechat/src/irc/irc-recv.c
index e2ec08e6c..8ac1ea50a 100644
--- a/weechat/src/irc/irc-recv.c
+++ b/weechat/src/irc/irc-recv.c
@@ -28,6 +28,7 @@
#include <unistd.h>
#include <stdio.h>
#include <string.h>
+#include <sys/time.h>
#include <time.h>
#include <sys/utsname.h>
@@ -522,7 +523,10 @@ irc_cmd_recv_nick (t_irc_server *server, char *host, char *arguments)
int
irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments)
{
- char *pos, *pos2;
+ char *pos, *pos2, *pos_usec;
+ struct timeval tv;
+ struct timezone tz;
+ long sec1, usec1, sec2, usec2, difftime;
if (host)
{
@@ -548,13 +552,13 @@ irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments)
WEECHAT_ERROR, "notice");
return -1;
}
- irc_display_prefix (server->window, PREFIX_SERVER);
if (strncmp (pos, "\01VERSION", 8) == 0)
{
pos += 9;
pos2 = strchr (pos, '\01');
if (pos2)
pos2[0] = '\0';
+ irc_display_prefix (server->window, PREFIX_SERVER);
gui_printf_color (server->window, COLOR_WIN_CHAT, "CTCP ");
gui_printf_color (server->window, COLOR_WIN_CHAT_CHANNEL, "VERSION ");
gui_printf_color (server->window, COLOR_WIN_CHAT, _("reply from"));
@@ -562,7 +566,48 @@ irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments)
gui_printf_color (server->window, COLOR_WIN_CHAT, ": %s\n", pos);
}
else
- gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", pos);
+ {
+ if (strncmp (pos, "\01PING", 5) == 0)
+ {
+ pos += 5;
+ while (pos[0] == ' ')
+ pos++;
+ pos_usec = strchr (pos, ' ');
+ if (pos_usec)
+ {
+ pos_usec[0] = '\0';
+ pos_usec++;
+ pos2 = strchr (pos_usec, '\01');
+ if (pos2)
+ {
+ pos2[0] = '\0';
+
+ gettimeofday (&tv, &tz);
+ sec1 = atol (pos);
+ usec1 = atol (pos_usec);
+ sec2 = tv.tv_sec;
+ usec2 = tv.tv_usec;
+
+ difftime = ((sec2 * 1000000) + usec2) - ((sec1 * 1000000) + usec1);
+
+ irc_display_prefix (server->window, PREFIX_SERVER);
+ gui_printf_color (server->window, COLOR_WIN_CHAT, "CTCP ");
+ gui_printf_color (server->window, COLOR_WIN_CHAT_CHANNEL, "PING ");
+ gui_printf_color (server->window, COLOR_WIN_CHAT, _("reply from"));
+ gui_printf_color (server->window, COLOR_WIN_CHAT_NICK, " %s", host);
+ gui_printf_color (server->window, COLOR_WIN_CHAT,
+ _(": %ld.%ld seconds\n"),
+ difftime / 1000000,
+ (difftime % 1000000) / 1000);
+ }
+ }
+ }
+ else
+ {
+ irc_display_prefix (server->window, PREFIX_SERVER);
+ gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", pos);
+ }
+ }
return 0;
}
@@ -784,6 +829,7 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments)
if (pos[0] == ':')
pos++;
+ /* version asked by another user => answer with WeeChat version */
if (strcmp (pos, "\01VERSION\01") == 0)
{
buf = (struct utsname *) malloc (sizeof (struct utsname));
@@ -808,38 +854,61 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments)
}
else
{
- /* private message received */
- ptr_channel = channel_search (server, host);
- if (!ptr_channel)
+ /* ping request from another user => answer */
+ if (strncmp (pos, "\01PING", 5) == 0)
{
- ptr_channel = channel_new (server, CHAT_PRIVATE, host);
+ pos += 5;
+ while (pos[0] == ' ')
+ pos++;
+ pos2 = strchr (pos, '\01');
+ if (pos2)
+ pos2[0] = '\0';
+ else
+ pos = NULL;
+ if (pos && !pos[0])
+ pos = NULL;
+ if (pos)
+ server_sendf (server, "NOTICE %s :\01PING %s\01\r\n",
+ host, pos);
+ else
+ server_sendf (server, "NOTICE %s :\01PING\01\r\n",
+ host);
+ }
+ else
+ {
+ /* private message received => display it */
+ ptr_channel = channel_search (server, host);
if (!ptr_channel)
{
- gui_printf (server->window,
- _("%s cannot create new private window \"%s\"\n"),
- WEECHAT_ERROR, host);
- return -1;
+ ptr_channel = channel_new (server, CHAT_PRIVATE, host);
+ if (!ptr_channel)
+ {
+ gui_printf (server->window,
+ _("%s cannot create new private window \"%s\"\n"),
+ WEECHAT_ERROR, host);
+ return -1;
+ }
}
+ if (!ptr_channel->topic)
+ {
+ ptr_channel->topic = strdup (host2);
+ gui_redraw_window_title (ptr_channel->window);
+ }
+
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_NICK,
+ COLOR_WIN_CHAT_DARK, "<");
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_NICK,
+ COLOR_WIN_NICK_PRIVATE,
+ "%s", host);
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_NICK,
+ COLOR_WIN_CHAT_DARK, "> ");
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_MSG,
+ COLOR_WIN_CHAT, "%s\n", pos);
}
- if (!ptr_channel->topic)
- {
- ptr_channel->topic = strdup (host2);
- gui_redraw_window_title (ptr_channel->window);
- }
-
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_NICK,
- COLOR_WIN_CHAT_DARK, "<");
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_NICK,
- COLOR_WIN_NICK_PRIVATE,
- "%s", host);
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_NICK,
- COLOR_WIN_CHAT_DARK, "> ");
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_MSG,
- COLOR_WIN_CHAT, "%s\n", pos);
}
}
else
diff --git a/weechat/src/irc/irc-send.c b/weechat/src/irc/irc-send.c
index f27edbf72..c672f7fbb 100644
--- a/weechat/src/irc/irc-send.c
+++ b/weechat/src/irc/irc-send.c
@@ -28,6 +28,7 @@
#include <unistd.h>
#include <stdio.h>
#include <string.h>
+#include <sys/time.h>
#include <time.h>
#include <sys/utsname.h>
@@ -126,6 +127,8 @@ int
irc_cmd_send_ctcp (t_irc_server *server, char *arguments)
{
char *pos, *pos2;
+ struct timeval tv;
+ struct timezone tz;
pos = strchr (arguments, ' ');
if (pos)
@@ -163,6 +166,12 @@ irc_cmd_send_ctcp (t_irc_server *server, char *arguments)
server_sendf (server, "PRIVMSG %s :\01ACTION\01\r\n",
arguments);
}
+ if (strcasecmp (pos, "ping") == 0)
+ {
+ gettimeofday (&tv, &tz);
+ server_sendf (server, "PRIVMSG %s :\01PING %d %d\01\r\n",
+ arguments, tv.tv_sec, tv.tv_usec);
+ }
}
return 0;