summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2003-10-06 22:24:19 +0000
committerSebastien Helleu <flashcode@flashtux.org>2003-10-06 22:24:19 +0000
commit954f1b98bfc6d4862ba1cefd33eea7201124d258 (patch)
tree7e2dc03e86e933c03a25514c632bc622ff849cf1
parent641e5cd05a68a2a9e7e6b043de05687855cb5029 (diff)
downloadweechat-954f1b98bfc6d4862ba1cefd33eea7201124d258.zip
Added /stats command, splited irc-commands.c in 3 files (commands, send, recv)
-rw-r--r--ChangeLog6
-rw-r--r--TODO6
-rw-r--r--src/irc/Makefile8
-rw-r--r--src/irc/irc-commands.c2839
-rw-r--r--src/irc/irc-recv.c2113
-rw-r--r--src/irc/irc-send.c811
-rw-r--r--src/irc/irc.h1
-rw-r--r--weechat/ChangeLog6
-rw-r--r--weechat/TODO6
-rw-r--r--weechat/src/irc/Makefile8
-rw-r--r--weechat/src/irc/irc-commands.c2839
-rw-r--r--weechat/src/irc/irc-recv.c2113
-rw-r--r--weechat/src/irc/irc-send.c811
-rw-r--r--weechat/src/irc/irc.h1
14 files changed, 5890 insertions, 5678 deletions
diff --git a/ChangeLog b/ChangeLog
index 0d93aad32..127ddc215 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,13 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
-ChangeLog - 2003-10-05
+ChangeLog - 2003-10-07
+Version 0.0.3 (under dev!):
+ * new IRC command: /stats
+ * french translation
+
Version 0.0.2 (2003-10-05):
* added commands /rehash and /restart
* command & auto-join channels when connected to server
diff --git a/TODO b/TODO
index 187145698..f22c5e872 100644
--- a/TODO
+++ b/TODO
@@ -1,7 +1,7 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
-TODO - 2003-10-05
+TODO - 2003-10-07
Legend:
# done
@@ -14,7 +14,7 @@ v0.0.3:
------
* IRC protocol:
- - implement RFC 2812
+ + implement RFC 2812
+ "/mode" command: change the user/channels modes
* WeeChat commands:
@@ -28,7 +28,7 @@ v0.0.3:
* Interface:
- display current channel modes (example : #weechat(+nt))
- interpret special chars in messages (color & bold for example)
- - internationalization (traduce WeeChat in many languages)
+ + internationalization (traduce WeeChat in many languages)
- log chats to file
* TCP/IP communication:
diff --git a/src/irc/Makefile b/src/irc/Makefile
index d22617bda..09ca6dc0d 100644
--- a/src/irc/Makefile
+++ b/src/irc/Makefile
@@ -20,7 +20,7 @@ CC=gcc
OPTIONS=-Wall -W -pipe -O2
OUTPUT=irc.a
-OBJS=irc-commands.o irc-display.o irc-server.o irc-channel.o irc-nick.o
+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
all: $(OBJS)
@@ -37,8 +37,12 @@ irc-channel.o: irc-channel.c ../weechat.h irc.h ../gui/gui.h \
irc-commands.o: irc-commands.c ../weechat.h irc.h ../gui/gui.h \
../completion.h ../history.h ../command.h ../irc/irc.h ../config.h
irc-display.o: irc-display.c ../weechat.h irc.h ../gui/gui.h \
- ../completion.h ../history.h
+ ../completion.h ../history.h ../config.h
irc-nick.o: irc-nick.c ../weechat.h irc.h ../gui/gui.h ../completion.h \
../history.h
+irc-recv.o: irc-recv.c ../weechat.h irc.h ../gui/gui.h ../completion.h \
+ ../history.h ../command.h ../irc/irc.h ../config.h
+irc-send.o: irc-send.c ../weechat.h irc.h ../gui/gui.h ../completion.h \
+ ../history.h ../command.h ../irc/irc.h ../config.h
irc-server.o: irc-server.c ../weechat.h irc.h ../gui/gui.h \
../completion.h ../history.h
diff --git a/src/irc/irc-commands.c b/src/irc/irc-commands.c
index 9f04540c7..384ba787a 100644
--- a/src/irc/irc-commands.c
+++ b/src/irc/irc-commands.c
@@ -151,6 +151,10 @@ t_irc_command irc_commands[] =
{ "restart", N_("tell the server to restart itself"),
"", "",
0, 0, 1, NULL, irc_cmd_send_restart, NULL },
+ { "stats", N_("query statistics about server"),
+ "[query [server]]",
+ "query: c/h/i/k/l/m/o/y/u (see RFC1459)\nserver: server name",
+ 0, 2, 1, NULL, irc_cmd_send_stats, NULL },
{ "topic", N_("get/set channel topic"),
N_("[channel] [topic]"), N_("channel: channel name\ntopic: new topic for channel "
"(if topic is \"-delete\" then topic is deleted)"),
@@ -170,6 +174,8 @@ t_irc_command irc_commands[] =
{ "003", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
{ "004", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_004 },
{ "005", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
+ { "212", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
+ { "219", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
{ "250", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
{ "251", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
{ "252", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
@@ -315,2836 +321,3 @@ t_irc_command irc_commands[] =
"", "", 0, MAX_ARGS, 1, NULL, NULL, irc_cmd_recv_error },
{ NULL, NULL, NULL, NULL, 0, 0, 1, NULL, NULL, NULL }
};
-
-
-/*
- * irc_recv_command: executes action when receiving IRC command
- * returns: 0 = all ok, command executed
- * -1 = command failed
- * -2 = no command to execute
- * -3 = command not found
- */
-
-int
-irc_recv_command (t_irc_server *server,
- char *host, char *command, char *arguments)
-{
- int i, cmd_found;
-
- if (command == NULL)
- return -2;
-
- /* looks for irc command */
- cmd_found = -1;
- for (i = 0; irc_commands[i].command_name; i++)
- if (strcasecmp (irc_commands[i].command_name, command) == 0)
- {
- cmd_found = i;
- break;
- }
-
- /* command not found */
- if (cmd_found < 0)
- return -3;
-
- if (irc_commands[i].recv_function != NULL)
- return (int) (irc_commands[i].recv_function) (server, host, arguments);
-
- return 0;
-}
-
-/*
- * irc_login: login to irc server
- */
-
-void
-irc_login (t_irc_server *server)
-{
- char hostname[128];
-
- if ((server->password) && (server->password[0]))
- server_sendf (server, "PASS %s\r\n", server->password);
-
- gethostname (hostname, sizeof (hostname) - 1);
- hostname[sizeof (hostname) - 1] = '\0';
- if (!hostname[0])
- strcpy (hostname, _("unknown"));
- gui_printf (server->window,
- _("%s: using local hostname \"%s\"\n"),
- WEECHAT_NAME, hostname);
- server_sendf (server,
- "NICK %s\r\n"
- "USER %s %s %s :%s\r\n",
- server->nick, server->username, hostname, "servername",
- server->realname);
-}
-
-/*
- * irc_cmd_send_away: toggle away status
- */
-
-int
-irc_cmd_send_away (t_irc_server *server, char *arguments)
-{
- char *pos;
- t_irc_server *ptr_server;
-
- if (arguments && (strncmp (arguments, "-all", 4) == 0))
- {
- pos = arguments + 4;
- while (pos[0] == ' ')
- pos++;
- if (!pos[0])
- pos = NULL;
-
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- if (server->is_connected)
- {
- if (pos)
- server_sendf (ptr_server, "AWAY :%s\r\n", pos);
- else
- server_sendf (ptr_server, "AWAY\r\n");
- }
- }
- }
- else
- {
- if (arguments)
- server_sendf (server, "AWAY :%s\r\n", arguments);
- else
- server_sendf (server, "AWAY\r\n");
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_ctcp: send a ctcp message
- */
-
-int
-irc_cmd_send_ctcp (t_irc_server *server, char *arguments)
-{
- char *pos, *pos2;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- pos2 = strchr (pos, ' ');
- if (pos2)
- {
- pos2[0] = '\0';
- pos2++;
- while (pos2[0] == ' ')
- pos2++;
- }
- else
- pos2 = NULL;
-
- if (strcasecmp (pos, "version") == 0)
- {
- if (pos2)
- server_sendf (server, "PRIVMSG %s :\01VERSION %s\01\r\n",
- arguments, pos2);
- else
- server_sendf (server, "PRIVMSG %s :\01VERSION\01\r\n",
- arguments);
- }
- if (strcasecmp (pos, "action") == 0)
- {
- if (pos2)
- server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n",
- arguments, pos2);
- else
- server_sendf (server, "PRIVMSG %s :\01ACTION\01\r\n",
- arguments);
- }
-
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_deop: remove operator privileges from nickname(s)
- */
-
-int
-irc_cmd_send_deop (t_irc_server *server, int argc, char **argv)
-{
- int i;
-
- if (WIN_IS_CHANNEL(gui_current_window))
- {
- for (i = 0; i < argc; i++)
- server_sendf (server, "MODE %s -o %s\r\n",
- CHANNEL(gui_current_window)->name,
- argv[i]);
- }
- else
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "deop");
- return 0;
-}
-
-/*
- * irc_cmd_send_devoice: remove voice from nickname(s)
- */
-
-int
-irc_cmd_send_devoice (t_irc_server *server, int argc, char **argv)
-{
- int i;
-
- if (WIN_IS_CHANNEL(gui_current_window))
- {
- for (i = 0; i < argc; i++)
- server_sendf (server, "MODE %s -v %s\r\n",
- CHANNEL(gui_current_window)->name,
- argv[i]);
- }
- else
- {
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "devoice");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_invite: invite a nick on a channel
- */
-
-int
-irc_cmd_send_invite (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "INVITE %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_join: join a new channel
- */
-
-int
-irc_cmd_send_join (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "JOIN %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_kick: forcibly remove a user from a channel
- */
-
-int
-irc_cmd_send_kick (t_irc_server *server, char *arguments)
-{
- if (string_is_channel (arguments))
- server_sendf (server, "KICK %s\r\n", arguments);
- else
- {
- if (WIN_IS_CHANNEL (gui_current_window))
- {
- server_sendf (server,
- "KICK %s %s\r\n",
- CHANNEL(gui_current_window)->name, arguments);
- }
- else
- {
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "kick");
- return -1;
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_kill: close client-server connection
- */
-
-int
-irc_cmd_send_kill (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "KILL %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_list: close client-server connection
- */
-
-int
-irc_cmd_send_list (t_irc_server *server, char *arguments)
-{
- if (arguments)
- server_sendf (server, "LIST %s\r\n", arguments);
- else
- server_sendf (server, "LIST\r\n");
- return 0;
-}
-
-/*
- * irc_cmd_send_me: send a ctcp action to the current channel
- */
-
-int
-irc_cmd_send_me (t_irc_server *server, char *arguments)
-{
- if (WIN_IS_SERVER(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can not be executed on a server window\n"),
- WEECHAT_ERROR, "me");
- return -1;
- }
- server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n",
- CHANNEL(gui_current_window)->name, arguments);
- irc_display_prefix (gui_current_window, PREFIX_ACTION_ME);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT_NICK, "%s", server->nick);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT, " %s\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_mode: change mode for channel/nickname
- */
-
-int
-irc_cmd_send_mode (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "MODE %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_msg: send a message to a nick or channel
- */
-
-int
-irc_cmd_send_msg (t_irc_server *server, char *arguments)
-{
- char *pos, *pos_comma;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
-
- while (arguments && arguments[0])
- {
- pos_comma = strchr (arguments, ',');
- if (pos_comma)
- {
- pos_comma[0] = '\0';
- pos_comma++;
- }
- if (strcmp (arguments, "*") == 0)
- {
- if (WIN_IS_SERVER(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can not be executed on a server window\n"),
- WEECHAT_ERROR, "msg *");
- return -1;
- }
- ptr_channel = CHANNEL(gui_current_window);
- ptr_nick = nick_search (ptr_channel, server->nick);
- if (ptr_nick)
- {
- irc_display_nick (ptr_channel->window, ptr_nick,
- MSG_TYPE_NICK, 1, 1, 0);
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_MSG,
- COLOR_WIN_CHAT, "%s\n", pos);
- }
- else
- gui_printf (server->window,
- _("%s nick not found for \"%s\" command\n"),
- WEECHAT_ERROR, "msg");
- server_sendf (server, "PRIVMSG %s :%s\r\n", ptr_channel->name, pos);
- }
- else
- {
- if (string_is_channel (arguments))
- {
- ptr_channel = channel_search (server, arguments);
- if (ptr_channel)
- {
- ptr_nick = nick_search (ptr_channel, server->nick);
- if (ptr_nick)
- {
- irc_display_nick (ptr_channel->window, ptr_nick,
- MSG_TYPE_NICK, 1, 1, 0);
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_MSG,
- COLOR_WIN_CHAT, "%s\n", pos);
- }
- else
- gui_printf (server->window,
- _("%s nick not found for \"%s\" command\n"),
- WEECHAT_ERROR, "msg");
- }
- server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos);
- }
- else
- {
- ptr_channel = channel_search (server, arguments);
- if (!ptr_channel)
- {
- ptr_channel = channel_new (server, CHAT_PRIVATE, arguments);
- if (!ptr_channel)
- {
- gui_printf (server->window,
- _("%s cannot create new private window \"%s\"\n"),
- WEECHAT_ERROR,
- arguments);
- return -1;
- }
- 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_SELF,
- "%s", server->nick);
- 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);
- server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos);
- }
- }
- arguments = pos_comma;
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s wrong argument count for \"%s\" command\n"),
- WEECHAT_ERROR, "msg");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_names: list nicknames on channels
- */
-
-int
-irc_cmd_send_names (t_irc_server *server, char *arguments)
-{
- if (arguments)
- server_sendf (server, "NAMES %s\r\n", arguments);
- else
- {
- if (!WIN_IS_CHANNEL(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "names");
- return -1;
- }
- else
- server_sendf (server, "NAMES %s\r\n",
- CHANNEL(gui_current_window)->name);
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_nick: change nickname
- */
-
-int
-irc_cmd_send_nick (t_irc_server *server, int argc, char **argv)
-{
- if (argc != 1)
- return -1;
- server_sendf (server, "NICK %s\r\n", argv[0]);
- return 0;
-}
-
-/*
- * irc_cmd_send_notice: send notice message
- */
-
-int
-irc_cmd_send_notice (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "NOTICE %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_op: give operator privileges to nickname(s)
- */
-
-int
-irc_cmd_send_op (t_irc_server *server, int argc, char **argv)
-{
- int i;
-
- if (WIN_IS_CHANNEL(gui_current_window))
- {
- for (i = 0; i < argc; i++)
- server_sendf (server, "MODE %s +o %s\r\n",
- CHANNEL(gui_current_window)->name,
- argv[i]);
- }
- else
- {
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "op");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_oper: get oper privileges
- */
-
-int
-irc_cmd_send_oper (t_irc_server *server, int argc, char **argv)
-{
- if (argc != 2)
- return -1;
- server_sendf (server, "OPER %s %s\r\n", argv[0], argv[1]);
- return 0;
-}
-
-/*
- * irc_cmd_send_part: leave a channel or close a private window
- */
-
-int
-irc_cmd_send_part (t_irc_server *server, char *arguments)
-{
- char *channel_name, *pos_args;
- t_irc_channel *ptr_channel;
-
- if (arguments)
- {
- if (string_is_channel (arguments))
- {
- channel_name = arguments;
- pos_args = strchr (arguments, ' ');
- if (pos_args)
- {
- pos_args[0] = '\0';
- pos_args++;
- while (pos_args[0] == ' ')
- pos_args++;
- }
- }
- else
- {
- if (WIN_IS_SERVER(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can not be executed on a server window\n"),
- WEECHAT_ERROR, "part");
- return -1;
- }
- channel_name = CHANNEL(gui_current_window)->name;
- pos_args = arguments;
- }
- }
- else
- {
- if (WIN_IS_SERVER(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can not be executed on a server window\n"),
- WEECHAT_ERROR, "part");
- return -1;
- }
- if (WIN_IS_PRIVATE(gui_current_window))
- {
- ptr_channel = CHANNEL(gui_current_window);
- gui_window_free (ptr_channel->window);
- channel_free (server, ptr_channel);
- gui_redraw_window_status (gui_current_window);
- gui_redraw_window_input (gui_current_window);
- return 0;
- }
- channel_name = CHANNEL(gui_current_window)->name;
- pos_args = NULL;
- }
-
- if (pos_args)
- server_sendf (server, "PART %s :%s\r\n", channel_name, pos_args);
- else
- server_sendf (server, "PART %s\r\n", channel_name);
- return 0;
-}
-
-/*
- * irc_cmd_send_ping: ping a server
- */
-
-int
-irc_cmd_send_ping (t_irc_server *server, int argc, char **argv)
-{
- if (argc == 1)
- server_sendf (server, "PING %s\r\n", argv[0]);
- if (argc == 2)
- server_sendf (server, "PING %s %s\r\n", argv[0],
- argv[1]);
- return 0;
-}
-
-/*
- * irc_cmd_send_pong: send pong answer to a daemon
- */
-
-int
-irc_cmd_send_pong (t_irc_server *server, int argc, char **argv)
-{
- if (argc == 1)
- server_sendf (server, "PONG %s\r\n", argv[0]);
- if (argc == 2)
- server_sendf (server, "PONG %s %s\r\n", argv[0],
- argv[1]);
- return 0;
-}
-
-/*
- * irc_cmd_send_quit: disconnect from all servers and quit WeeChat
- */
-
-int
-irc_cmd_send_quit (t_irc_server *server, char *arguments)
-{
- if (server && server->is_connected)
- {
- if (arguments)
- server_sendf (server, "QUIT :%s\r\n", arguments);
- else
- server_sendf (server, "QUIT\r\n");
- }
- quit_weechat = 1;
- return 0;
-}
-
-/*
- * irc_cmd_send_quote: send raw data to server
- */
-
-int
-irc_cmd_send_quote (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "%s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_rehash: tell the server to reload its config file
- */
-
-int
-irc_cmd_send_rehash (t_irc_server *server, char *arguments)
-{
- /* make gcc happy */
- (void) arguments;
-
- server_sendf (server, "REHASH\r\n");
- return 0;
-}
-
-/*
- * irc_cmd_send_restart: tell the server to restart itself
- */
-
-int
-irc_cmd_send_restart (t_irc_server *server, char *arguments)
-{
- /* make gcc happy */
- (void) arguments;
-
- server_sendf (server, "RESTART\r\n");
- return 0;
-}
-
-/*
- * irc_cmd_send_topic: get/set topic for a channel
- */
-
-int
-irc_cmd_send_topic (t_irc_server *server, char *arguments)
-{
- char *channel_name, *new_topic, *pos;
-
- channel_name = NULL;
- new_topic = NULL;
-
- if (arguments)
- {
- if (string_is_channel (arguments))
- {
- channel_name = arguments;
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- new_topic = (pos[0]) ? pos : NULL;
- }
- }
- else
- new_topic = arguments;
- }
-
- /* look for current channel if not specified */
- if (!channel_name)
- {
- if (WIN_IS_SERVER(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can not be executed on a server window\n"),
- WEECHAT_ERROR, "topic");
- return -1;
- }
- channel_name = CHANNEL(gui_current_window)->name;
- }
-
- if (new_topic)
- {
- if (strcmp (new_topic, "-delete") == 0)
- server_sendf (server, "TOPIC %s :\r\n", channel_name);
- else
- server_sendf (server, "TOPIC %s :%s\r\n", channel_name, new_topic);
- }
- else
- server_sendf (server, "TOPIC %s\r\n", channel_name);
- return 0;
-}
-
-/*
- * irc_cmd_send_version: gives the version info of nick or server (current or specified)
- */
-
-int
-irc_cmd_send_version (t_irc_server *server, char *arguments)
-{
- if (arguments)
- {
- if (WIN_IS_CHANNEL(gui_current_window) &&
- nick_search (CHANNEL(gui_current_window), arguments))
- server_sendf (server, "PRIVMSG %s :\01VERSION\01\r\n",
- arguments);
- else
- server_sendf (server, "VERSION %s\r\n",
- arguments);
- }
- else
- {
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf (server->window, _("%s, compiled on %s %s\n"),
- WEECHAT_NAME_AND_VERSION,
- __DATE__, __TIME__);
- server_sendf (server, "VERSION\r\n");
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_voice: give voice to nickname(s)
- */
-
-int
-irc_cmd_send_voice (t_irc_server *server, int argc, char **argv)
-{
- int i;
-
- if (WIN_IS_CHANNEL(gui_current_window))
- {
- for (i = 0; i < argc; i++)
- server_sendf (server, "MODE %s +v %s\r\n",
- CHANNEL(gui_current_window)->name,
- argv[i]);
- }
- else
- {
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "voice");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_whois: query information about user(s)
- */
-
-int
-irc_cmd_send_whois (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "WHOIS %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_recv_error: error received from server
- */
-
-int
-irc_cmd_recv_error (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
- int first;
-
- /* make gcc happy */
- (void) server;
- (void) host;
-
- if (strncmp (arguments, "Closing Link", 12) == 0)
- {
- server_disconnect (server);
- return 0;
- }
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- else
- pos = arguments;
-
- irc_display_prefix (server->window, PREFIX_ERROR);
- first = 1;
-
- while (pos && pos[0])
- {
- pos2 = strchr (pos, ' ');
- if ((pos[0] == ':') || (!pos2))
- {
- if (pos[0] == ':')
- pos++;
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- "%s%s\n", (first) ? "" : ": ", pos);
- pos = NULL;
- }
- else
- {
- pos2[0] = '\0';
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s%s",
- (first) ? "" : " ", pos);
- first = 0;
- pos = pos2 + 1;
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_join: 'join' message received
- */
-
-int
-irc_cmd_recv_join (t_irc_server *server, char *host, char *arguments)
-{
- t_irc_channel *ptr_channel;
- char *pos;
-
- ptr_channel = channel_search (server, arguments);
- if (!ptr_channel)
- {
- ptr_channel = channel_new (server, CHAT_CHANNEL, arguments);
- if (!ptr_channel)
- {
- gui_printf (server->window,
- _("%s cannot create new channel \"%s\"\n"),
- WEECHAT_ERROR, arguments);
- return -1;
- }
- }
-
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- irc_display_prefix (ptr_channel->window, PREFIX_JOIN);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
- "%s ", host);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
- "(");
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_HOST,
- "%s", pos + 1);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
- ")");
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
- _(" has joined "));
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
- "%s\n", arguments);
- nick_new (ptr_channel, host, 0, 0, 0);
- gui_redraw_window_nick (gui_current_window);
- return 0;
-}
-
-/*
- * irc_cmd_recv_kick: 'kick' message received
- */
-
-int
-irc_cmd_recv_kick (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos_nick, *pos_comment;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- pos_nick[0] = '\0';
- pos_nick++;
- while (pos_nick[0] == ' ')
- pos_nick++;
-
- pos_comment = strchr (pos_nick, ' ');
- if (pos_comment)
- {
- pos_comment[0] = '\0';
- pos_comment++;
- while (pos_comment[0] == ' ')
- pos_comment++;
- if (pos_comment[0] == ':')
- pos_comment++;
- }
-
- ptr_channel = channel_search (server, arguments);
- if (!ptr_channel)
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "kick");
- return -1;
- }
-
- irc_display_prefix (ptr_channel->window, PREFIX_PART);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
- "%s", host);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
- _(" has kicked "));
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
- "%s", pos_nick);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
- _(" from "));
- if (pos_comment)
- {
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
- "%s ", arguments);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
- "(");
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
- "%s", pos_comment);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
- ")\n");
- }
- else
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
- "%s\n", arguments);
- }
- else
- {
- gui_printf (server->window,
- _("%s nick not found for \"%s\" command\n"),
- WEECHAT_ERROR, "kick");
- return -1;
- }
- ptr_nick = nick_search (ptr_channel, pos_nick);
- if (ptr_nick)
- {
- nick_free (ptr_channel, ptr_nick);
- gui_redraw_window_nick (gui_current_window);
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_mode: 'mode' message received
- */
-
-int
-irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2, *pos_parm;
- char set_flag;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- /* no host => we can't identify sender of message! */
- if (host == NULL)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without host\n"),
- WEECHAT_ERROR, "mode");
- return -1;
- }
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- pos = strchr (arguments, ' ');
- if (!pos)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without channel or nickname\n"),
- WEECHAT_ERROR, "mode");
- return -1;
- }
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
-
- pos_parm = strchr (pos, ' ');
- if (pos_parm)
- {
- pos_parm[0] = '\0';
- pos_parm++;
- while (pos_parm[0] == ' ')
- pos_parm++;
- pos2 = strchr (pos_parm, ' ');
- if (pos2)
- pos2[0] = '\0';
- }
-
- set_flag = '+';
-
- if (string_is_channel (arguments))
- {
- ptr_channel = channel_search (server, arguments);
- if (ptr_channel)
- {
- /* channel modes */
- while (pos && pos[0])
- {
- switch (pos[0])
- {
- case '+':
- set_flag = '+';
- break;
- case '-':
- set_flag = '-';
- break;
- case 'b':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "b", host,
- (set_flag == '+') ?
- _("sets ban on") :
- _("removes ban on"),
- pos_parm);
- /* TODO: change & redraw channel modes */
- break;
- case 'i':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "i", host,
- (set_flag == '+') ?
- _("sets invite-only channel flag") :
- _("removes invite-only channel flag"),
- NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 'l':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "l", host,
- (set_flag == '+') ?
- _("sets the user limit to") :
- _("removes user limit"),
- (set_flag == '+') ? pos_parm : NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 'm':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "m", host,
- (set_flag == '+') ?
- _("sets moderated channel flag") :
- _("removes moderated channel flag"),
- NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 'o':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "o", host,
- (set_flag == '+') ?
- _("gives channel operator status to") :
- _("removes channel operator status from"),
- pos_parm);
- ptr_nick = nick_search (ptr_channel, pos_parm);
- if (ptr_nick)
- {
- ptr_nick->is_op = (set_flag == '+') ? 1 : 0;
- nick_resort (ptr_channel, ptr_nick);
- gui_redraw_window_nick (ptr_channel->window);
- }
- break;
- /* TODO: remove this obsolete (?) channel flag? */
- case 'p':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "p", host,
- (set_flag == '+') ?
- _("sets private channel flag") :
- _("removes private channel flag"),
- NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 's':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "s", host,
- (set_flag == '+') ?
- _("sets secret channel flag") :
- _("removes secret channel flag"),
- NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 't':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "t", host,
- (set_flag == '+') ?
- _("sets topic protection") :
- _("removes topic protection"),
- NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 'v':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "v", host,
- (set_flag == '+') ?
- _("gives voice to") :
- _("removes voice from"),
- pos_parm);
-
- ptr_nick = nick_search (ptr_channel, pos_parm);
- if (ptr_nick)
- {
- ptr_nick->has_voice = (set_flag == '+') ? 1 : 0;
- nick_resort (ptr_channel, ptr_nick);
- gui_redraw_window_nick (ptr_channel->window);
- }
- break;
- }
- pos++;
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "mode");
- return -1;
- }
- }
- else
- {
- /* nickname modes */
- gui_printf (server->window, "(TODO!) nickname modes: channel=%s, args=%s\n", arguments, pos);
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_nick: 'nick' message received
- */
-
-int
-irc_cmd_recv_nick (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
- int nick_is_me;
-
- /* no host => we can't identify sender of message! */
- if (host == NULL)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without host\n"),
- WEECHAT_ERROR, "nick");
- return -1;
- }
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- for (ptr_channel = server->channels; ptr_channel;
- ptr_channel = ptr_channel->next_channel)
- {
- ptr_nick = nick_search (ptr_channel, host);
- if (ptr_nick)
- {
- nick_is_me = (strcmp (ptr_nick->nick, server->nick) == 0);
- nick_change (ptr_channel, ptr_nick, arguments);
- irc_display_prefix (ptr_channel->window, PREFIX_INFO);
- if (nick_is_me)
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- _("You are "));
- else
- {
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK,
- "%s", host);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, " is ");
- }
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- _("now known as "));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK,
- "%s\n",
- arguments);
- if (ptr_channel->window->win_nick)
- gui_redraw_window_nick (ptr_channel->window);
- }
- }
-
- if (strcmp (server->nick, host) == 0)
- {
- free (server->nick);
- server->nick = strdup (arguments);
- }
- gui_redraw_window_input (gui_current_window);
-
- return 0;
-}
-
-/*
- * irc_cmd_recv_notice: 'notice' message received
- */
-
-int
-irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
-
- if (host)
- {
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
- }
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- if (pos[0] == ':')
- pos++;
- }
- else
- {
- gui_printf (server->window,
- _("%s nickname not found for \"%s\" command\n"),
- 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';
- 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"));
- gui_printf_color (server->window, COLOR_WIN_CHAT_NICK, " %s", host);
- gui_printf_color (server->window, COLOR_WIN_CHAT, ": %s\n", pos);
- }
- else
- gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", pos);
- return 0;
-}
-
-/*
- * irc_cmd_recv_part: 'part' message received
- */
-
-int
-irc_cmd_recv_part (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos_args;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- /* no host => we can't identify sender of message! */
- if (!host || !arguments)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without host or channel\n"),
- WEECHAT_ERROR, "part");
- return -1;
- }
-
- pos_args = strchr (arguments, ' ');
- if (pos_args)
- {
- pos_args[0] = '\0';
- pos_args++;
- while (pos_args[0] == ' ')
- pos_args++;
- if (pos_args[0] == ':')
- pos_args++;
- }
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- ptr_channel = channel_search (server, arguments);
- if (ptr_channel)
- {
- ptr_nick = nick_search (ptr_channel, host);
- if (ptr_nick)
- {
- if (strcmp (ptr_nick->nick, server->nick) == 0)
- {
- /* part request was issued by local client */
- gui_window_free (ptr_channel->window);
- channel_free (server, ptr_channel);
- gui_redraw_window_status (gui_current_window);
- gui_redraw_window_input (gui_current_window);
- }
- else
- {
-
- /* remove nick from nick list and display message */
- nick_free (ptr_channel, ptr_nick);
- irc_display_prefix (ptr_channel->window, PREFIX_PART);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK, "%s ", host);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, "(");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_HOST, "%s", pos+1);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, ")");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _(" has left "));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s", ptr_channel->name);
- if (pos_args && pos_args[0])
- {
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, " (");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, "%s", pos_args);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, ")");
- }
- gui_printf (ptr_channel->window, "\n");
-
- /* redraw nick list if this is current window */
- if (ptr_channel->window->win_nick)
- gui_redraw_window_nick (ptr_channel->window);
- }
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "part");
- return -1;
- }
-
- return 0;
-}
-
-/*
- * irc_cmd_recv_ping: 'ping' command received
- */
-
-int
-irc_cmd_recv_ping (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
-
- (void)host;
- pos = strrchr (arguments, ' ');
- if (pos)
- pos[0] = '\0';
- server_sendf (server, "PONG :%s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_recv_privmsg: 'privmsg' command received
- */
-
-int
-irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2, *host2;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
- struct utsname *buf;
-
- /* no host => we can't identify sender of message! */
- if (host == NULL)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without host\n"),
- WEECHAT_ERROR, "privmsg");
- return -1;
- }
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- {
- pos[0] = '\0';
- host2 = pos+1;
- }
- else
- host2 = host;
-
- /* receiver is a channel ? */
- if (string_is_channel (arguments))
- {
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- if (pos[0] == ':')
- pos++;
-
- ptr_channel = channel_search (server, arguments);
- if (ptr_channel)
- {
- if (strncmp (pos, "\01ACTION ", 8) == 0)
- {
- pos += 8;
- pos2 = strchr (pos, '\01');
- if (pos2)
- pos2[0] = '\0';
- irc_display_prefix (ptr_channel->window, PREFIX_ACTION_ME);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK, "%s", host);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, " %s\n", pos);
- }
- else
- {
- ptr_nick = nick_search (ptr_channel, host);
- if (ptr_nick)
- {
- irc_display_nick (ptr_channel->window, ptr_nick,
- MSG_TYPE_NICK, 1, 1, 0);
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_MSG,
- COLOR_WIN_CHAT, "%s\n", pos);
- }
- else
- {
- gui_printf (server->window,
- _("%s nick not found for \"%s\" command\n"),
- WEECHAT_ERROR, "privmsg");
- return -1;
- }
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "privmsg");
- return -1;
- }
- }
- }
- else
- {
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- if (pos[0] == ':')
- pos++;
-
- if (strcmp (pos, "\01VERSION\01") == 0)
- {
- buf = (struct utsname *) malloc (sizeof (struct utsname));
- uname (buf);
- server_sendf (server,
- _("NOTICE %s :%sVERSION %s v%s"
- " compiled on %s, host \"%s\" is running "
- "%s %s / %s%s"),
- host, "\01", WEECHAT_NAME, WEECHAT_VERSION, __DATE__,
- &buf->nodename, &buf->sysname,
- &buf->release, &buf->machine, "\01\r\n");
- free (buf);
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, _("Received a "));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL, _("CTCP VERSION "));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, _("from"));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, " %s\n", host);
- }
- else
- {
- /* private message received */
- ptr_channel = channel_search (server, host);
- if (!ptr_channel)
- {
- 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);
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot parse \"%s\" command\n"),
- WEECHAT_ERROR, "privmsg");
- return -1;
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_quit: 'quit' command received
- */
-
-int
-irc_cmd_recv_quit (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- /* no host => we can't identify sender of message! */
- if (host == NULL)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without host\n"),
- WEECHAT_ERROR, "quit");
- return -1;
- }
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- for (ptr_channel = server->channels; ptr_channel;
- ptr_channel = ptr_channel->next_channel)
- {
- if (ptr_channel->type == CHAT_PRIVATE)
- ptr_nick = NULL;
- else
- ptr_nick = nick_search (ptr_channel, host);
-
- if (ptr_nick || (strcmp (ptr_channel->name, host) == 0))
- {
- if (ptr_nick)
- nick_free (ptr_channel, ptr_nick);
- irc_display_prefix (ptr_channel->window, PREFIX_QUIT);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK, "%s ", host);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, "(");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_HOST, "%s", pos + 1);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, ") ");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _("has quit"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, " (");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, "%s",
- arguments);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, ")\n");
- if ((ptr_channel->window == gui_current_window) &&
- (ptr_channel->window->win_nick))
- gui_redraw_window_nick (ptr_channel->window);
- }
- }
-
- return 0;
-}
-
-/*
- * irc_cmd_recv_server_msg: command received from server (numeric)
- */
-
-int
-irc_cmd_recv_server_msg (t_irc_server *server, char *host, char *arguments)
-{
- /* make gcc happy */
- (void) host;
-
- /* skip nickname if at beginning of server message */
- if (strncmp (server->nick, arguments, strlen (server->nick)) == 0)
- {
- arguments += strlen (server->nick) + 1;
- while (arguments[0] == ' ')
- arguments++;
- }
-
- if (arguments[0] == ':')
- arguments++;
-
- /* display server message */
- irc_display_prefix (server->window, PREFIX_SERVER);
- gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_recv_server_reply: server reply
- */
-
-int
-irc_cmd_recv_server_reply (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
- int first;
-
- /* make gcc happy */
- (void) server;
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- else
- pos = arguments;
-
- irc_display_prefix (server->window, PREFIX_ERROR);
- first = 1;
-
- while (pos && pos[0])
- {
- pos2 = strchr (pos, ' ');
- if ((pos[0] == ':') || (!pos2))
- {
- if (pos[0] == ':')
- pos++;
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- "%s%s\n", (first) ? "" : ": ", pos);
- pos = NULL;
- }
- else
- {
- pos2[0] = '\0';
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s%s",
- (first) ? "" : " ", pos);
- first = 0;
- pos = pos2 + 1;
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_topic: 'topic' command received
- */
-
-int
-irc_cmd_recv_topic (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
- t_irc_channel *ptr_channel;
- t_gui_window *window;
-
- /* make gcc happy */
- (void) host;
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- if (!string_is_channel (arguments))
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without channel\n"),
- WEECHAT_ERROR, "topic");
- return -1;
- }
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- if (pos[0] == ':')
- pos++;
- if (!pos[0])
- pos = NULL;
- }
-
- ptr_channel = channel_search (server, arguments);
- window = (ptr_channel) ? ptr_channel->window : server->window;
-
- irc_display_prefix (window, PREFIX_INFO);
- gui_printf_color (window,
- COLOR_WIN_CHAT_NICK, "%s",
- host);
- if (pos)
- {
- gui_printf_color (window,
- COLOR_WIN_CHAT, _(" has changed topic for "));
- gui_printf_color (window,
- COLOR_WIN_CHAT_CHANNEL, "%s",
- arguments);
- gui_printf_color (window,
- COLOR_WIN_CHAT, _(" to: \"%s\"\n"),
- pos);
- }
- else
- {
- gui_printf_color (window,
- COLOR_WIN_CHAT, _(" has unset topic for "));
- gui_printf_color (window,
- COLOR_WIN_CHAT_CHANNEL, "%s\n",
- arguments);
- }
-
- if (ptr_channel)
- {
- if (ptr_channel->topic)
- free (ptr_channel->topic);
- if (pos)
- ptr_channel->topic = strdup (pos);
- else
- ptr_channel->topic = strdup ("");
- gui_redraw_window_title (ptr_channel->window);
- }
-
- return 0;
-}
-
-/*
- * irc_cmd_recv_004: '004' command (connected to irc server)
- */
-
-int
-irc_cmd_recv_004 (t_irc_server *server, char *host, char *arguments)
-{
- /* make gcc happy */
- (void) host;
- (void) arguments;
-
- irc_cmd_recv_server_msg (server, host, arguments);
-
- /* connection to IRC server is ok! */
- server->is_connected = 1;
- gui_redraw_window_status (server->window);
- gui_redraw_window_input (server->window);
-
- /* execute command once connected */
- if (server->command && server->command[0])
- user_command(server, server->command);
-
- /* autojoin */
- if (server->autojoin && server->autojoin[0])
- return irc_cmd_send_join (server, server->autojoin);
-
- return 0;
-}
-
-/*
- * irc_cmd_recv_311: '311' command (away message)
- */
-
-int
-irc_cmd_recv_301 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_message;
-
- /* make gcc happy */
- (void) server;
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_message = strchr (pos_nick, ' ');
- if (pos_message)
- {
- pos_message[0] = '\0';
- pos_message++;
- while (pos_message[0] == ' ')
- pos_message++;
- if (pos_message[0] == ':')
- pos_message++;
-
- irc_display_prefix (gui_current_window, PREFIX_INFO);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT, _(" is away: %s\n"), pos_message);
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_311: '311' command (whois, user)
- */
-
-int
-irc_cmd_recv_311 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_user, *pos_host, *pos_realname;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_user = strchr (pos_nick, ' ');
- if (pos_user)
- {
- pos_user[0] = '\0';
- pos_user++;
- while (pos_user[0] == ' ')
- pos_user++;
- pos_host = strchr (pos_user, ' ');
- if (pos_host)
- {
- pos_host[0] = '\0';
- pos_host++;
- while (pos_host[0] == ' ')
- pos_host++;
- pos_realname = strchr (pos_host, ' ');
- if (pos_realname)
- {
- pos_realname[0] = '\0';
- pos_realname++;
- while (pos_realname[0] == ' ')
- pos_realname++;
- if (pos_realname[0] == '*')
- pos_realname++;
- while (pos_realname[0] == ' ')
- pos_realname++;
- if (pos_realname[0] == ':')
- pos_realname++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] (");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_HOST, "%s@%s",
- pos_user, pos_host);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, ")");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, ": %s\n", pos_realname);
- }
- }
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_312: '312' command (whois, server)
- */
-
-int
-irc_cmd_recv_312 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_server, *pos_serverinfo;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_server = strchr (pos_nick, ' ');
- if (pos_server)
- {
- pos_server[0] = '\0';
- pos_server++;
- while (pos_server[0] == ' ')
- pos_server++;
- pos_serverinfo = strchr (pos_server, ' ');
- if (pos_serverinfo)
- {
- pos_serverinfo[0] = '\0';
- pos_serverinfo++;
- while (pos_serverinfo[0] == ' ')
- pos_serverinfo++;
- if (pos_serverinfo[0] == ':')
- pos_serverinfo++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, "%s ", pos_server);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "(");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, "%s", pos_serverinfo);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, ")\n");
- }
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_313: '313' command (whois, operator)
- */
-
-int
-irc_cmd_recv_313 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_message;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_message = strchr (pos_nick, ' ');
- if (pos_message)
- {
- pos_message[0] = '\0';
- pos_message++;
- while (pos_message[0] == ' ')
- pos_message++;
- if (pos_message[0] == ':')
- pos_message++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, "%s\n", pos_message);
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_317: '317' command (whois, idle)
- */
-
-int
-irc_cmd_recv_317 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_idle, *pos_signon, *pos_message;
- int idle_time, day, hour, min, sec;
- time_t datetime;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_idle = strchr (pos_nick, ' ');
- if (pos_idle)
- {
- pos_idle[0] = '\0';
- pos_idle++;
- while (pos_idle[0] == ' ')
- pos_idle++;
- pos_signon = strchr (pos_idle, ' ');
- if (pos_signon)
- {
- pos_signon[0] = '\0';
- pos_signon++;
- while (pos_signon[0] == ' ')
- pos_signon++;
- pos_message = strchr (pos_signon, ' ');
- if (pos_message)
- {
- pos_message[0] = '\0';
-
- idle_time = atoi (pos_idle);
- day = idle_time / (60 * 60 * 24);
- hour = (idle_time % (60 * 60 * 24)) / (60 * 60);
- min = ((idle_time % (60 * 60 * 24)) % (60 * 60)) / 60;
- sec = ((idle_time % (60 * 60 * 24)) % (60 * 60)) % 60;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, _("idle: "));
- if (day > 0)
- {
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", day);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- (day > 1) ? _("days") : _("day"));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- ", ");
- }
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%02d ", hour);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- (hour > 1) ? _("hours") : _("hour"));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- " %02d ", min);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- (min > 1) ? _("minutes") : _("minute"));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- " %02d ", sec);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- (sec > 1) ? _("seconds") : _("second"));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- ", ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, _("signon at: "));
- datetime = (time_t)(atol (pos_signon));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s", ctime (&datetime));
- }
- }
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_318: '318' command (whois, end)
- */
-
-int
-irc_cmd_recv_318 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_message;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_message = strchr (pos_nick, ' ');
- if (pos_message)
- {
- pos_message[0] = '\0';
- pos_message++;
- while (pos_message[0] == ' ')
- pos_message++;
- if (pos_message[0] == ':')
- pos_message++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, "%s\n", pos_message);
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_319: '319' command (whois, end)
- */
-
-int
-irc_cmd_recv_319 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_channel, *pos;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_channel = strchr (pos_nick, ' ');
- if (pos_channel)
- {
- pos_channel[0] = '\0';
- pos_channel++;
- while (pos_channel[0] == ' ')
- pos_channel++;
- if (pos_channel[0] == ':')
- pos_channel++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, _("Channels: "));
-
- while (pos_channel && pos_channel[0])
- {
- if (pos_channel[0] == '@')
- {
- gui_printf_color (server->window,
- COLOR_WIN_NICK_OP, "@");
- pos_channel++;
- }
- else
- {
- if (pos_channel[0] == '%')
- {
- gui_printf_color (server->window,
- COLOR_WIN_NICK_HALFOP, "%");
- pos_channel++;
- }
- else
- if (pos_channel[0] == '+')
- {
- gui_printf_color (server->window,
- COLOR_WIN_NICK_VOICE, "+");
- pos_channel++;
- }
- }
- pos = strchr (pos_channel, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s%s",
- pos_channel,
- (pos && pos[0]) ? " " : "\n");
- pos_channel = pos;
- }
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_320: '320' command (whois, identified user)
- */
-
-int
-irc_cmd_recv_320 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_message;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_message = strchr (pos_nick, ' ');
- if (pos_message)
- {
- pos_message[0] = '\0';
- pos_message++;
- while (pos_message[0] == ' ')
- pos_message++;
- if (pos_message[0] == ':')
- pos_message++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, "%s\n", pos_message);
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_321: '321' command (/list start)
- */
-
-int
-irc_cmd_recv_321 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
-
- /* make gcc happy */
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- else
- pos = arguments;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf (server->window, "%s\n", pos);
- return 0;
-}
-
-/*
- * irc_cmd_recv_322: '322' command (channel for /list)
- */
-
-int
-irc_cmd_recv_322 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
-
- /* make gcc happy */
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- else
- pos = arguments;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf (server->window, "%s\n", pos);
- return 0;
-}
-
-/*
- * irc_cmd_recv_323: '323' command (/list end)
- */
-
-int
-irc_cmd_recv_323 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
-
- /* make gcc happy */
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- else
- pos = arguments;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf (server->window, "%s\n", pos);
- return 0;
-}
-
-/*
- * irc_cmd_recv_331: '331' command received (no topic for channel)
- */
-
-int
-irc_cmd_recv_331 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
-
- /* make gcc happy */
- (void) server;
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- pos[0] = '\0';
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT, _("No topic set for "));
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT_CHANNEL, "%s\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_recv_332: '332' command received (topic of channel)
- */
-
-int
-irc_cmd_recv_332 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
- t_irc_channel *ptr_channel;
-
- /* make gcc happy */
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- while (pos[0] == ' ')
- pos++;
- pos2 = strchr (pos, ' ');
- if (pos2)
- {
- pos2[0] = '\0';
- ptr_channel = channel_search (server, pos);
- if (ptr_channel)
- {
- pos2++;
- while (pos2[0] == ' ')
- pos2++;
- if (pos2[0] == ':')
- pos2++;
- if (ptr_channel->topic)
- free (ptr_channel->topic);
- ptr_channel->topic = strdup (pos2);
-
- irc_display_prefix (ptr_channel->window, PREFIX_INFO);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _("Topic for "));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL, "%s", pos);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _(" is: \"%s\"\n"), pos2);
-
- gui_redraw_window_title (ptr_channel->window);
- }
- else
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "332");
- return -1;
- }
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot identify channel for \"%s\" command\n"),
- WEECHAT_ERROR, "332");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_333: '333' command received (infos about topic (nick / date)
- */
-
-int
-irc_cmd_recv_333 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_channel, *pos_nick, *pos_date;
- t_irc_channel *ptr_channel;
- time_t datetime;
-
- /* make gcc happy */
- (void) host;
-
- pos_channel = strchr (arguments, ' ');
- if (pos_channel)
- {
- while (pos_channel[0] == ' ')
- pos_channel++;
- pos_nick = strchr (pos_channel, ' ');
- if (pos_nick)
- {
- pos_nick[0] = '\0';
- pos_nick++;
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_date = strchr (pos_nick, ' ');
- if (pos_date)
- {
- pos_date[0] = '\0';
- pos_date++;
- while (pos_date[0] == ' ')
- pos_date++;
-
- ptr_channel = channel_search (server, pos_channel);
- if (ptr_channel)
- {
- irc_display_prefix (ptr_channel->window, PREFIX_INFO);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _("Topic set by "));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- datetime = (time_t)(atol (pos_date));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, ", %s", ctime (&datetime));
- }
- else
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "333");
- return -1;
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot identify date/time for \"%s\" command\n"),
- WEECHAT_ERROR, "333");
- return -1;
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot identify nickname for \"%s\" command\n"),
- WEECHAT_ERROR, "333");
- return -1;
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot identify channel for \"%s\" command\n"),
- WEECHAT_ERROR, "333");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_351: '351' command received (server version)
- */
-
-int
-irc_cmd_recv_351 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
-
- /* make gcc happy */
- (void) server;
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- }
- else
- pos = arguments;
-
- pos2 = strstr (pos, " :");
- if (pos2)
- {
- pos2[0] = '\0';
- pos2 += 2;
- }
-
- irc_display_prefix (server->window, PREFIX_SERVER);
- if (pos2)
- gui_printf (server->window, "%s %s\n", pos, pos2);
- else
- gui_printf (server->window, "%s\n", pos);
- return 0;
-}
-
-/*
- * irc_cmd_recv_353: '353' command received (list of users on a channel)
- */
-
-int
-irc_cmd_recv_353 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos_nick;
- int is_op, is_halfop, has_voice;
- t_irc_channel *ptr_channel;
-
- /* make gcc happy */
- (void) host;
-
- pos = strstr (arguments, " = ");
- if (pos)
- arguments = pos + 3;
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
-
- ptr_channel = channel_search (server, arguments);
- if (!ptr_channel)
- return 0;
-
- pos++;
- while (pos[0] == ' ')
- pos++;
- if (pos[0] != ':')
- {
- gui_printf (server->window,
- _("%s cannot parse \"%s\" command\n"),
- WEECHAT_ERROR, "353");
- return -1;
- }
- pos++;
- if (pos[0])
- {
- while (pos && pos[0])
- {
- is_op = 0;
- is_halfop = 0;
- has_voice = 0;
- while ((pos[0] == '@') || (pos[0] == '%') || (pos[0] == '+'))
- {
- if (pos[0] == '@')
- is_op = 1;
- if (pos[0] == '%')
- is_halfop = 1;
- if (pos[0] == '+')
- has_voice = 1;
- pos++;
- }
- pos_nick = pos;
- pos = strchr (pos, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- }
- if (!nick_new (ptr_channel, pos_nick, is_op, is_halfop, has_voice))
- gui_printf (server->window,
- _("%s cannot create nick \"%s\" for channel \"%s\"\n"),
- WEECHAT_ERROR, pos_nick, ptr_channel->name);
- }
- }
- gui_redraw_window_nick (ptr_channel->window);
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot parse \"%s\" command\n"),
- WEECHAT_ERROR, "353");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_366: '366' command received (end of /names list)
- */
-
-int
-irc_cmd_recv_366 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
- int num_nicks, num_op, num_halfop, num_voice, num_normal;
-
- /* make gcc happy */
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- while (pos[0] == ' ')
- pos++;
- pos2 = strchr (pos, ' ');
- if (pos2)
- {
- pos2[0] = '\0';
- pos2++;
- while (pos2[0] == ' ')
- pos2++;
- if (pos2[0] == ':')
- pos2++;
-
- ptr_channel = channel_search (server, pos);
- if (ptr_channel)
- {
-
- /* display users on channel */
- irc_display_prefix (ptr_channel->window, PREFIX_INFO);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
- _("Nicks "));
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
- "%s", ptr_channel->name);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT, ": ");
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, "[");
-
- for (ptr_nick = ptr_channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick)
- {
- irc_display_nick (ptr_channel->window, ptr_nick,
- MSG_TYPE_INFO, 0, 0, 1);
- if (ptr_nick != ptr_channel->last_nick)
- gui_printf (ptr_channel->window, " ");
- }
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, "]\n");
-
- /* display number of nicks, ops, halfops & voices on the channel */
- nick_count (ptr_channel, &num_nicks, &num_op, &num_halfop, &num_voice,
- &num_normal);
- irc_display_prefix (ptr_channel->window, PREFIX_INFO);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _("Channel "));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s", ptr_channel->name);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, ": ");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", num_nicks);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- (num_nicks > 1) ? _("nicks") : _("nick"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, " (");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", num_op);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- (num_op > 1) ? _("ops") : _("op"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- ", ");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", num_halfop);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- (num_halfop > 1) ? _("halfops") : _("halfop"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- ", ");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", num_voice);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- (num_voice > 1) ? _("voices") : _("voice"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- ", ");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", num_normal);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- _("normal"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, ")\n");
- }
- else
- {
- irc_display_prefix (gui_current_window, PREFIX_INFO);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT_CHANNEL, pos);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT, ": %s\n", pos2);
- return 0;
- }
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_433: '433' command received (nickname already in use)
- */
-
-int
-irc_cmd_recv_433 (t_irc_server *server, char *host, char *arguments)
-{
- char hostname[128];
-
- if (!server->is_connected)
- {
- if (strcmp (server->nick, server->nick1) == 0)
- {
- gui_printf (server->window,
- _("%s: nickname \"%s\" is already in use, "
- "trying 2nd nickname \"%s\"\n"),
- WEECHAT_NAME, server->nick, server->nick2);
- free (server->nick);
- server->nick = strdup (server->nick2);
- }
- else
- {
- if (strcmp (server->nick, server->nick2) == 0)
- {
- gui_printf (server->window,
- _("%s: nickname \"%s\" is already in use, "
- "trying 3rd nickname \"%s\"\n"),
- WEECHAT_NAME, server->nick, server->nick3);
- free (server->nick);
- server->nick = strdup (server->nick3);
- }
- else
- {
- gui_printf (server->window,
- _("%s: all declared nicknames are already in use, "
- "closing connection with server!\n"),
- WEECHAT_NAME);
- server_disconnect (server);
- return 0;
- }
- }
-
- gethostname (hostname, sizeof (hostname) - 1);
- hostname[sizeof (hostname) - 1] = '\0';
- if (!hostname[0])
- strcpy (hostname, _("unknown"));
- server_sendf (server,
- "NICK %s\r\n",
- server->nick);
- }
- else
- return irc_cmd_recv_error (server, host, arguments);
- return 0;
-}
diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c
new file mode 100644
index 000000000..4404b6682
--- /dev/null
+++ b/src/irc/irc-recv.c
@@ -0,0 +1,2113 @@
+/*
+ * Copyright (c) 2003 by FlashCode <flashcode@flashtux.org>
+ * Bounga <bounga@altern.org>
+ * Xahlexx <xahlexx@tuxisland.org>
+ * See README for License detail.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+/* irc-recv.c: implementation of IRC commands (server to client),
+ according to RFC 1459,2810,2811,2812 */
+
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <sys/utsname.h>
+
+#include "../weechat.h"
+#include "irc.h"
+#include "../command.h"
+#include "../config.h"
+#include "../gui/gui.h"
+
+
+/*
+ * irc_recv_command: executes action when receiving IRC command
+ * returns: 0 = all ok, command executed
+ * -1 = command failed
+ * -2 = no command to execute
+ * -3 = command not found
+ */
+
+int
+irc_recv_command (t_irc_server *server,
+ char *host, char *command, char *arguments)
+{
+ int i, cmd_found;
+
+ if (command == NULL)
+ return -2;
+
+ /* looks for irc command */
+ cmd_found = -1;
+ for (i = 0; irc_commands[i].command_name; i++)
+ if (strcasecmp (irc_commands[i].command_name, command) == 0)
+ {
+ cmd_found = i;
+ break;
+ }
+
+ /* command not found */
+ if (cmd_found < 0)
+ return -3;
+
+ if (irc_commands[i].recv_function != NULL)
+ return (int) (irc_commands[i].recv_function) (server, host, arguments);
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_error: error received from server
+ */
+
+int
+irc_cmd_recv_error (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+ int first;
+
+ /* make gcc happy */
+ (void) server;
+ (void) host;
+
+ if (strncmp (arguments, "Closing Link", 12) == 0)
+ {
+ server_disconnect (server);
+ return 0;
+ }
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ irc_display_prefix (server->window, PREFIX_ERROR);
+ first = 1;
+
+ while (pos && pos[0])
+ {
+ pos2 = strchr (pos, ' ');
+ if ((pos[0] == ':') || (!pos2))
+ {
+ if (pos[0] == ':')
+ pos++;
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ "%s%s\n", (first) ? "" : ": ", pos);
+ pos = NULL;
+ }
+ else
+ {
+ pos2[0] = '\0';
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s%s",
+ (first) ? "" : " ", pos);
+ first = 0;
+ pos = pos2 + 1;
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_join: 'join' message received
+ */
+
+int
+irc_cmd_recv_join (t_irc_server *server, char *host, char *arguments)
+{
+ t_irc_channel *ptr_channel;
+ char *pos;
+
+ ptr_channel = channel_search (server, arguments);
+ if (!ptr_channel)
+ {
+ ptr_channel = channel_new (server, CHAT_CHANNEL, arguments);
+ if (!ptr_channel)
+ {
+ gui_printf (server->window,
+ _("%s cannot create new channel \"%s\"\n"),
+ WEECHAT_ERROR, arguments);
+ return -1;
+ }
+ }
+
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ irc_display_prefix (ptr_channel->window, PREFIX_JOIN);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
+ "%s ", host);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
+ "(");
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_HOST,
+ "%s", pos + 1);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
+ ")");
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
+ _(" has joined "));
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
+ "%s\n", arguments);
+ nick_new (ptr_channel, host, 0, 0, 0);
+ gui_redraw_window_nick (gui_current_window);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_kick: 'kick' message received
+ */
+
+int
+irc_cmd_recv_kick (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos_nick, *pos_comment;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ pos_nick[0] = '\0';
+ pos_nick++;
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+
+ pos_comment = strchr (pos_nick, ' ');
+ if (pos_comment)
+ {
+ pos_comment[0] = '\0';
+ pos_comment++;
+ while (pos_comment[0] == ' ')
+ pos_comment++;
+ if (pos_comment[0] == ':')
+ pos_comment++;
+ }
+
+ ptr_channel = channel_search (server, arguments);
+ if (!ptr_channel)
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "kick");
+ return -1;
+ }
+
+ irc_display_prefix (ptr_channel->window, PREFIX_PART);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
+ "%s", host);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
+ _(" has kicked "));
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
+ "%s", pos_nick);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
+ _(" from "));
+ if (pos_comment)
+ {
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
+ "%s ", arguments);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
+ "(");
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
+ "%s", pos_comment);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
+ ")\n");
+ }
+ else
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
+ "%s\n", arguments);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s nick not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "kick");
+ return -1;
+ }
+ ptr_nick = nick_search (ptr_channel, pos_nick);
+ if (ptr_nick)
+ {
+ nick_free (ptr_channel, ptr_nick);
+ gui_redraw_window_nick (gui_current_window);
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_mode: 'mode' message received
+ */
+
+int
+irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2, *pos_parm;
+ char set_flag;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+
+ /* no host => we can't identify sender of message! */
+ if (host == NULL)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without host\n"),
+ WEECHAT_ERROR, "mode");
+ return -1;
+ }
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ pos = strchr (arguments, ' ');
+ if (!pos)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without channel or nickname\n"),
+ WEECHAT_ERROR, "mode");
+ return -1;
+ }
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+
+ pos_parm = strchr (pos, ' ');
+ if (pos_parm)
+ {
+ pos_parm[0] = '\0';
+ pos_parm++;
+ while (pos_parm[0] == ' ')
+ pos_parm++;
+ pos2 = strchr (pos_parm, ' ');
+ if (pos2)
+ pos2[0] = '\0';
+ }
+
+ set_flag = '+';
+
+ if (string_is_channel (arguments))
+ {
+ ptr_channel = channel_search (server, arguments);
+ if (ptr_channel)
+ {
+ /* channel modes */
+ while (pos && pos[0])
+ {
+ switch (pos[0])
+ {
+ case '+':
+ set_flag = '+';
+ break;
+ case '-':
+ set_flag = '-';
+ break;
+ case 'b':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "b", host,
+ (set_flag == '+') ?
+ _("sets ban on") :
+ _("removes ban on"),
+ pos_parm);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 'i':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "i", host,
+ (set_flag == '+') ?
+ _("sets invite-only channel flag") :
+ _("removes invite-only channel flag"),
+ NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 'l':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "l", host,
+ (set_flag == '+') ?
+ _("sets the user limit to") :
+ _("removes user limit"),
+ (set_flag == '+') ? pos_parm : NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 'm':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "m", host,
+ (set_flag == '+') ?
+ _("sets moderated channel flag") :
+ _("removes moderated channel flag"),
+ NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 'o':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "o", host,
+ (set_flag == '+') ?
+ _("gives channel operator status to") :
+ _("removes channel operator status from"),
+ pos_parm);
+ ptr_nick = nick_search (ptr_channel, pos_parm);
+ if (ptr_nick)
+ {
+ ptr_nick->is_op = (set_flag == '+') ? 1 : 0;
+ nick_resort (ptr_channel, ptr_nick);
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ break;
+ /* TODO: remove this obsolete (?) channel flag? */
+ case 'p':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "p", host,
+ (set_flag == '+') ?
+ _("sets private channel flag") :
+ _("removes private channel flag"),
+ NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 's':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "s", host,
+ (set_flag == '+') ?
+ _("sets secret channel flag") :
+ _("removes secret channel flag"),
+ NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 't':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "t", host,
+ (set_flag == '+') ?
+ _("sets topic protection") :
+ _("removes topic protection"),
+ NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 'v':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "v", host,
+ (set_flag == '+') ?
+ _("gives voice to") :
+ _("removes voice from"),
+ pos_parm);
+
+ ptr_nick = nick_search (ptr_channel, pos_parm);
+ if (ptr_nick)
+ {
+ ptr_nick->has_voice = (set_flag == '+') ? 1 : 0;
+ nick_resort (ptr_channel, ptr_nick);
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ break;
+ }
+ pos++;
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "mode");
+ return -1;
+ }
+ }
+ else
+ {
+ /* nickname modes */
+ gui_printf (server->window, "(TODO!) nickname modes: channel=%s, args=%s\n", arguments, pos);
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_nick: 'nick' message received
+ */
+
+int
+irc_cmd_recv_nick (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+ int nick_is_me;
+
+ /* no host => we can't identify sender of message! */
+ if (host == NULL)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without host\n"),
+ WEECHAT_ERROR, "nick");
+ return -1;
+ }
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ for (ptr_channel = server->channels; ptr_channel;
+ ptr_channel = ptr_channel->next_channel)
+ {
+ ptr_nick = nick_search (ptr_channel, host);
+ if (ptr_nick)
+ {
+ nick_is_me = (strcmp (ptr_nick->nick, server->nick) == 0);
+ nick_change (ptr_channel, ptr_nick, arguments);
+ irc_display_prefix (ptr_channel->window, PREFIX_INFO);
+ if (nick_is_me)
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ _("You are "));
+ else
+ {
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK,
+ "%s", host);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, " is ");
+ }
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ _("now known as "));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK,
+ "%s\n",
+ arguments);
+ if (ptr_channel->window->win_nick)
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ }
+
+ if (strcmp (server->nick, host) == 0)
+ {
+ free (server->nick);
+ server->nick = strdup (arguments);
+ }
+ gui_redraw_window_input (gui_current_window);
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_notice: 'notice' message received
+ */
+
+int
+irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+
+ if (host)
+ {
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+ }
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ if (pos[0] == ':')
+ pos++;
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s nickname not found for \"%s\" command\n"),
+ 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';
+ 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"));
+ gui_printf_color (server->window, COLOR_WIN_CHAT_NICK, " %s", host);
+ gui_printf_color (server->window, COLOR_WIN_CHAT, ": %s\n", pos);
+ }
+ else
+ gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", pos);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_part: 'part' message received
+ */
+
+int
+irc_cmd_recv_part (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos_args;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+
+ /* no host => we can't identify sender of message! */
+ if (!host || !arguments)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without host or channel\n"),
+ WEECHAT_ERROR, "part");
+ return -1;
+ }
+
+ pos_args = strchr (arguments, ' ');
+ if (pos_args)
+ {
+ pos_args[0] = '\0';
+ pos_args++;
+ while (pos_args[0] == ' ')
+ pos_args++;
+ if (pos_args[0] == ':')
+ pos_args++;
+ }
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ ptr_channel = channel_search (server, arguments);
+ if (ptr_channel)
+ {
+ ptr_nick = nick_search (ptr_channel, host);
+ if (ptr_nick)
+ {
+ if (strcmp (ptr_nick->nick, server->nick) == 0)
+ {
+ /* part request was issued by local client */
+ gui_window_free (ptr_channel->window);
+ channel_free (server, ptr_channel);
+ gui_redraw_window_status (gui_current_window);
+ gui_redraw_window_input (gui_current_window);
+ }
+ else
+ {
+
+ /* remove nick from nick list and display message */
+ nick_free (ptr_channel, ptr_nick);
+ irc_display_prefix (ptr_channel->window, PREFIX_PART);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK, "%s ", host);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, "(");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_HOST, "%s", pos+1);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, ")");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _(" has left "));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s", ptr_channel->name);
+ if (pos_args && pos_args[0])
+ {
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, " (");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, "%s", pos_args);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, ")");
+ }
+ gui_printf (ptr_channel->window, "\n");
+
+ /* redraw nick list if this is current window */
+ if (ptr_channel->window->win_nick)
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "part");
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_ping: 'ping' command received
+ */
+
+int
+irc_cmd_recv_ping (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+
+ (void)host;
+ pos = strrchr (arguments, ' ');
+ if (pos)
+ pos[0] = '\0';
+ server_sendf (server, "PONG :%s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_privmsg: 'privmsg' command received
+ */
+
+int
+irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2, *host2;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+ struct utsname *buf;
+
+ /* no host => we can't identify sender of message! */
+ if (host == NULL)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without host\n"),
+ WEECHAT_ERROR, "privmsg");
+ return -1;
+ }
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ {
+ pos[0] = '\0';
+ host2 = pos+1;
+ }
+ else
+ host2 = host;
+
+ /* receiver is a channel ? */
+ if (string_is_channel (arguments))
+ {
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ if (pos[0] == ':')
+ pos++;
+
+ ptr_channel = channel_search (server, arguments);
+ if (ptr_channel)
+ {
+ if (strncmp (pos, "\01ACTION ", 8) == 0)
+ {
+ pos += 8;
+ pos2 = strchr (pos, '\01');
+ if (pos2)
+ pos2[0] = '\0';
+ irc_display_prefix (ptr_channel->window, PREFIX_ACTION_ME);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK, "%s", host);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, " %s\n", pos);
+ }
+ else
+ {
+ ptr_nick = nick_search (ptr_channel, host);
+ if (ptr_nick)
+ {
+ irc_display_nick (ptr_channel->window, ptr_nick,
+ MSG_TYPE_NICK, 1, 1, 0);
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_MSG,
+ COLOR_WIN_CHAT, "%s\n", pos);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s nick not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "privmsg");
+ return -1;
+ }
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "privmsg");
+ return -1;
+ }
+ }
+ }
+ else
+ {
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ if (pos[0] == ':')
+ pos++;
+
+ if (strcmp (pos, "\01VERSION\01") == 0)
+ {
+ buf = (struct utsname *) malloc (sizeof (struct utsname));
+ uname (buf);
+ server_sendf (server,
+ _("NOTICE %s :%sVERSION %s v%s"
+ " compiled on %s, host \"%s\" is running "
+ "%s %s / %s%s"),
+ host, "\01", WEECHAT_NAME, WEECHAT_VERSION, __DATE__,
+ &buf->nodename, &buf->sysname,
+ &buf->release, &buf->machine, "\01\r\n");
+ free (buf);
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, _("Received a "));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL, _("CTCP VERSION "));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, _("from"));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, " %s\n", host);
+ }
+ else
+ {
+ /* private message received */
+ ptr_channel = channel_search (server, host);
+ if (!ptr_channel)
+ {
+ 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);
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot parse \"%s\" command\n"),
+ WEECHAT_ERROR, "privmsg");
+ return -1;
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_quit: 'quit' command received
+ */
+
+int
+irc_cmd_recv_quit (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+
+ /* no host => we can't identify sender of message! */
+ if (host == NULL)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without host\n"),
+ WEECHAT_ERROR, "quit");
+ return -1;
+ }
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ for (ptr_channel = server->channels; ptr_channel;
+ ptr_channel = ptr_channel->next_channel)
+ {
+ if (ptr_channel->type == CHAT_PRIVATE)
+ ptr_nick = NULL;
+ else
+ ptr_nick = nick_search (ptr_channel, host);
+
+ if (ptr_nick || (strcmp (ptr_channel->name, host) == 0))
+ {
+ if (ptr_nick)
+ nick_free (ptr_channel, ptr_nick);
+ irc_display_prefix (ptr_channel->window, PREFIX_QUIT);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK, "%s ", host);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, "(");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_HOST, "%s", pos + 1);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, ") ");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _("has quit"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, " (");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, "%s",
+ arguments);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, ")\n");
+ if ((ptr_channel->window == gui_current_window) &&
+ (ptr_channel->window->win_nick))
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_server_msg: command received from server (numeric)
+ */
+
+int
+irc_cmd_recv_server_msg (t_irc_server *server, char *host, char *arguments)
+{
+ /* make gcc happy */
+ (void) host;
+
+ /* skip nickname if at beginning of server message */
+ if (strncmp (server->nick, arguments, strlen (server->nick)) == 0)
+ {
+ arguments += strlen (server->nick) + 1;
+ while (arguments[0] == ' ')
+ arguments++;
+ }
+
+ if (arguments[0] == ':')
+ arguments++;
+
+ /* display server message */
+ irc_display_prefix (server->window, PREFIX_SERVER);
+ gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_server_reply: server reply
+ */
+
+int
+irc_cmd_recv_server_reply (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+ int first;
+
+ /* make gcc happy */
+ (void) server;
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ irc_display_prefix (server->window, PREFIX_ERROR);
+ first = 1;
+
+ while (pos && pos[0])
+ {
+ pos2 = strchr (pos, ' ');
+ if ((pos[0] == ':') || (!pos2))
+ {
+ if (pos[0] == ':')
+ pos++;
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ "%s%s\n", (first) ? "" : ": ", pos);
+ pos = NULL;
+ }
+ else
+ {
+ pos2[0] = '\0';
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s%s",
+ (first) ? "" : " ", pos);
+ first = 0;
+ pos = pos2 + 1;
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_topic: 'topic' command received
+ */
+
+int
+irc_cmd_recv_topic (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+ t_irc_channel *ptr_channel;
+ t_gui_window *window;
+
+ /* make gcc happy */
+ (void) host;
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ if (!string_is_channel (arguments))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without channel\n"),
+ WEECHAT_ERROR, "topic");
+ return -1;
+ }
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ if (pos[0] == ':')
+ pos++;
+ if (!pos[0])
+ pos = NULL;
+ }
+
+ ptr_channel = channel_search (server, arguments);
+ window = (ptr_channel) ? ptr_channel->window : server->window;
+
+ irc_display_prefix (window, PREFIX_INFO);
+ gui_printf_color (window,
+ COLOR_WIN_CHAT_NICK, "%s",
+ host);
+ if (pos)
+ {
+ gui_printf_color (window,
+ COLOR_WIN_CHAT, _(" has changed topic for "));
+ gui_printf_color (window,
+ COLOR_WIN_CHAT_CHANNEL, "%s",
+ arguments);
+ gui_printf_color (window,
+ COLOR_WIN_CHAT, _(" to: \"%s\"\n"),
+ pos);
+ }
+ else
+ {
+ gui_printf_color (window,
+ COLOR_WIN_CHAT, _(" has unset topic for "));
+ gui_printf_color (window,
+ COLOR_WIN_CHAT_CHANNEL, "%s\n",
+ arguments);
+ }
+
+ if (ptr_channel)
+ {
+ if (ptr_channel->topic)
+ free (ptr_channel->topic);
+ if (pos)
+ ptr_channel->topic = strdup (pos);
+ else
+ ptr_channel->topic = strdup ("");
+ gui_redraw_window_title (ptr_channel->window);
+ }
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_004: '004' command (connected to irc server)
+ */
+
+int
+irc_cmd_recv_004 (t_irc_server *server, char *host, char *arguments)
+{
+ /* make gcc happy */
+ (void) host;
+ (void) arguments;
+
+ irc_cmd_recv_server_msg (server, host, arguments);
+
+ /* connection to IRC server is ok! */
+ server->is_connected = 1;
+ gui_redraw_window_status (server->window);
+ gui_redraw_window_input (server->window);
+
+ /* execute command once connected */
+ if (server->command && server->command[0])
+ user_command(server, server->command);
+
+ /* autojoin */
+ if (server->autojoin && server->autojoin[0])
+ return irc_cmd_send_join (server, server->autojoin);
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_311: '311' command (away message)
+ */
+
+int
+irc_cmd_recv_301 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_message;
+
+ /* make gcc happy */
+ (void) server;
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_message = strchr (pos_nick, ' ');
+ if (pos_message)
+ {
+ pos_message[0] = '\0';
+ pos_message++;
+ while (pos_message[0] == ' ')
+ pos_message++;
+ if (pos_message[0] == ':')
+ pos_message++;
+
+ irc_display_prefix (gui_current_window, PREFIX_INFO);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT, _(" is away: %s\n"), pos_message);
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_311: '311' command (whois, user)
+ */
+
+int
+irc_cmd_recv_311 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_user, *pos_host, *pos_realname;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_user = strchr (pos_nick, ' ');
+ if (pos_user)
+ {
+ pos_user[0] = '\0';
+ pos_user++;
+ while (pos_user[0] == ' ')
+ pos_user++;
+ pos_host = strchr (pos_user, ' ');
+ if (pos_host)
+ {
+ pos_host[0] = '\0';
+ pos_host++;
+ while (pos_host[0] == ' ')
+ pos_host++;
+ pos_realname = strchr (pos_host, ' ');
+ if (pos_realname)
+ {
+ pos_realname[0] = '\0';
+ pos_realname++;
+ while (pos_realname[0] == ' ')
+ pos_realname++;
+ if (pos_realname[0] == '*')
+ pos_realname++;
+ while (pos_realname[0] == ' ')
+ pos_realname++;
+ if (pos_realname[0] == ':')
+ pos_realname++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] (");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_HOST, "%s@%s",
+ pos_user, pos_host);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, ")");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, ": %s\n", pos_realname);
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_312: '312' command (whois, server)
+ */
+
+int
+irc_cmd_recv_312 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_server, *pos_serverinfo;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_server = strchr (pos_nick, ' ');
+ if (pos_server)
+ {
+ pos_server[0] = '\0';
+ pos_server++;
+ while (pos_server[0] == ' ')
+ pos_server++;
+ pos_serverinfo = strchr (pos_server, ' ');
+ if (pos_serverinfo)
+ {
+ pos_serverinfo[0] = '\0';
+ pos_serverinfo++;
+ while (pos_serverinfo[0] == ' ')
+ pos_serverinfo++;
+ if (pos_serverinfo[0] == ':')
+ pos_serverinfo++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, "%s ", pos_server);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "(");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, "%s", pos_serverinfo);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, ")\n");
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_313: '313' command (whois, operator)
+ */
+
+int
+irc_cmd_recv_313 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_message;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_message = strchr (pos_nick, ' ');
+ if (pos_message)
+ {
+ pos_message[0] = '\0';
+ pos_message++;
+ while (pos_message[0] == ' ')
+ pos_message++;
+ if (pos_message[0] == ':')
+ pos_message++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, "%s\n", pos_message);
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_317: '317' command (whois, idle)
+ */
+
+int
+irc_cmd_recv_317 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_idle, *pos_signon, *pos_message;
+ int idle_time, day, hour, min, sec;
+ time_t datetime;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_idle = strchr (pos_nick, ' ');
+ if (pos_idle)
+ {
+ pos_idle[0] = '\0';
+ pos_idle++;
+ while (pos_idle[0] == ' ')
+ pos_idle++;
+ pos_signon = strchr (pos_idle, ' ');
+ if (pos_signon)
+ {
+ pos_signon[0] = '\0';
+ pos_signon++;
+ while (pos_signon[0] == ' ')
+ pos_signon++;
+ pos_message = strchr (pos_signon, ' ');
+ if (pos_message)
+ {
+ pos_message[0] = '\0';
+
+ idle_time = atoi (pos_idle);
+ day = idle_time / (60 * 60 * 24);
+ hour = (idle_time % (60 * 60 * 24)) / (60 * 60);
+ min = ((idle_time % (60 * 60 * 24)) % (60 * 60)) / 60;
+ sec = ((idle_time % (60 * 60 * 24)) % (60 * 60)) % 60;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, _("idle: "));
+ if (day > 0)
+ {
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", day);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ (day > 1) ? _("days") : _("day"));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ ", ");
+ }
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%02d ", hour);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ (hour > 1) ? _("hours") : _("hour"));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ " %02d ", min);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ (min > 1) ? _("minutes") : _("minute"));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ " %02d ", sec);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ (sec > 1) ? _("seconds") : _("second"));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ ", ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, _("signon at: "));
+ datetime = (time_t)(atol (pos_signon));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s", ctime (&datetime));
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_318: '318' command (whois, end)
+ */
+
+int
+irc_cmd_recv_318 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_message;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_message = strchr (pos_nick, ' ');
+ if (pos_message)
+ {
+ pos_message[0] = '\0';
+ pos_message++;
+ while (pos_message[0] == ' ')
+ pos_message++;
+ if (pos_message[0] == ':')
+ pos_message++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, "%s\n", pos_message);
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_319: '319' command (whois, end)
+ */
+
+int
+irc_cmd_recv_319 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_channel, *pos;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_channel = strchr (pos_nick, ' ');
+ if (pos_channel)
+ {
+ pos_channel[0] = '\0';
+ pos_channel++;
+ while (pos_channel[0] == ' ')
+ pos_channel++;
+ if (pos_channel[0] == ':')
+ pos_channel++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, _("Channels: "));
+
+ while (pos_channel && pos_channel[0])
+ {
+ if (pos_channel[0] == '@')
+ {
+ gui_printf_color (server->window,
+ COLOR_WIN_NICK_OP, "@");
+ pos_channel++;
+ }
+ else
+ {
+ if (pos_channel[0] == '%')
+ {
+ gui_printf_color (server->window,
+ COLOR_WIN_NICK_HALFOP, "%");
+ pos_channel++;
+ }
+ else
+ if (pos_channel[0] == '+')
+ {
+ gui_printf_color (server->window,
+ COLOR_WIN_NICK_VOICE, "+");
+ pos_channel++;
+ }
+ }
+ pos = strchr (pos_channel, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s%s",
+ pos_channel,
+ (pos && pos[0]) ? " " : "\n");
+ pos_channel = pos;
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_320: '320' command (whois, identified user)
+ */
+
+int
+irc_cmd_recv_320 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_message;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_message = strchr (pos_nick, ' ');
+ if (pos_message)
+ {
+ pos_message[0] = '\0';
+ pos_message++;
+ while (pos_message[0] == ' ')
+ pos_message++;
+ if (pos_message[0] == ':')
+ pos_message++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, "%s\n", pos_message);
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_321: '321' command (/list start)
+ */
+
+int
+irc_cmd_recv_321 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf (server->window, "%s\n", pos);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_322: '322' command (channel for /list)
+ */
+
+int
+irc_cmd_recv_322 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf (server->window, "%s\n", pos);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_323: '323' command (/list end)
+ */
+
+int
+irc_cmd_recv_323 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf (server->window, "%s\n", pos);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_331: '331' command received (no topic for channel)
+ */
+
+int
+irc_cmd_recv_331 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+
+ /* make gcc happy */
+ (void) server;
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ pos[0] = '\0';
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT, _("No topic set for "));
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT_CHANNEL, "%s\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_332: '332' command received (topic of channel)
+ */
+
+int
+irc_cmd_recv_332 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+ t_irc_channel *ptr_channel;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ while (pos[0] == ' ')
+ pos++;
+ pos2 = strchr (pos, ' ');
+ if (pos2)
+ {
+ pos2[0] = '\0';
+ ptr_channel = channel_search (server, pos);
+ if (ptr_channel)
+ {
+ pos2++;
+ while (pos2[0] == ' ')
+ pos2++;
+ if (pos2[0] == ':')
+ pos2++;
+ if (ptr_channel->topic)
+ free (ptr_channel->topic);
+ ptr_channel->topic = strdup (pos2);
+
+ irc_display_prefix (ptr_channel->window, PREFIX_INFO);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _("Topic for "));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL, "%s", pos);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _(" is: \"%s\"\n"), pos2);
+
+ gui_redraw_window_title (ptr_channel->window);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "332");
+ return -1;
+ }
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot identify channel for \"%s\" command\n"),
+ WEECHAT_ERROR, "332");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_333: '333' command received (infos about topic (nick / date)
+ */
+
+int
+irc_cmd_recv_333 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_channel, *pos_nick, *pos_date;
+ t_irc_channel *ptr_channel;
+ time_t datetime;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_channel = strchr (arguments, ' ');
+ if (pos_channel)
+ {
+ while (pos_channel[0] == ' ')
+ pos_channel++;
+ pos_nick = strchr (pos_channel, ' ');
+ if (pos_nick)
+ {
+ pos_nick[0] = '\0';
+ pos_nick++;
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_date = strchr (pos_nick, ' ');
+ if (pos_date)
+ {
+ pos_date[0] = '\0';
+ pos_date++;
+ while (pos_date[0] == ' ')
+ pos_date++;
+
+ ptr_channel = channel_search (server, pos_channel);
+ if (ptr_channel)
+ {
+ irc_display_prefix (ptr_channel->window, PREFIX_INFO);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _("Topic set by "));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ datetime = (time_t)(atol (pos_date));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, ", %s", ctime (&datetime));
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "333");
+ return -1;
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot identify date/time for \"%s\" command\n"),
+ WEECHAT_ERROR, "333");
+ return -1;
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot identify nickname for \"%s\" command\n"),
+ WEECHAT_ERROR, "333");
+ return -1;
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot identify channel for \"%s\" command\n"),
+ WEECHAT_ERROR, "333");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_351: '351' command received (server version)
+ */
+
+int
+irc_cmd_recv_351 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+
+ /* make gcc happy */
+ (void) server;
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ pos2 = strstr (pos, " :");
+ if (pos2)
+ {
+ pos2[0] = '\0';
+ pos2 += 2;
+ }
+
+ irc_display_prefix (server->window, PREFIX_SERVER);
+ if (pos2)
+ gui_printf (server->window, "%s %s\n", pos, pos2);
+ else
+ gui_printf (server->window, "%s\n", pos);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_353: '353' command received (list of users on a channel)
+ */
+
+int
+irc_cmd_recv_353 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos_nick;
+ int is_op, is_halfop, has_voice;
+ t_irc_channel *ptr_channel;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strstr (arguments, " = ");
+ if (pos)
+ arguments = pos + 3;
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+
+ ptr_channel = channel_search (server, arguments);
+ if (!ptr_channel)
+ return 0;
+
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ if (pos[0] != ':')
+ {
+ gui_printf (server->window,
+ _("%s cannot parse \"%s\" command\n"),
+ WEECHAT_ERROR, "353");
+ return -1;
+ }
+ pos++;
+ if (pos[0])
+ {
+ while (pos && pos[0])
+ {
+ is_op = 0;
+ is_halfop = 0;
+ has_voice = 0;
+ while ((pos[0] == '@') || (pos[0] == '%') || (pos[0] == '+'))
+ {
+ if (pos[0] == '@')
+ is_op = 1;
+ if (pos[0] == '%')
+ is_halfop = 1;
+ if (pos[0] == '+')
+ has_voice = 1;
+ pos++;
+ }
+ pos_nick = pos;
+ pos = strchr (pos, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ }
+ if (!nick_new (ptr_channel, pos_nick, is_op, is_halfop, has_voice))
+ gui_printf (server->window,
+ _("%s cannot create nick \"%s\" for channel \"%s\"\n"),
+ WEECHAT_ERROR, pos_nick, ptr_channel->name);
+ }
+ }
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot parse \"%s\" command\n"),
+ WEECHAT_ERROR, "353");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_366: '366' command received (end of /names list)
+ */
+
+int
+irc_cmd_recv_366 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+ int num_nicks, num_op, num_halfop, num_voice, num_normal;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ while (pos[0] == ' ')
+ pos++;
+ pos2 = strchr (pos, ' ');
+ if (pos2)
+ {
+ pos2[0] = '\0';
+ pos2++;
+ while (pos2[0] == ' ')
+ pos2++;
+ if (pos2[0] == ':')
+ pos2++;
+
+ ptr_channel = channel_search (server, pos);
+ if (ptr_channel)
+ {
+
+ /* display users on channel */
+ irc_display_prefix (ptr_channel->window, PREFIX_INFO);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
+ _("Nicks "));
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
+ "%s", ptr_channel->name);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT, ": ");
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, "[");
+
+ for (ptr_nick = ptr_channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick)
+ {
+ irc_display_nick (ptr_channel->window, ptr_nick,
+ MSG_TYPE_INFO, 0, 0, 1);
+ if (ptr_nick != ptr_channel->last_nick)
+ gui_printf (ptr_channel->window, " ");
+ }
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, "]\n");
+
+ /* display number of nicks, ops, halfops & voices on the channel */
+ nick_count (ptr_channel, &num_nicks, &num_op, &num_halfop, &num_voice,
+ &num_normal);
+ irc_display_prefix (ptr_channel->window, PREFIX_INFO);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _("Channel "));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s", ptr_channel->name);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, ": ");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", num_nicks);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ (num_nicks > 1) ? _("nicks") : _("nick"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, " (");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", num_op);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ (num_op > 1) ? _("ops") : _("op"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ ", ");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", num_halfop);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ (num_halfop > 1) ? _("halfops") : _("halfop"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ ", ");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", num_voice);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ (num_voice > 1) ? _("voices") : _("voice"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ ", ");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", num_normal);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ _("normal"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, ")\n");
+ }
+ else
+ {
+ irc_display_prefix (gui_current_window, PREFIX_INFO);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT_CHANNEL, pos);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT, ": %s\n", pos2);
+ return 0;
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_433: '433' command received (nickname already in use)
+ */
+
+int
+irc_cmd_recv_433 (t_irc_server *server, char *host, char *arguments)
+{
+ char hostname[128];
+
+ if (!server->is_connected)
+ {
+ if (strcmp (server->nick, server->nick1) == 0)
+ {
+ gui_printf (server->window,
+ _("%s: nickname \"%s\" is already in use, "
+ "trying 2nd nickname \"%s\"\n"),
+ WEECHAT_NAME, server->nick, server->nick2);
+ free (server->nick);
+ server->nick = strdup (server->nick2);
+ }
+ else
+ {
+ if (strcmp (server->nick, server->nick2) == 0)
+ {
+ gui_printf (server->window,
+ _("%s: nickname \"%s\" is already in use, "
+ "trying 3rd nickname \"%s\"\n"),
+ WEECHAT_NAME, server->nick, server->nick3);
+ free (server->nick);
+ server->nick = strdup (server->nick3);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s: all declared nicknames are already in use, "
+ "closing connection with server!\n"),
+ WEECHAT_NAME);
+ server_disconnect (server);
+ return 0;
+ }
+ }
+
+ gethostname (hostname, sizeof (hostname) - 1);
+ hostname[sizeof (hostname) - 1] = '\0';
+ if (!hostname[0])
+ strcpy (hostname, _("unknown"));
+ server_sendf (server,
+ "NICK %s\r\n",
+ server->nick);
+ }
+ else
+ return irc_cmd_recv_error (server, host, arguments);
+ return 0;
+}
diff --git a/src/irc/irc-send.c b/src/irc/irc-send.c
new file mode 100644
index 000000000..d086aee29
--- /dev/null
+++ b/src/irc/irc-send.c
@@ -0,0 +1,811 @@
+/*
+ * Copyright (c) 2003 by FlashCode <flashcode@flashtux.org>
+ * Bounga <bounga@altern.org>
+ * Xahlexx <xahlexx@tuxisland.org>
+ * See README for License detail.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+/* irc-send.c: implementation of IRC commands (client to server),
+ according to RFC 1459,2810,2811,2812 */
+
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <sys/utsname.h>
+
+#include "../weechat.h"
+#include "irc.h"
+#include "../command.h"
+#include "../config.h"
+#include "../gui/gui.h"
+
+
+/*
+ * irc_login: login to irc server
+ */
+
+void
+irc_login (t_irc_server *server)
+{
+ char hostname[128];
+
+ if ((server->password) && (server->password[0]))
+ server_sendf (server, "PASS %s\r\n", server->password);
+
+ gethostname (hostname, sizeof (hostname) - 1);
+ hostname[sizeof (hostname) - 1] = '\0';
+ if (!hostname[0])
+ strcpy (hostname, _("unknown"));
+ gui_printf (server->window,
+ _("%s: using local hostname \"%s\"\n"),
+ WEECHAT_NAME, hostname);
+ server_sendf (server,
+ "NICK %s\r\n"
+ "USER %s %s %s :%s\r\n",
+ server->nick, server->username, hostname, "servername",
+ server->realname);
+}
+
+/*
+ * irc_cmd_send_away: toggle away status
+ */
+
+int
+irc_cmd_send_away (t_irc_server *server, char *arguments)
+{
+ char *pos;
+ t_irc_server *ptr_server;
+
+ if (arguments && (strncmp (arguments, "-all", 4) == 0))
+ {
+ pos = arguments + 4;
+ while (pos[0] == ' ')
+ pos++;
+ if (!pos[0])
+ pos = NULL;
+
+ for (ptr_server = irc_servers; ptr_server;
+ ptr_server = ptr_server->next_server)
+ {
+ if (server->is_connected)
+ {
+ if (pos)
+ server_sendf (ptr_server, "AWAY :%s\r\n", pos);
+ else
+ server_sendf (ptr_server, "AWAY\r\n");
+ }
+ }
+ }
+ else
+ {
+ if (arguments)
+ server_sendf (server, "AWAY :%s\r\n", arguments);
+ else
+ server_sendf (server, "AWAY\r\n");
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_ctcp: send a ctcp message
+ */
+
+int
+irc_cmd_send_ctcp (t_irc_server *server, char *arguments)
+{
+ char *pos, *pos2;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ pos2 = strchr (pos, ' ');
+ if (pos2)
+ {
+ pos2[0] = '\0';
+ pos2++;
+ while (pos2[0] == ' ')
+ pos2++;
+ }
+ else
+ pos2 = NULL;
+
+ if (strcasecmp (pos, "version") == 0)
+ {
+ if (pos2)
+ server_sendf (server, "PRIVMSG %s :\01VERSION %s\01\r\n",
+ arguments, pos2);
+ else
+ server_sendf (server, "PRIVMSG %s :\01VERSION\01\r\n",
+ arguments);
+ }
+ if (strcasecmp (pos, "action") == 0)
+ {
+ if (pos2)
+ server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n",
+ arguments, pos2);
+ else
+ server_sendf (server, "PRIVMSG %s :\01ACTION\01\r\n",
+ arguments);
+ }
+
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_deop: remove operator privileges from nickname(s)
+ */
+
+int
+irc_cmd_send_deop (t_irc_server *server, int argc, char **argv)
+{
+ int i;
+
+ if (WIN_IS_CHANNEL(gui_current_window))
+ {
+ for (i = 0; i < argc; i++)
+ server_sendf (server, "MODE %s -o %s\r\n",
+ CHANNEL(gui_current_window)->name,
+ argv[i]);
+ }
+ else
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "deop");
+ return 0;
+}
+
+/*
+ * irc_cmd_send_devoice: remove voice from nickname(s)
+ */
+
+int
+irc_cmd_send_devoice (t_irc_server *server, int argc, char **argv)
+{
+ int i;
+
+ if (WIN_IS_CHANNEL(gui_current_window))
+ {
+ for (i = 0; i < argc; i++)
+ server_sendf (server, "MODE %s -v %s\r\n",
+ CHANNEL(gui_current_window)->name,
+ argv[i]);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "devoice");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_invite: invite a nick on a channel
+ */
+
+int
+irc_cmd_send_invite (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "INVITE %s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_join: join a new channel
+ */
+
+int
+irc_cmd_send_join (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "JOIN %s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_kick: forcibly remove a user from a channel
+ */
+
+int
+irc_cmd_send_kick (t_irc_server *server, char *arguments)
+{
+ if (string_is_channel (arguments))
+ server_sendf (server, "KICK %s\r\n", arguments);
+ else
+ {
+ if (WIN_IS_CHANNEL (gui_current_window))
+ {
+ server_sendf (server,
+ "KICK %s %s\r\n",
+ CHANNEL(gui_current_window)->name, arguments);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "kick");
+ return -1;
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_kill: close client-server connection
+ */
+
+int
+irc_cmd_send_kill (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "KILL %s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_list: close client-server connection
+ */
+
+int
+irc_cmd_send_list (t_irc_server *server, char *arguments)
+{
+ if (arguments)
+ server_sendf (server, "LIST %s\r\n", arguments);
+ else
+ server_sendf (server, "LIST\r\n");
+ return 0;
+}
+
+/*
+ * irc_cmd_send_me: send a ctcp action to the current channel
+ */
+
+int
+irc_cmd_send_me (t_irc_server *server, char *arguments)
+{
+ if (WIN_IS_SERVER(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can not be executed on a server window\n"),
+ WEECHAT_ERROR, "me");
+ return -1;
+ }
+ server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n",
+ CHANNEL(gui_current_window)->name, arguments);
+ irc_display_prefix (gui_current_window, PREFIX_ACTION_ME);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT_NICK, "%s", server->nick);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT, " %s\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_mode: change mode for channel/nickname
+ */
+
+int
+irc_cmd_send_mode (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "MODE %s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_msg: send a message to a nick or channel
+ */
+
+int
+irc_cmd_send_msg (t_irc_server *server, char *arguments)
+{
+ char *pos, *pos_comma;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+
+ while (arguments && arguments[0])
+ {
+ pos_comma = strchr (arguments, ',');
+ if (pos_comma)
+ {
+ pos_comma[0] = '\0';
+ pos_comma++;
+ }
+ if (strcmp (arguments, "*") == 0)
+ {
+ if (WIN_IS_SERVER(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can not be executed on a server window\n"),
+ WEECHAT_ERROR, "msg *");
+ return -1;
+ }
+ ptr_channel = CHANNEL(gui_current_window);
+ ptr_nick = nick_search (ptr_channel, server->nick);
+ if (ptr_nick)
+ {
+ irc_display_nick (ptr_channel->window, ptr_nick,
+ MSG_TYPE_NICK, 1, 1, 0);
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_MSG,
+ COLOR_WIN_CHAT, "%s\n", pos);
+ }
+ else
+ gui_printf (server->window,
+ _("%s nick not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "msg");
+ server_sendf (server, "PRIVMSG %s :%s\r\n", ptr_channel->name, pos);
+ }
+ else
+ {
+ if (string_is_channel (arguments))
+ {
+ ptr_channel = channel_search (server, arguments);
+ if (ptr_channel)
+ {
+ ptr_nick = nick_search (ptr_channel, server->nick);
+ if (ptr_nick)
+ {
+ irc_display_nick (ptr_channel->window, ptr_nick,
+ MSG_TYPE_NICK, 1, 1, 0);
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_MSG,
+ COLOR_WIN_CHAT, "%s\n", pos);
+ }
+ else
+ gui_printf (server->window,
+ _("%s nick not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "msg");
+ }
+ server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos);
+ }
+ else
+ {
+ ptr_channel = channel_search (server, arguments);
+ if (!ptr_channel)
+ {
+ ptr_channel = channel_new (server, CHAT_PRIVATE, arguments);
+ if (!ptr_channel)
+ {
+ gui_printf (server->window,
+ _("%s cannot create new private window \"%s\"\n"),
+ WEECHAT_ERROR,
+ arguments);
+ return -1;
+ }
+ 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_SELF,
+ "%s", server->nick);
+ 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);
+ server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos);
+ }
+ }
+ arguments = pos_comma;
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s wrong argument count for \"%s\" command\n"),
+ WEECHAT_ERROR, "msg");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_names: list nicknames on channels
+ */
+
+int
+irc_cmd_send_names (t_irc_server *server, char *arguments)
+{
+ if (arguments)
+ server_sendf (server, "NAMES %s\r\n", arguments);
+ else
+ {
+ if (!WIN_IS_CHANNEL(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "names");
+ return -1;
+ }
+ else
+ server_sendf (server, "NAMES %s\r\n",
+ CHANNEL(gui_current_window)->name);
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_nick: change nickname
+ */
+
+int
+irc_cmd_send_nick (t_irc_server *server, int argc, char **argv)
+{
+ if (argc != 1)
+ return -1;
+ server_sendf (server, "NICK %s\r\n", argv[0]);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_notice: send notice message
+ */
+
+int
+irc_cmd_send_notice (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "NOTICE %s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_op: give operator privileges to nickname(s)
+ */
+
+int
+irc_cmd_send_op (t_irc_server *server, int argc, char **argv)
+{
+ int i;
+
+ if (WIN_IS_CHANNEL(gui_current_window))
+ {
+ for (i = 0; i < argc; i++)
+ server_sendf (server, "MODE %s +o %s\r\n",
+ CHANNEL(gui_current_window)->name,
+ argv[i]);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "op");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_oper: get oper privileges
+ */
+
+int
+irc_cmd_send_oper (t_irc_server *server, int argc, char **argv)
+{
+ if (argc != 2)
+ return -1;
+ server_sendf (server, "OPER %s %s\r\n", argv[0], argv[1]);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_part: leave a channel or close a private window
+ */
+
+int
+irc_cmd_send_part (t_irc_server *server, char *arguments)
+{
+ char *channel_name, *pos_args;
+ t_irc_channel *ptr_channel;
+
+ if (arguments)
+ {
+ if (string_is_channel (arguments))
+ {
+ channel_name = arguments;
+ pos_args = strchr (arguments, ' ');
+ if (pos_args)
+ {
+ pos_args[0] = '\0';
+ pos_args++;
+ while (pos_args[0] == ' ')
+ pos_args++;
+ }
+ }
+ else
+ {
+ if (WIN_IS_SERVER(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can not be executed on a server window\n"),
+ WEECHAT_ERROR, "part");
+ return -1;
+ }
+ channel_name = CHANNEL(gui_current_window)->name;
+ pos_args = arguments;
+ }
+ }
+ else
+ {
+ if (WIN_IS_SERVER(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can not be executed on a server window\n"),
+ WEECHAT_ERROR, "part");
+ return -1;
+ }
+ if (WIN_IS_PRIVATE(gui_current_window))
+ {
+ ptr_channel = CHANNEL(gui_current_window);
+ gui_window_free (ptr_channel->window);
+ channel_free (server, ptr_channel);
+ gui_redraw_window_status (gui_current_window);
+ gui_redraw_window_input (gui_current_window);
+ return 0;
+ }
+ channel_name = CHANNEL(gui_current_window)->name;
+ pos_args = NULL;
+ }
+
+ if (pos_args)
+ server_sendf (server, "PART %s :%s\r\n", channel_name, pos_args);
+ else
+ server_sendf (server, "PART %s\r\n", channel_name);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_ping: ping a server
+ */
+
+int
+irc_cmd_send_ping (t_irc_server *server, int argc, char **argv)
+{
+ if (argc == 1)
+ server_sendf (server, "PING %s\r\n", argv[0]);
+ if (argc == 2)
+ server_sendf (server, "PING %s %s\r\n", argv[0],
+ argv[1]);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_pong: send pong answer to a daemon
+ */
+
+int
+irc_cmd_send_pong (t_irc_server *server, int argc, char **argv)
+{
+ if (argc == 1)
+ server_sendf (server, "PONG %s\r\n", argv[0]);
+ if (argc == 2)
+ server_sendf (server, "PONG %s %s\r\n", argv[0],
+ argv[1]);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_quit: disconnect from all servers and quit WeeChat
+ */
+
+int
+irc_cmd_send_quit (t_irc_server *server, char *arguments)
+{
+ if (server && server->is_connected)
+ {
+ if (arguments)
+ server_sendf (server, "QUIT :%s\r\n", arguments);
+ else
+ server_sendf (server, "QUIT\r\n");
+ }
+ quit_weechat = 1;
+ return 0;
+}
+
+/*
+ * irc_cmd_send_quote: send raw data to server
+ */
+
+int
+irc_cmd_send_quote (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "%s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_rehash: tell the server to reload its config file
+ */
+
+int
+irc_cmd_send_rehash (t_irc_server *server, char *arguments)
+{
+ /* make gcc happy */
+ (void) arguments;
+
+ server_sendf (server, "REHASH\r\n");
+ return 0;
+}
+
+/*
+ * irc_cmd_send_restart: tell the server to restart itself
+ */
+
+int
+irc_cmd_send_restart (t_irc_server *server, char *arguments)
+{
+ /* make gcc happy */
+ (void) arguments;
+
+ server_sendf (server, "RESTART\r\n");
+ return 0;
+}
+
+/*
+ * irc_cmd_send_stats: query statistics about server
+ */
+
+int
+irc_cmd_send_stats (t_irc_server *server, char *arguments)
+{
+ if (arguments)
+ server_sendf (server, "STATS %s\r\n", arguments);
+ else
+ server_sendf (server, "STATS\r\n");
+ return 0;
+}
+
+/*
+ * irc_cmd_send_topic: get/set topic for a channel
+ */
+
+int
+irc_cmd_send_topic (t_irc_server *server, char *arguments)
+{
+ char *channel_name, *new_topic, *pos;
+
+ channel_name = NULL;
+ new_topic = NULL;
+
+ if (arguments)
+ {
+ if (string_is_channel (arguments))
+ {
+ channel_name = arguments;
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ new_topic = (pos[0]) ? pos : NULL;
+ }
+ }
+ else
+ new_topic = arguments;
+ }
+
+ /* look for current channel if not specified */
+ if (!channel_name)
+ {
+ if (WIN_IS_SERVER(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can not be executed on a server window\n"),
+ WEECHAT_ERROR, "topic");
+ return -1;
+ }
+ channel_name = CHANNEL(gui_current_window)->name;
+ }
+
+ if (new_topic)
+ {
+ if (strcmp (new_topic, "-delete") == 0)
+ server_sendf (server, "TOPIC %s :\r\n", channel_name);
+ else
+ server_sendf (server, "TOPIC %s :%s\r\n", channel_name, new_topic);
+ }
+ else
+ server_sendf (server, "TOPIC %s\r\n", channel_name);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_version: gives the version info of nick or server (current or specified)
+ */
+
+int
+irc_cmd_send_version (t_irc_server *server, char *arguments)
+{
+ if (arguments)
+ {
+ if (WIN_IS_CHANNEL(gui_current_window) &&
+ nick_search (CHANNEL(gui_current_window), arguments))
+ server_sendf (server, "PRIVMSG %s :\01VERSION\01\r\n",
+ arguments);
+ else
+ server_sendf (server, "VERSION %s\r\n",
+ arguments);
+ }
+ else
+ {
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf (server->window, _("%s, compiled on %s %s\n"),
+ WEECHAT_NAME_AND_VERSION,
+ __DATE__, __TIME__);
+ server_sendf (server, "VERSION\r\n");
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_voice: give voice to nickname(s)
+ */
+
+int
+irc_cmd_send_voice (t_irc_server *server, int argc, char **argv)
+{
+ int i;
+
+ if (WIN_IS_CHANNEL(gui_current_window))
+ {
+ for (i = 0; i < argc; i++)
+ server_sendf (server, "MODE %s +v %s\r\n",
+ CHANNEL(gui_current_window)->name,
+ argv[i]);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "voice");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_whois: query information about user(s)
+ */
+
+int
+irc_cmd_send_whois (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "WHOIS %s\r\n", arguments);
+ return 0;
+}
diff --git a/src/irc/irc.h b/src/irc/irc.h
index 41591045f..0dfa33ac4 100644
--- a/src/irc/irc.h
+++ b/src/irc/irc.h
@@ -212,6 +212,7 @@ extern int irc_cmd_send_quit (t_irc_server *, char *);
extern int irc_cmd_send_quote (t_irc_server *, char *);
extern int irc_cmd_send_rehash (t_irc_server *, char *);
extern int irc_cmd_send_restart (t_irc_server *, char *);
+extern int irc_cmd_send_stats (t_irc_server *, char *);
extern int irc_cmd_send_topic (t_irc_server *, char *);
extern int irc_cmd_send_version (t_irc_server *, char *);
extern int irc_cmd_send_voice (t_irc_server *, int, char **);
diff --git a/weechat/ChangeLog b/weechat/ChangeLog
index 0d93aad32..127ddc215 100644
--- a/weechat/ChangeLog
+++ b/weechat/ChangeLog
@@ -1,9 +1,13 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
-ChangeLog - 2003-10-05
+ChangeLog - 2003-10-07
+Version 0.0.3 (under dev!):
+ * new IRC command: /stats
+ * french translation
+
Version 0.0.2 (2003-10-05):
* added commands /rehash and /restart
* command & auto-join channels when connected to server
diff --git a/weechat/TODO b/weechat/TODO
index 187145698..f22c5e872 100644
--- a/weechat/TODO
+++ b/weechat/TODO
@@ -1,7 +1,7 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
-TODO - 2003-10-05
+TODO - 2003-10-07
Legend:
# done
@@ -14,7 +14,7 @@ v0.0.3:
------
* IRC protocol:
- - implement RFC 2812
+ + implement RFC 2812
+ "/mode" command: change the user/channels modes
* WeeChat commands:
@@ -28,7 +28,7 @@ v0.0.3:
* Interface:
- display current channel modes (example : #weechat(+nt))
- interpret special chars in messages (color & bold for example)
- - internationalization (traduce WeeChat in many languages)
+ + internationalization (traduce WeeChat in many languages)
- log chats to file
* TCP/IP communication:
diff --git a/weechat/src/irc/Makefile b/weechat/src/irc/Makefile
index d22617bda..09ca6dc0d 100644
--- a/weechat/src/irc/Makefile
+++ b/weechat/src/irc/Makefile
@@ -20,7 +20,7 @@ CC=gcc
OPTIONS=-Wall -W -pipe -O2
OUTPUT=irc.a
-OBJS=irc-commands.o irc-display.o irc-server.o irc-channel.o irc-nick.o
+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
all: $(OBJS)
@@ -37,8 +37,12 @@ irc-channel.o: irc-channel.c ../weechat.h irc.h ../gui/gui.h \
irc-commands.o: irc-commands.c ../weechat.h irc.h ../gui/gui.h \
../completion.h ../history.h ../command.h ../irc/irc.h ../config.h
irc-display.o: irc-display.c ../weechat.h irc.h ../gui/gui.h \
- ../completion.h ../history.h
+ ../completion.h ../history.h ../config.h
irc-nick.o: irc-nick.c ../weechat.h irc.h ../gui/gui.h ../completion.h \
../history.h
+irc-recv.o: irc-recv.c ../weechat.h irc.h ../gui/gui.h ../completion.h \
+ ../history.h ../command.h ../irc/irc.h ../config.h
+irc-send.o: irc-send.c ../weechat.h irc.h ../gui/gui.h ../completion.h \
+ ../history.h ../command.h ../irc/irc.h ../config.h
irc-server.o: irc-server.c ../weechat.h irc.h ../gui/gui.h \
../completion.h ../history.h
diff --git a/weechat/src/irc/irc-commands.c b/weechat/src/irc/irc-commands.c
index 9f04540c7..384ba787a 100644
--- a/weechat/src/irc/irc-commands.c
+++ b/weechat/src/irc/irc-commands.c
@@ -151,6 +151,10 @@ t_irc_command irc_commands[] =
{ "restart", N_("tell the server to restart itself"),
"", "",
0, 0, 1, NULL, irc_cmd_send_restart, NULL },
+ { "stats", N_("query statistics about server"),
+ "[query [server]]",
+ "query: c/h/i/k/l/m/o/y/u (see RFC1459)\nserver: server name",
+ 0, 2, 1, NULL, irc_cmd_send_stats, NULL },
{ "topic", N_("get/set channel topic"),
N_("[channel] [topic]"), N_("channel: channel name\ntopic: new topic for channel "
"(if topic is \"-delete\" then topic is deleted)"),
@@ -170,6 +174,8 @@ t_irc_command irc_commands[] =
{ "003", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
{ "004", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_004 },
{ "005", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
+ { "212", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
+ { "219", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
{ "250", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
{ "251", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
{ "252", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg },
@@ -315,2836 +321,3 @@ t_irc_command irc_commands[] =
"", "", 0, MAX_ARGS, 1, NULL, NULL, irc_cmd_recv_error },
{ NULL, NULL, NULL, NULL, 0, 0, 1, NULL, NULL, NULL }
};
-
-
-/*
- * irc_recv_command: executes action when receiving IRC command
- * returns: 0 = all ok, command executed
- * -1 = command failed
- * -2 = no command to execute
- * -3 = command not found
- */
-
-int
-irc_recv_command (t_irc_server *server,
- char *host, char *command, char *arguments)
-{
- int i, cmd_found;
-
- if (command == NULL)
- return -2;
-
- /* looks for irc command */
- cmd_found = -1;
- for (i = 0; irc_commands[i].command_name; i++)
- if (strcasecmp (irc_commands[i].command_name, command) == 0)
- {
- cmd_found = i;
- break;
- }
-
- /* command not found */
- if (cmd_found < 0)
- return -3;
-
- if (irc_commands[i].recv_function != NULL)
- return (int) (irc_commands[i].recv_function) (server, host, arguments);
-
- return 0;
-}
-
-/*
- * irc_login: login to irc server
- */
-
-void
-irc_login (t_irc_server *server)
-{
- char hostname[128];
-
- if ((server->password) && (server->password[0]))
- server_sendf (server, "PASS %s\r\n", server->password);
-
- gethostname (hostname, sizeof (hostname) - 1);
- hostname[sizeof (hostname) - 1] = '\0';
- if (!hostname[0])
- strcpy (hostname, _("unknown"));
- gui_printf (server->window,
- _("%s: using local hostname \"%s\"\n"),
- WEECHAT_NAME, hostname);
- server_sendf (server,
- "NICK %s\r\n"
- "USER %s %s %s :%s\r\n",
- server->nick, server->username, hostname, "servername",
- server->realname);
-}
-
-/*
- * irc_cmd_send_away: toggle away status
- */
-
-int
-irc_cmd_send_away (t_irc_server *server, char *arguments)
-{
- char *pos;
- t_irc_server *ptr_server;
-
- if (arguments && (strncmp (arguments, "-all", 4) == 0))
- {
- pos = arguments + 4;
- while (pos[0] == ' ')
- pos++;
- if (!pos[0])
- pos = NULL;
-
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- if (server->is_connected)
- {
- if (pos)
- server_sendf (ptr_server, "AWAY :%s\r\n", pos);
- else
- server_sendf (ptr_server, "AWAY\r\n");
- }
- }
- }
- else
- {
- if (arguments)
- server_sendf (server, "AWAY :%s\r\n", arguments);
- else
- server_sendf (server, "AWAY\r\n");
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_ctcp: send a ctcp message
- */
-
-int
-irc_cmd_send_ctcp (t_irc_server *server, char *arguments)
-{
- char *pos, *pos2;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- pos2 = strchr (pos, ' ');
- if (pos2)
- {
- pos2[0] = '\0';
- pos2++;
- while (pos2[0] == ' ')
- pos2++;
- }
- else
- pos2 = NULL;
-
- if (strcasecmp (pos, "version") == 0)
- {
- if (pos2)
- server_sendf (server, "PRIVMSG %s :\01VERSION %s\01\r\n",
- arguments, pos2);
- else
- server_sendf (server, "PRIVMSG %s :\01VERSION\01\r\n",
- arguments);
- }
- if (strcasecmp (pos, "action") == 0)
- {
- if (pos2)
- server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n",
- arguments, pos2);
- else
- server_sendf (server, "PRIVMSG %s :\01ACTION\01\r\n",
- arguments);
- }
-
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_deop: remove operator privileges from nickname(s)
- */
-
-int
-irc_cmd_send_deop (t_irc_server *server, int argc, char **argv)
-{
- int i;
-
- if (WIN_IS_CHANNEL(gui_current_window))
- {
- for (i = 0; i < argc; i++)
- server_sendf (server, "MODE %s -o %s\r\n",
- CHANNEL(gui_current_window)->name,
- argv[i]);
- }
- else
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "deop");
- return 0;
-}
-
-/*
- * irc_cmd_send_devoice: remove voice from nickname(s)
- */
-
-int
-irc_cmd_send_devoice (t_irc_server *server, int argc, char **argv)
-{
- int i;
-
- if (WIN_IS_CHANNEL(gui_current_window))
- {
- for (i = 0; i < argc; i++)
- server_sendf (server, "MODE %s -v %s\r\n",
- CHANNEL(gui_current_window)->name,
- argv[i]);
- }
- else
- {
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "devoice");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_invite: invite a nick on a channel
- */
-
-int
-irc_cmd_send_invite (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "INVITE %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_join: join a new channel
- */
-
-int
-irc_cmd_send_join (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "JOIN %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_kick: forcibly remove a user from a channel
- */
-
-int
-irc_cmd_send_kick (t_irc_server *server, char *arguments)
-{
- if (string_is_channel (arguments))
- server_sendf (server, "KICK %s\r\n", arguments);
- else
- {
- if (WIN_IS_CHANNEL (gui_current_window))
- {
- server_sendf (server,
- "KICK %s %s\r\n",
- CHANNEL(gui_current_window)->name, arguments);
- }
- else
- {
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "kick");
- return -1;
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_kill: close client-server connection
- */
-
-int
-irc_cmd_send_kill (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "KILL %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_list: close client-server connection
- */
-
-int
-irc_cmd_send_list (t_irc_server *server, char *arguments)
-{
- if (arguments)
- server_sendf (server, "LIST %s\r\n", arguments);
- else
- server_sendf (server, "LIST\r\n");
- return 0;
-}
-
-/*
- * irc_cmd_send_me: send a ctcp action to the current channel
- */
-
-int
-irc_cmd_send_me (t_irc_server *server, char *arguments)
-{
- if (WIN_IS_SERVER(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can not be executed on a server window\n"),
- WEECHAT_ERROR, "me");
- return -1;
- }
- server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n",
- CHANNEL(gui_current_window)->name, arguments);
- irc_display_prefix (gui_current_window, PREFIX_ACTION_ME);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT_NICK, "%s", server->nick);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT, " %s\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_mode: change mode for channel/nickname
- */
-
-int
-irc_cmd_send_mode (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "MODE %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_msg: send a message to a nick or channel
- */
-
-int
-irc_cmd_send_msg (t_irc_server *server, char *arguments)
-{
- char *pos, *pos_comma;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
-
- while (arguments && arguments[0])
- {
- pos_comma = strchr (arguments, ',');
- if (pos_comma)
- {
- pos_comma[0] = '\0';
- pos_comma++;
- }
- if (strcmp (arguments, "*") == 0)
- {
- if (WIN_IS_SERVER(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can not be executed on a server window\n"),
- WEECHAT_ERROR, "msg *");
- return -1;
- }
- ptr_channel = CHANNEL(gui_current_window);
- ptr_nick = nick_search (ptr_channel, server->nick);
- if (ptr_nick)
- {
- irc_display_nick (ptr_channel->window, ptr_nick,
- MSG_TYPE_NICK, 1, 1, 0);
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_MSG,
- COLOR_WIN_CHAT, "%s\n", pos);
- }
- else
- gui_printf (server->window,
- _("%s nick not found for \"%s\" command\n"),
- WEECHAT_ERROR, "msg");
- server_sendf (server, "PRIVMSG %s :%s\r\n", ptr_channel->name, pos);
- }
- else
- {
- if (string_is_channel (arguments))
- {
- ptr_channel = channel_search (server, arguments);
- if (ptr_channel)
- {
- ptr_nick = nick_search (ptr_channel, server->nick);
- if (ptr_nick)
- {
- irc_display_nick (ptr_channel->window, ptr_nick,
- MSG_TYPE_NICK, 1, 1, 0);
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_MSG,
- COLOR_WIN_CHAT, "%s\n", pos);
- }
- else
- gui_printf (server->window,
- _("%s nick not found for \"%s\" command\n"),
- WEECHAT_ERROR, "msg");
- }
- server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos);
- }
- else
- {
- ptr_channel = channel_search (server, arguments);
- if (!ptr_channel)
- {
- ptr_channel = channel_new (server, CHAT_PRIVATE, arguments);
- if (!ptr_channel)
- {
- gui_printf (server->window,
- _("%s cannot create new private window \"%s\"\n"),
- WEECHAT_ERROR,
- arguments);
- return -1;
- }
- 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_SELF,
- "%s", server->nick);
- 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);
- server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos);
- }
- }
- arguments = pos_comma;
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s wrong argument count for \"%s\" command\n"),
- WEECHAT_ERROR, "msg");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_names: list nicknames on channels
- */
-
-int
-irc_cmd_send_names (t_irc_server *server, char *arguments)
-{
- if (arguments)
- server_sendf (server, "NAMES %s\r\n", arguments);
- else
- {
- if (!WIN_IS_CHANNEL(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "names");
- return -1;
- }
- else
- server_sendf (server, "NAMES %s\r\n",
- CHANNEL(gui_current_window)->name);
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_nick: change nickname
- */
-
-int
-irc_cmd_send_nick (t_irc_server *server, int argc, char **argv)
-{
- if (argc != 1)
- return -1;
- server_sendf (server, "NICK %s\r\n", argv[0]);
- return 0;
-}
-
-/*
- * irc_cmd_send_notice: send notice message
- */
-
-int
-irc_cmd_send_notice (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "NOTICE %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_op: give operator privileges to nickname(s)
- */
-
-int
-irc_cmd_send_op (t_irc_server *server, int argc, char **argv)
-{
- int i;
-
- if (WIN_IS_CHANNEL(gui_current_window))
- {
- for (i = 0; i < argc; i++)
- server_sendf (server, "MODE %s +o %s\r\n",
- CHANNEL(gui_current_window)->name,
- argv[i]);
- }
- else
- {
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "op");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_oper: get oper privileges
- */
-
-int
-irc_cmd_send_oper (t_irc_server *server, int argc, char **argv)
-{
- if (argc != 2)
- return -1;
- server_sendf (server, "OPER %s %s\r\n", argv[0], argv[1]);
- return 0;
-}
-
-/*
- * irc_cmd_send_part: leave a channel or close a private window
- */
-
-int
-irc_cmd_send_part (t_irc_server *server, char *arguments)
-{
- char *channel_name, *pos_args;
- t_irc_channel *ptr_channel;
-
- if (arguments)
- {
- if (string_is_channel (arguments))
- {
- channel_name = arguments;
- pos_args = strchr (arguments, ' ');
- if (pos_args)
- {
- pos_args[0] = '\0';
- pos_args++;
- while (pos_args[0] == ' ')
- pos_args++;
- }
- }
- else
- {
- if (WIN_IS_SERVER(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can not be executed on a server window\n"),
- WEECHAT_ERROR, "part");
- return -1;
- }
- channel_name = CHANNEL(gui_current_window)->name;
- pos_args = arguments;
- }
- }
- else
- {
- if (WIN_IS_SERVER(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can not be executed on a server window\n"),
- WEECHAT_ERROR, "part");
- return -1;
- }
- if (WIN_IS_PRIVATE(gui_current_window))
- {
- ptr_channel = CHANNEL(gui_current_window);
- gui_window_free (ptr_channel->window);
- channel_free (server, ptr_channel);
- gui_redraw_window_status (gui_current_window);
- gui_redraw_window_input (gui_current_window);
- return 0;
- }
- channel_name = CHANNEL(gui_current_window)->name;
- pos_args = NULL;
- }
-
- if (pos_args)
- server_sendf (server, "PART %s :%s\r\n", channel_name, pos_args);
- else
- server_sendf (server, "PART %s\r\n", channel_name);
- return 0;
-}
-
-/*
- * irc_cmd_send_ping: ping a server
- */
-
-int
-irc_cmd_send_ping (t_irc_server *server, int argc, char **argv)
-{
- if (argc == 1)
- server_sendf (server, "PING %s\r\n", argv[0]);
- if (argc == 2)
- server_sendf (server, "PING %s %s\r\n", argv[0],
- argv[1]);
- return 0;
-}
-
-/*
- * irc_cmd_send_pong: send pong answer to a daemon
- */
-
-int
-irc_cmd_send_pong (t_irc_server *server, int argc, char **argv)
-{
- if (argc == 1)
- server_sendf (server, "PONG %s\r\n", argv[0]);
- if (argc == 2)
- server_sendf (server, "PONG %s %s\r\n", argv[0],
- argv[1]);
- return 0;
-}
-
-/*
- * irc_cmd_send_quit: disconnect from all servers and quit WeeChat
- */
-
-int
-irc_cmd_send_quit (t_irc_server *server, char *arguments)
-{
- if (server && server->is_connected)
- {
- if (arguments)
- server_sendf (server, "QUIT :%s\r\n", arguments);
- else
- server_sendf (server, "QUIT\r\n");
- }
- quit_weechat = 1;
- return 0;
-}
-
-/*
- * irc_cmd_send_quote: send raw data to server
- */
-
-int
-irc_cmd_send_quote (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "%s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_send_rehash: tell the server to reload its config file
- */
-
-int
-irc_cmd_send_rehash (t_irc_server *server, char *arguments)
-{
- /* make gcc happy */
- (void) arguments;
-
- server_sendf (server, "REHASH\r\n");
- return 0;
-}
-
-/*
- * irc_cmd_send_restart: tell the server to restart itself
- */
-
-int
-irc_cmd_send_restart (t_irc_server *server, char *arguments)
-{
- /* make gcc happy */
- (void) arguments;
-
- server_sendf (server, "RESTART\r\n");
- return 0;
-}
-
-/*
- * irc_cmd_send_topic: get/set topic for a channel
- */
-
-int
-irc_cmd_send_topic (t_irc_server *server, char *arguments)
-{
- char *channel_name, *new_topic, *pos;
-
- channel_name = NULL;
- new_topic = NULL;
-
- if (arguments)
- {
- if (string_is_channel (arguments))
- {
- channel_name = arguments;
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- new_topic = (pos[0]) ? pos : NULL;
- }
- }
- else
- new_topic = arguments;
- }
-
- /* look for current channel if not specified */
- if (!channel_name)
- {
- if (WIN_IS_SERVER(gui_current_window))
- {
- gui_printf (server->window,
- _("%s \"%s\" command can not be executed on a server window\n"),
- WEECHAT_ERROR, "topic");
- return -1;
- }
- channel_name = CHANNEL(gui_current_window)->name;
- }
-
- if (new_topic)
- {
- if (strcmp (new_topic, "-delete") == 0)
- server_sendf (server, "TOPIC %s :\r\n", channel_name);
- else
- server_sendf (server, "TOPIC %s :%s\r\n", channel_name, new_topic);
- }
- else
- server_sendf (server, "TOPIC %s\r\n", channel_name);
- return 0;
-}
-
-/*
- * irc_cmd_send_version: gives the version info of nick or server (current or specified)
- */
-
-int
-irc_cmd_send_version (t_irc_server *server, char *arguments)
-{
- if (arguments)
- {
- if (WIN_IS_CHANNEL(gui_current_window) &&
- nick_search (CHANNEL(gui_current_window), arguments))
- server_sendf (server, "PRIVMSG %s :\01VERSION\01\r\n",
- arguments);
- else
- server_sendf (server, "VERSION %s\r\n",
- arguments);
- }
- else
- {
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf (server->window, _("%s, compiled on %s %s\n"),
- WEECHAT_NAME_AND_VERSION,
- __DATE__, __TIME__);
- server_sendf (server, "VERSION\r\n");
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_voice: give voice to nickname(s)
- */
-
-int
-irc_cmd_send_voice (t_irc_server *server, int argc, char **argv)
-{
- int i;
-
- if (WIN_IS_CHANNEL(gui_current_window))
- {
- for (i = 0; i < argc; i++)
- server_sendf (server, "MODE %s +v %s\r\n",
- CHANNEL(gui_current_window)->name,
- argv[i]);
- }
- else
- {
- gui_printf (server->window,
- _("%s \"%s\" command can only be executed in a channel window\n"),
- WEECHAT_ERROR, "voice");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_send_whois: query information about user(s)
- */
-
-int
-irc_cmd_send_whois (t_irc_server *server, char *arguments)
-{
- server_sendf (server, "WHOIS %s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_recv_error: error received from server
- */
-
-int
-irc_cmd_recv_error (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
- int first;
-
- /* make gcc happy */
- (void) server;
- (void) host;
-
- if (strncmp (arguments, "Closing Link", 12) == 0)
- {
- server_disconnect (server);
- return 0;
- }
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- else
- pos = arguments;
-
- irc_display_prefix (server->window, PREFIX_ERROR);
- first = 1;
-
- while (pos && pos[0])
- {
- pos2 = strchr (pos, ' ');
- if ((pos[0] == ':') || (!pos2))
- {
- if (pos[0] == ':')
- pos++;
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- "%s%s\n", (first) ? "" : ": ", pos);
- pos = NULL;
- }
- else
- {
- pos2[0] = '\0';
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s%s",
- (first) ? "" : " ", pos);
- first = 0;
- pos = pos2 + 1;
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_join: 'join' message received
- */
-
-int
-irc_cmd_recv_join (t_irc_server *server, char *host, char *arguments)
-{
- t_irc_channel *ptr_channel;
- char *pos;
-
- ptr_channel = channel_search (server, arguments);
- if (!ptr_channel)
- {
- ptr_channel = channel_new (server, CHAT_CHANNEL, arguments);
- if (!ptr_channel)
- {
- gui_printf (server->window,
- _("%s cannot create new channel \"%s\"\n"),
- WEECHAT_ERROR, arguments);
- return -1;
- }
- }
-
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- irc_display_prefix (ptr_channel->window, PREFIX_JOIN);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
- "%s ", host);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
- "(");
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_HOST,
- "%s", pos + 1);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
- ")");
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
- _(" has joined "));
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
- "%s\n", arguments);
- nick_new (ptr_channel, host, 0, 0, 0);
- gui_redraw_window_nick (gui_current_window);
- return 0;
-}
-
-/*
- * irc_cmd_recv_kick: 'kick' message received
- */
-
-int
-irc_cmd_recv_kick (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos_nick, *pos_comment;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- pos_nick[0] = '\0';
- pos_nick++;
- while (pos_nick[0] == ' ')
- pos_nick++;
-
- pos_comment = strchr (pos_nick, ' ');
- if (pos_comment)
- {
- pos_comment[0] = '\0';
- pos_comment++;
- while (pos_comment[0] == ' ')
- pos_comment++;
- if (pos_comment[0] == ':')
- pos_comment++;
- }
-
- ptr_channel = channel_search (server, arguments);
- if (!ptr_channel)
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "kick");
- return -1;
- }
-
- irc_display_prefix (ptr_channel->window, PREFIX_PART);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
- "%s", host);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
- _(" has kicked "));
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
- "%s", pos_nick);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
- _(" from "));
- if (pos_comment)
- {
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
- "%s ", arguments);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
- "(");
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
- "%s", pos_comment);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
- ")\n");
- }
- else
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
- "%s\n", arguments);
- }
- else
- {
- gui_printf (server->window,
- _("%s nick not found for \"%s\" command\n"),
- WEECHAT_ERROR, "kick");
- return -1;
- }
- ptr_nick = nick_search (ptr_channel, pos_nick);
- if (ptr_nick)
- {
- nick_free (ptr_channel, ptr_nick);
- gui_redraw_window_nick (gui_current_window);
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_mode: 'mode' message received
- */
-
-int
-irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2, *pos_parm;
- char set_flag;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- /* no host => we can't identify sender of message! */
- if (host == NULL)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without host\n"),
- WEECHAT_ERROR, "mode");
- return -1;
- }
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- pos = strchr (arguments, ' ');
- if (!pos)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without channel or nickname\n"),
- WEECHAT_ERROR, "mode");
- return -1;
- }
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
-
- pos_parm = strchr (pos, ' ');
- if (pos_parm)
- {
- pos_parm[0] = '\0';
- pos_parm++;
- while (pos_parm[0] == ' ')
- pos_parm++;
- pos2 = strchr (pos_parm, ' ');
- if (pos2)
- pos2[0] = '\0';
- }
-
- set_flag = '+';
-
- if (string_is_channel (arguments))
- {
- ptr_channel = channel_search (server, arguments);
- if (ptr_channel)
- {
- /* channel modes */
- while (pos && pos[0])
- {
- switch (pos[0])
- {
- case '+':
- set_flag = '+';
- break;
- case '-':
- set_flag = '-';
- break;
- case 'b':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "b", host,
- (set_flag == '+') ?
- _("sets ban on") :
- _("removes ban on"),
- pos_parm);
- /* TODO: change & redraw channel modes */
- break;
- case 'i':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "i", host,
- (set_flag == '+') ?
- _("sets invite-only channel flag") :
- _("removes invite-only channel flag"),
- NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 'l':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "l", host,
- (set_flag == '+') ?
- _("sets the user limit to") :
- _("removes user limit"),
- (set_flag == '+') ? pos_parm : NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 'm':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "m", host,
- (set_flag == '+') ?
- _("sets moderated channel flag") :
- _("removes moderated channel flag"),
- NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 'o':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "o", host,
- (set_flag == '+') ?
- _("gives channel operator status to") :
- _("removes channel operator status from"),
- pos_parm);
- ptr_nick = nick_search (ptr_channel, pos_parm);
- if (ptr_nick)
- {
- ptr_nick->is_op = (set_flag == '+') ? 1 : 0;
- nick_resort (ptr_channel, ptr_nick);
- gui_redraw_window_nick (ptr_channel->window);
- }
- break;
- /* TODO: remove this obsolete (?) channel flag? */
- case 'p':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "p", host,
- (set_flag == '+') ?
- _("sets private channel flag") :
- _("removes private channel flag"),
- NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 's':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "s", host,
- (set_flag == '+') ?
- _("sets secret channel flag") :
- _("removes secret channel flag"),
- NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 't':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "t", host,
- (set_flag == '+') ?
- _("sets topic protection") :
- _("removes topic protection"),
- NULL);
- /* TODO: change & redraw channel modes */
- break;
- case 'v':
- irc_display_mode (ptr_channel->window,
- arguments, set_flag, "v", host,
- (set_flag == '+') ?
- _("gives voice to") :
- _("removes voice from"),
- pos_parm);
-
- ptr_nick = nick_search (ptr_channel, pos_parm);
- if (ptr_nick)
- {
- ptr_nick->has_voice = (set_flag == '+') ? 1 : 0;
- nick_resort (ptr_channel, ptr_nick);
- gui_redraw_window_nick (ptr_channel->window);
- }
- break;
- }
- pos++;
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "mode");
- return -1;
- }
- }
- else
- {
- /* nickname modes */
- gui_printf (server->window, "(TODO!) nickname modes: channel=%s, args=%s\n", arguments, pos);
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_nick: 'nick' message received
- */
-
-int
-irc_cmd_recv_nick (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
- int nick_is_me;
-
- /* no host => we can't identify sender of message! */
- if (host == NULL)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without host\n"),
- WEECHAT_ERROR, "nick");
- return -1;
- }
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- for (ptr_channel = server->channels; ptr_channel;
- ptr_channel = ptr_channel->next_channel)
- {
- ptr_nick = nick_search (ptr_channel, host);
- if (ptr_nick)
- {
- nick_is_me = (strcmp (ptr_nick->nick, server->nick) == 0);
- nick_change (ptr_channel, ptr_nick, arguments);
- irc_display_prefix (ptr_channel->window, PREFIX_INFO);
- if (nick_is_me)
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- _("You are "));
- else
- {
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK,
- "%s", host);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, " is ");
- }
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- _("now known as "));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK,
- "%s\n",
- arguments);
- if (ptr_channel->window->win_nick)
- gui_redraw_window_nick (ptr_channel->window);
- }
- }
-
- if (strcmp (server->nick, host) == 0)
- {
- free (server->nick);
- server->nick = strdup (arguments);
- }
- gui_redraw_window_input (gui_current_window);
-
- return 0;
-}
-
-/*
- * irc_cmd_recv_notice: 'notice' message received
- */
-
-int
-irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
-
- if (host)
- {
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
- }
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- if (pos[0] == ':')
- pos++;
- }
- else
- {
- gui_printf (server->window,
- _("%s nickname not found for \"%s\" command\n"),
- 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';
- 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"));
- gui_printf_color (server->window, COLOR_WIN_CHAT_NICK, " %s", host);
- gui_printf_color (server->window, COLOR_WIN_CHAT, ": %s\n", pos);
- }
- else
- gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", pos);
- return 0;
-}
-
-/*
- * irc_cmd_recv_part: 'part' message received
- */
-
-int
-irc_cmd_recv_part (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos_args;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- /* no host => we can't identify sender of message! */
- if (!host || !arguments)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without host or channel\n"),
- WEECHAT_ERROR, "part");
- return -1;
- }
-
- pos_args = strchr (arguments, ' ');
- if (pos_args)
- {
- pos_args[0] = '\0';
- pos_args++;
- while (pos_args[0] == ' ')
- pos_args++;
- if (pos_args[0] == ':')
- pos_args++;
- }
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- ptr_channel = channel_search (server, arguments);
- if (ptr_channel)
- {
- ptr_nick = nick_search (ptr_channel, host);
- if (ptr_nick)
- {
- if (strcmp (ptr_nick->nick, server->nick) == 0)
- {
- /* part request was issued by local client */
- gui_window_free (ptr_channel->window);
- channel_free (server, ptr_channel);
- gui_redraw_window_status (gui_current_window);
- gui_redraw_window_input (gui_current_window);
- }
- else
- {
-
- /* remove nick from nick list and display message */
- nick_free (ptr_channel, ptr_nick);
- irc_display_prefix (ptr_channel->window, PREFIX_PART);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK, "%s ", host);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, "(");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_HOST, "%s", pos+1);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, ")");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _(" has left "));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s", ptr_channel->name);
- if (pos_args && pos_args[0])
- {
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, " (");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, "%s", pos_args);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, ")");
- }
- gui_printf (ptr_channel->window, "\n");
-
- /* redraw nick list if this is current window */
- if (ptr_channel->window->win_nick)
- gui_redraw_window_nick (ptr_channel->window);
- }
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "part");
- return -1;
- }
-
- return 0;
-}
-
-/*
- * irc_cmd_recv_ping: 'ping' command received
- */
-
-int
-irc_cmd_recv_ping (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
-
- (void)host;
- pos = strrchr (arguments, ' ');
- if (pos)
- pos[0] = '\0';
- server_sendf (server, "PONG :%s\r\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_recv_privmsg: 'privmsg' command received
- */
-
-int
-irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2, *host2;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
- struct utsname *buf;
-
- /* no host => we can't identify sender of message! */
- if (host == NULL)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without host\n"),
- WEECHAT_ERROR, "privmsg");
- return -1;
- }
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- {
- pos[0] = '\0';
- host2 = pos+1;
- }
- else
- host2 = host;
-
- /* receiver is a channel ? */
- if (string_is_channel (arguments))
- {
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- if (pos[0] == ':')
- pos++;
-
- ptr_channel = channel_search (server, arguments);
- if (ptr_channel)
- {
- if (strncmp (pos, "\01ACTION ", 8) == 0)
- {
- pos += 8;
- pos2 = strchr (pos, '\01');
- if (pos2)
- pos2[0] = '\0';
- irc_display_prefix (ptr_channel->window, PREFIX_ACTION_ME);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK, "%s", host);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, " %s\n", pos);
- }
- else
- {
- ptr_nick = nick_search (ptr_channel, host);
- if (ptr_nick)
- {
- irc_display_nick (ptr_channel->window, ptr_nick,
- MSG_TYPE_NICK, 1, 1, 0);
- gui_printf_color_type (ptr_channel->window,
- MSG_TYPE_MSG,
- COLOR_WIN_CHAT, "%s\n", pos);
- }
- else
- {
- gui_printf (server->window,
- _("%s nick not found for \"%s\" command\n"),
- WEECHAT_ERROR, "privmsg");
- return -1;
- }
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "privmsg");
- return -1;
- }
- }
- }
- else
- {
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- if (pos[0] == ':')
- pos++;
-
- if (strcmp (pos, "\01VERSION\01") == 0)
- {
- buf = (struct utsname *) malloc (sizeof (struct utsname));
- uname (buf);
- server_sendf (server,
- _("NOTICE %s :%sVERSION %s v%s"
- " compiled on %s, host \"%s\" is running "
- "%s %s / %s%s"),
- host, "\01", WEECHAT_NAME, WEECHAT_VERSION, __DATE__,
- &buf->nodename, &buf->sysname,
- &buf->release, &buf->machine, "\01\r\n");
- free (buf);
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, _("Received a "));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL, _("CTCP VERSION "));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, _("from"));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, " %s\n", host);
- }
- else
- {
- /* private message received */
- ptr_channel = channel_search (server, host);
- if (!ptr_channel)
- {
- 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);
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot parse \"%s\" command\n"),
- WEECHAT_ERROR, "privmsg");
- return -1;
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_quit: 'quit' command received
- */
-
-int
-irc_cmd_recv_quit (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- /* no host => we can't identify sender of message! */
- if (host == NULL)
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without host\n"),
- WEECHAT_ERROR, "quit");
- return -1;
- }
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- for (ptr_channel = server->channels; ptr_channel;
- ptr_channel = ptr_channel->next_channel)
- {
- if (ptr_channel->type == CHAT_PRIVATE)
- ptr_nick = NULL;
- else
- ptr_nick = nick_search (ptr_channel, host);
-
- if (ptr_nick || (strcmp (ptr_channel->name, host) == 0))
- {
- if (ptr_nick)
- nick_free (ptr_channel, ptr_nick);
- irc_display_prefix (ptr_channel->window, PREFIX_QUIT);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK, "%s ", host);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, "(");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_HOST, "%s", pos + 1);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, ") ");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _("has quit"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, " (");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, "%s",
- arguments);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, ")\n");
- if ((ptr_channel->window == gui_current_window) &&
- (ptr_channel->window->win_nick))
- gui_redraw_window_nick (ptr_channel->window);
- }
- }
-
- return 0;
-}
-
-/*
- * irc_cmd_recv_server_msg: command received from server (numeric)
- */
-
-int
-irc_cmd_recv_server_msg (t_irc_server *server, char *host, char *arguments)
-{
- /* make gcc happy */
- (void) host;
-
- /* skip nickname if at beginning of server message */
- if (strncmp (server->nick, arguments, strlen (server->nick)) == 0)
- {
- arguments += strlen (server->nick) + 1;
- while (arguments[0] == ' ')
- arguments++;
- }
-
- if (arguments[0] == ':')
- arguments++;
-
- /* display server message */
- irc_display_prefix (server->window, PREFIX_SERVER);
- gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_recv_server_reply: server reply
- */
-
-int
-irc_cmd_recv_server_reply (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
- int first;
-
- /* make gcc happy */
- (void) server;
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- else
- pos = arguments;
-
- irc_display_prefix (server->window, PREFIX_ERROR);
- first = 1;
-
- while (pos && pos[0])
- {
- pos2 = strchr (pos, ' ');
- if ((pos[0] == ':') || (!pos2))
- {
- if (pos[0] == ':')
- pos++;
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- "%s%s\n", (first) ? "" : ": ", pos);
- pos = NULL;
- }
- else
- {
- pos2[0] = '\0';
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s%s",
- (first) ? "" : " ", pos);
- first = 0;
- pos = pos2 + 1;
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_topic: 'topic' command received
- */
-
-int
-irc_cmd_recv_topic (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
- t_irc_channel *ptr_channel;
- t_gui_window *window;
-
- /* make gcc happy */
- (void) host;
-
- /* keep only nick name from host */
- pos = strchr (host, '!');
- if (pos)
- pos[0] = '\0';
-
- if (!string_is_channel (arguments))
- {
- gui_printf (server->window,
- _("%s \"%s\" command received without channel\n"),
- WEECHAT_ERROR, "topic");
- return -1;
- }
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- if (pos[0] == ':')
- pos++;
- if (!pos[0])
- pos = NULL;
- }
-
- ptr_channel = channel_search (server, arguments);
- window = (ptr_channel) ? ptr_channel->window : server->window;
-
- irc_display_prefix (window, PREFIX_INFO);
- gui_printf_color (window,
- COLOR_WIN_CHAT_NICK, "%s",
- host);
- if (pos)
- {
- gui_printf_color (window,
- COLOR_WIN_CHAT, _(" has changed topic for "));
- gui_printf_color (window,
- COLOR_WIN_CHAT_CHANNEL, "%s",
- arguments);
- gui_printf_color (window,
- COLOR_WIN_CHAT, _(" to: \"%s\"\n"),
- pos);
- }
- else
- {
- gui_printf_color (window,
- COLOR_WIN_CHAT, _(" has unset topic for "));
- gui_printf_color (window,
- COLOR_WIN_CHAT_CHANNEL, "%s\n",
- arguments);
- }
-
- if (ptr_channel)
- {
- if (ptr_channel->topic)
- free (ptr_channel->topic);
- if (pos)
- ptr_channel->topic = strdup (pos);
- else
- ptr_channel->topic = strdup ("");
- gui_redraw_window_title (ptr_channel->window);
- }
-
- return 0;
-}
-
-/*
- * irc_cmd_recv_004: '004' command (connected to irc server)
- */
-
-int
-irc_cmd_recv_004 (t_irc_server *server, char *host, char *arguments)
-{
- /* make gcc happy */
- (void) host;
- (void) arguments;
-
- irc_cmd_recv_server_msg (server, host, arguments);
-
- /* connection to IRC server is ok! */
- server->is_connected = 1;
- gui_redraw_window_status (server->window);
- gui_redraw_window_input (server->window);
-
- /* execute command once connected */
- if (server->command && server->command[0])
- user_command(server, server->command);
-
- /* autojoin */
- if (server->autojoin && server->autojoin[0])
- return irc_cmd_send_join (server, server->autojoin);
-
- return 0;
-}
-
-/*
- * irc_cmd_recv_311: '311' command (away message)
- */
-
-int
-irc_cmd_recv_301 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_message;
-
- /* make gcc happy */
- (void) server;
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_message = strchr (pos_nick, ' ');
- if (pos_message)
- {
- pos_message[0] = '\0';
- pos_message++;
- while (pos_message[0] == ' ')
- pos_message++;
- if (pos_message[0] == ':')
- pos_message++;
-
- irc_display_prefix (gui_current_window, PREFIX_INFO);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT, _(" is away: %s\n"), pos_message);
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_311: '311' command (whois, user)
- */
-
-int
-irc_cmd_recv_311 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_user, *pos_host, *pos_realname;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_user = strchr (pos_nick, ' ');
- if (pos_user)
- {
- pos_user[0] = '\0';
- pos_user++;
- while (pos_user[0] == ' ')
- pos_user++;
- pos_host = strchr (pos_user, ' ');
- if (pos_host)
- {
- pos_host[0] = '\0';
- pos_host++;
- while (pos_host[0] == ' ')
- pos_host++;
- pos_realname = strchr (pos_host, ' ');
- if (pos_realname)
- {
- pos_realname[0] = '\0';
- pos_realname++;
- while (pos_realname[0] == ' ')
- pos_realname++;
- if (pos_realname[0] == '*')
- pos_realname++;
- while (pos_realname[0] == ' ')
- pos_realname++;
- if (pos_realname[0] == ':')
- pos_realname++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] (");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_HOST, "%s@%s",
- pos_user, pos_host);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, ")");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, ": %s\n", pos_realname);
- }
- }
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_312: '312' command (whois, server)
- */
-
-int
-irc_cmd_recv_312 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_server, *pos_serverinfo;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_server = strchr (pos_nick, ' ');
- if (pos_server)
- {
- pos_server[0] = '\0';
- pos_server++;
- while (pos_server[0] == ' ')
- pos_server++;
- pos_serverinfo = strchr (pos_server, ' ');
- if (pos_serverinfo)
- {
- pos_serverinfo[0] = '\0';
- pos_serverinfo++;
- while (pos_serverinfo[0] == ' ')
- pos_serverinfo++;
- if (pos_serverinfo[0] == ':')
- pos_serverinfo++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, "%s ", pos_server);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "(");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, "%s", pos_serverinfo);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, ")\n");
- }
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_313: '313' command (whois, operator)
- */
-
-int
-irc_cmd_recv_313 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_message;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_message = strchr (pos_nick, ' ');
- if (pos_message)
- {
- pos_message[0] = '\0';
- pos_message++;
- while (pos_message[0] == ' ')
- pos_message++;
- if (pos_message[0] == ':')
- pos_message++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, "%s\n", pos_message);
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_317: '317' command (whois, idle)
- */
-
-int
-irc_cmd_recv_317 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_idle, *pos_signon, *pos_message;
- int idle_time, day, hour, min, sec;
- time_t datetime;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_idle = strchr (pos_nick, ' ');
- if (pos_idle)
- {
- pos_idle[0] = '\0';
- pos_idle++;
- while (pos_idle[0] == ' ')
- pos_idle++;
- pos_signon = strchr (pos_idle, ' ');
- if (pos_signon)
- {
- pos_signon[0] = '\0';
- pos_signon++;
- while (pos_signon[0] == ' ')
- pos_signon++;
- pos_message = strchr (pos_signon, ' ');
- if (pos_message)
- {
- pos_message[0] = '\0';
-
- idle_time = atoi (pos_idle);
- day = idle_time / (60 * 60 * 24);
- hour = (idle_time % (60 * 60 * 24)) / (60 * 60);
- min = ((idle_time % (60 * 60 * 24)) % (60 * 60)) / 60;
- sec = ((idle_time % (60 * 60 * 24)) % (60 * 60)) % 60;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, _("idle: "));
- if (day > 0)
- {
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", day);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- (day > 1) ? _("days") : _("day"));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- ", ");
- }
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%02d ", hour);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- (hour > 1) ? _("hours") : _("hour"));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- " %02d ", min);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- (min > 1) ? _("minutes") : _("minute"));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- " %02d ", sec);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- (sec > 1) ? _("seconds") : _("second"));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT,
- ", ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, _("signon at: "));
- datetime = (time_t)(atol (pos_signon));
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s", ctime (&datetime));
- }
- }
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_318: '318' command (whois, end)
- */
-
-int
-irc_cmd_recv_318 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_message;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_message = strchr (pos_nick, ' ');
- if (pos_message)
- {
- pos_message[0] = '\0';
- pos_message++;
- while (pos_message[0] == ' ')
- pos_message++;
- if (pos_message[0] == ':')
- pos_message++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, "%s\n", pos_message);
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_319: '319' command (whois, end)
- */
-
-int
-irc_cmd_recv_319 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_channel, *pos;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_channel = strchr (pos_nick, ' ');
- if (pos_channel)
- {
- pos_channel[0] = '\0';
- pos_channel++;
- while (pos_channel[0] == ' ')
- pos_channel++;
- if (pos_channel[0] == ':')
- pos_channel++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, _("Channels: "));
-
- while (pos_channel && pos_channel[0])
- {
- if (pos_channel[0] == '@')
- {
- gui_printf_color (server->window,
- COLOR_WIN_NICK_OP, "@");
- pos_channel++;
- }
- else
- {
- if (pos_channel[0] == '%')
- {
- gui_printf_color (server->window,
- COLOR_WIN_NICK_HALFOP, "%");
- pos_channel++;
- }
- else
- if (pos_channel[0] == '+')
- {
- gui_printf_color (server->window,
- COLOR_WIN_NICK_VOICE, "+");
- pos_channel++;
- }
- }
- pos = strchr (pos_channel, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s%s",
- pos_channel,
- (pos && pos[0]) ? " " : "\n");
- pos_channel = pos;
- }
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_320: '320' command (whois, identified user)
- */
-
-int
-irc_cmd_recv_320 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_nick, *pos_message;
-
- /* make gcc happy */
- (void) host;
-
- pos_nick = strchr (arguments, ' ');
- if (pos_nick)
- {
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_message = strchr (pos_nick, ' ');
- if (pos_message)
- {
- pos_message[0] = '\0';
- pos_message++;
- while (pos_message[0] == ' ')
- pos_message++;
- if (pos_message[0] == ':')
- pos_message++;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "[");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- gui_printf_color (server->window,
- COLOR_WIN_CHAT_DARK, "] ");
- gui_printf_color (server->window,
- COLOR_WIN_CHAT, "%s\n", pos_message);
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_321: '321' command (/list start)
- */
-
-int
-irc_cmd_recv_321 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
-
- /* make gcc happy */
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- else
- pos = arguments;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf (server->window, "%s\n", pos);
- return 0;
-}
-
-/*
- * irc_cmd_recv_322: '322' command (channel for /list)
- */
-
-int
-irc_cmd_recv_322 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
-
- /* make gcc happy */
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- else
- pos = arguments;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf (server->window, "%s\n", pos);
- return 0;
-}
-
-/*
- * irc_cmd_recv_323: '323' command (/list end)
- */
-
-int
-irc_cmd_recv_323 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
-
- /* make gcc happy */
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- }
- else
- pos = arguments;
-
- irc_display_prefix (server->window, PREFIX_INFO);
- gui_printf (server->window, "%s\n", pos);
- return 0;
-}
-
-/*
- * irc_cmd_recv_331: '331' command received (no topic for channel)
- */
-
-int
-irc_cmd_recv_331 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos;
-
- /* make gcc happy */
- (void) server;
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- pos[0] = '\0';
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT, _("No topic set for "));
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT_CHANNEL, "%s\n", arguments);
- return 0;
-}
-
-/*
- * irc_cmd_recv_332: '332' command received (topic of channel)
- */
-
-int
-irc_cmd_recv_332 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
- t_irc_channel *ptr_channel;
-
- /* make gcc happy */
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- while (pos[0] == ' ')
- pos++;
- pos2 = strchr (pos, ' ');
- if (pos2)
- {
- pos2[0] = '\0';
- ptr_channel = channel_search (server, pos);
- if (ptr_channel)
- {
- pos2++;
- while (pos2[0] == ' ')
- pos2++;
- if (pos2[0] == ':')
- pos2++;
- if (ptr_channel->topic)
- free (ptr_channel->topic);
- ptr_channel->topic = strdup (pos2);
-
- irc_display_prefix (ptr_channel->window, PREFIX_INFO);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _("Topic for "));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL, "%s", pos);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _(" is: \"%s\"\n"), pos2);
-
- gui_redraw_window_title (ptr_channel->window);
- }
- else
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "332");
- return -1;
- }
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot identify channel for \"%s\" command\n"),
- WEECHAT_ERROR, "332");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_333: '333' command received (infos about topic (nick / date)
- */
-
-int
-irc_cmd_recv_333 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos_channel, *pos_nick, *pos_date;
- t_irc_channel *ptr_channel;
- time_t datetime;
-
- /* make gcc happy */
- (void) host;
-
- pos_channel = strchr (arguments, ' ');
- if (pos_channel)
- {
- while (pos_channel[0] == ' ')
- pos_channel++;
- pos_nick = strchr (pos_channel, ' ');
- if (pos_nick)
- {
- pos_nick[0] = '\0';
- pos_nick++;
- while (pos_nick[0] == ' ')
- pos_nick++;
- pos_date = strchr (pos_nick, ' ');
- if (pos_date)
- {
- pos_date[0] = '\0';
- pos_date++;
- while (pos_date[0] == ' ')
- pos_date++;
-
- ptr_channel = channel_search (server, pos_channel);
- if (ptr_channel)
- {
- irc_display_prefix (ptr_channel->window, PREFIX_INFO);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _("Topic set by "));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_NICK, "%s", pos_nick);
- datetime = (time_t)(atol (pos_date));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, ", %s", ctime (&datetime));
- }
- else
- {
- gui_printf (server->window,
- _("%s channel not found for \"%s\" command\n"),
- WEECHAT_ERROR, "333");
- return -1;
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot identify date/time for \"%s\" command\n"),
- WEECHAT_ERROR, "333");
- return -1;
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot identify nickname for \"%s\" command\n"),
- WEECHAT_ERROR, "333");
- return -1;
- }
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot identify channel for \"%s\" command\n"),
- WEECHAT_ERROR, "333");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_351: '351' command received (server version)
- */
-
-int
-irc_cmd_recv_351 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
-
- /* make gcc happy */
- (void) server;
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- }
- else
- pos = arguments;
-
- pos2 = strstr (pos, " :");
- if (pos2)
- {
- pos2[0] = '\0';
- pos2 += 2;
- }
-
- irc_display_prefix (server->window, PREFIX_SERVER);
- if (pos2)
- gui_printf (server->window, "%s %s\n", pos, pos2);
- else
- gui_printf (server->window, "%s\n", pos);
- return 0;
-}
-
-/*
- * irc_cmd_recv_353: '353' command received (list of users on a channel)
- */
-
-int
-irc_cmd_recv_353 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos_nick;
- int is_op, is_halfop, has_voice;
- t_irc_channel *ptr_channel;
-
- /* make gcc happy */
- (void) host;
-
- pos = strstr (arguments, " = ");
- if (pos)
- arguments = pos + 3;
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
-
- ptr_channel = channel_search (server, arguments);
- if (!ptr_channel)
- return 0;
-
- pos++;
- while (pos[0] == ' ')
- pos++;
- if (pos[0] != ':')
- {
- gui_printf (server->window,
- _("%s cannot parse \"%s\" command\n"),
- WEECHAT_ERROR, "353");
- return -1;
- }
- pos++;
- if (pos[0])
- {
- while (pos && pos[0])
- {
- is_op = 0;
- is_halfop = 0;
- has_voice = 0;
- while ((pos[0] == '@') || (pos[0] == '%') || (pos[0] == '+'))
- {
- if (pos[0] == '@')
- is_op = 1;
- if (pos[0] == '%')
- is_halfop = 1;
- if (pos[0] == '+')
- has_voice = 1;
- pos++;
- }
- pos_nick = pos;
- pos = strchr (pos, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- }
- if (!nick_new (ptr_channel, pos_nick, is_op, is_halfop, has_voice))
- gui_printf (server->window,
- _("%s cannot create nick \"%s\" for channel \"%s\"\n"),
- WEECHAT_ERROR, pos_nick, ptr_channel->name);
- }
- }
- gui_redraw_window_nick (ptr_channel->window);
- }
- else
- {
- gui_printf (server->window,
- _("%s cannot parse \"%s\" command\n"),
- WEECHAT_ERROR, "353");
- return -1;
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_366: '366' command received (end of /names list)
- */
-
-int
-irc_cmd_recv_366 (t_irc_server *server, char *host, char *arguments)
-{
- char *pos, *pos2;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
- int num_nicks, num_op, num_halfop, num_voice, num_normal;
-
- /* make gcc happy */
- (void) host;
-
- pos = strchr (arguments, ' ');
- if (pos)
- {
- while (pos[0] == ' ')
- pos++;
- pos2 = strchr (pos, ' ');
- if (pos2)
- {
- pos2[0] = '\0';
- pos2++;
- while (pos2[0] == ' ')
- pos2++;
- if (pos2[0] == ':')
- pos2++;
-
- ptr_channel = channel_search (server, pos);
- if (ptr_channel)
- {
-
- /* display users on channel */
- irc_display_prefix (ptr_channel->window, PREFIX_INFO);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
- _("Nicks "));
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
- "%s", ptr_channel->name);
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT, ": ");
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, "[");
-
- for (ptr_nick = ptr_channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick)
- {
- irc_display_nick (ptr_channel->window, ptr_nick,
- MSG_TYPE_INFO, 0, 0, 1);
- if (ptr_nick != ptr_channel->last_nick)
- gui_printf (ptr_channel->window, " ");
- }
- gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, "]\n");
-
- /* display number of nicks, ops, halfops & voices on the channel */
- nick_count (ptr_channel, &num_nicks, &num_op, &num_halfop, &num_voice,
- &num_normal);
- irc_display_prefix (ptr_channel->window, PREFIX_INFO);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, _("Channel "));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%s", ptr_channel->name);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT, ": ");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", num_nicks);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- (num_nicks > 1) ? _("nicks") : _("nick"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, " (");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", num_op);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- (num_op > 1) ? _("ops") : _("op"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- ", ");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", num_halfop);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- (num_halfop > 1) ? _("halfops") : _("halfop"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- ", ");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", num_voice);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- (num_voice > 1) ? _("voices") : _("voice"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- ", ");
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_CHANNEL,
- "%d ", num_normal);
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT,
- _("normal"));
- gui_printf_color (ptr_channel->window,
- COLOR_WIN_CHAT_DARK, ")\n");
- }
- else
- {
- irc_display_prefix (gui_current_window, PREFIX_INFO);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT_CHANNEL, pos);
- gui_printf_color (gui_current_window,
- COLOR_WIN_CHAT, ": %s\n", pos2);
- return 0;
- }
- }
- }
- return 0;
-}
-
-/*
- * irc_cmd_recv_433: '433' command received (nickname already in use)
- */
-
-int
-irc_cmd_recv_433 (t_irc_server *server, char *host, char *arguments)
-{
- char hostname[128];
-
- if (!server->is_connected)
- {
- if (strcmp (server->nick, server->nick1) == 0)
- {
- gui_printf (server->window,
- _("%s: nickname \"%s\" is already in use, "
- "trying 2nd nickname \"%s\"\n"),
- WEECHAT_NAME, server->nick, server->nick2);
- free (server->nick);
- server->nick = strdup (server->nick2);
- }
- else
- {
- if (strcmp (server->nick, server->nick2) == 0)
- {
- gui_printf (server->window,
- _("%s: nickname \"%s\" is already in use, "
- "trying 3rd nickname \"%s\"\n"),
- WEECHAT_NAME, server->nick, server->nick3);
- free (server->nick);
- server->nick = strdup (server->nick3);
- }
- else
- {
- gui_printf (server->window,
- _("%s: all declared nicknames are already in use, "
- "closing connection with server!\n"),
- WEECHAT_NAME);
- server_disconnect (server);
- return 0;
- }
- }
-
- gethostname (hostname, sizeof (hostname) - 1);
- hostname[sizeof (hostname) - 1] = '\0';
- if (!hostname[0])
- strcpy (hostname, _("unknown"));
- server_sendf (server,
- "NICK %s\r\n",
- server->nick);
- }
- else
- return irc_cmd_recv_error (server, host, arguments);
- return 0;
-}
diff --git a/weechat/src/irc/irc-recv.c b/weechat/src/irc/irc-recv.c
new file mode 100644
index 000000000..4404b6682
--- /dev/null
+++ b/weechat/src/irc/irc-recv.c
@@ -0,0 +1,2113 @@
+/*
+ * Copyright (c) 2003 by FlashCode <flashcode@flashtux.org>
+ * Bounga <bounga@altern.org>
+ * Xahlexx <xahlexx@tuxisland.org>
+ * See README for License detail.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+/* irc-recv.c: implementation of IRC commands (server to client),
+ according to RFC 1459,2810,2811,2812 */
+
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <sys/utsname.h>
+
+#include "../weechat.h"
+#include "irc.h"
+#include "../command.h"
+#include "../config.h"
+#include "../gui/gui.h"
+
+
+/*
+ * irc_recv_command: executes action when receiving IRC command
+ * returns: 0 = all ok, command executed
+ * -1 = command failed
+ * -2 = no command to execute
+ * -3 = command not found
+ */
+
+int
+irc_recv_command (t_irc_server *server,
+ char *host, char *command, char *arguments)
+{
+ int i, cmd_found;
+
+ if (command == NULL)
+ return -2;
+
+ /* looks for irc command */
+ cmd_found = -1;
+ for (i = 0; irc_commands[i].command_name; i++)
+ if (strcasecmp (irc_commands[i].command_name, command) == 0)
+ {
+ cmd_found = i;
+ break;
+ }
+
+ /* command not found */
+ if (cmd_found < 0)
+ return -3;
+
+ if (irc_commands[i].recv_function != NULL)
+ return (int) (irc_commands[i].recv_function) (server, host, arguments);
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_error: error received from server
+ */
+
+int
+irc_cmd_recv_error (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+ int first;
+
+ /* make gcc happy */
+ (void) server;
+ (void) host;
+
+ if (strncmp (arguments, "Closing Link", 12) == 0)
+ {
+ server_disconnect (server);
+ return 0;
+ }
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ irc_display_prefix (server->window, PREFIX_ERROR);
+ first = 1;
+
+ while (pos && pos[0])
+ {
+ pos2 = strchr (pos, ' ');
+ if ((pos[0] == ':') || (!pos2))
+ {
+ if (pos[0] == ':')
+ pos++;
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ "%s%s\n", (first) ? "" : ": ", pos);
+ pos = NULL;
+ }
+ else
+ {
+ pos2[0] = '\0';
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s%s",
+ (first) ? "" : " ", pos);
+ first = 0;
+ pos = pos2 + 1;
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_join: 'join' message received
+ */
+
+int
+irc_cmd_recv_join (t_irc_server *server, char *host, char *arguments)
+{
+ t_irc_channel *ptr_channel;
+ char *pos;
+
+ ptr_channel = channel_search (server, arguments);
+ if (!ptr_channel)
+ {
+ ptr_channel = channel_new (server, CHAT_CHANNEL, arguments);
+ if (!ptr_channel)
+ {
+ gui_printf (server->window,
+ _("%s cannot create new channel \"%s\"\n"),
+ WEECHAT_ERROR, arguments);
+ return -1;
+ }
+ }
+
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ irc_display_prefix (ptr_channel->window, PREFIX_JOIN);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
+ "%s ", host);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
+ "(");
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_HOST,
+ "%s", pos + 1);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
+ ")");
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
+ _(" has joined "));
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
+ "%s\n", arguments);
+ nick_new (ptr_channel, host, 0, 0, 0);
+ gui_redraw_window_nick (gui_current_window);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_kick: 'kick' message received
+ */
+
+int
+irc_cmd_recv_kick (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos_nick, *pos_comment;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ pos_nick[0] = '\0';
+ pos_nick++;
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+
+ pos_comment = strchr (pos_nick, ' ');
+ if (pos_comment)
+ {
+ pos_comment[0] = '\0';
+ pos_comment++;
+ while (pos_comment[0] == ' ')
+ pos_comment++;
+ if (pos_comment[0] == ':')
+ pos_comment++;
+ }
+
+ ptr_channel = channel_search (server, arguments);
+ if (!ptr_channel)
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "kick");
+ return -1;
+ }
+
+ irc_display_prefix (ptr_channel->window, PREFIX_PART);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
+ "%s", host);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
+ _(" has kicked "));
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK,
+ "%s", pos_nick);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
+ _(" from "));
+ if (pos_comment)
+ {
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
+ "%s ", arguments);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
+ "(");
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
+ "%s", pos_comment);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK,
+ ")\n");
+ }
+ else
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
+ "%s\n", arguments);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s nick not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "kick");
+ return -1;
+ }
+ ptr_nick = nick_search (ptr_channel, pos_nick);
+ if (ptr_nick)
+ {
+ nick_free (ptr_channel, ptr_nick);
+ gui_redraw_window_nick (gui_current_window);
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_mode: 'mode' message received
+ */
+
+int
+irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2, *pos_parm;
+ char set_flag;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+
+ /* no host => we can't identify sender of message! */
+ if (host == NULL)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without host\n"),
+ WEECHAT_ERROR, "mode");
+ return -1;
+ }
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ pos = strchr (arguments, ' ');
+ if (!pos)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without channel or nickname\n"),
+ WEECHAT_ERROR, "mode");
+ return -1;
+ }
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+
+ pos_parm = strchr (pos, ' ');
+ if (pos_parm)
+ {
+ pos_parm[0] = '\0';
+ pos_parm++;
+ while (pos_parm[0] == ' ')
+ pos_parm++;
+ pos2 = strchr (pos_parm, ' ');
+ if (pos2)
+ pos2[0] = '\0';
+ }
+
+ set_flag = '+';
+
+ if (string_is_channel (arguments))
+ {
+ ptr_channel = channel_search (server, arguments);
+ if (ptr_channel)
+ {
+ /* channel modes */
+ while (pos && pos[0])
+ {
+ switch (pos[0])
+ {
+ case '+':
+ set_flag = '+';
+ break;
+ case '-':
+ set_flag = '-';
+ break;
+ case 'b':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "b", host,
+ (set_flag == '+') ?
+ _("sets ban on") :
+ _("removes ban on"),
+ pos_parm);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 'i':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "i", host,
+ (set_flag == '+') ?
+ _("sets invite-only channel flag") :
+ _("removes invite-only channel flag"),
+ NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 'l':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "l", host,
+ (set_flag == '+') ?
+ _("sets the user limit to") :
+ _("removes user limit"),
+ (set_flag == '+') ? pos_parm : NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 'm':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "m", host,
+ (set_flag == '+') ?
+ _("sets moderated channel flag") :
+ _("removes moderated channel flag"),
+ NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 'o':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "o", host,
+ (set_flag == '+') ?
+ _("gives channel operator status to") :
+ _("removes channel operator status from"),
+ pos_parm);
+ ptr_nick = nick_search (ptr_channel, pos_parm);
+ if (ptr_nick)
+ {
+ ptr_nick->is_op = (set_flag == '+') ? 1 : 0;
+ nick_resort (ptr_channel, ptr_nick);
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ break;
+ /* TODO: remove this obsolete (?) channel flag? */
+ case 'p':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "p", host,
+ (set_flag == '+') ?
+ _("sets private channel flag") :
+ _("removes private channel flag"),
+ NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 's':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "s", host,
+ (set_flag == '+') ?
+ _("sets secret channel flag") :
+ _("removes secret channel flag"),
+ NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 't':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "t", host,
+ (set_flag == '+') ?
+ _("sets topic protection") :
+ _("removes topic protection"),
+ NULL);
+ /* TODO: change & redraw channel modes */
+ break;
+ case 'v':
+ irc_display_mode (ptr_channel->window,
+ arguments, set_flag, "v", host,
+ (set_flag == '+') ?
+ _("gives voice to") :
+ _("removes voice from"),
+ pos_parm);
+
+ ptr_nick = nick_search (ptr_channel, pos_parm);
+ if (ptr_nick)
+ {
+ ptr_nick->has_voice = (set_flag == '+') ? 1 : 0;
+ nick_resort (ptr_channel, ptr_nick);
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ break;
+ }
+ pos++;
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "mode");
+ return -1;
+ }
+ }
+ else
+ {
+ /* nickname modes */
+ gui_printf (server->window, "(TODO!) nickname modes: channel=%s, args=%s\n", arguments, pos);
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_nick: 'nick' message received
+ */
+
+int
+irc_cmd_recv_nick (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+ int nick_is_me;
+
+ /* no host => we can't identify sender of message! */
+ if (host == NULL)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without host\n"),
+ WEECHAT_ERROR, "nick");
+ return -1;
+ }
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ for (ptr_channel = server->channels; ptr_channel;
+ ptr_channel = ptr_channel->next_channel)
+ {
+ ptr_nick = nick_search (ptr_channel, host);
+ if (ptr_nick)
+ {
+ nick_is_me = (strcmp (ptr_nick->nick, server->nick) == 0);
+ nick_change (ptr_channel, ptr_nick, arguments);
+ irc_display_prefix (ptr_channel->window, PREFIX_INFO);
+ if (nick_is_me)
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ _("You are "));
+ else
+ {
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK,
+ "%s", host);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, " is ");
+ }
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ _("now known as "));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK,
+ "%s\n",
+ arguments);
+ if (ptr_channel->window->win_nick)
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ }
+
+ if (strcmp (server->nick, host) == 0)
+ {
+ free (server->nick);
+ server->nick = strdup (arguments);
+ }
+ gui_redraw_window_input (gui_current_window);
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_notice: 'notice' message received
+ */
+
+int
+irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+
+ if (host)
+ {
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+ }
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ if (pos[0] == ':')
+ pos++;
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s nickname not found for \"%s\" command\n"),
+ 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';
+ 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"));
+ gui_printf_color (server->window, COLOR_WIN_CHAT_NICK, " %s", host);
+ gui_printf_color (server->window, COLOR_WIN_CHAT, ": %s\n", pos);
+ }
+ else
+ gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", pos);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_part: 'part' message received
+ */
+
+int
+irc_cmd_recv_part (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos_args;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+
+ /* no host => we can't identify sender of message! */
+ if (!host || !arguments)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without host or channel\n"),
+ WEECHAT_ERROR, "part");
+ return -1;
+ }
+
+ pos_args = strchr (arguments, ' ');
+ if (pos_args)
+ {
+ pos_args[0] = '\0';
+ pos_args++;
+ while (pos_args[0] == ' ')
+ pos_args++;
+ if (pos_args[0] == ':')
+ pos_args++;
+ }
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ ptr_channel = channel_search (server, arguments);
+ if (ptr_channel)
+ {
+ ptr_nick = nick_search (ptr_channel, host);
+ if (ptr_nick)
+ {
+ if (strcmp (ptr_nick->nick, server->nick) == 0)
+ {
+ /* part request was issued by local client */
+ gui_window_free (ptr_channel->window);
+ channel_free (server, ptr_channel);
+ gui_redraw_window_status (gui_current_window);
+ gui_redraw_window_input (gui_current_window);
+ }
+ else
+ {
+
+ /* remove nick from nick list and display message */
+ nick_free (ptr_channel, ptr_nick);
+ irc_display_prefix (ptr_channel->window, PREFIX_PART);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK, "%s ", host);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, "(");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_HOST, "%s", pos+1);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, ")");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _(" has left "));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s", ptr_channel->name);
+ if (pos_args && pos_args[0])
+ {
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, " (");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, "%s", pos_args);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, ")");
+ }
+ gui_printf (ptr_channel->window, "\n");
+
+ /* redraw nick list if this is current window */
+ if (ptr_channel->window->win_nick)
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "part");
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_ping: 'ping' command received
+ */
+
+int
+irc_cmd_recv_ping (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+
+ (void)host;
+ pos = strrchr (arguments, ' ');
+ if (pos)
+ pos[0] = '\0';
+ server_sendf (server, "PONG :%s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_privmsg: 'privmsg' command received
+ */
+
+int
+irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2, *host2;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+ struct utsname *buf;
+
+ /* no host => we can't identify sender of message! */
+ if (host == NULL)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without host\n"),
+ WEECHAT_ERROR, "privmsg");
+ return -1;
+ }
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ {
+ pos[0] = '\0';
+ host2 = pos+1;
+ }
+ else
+ host2 = host;
+
+ /* receiver is a channel ? */
+ if (string_is_channel (arguments))
+ {
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ if (pos[0] == ':')
+ pos++;
+
+ ptr_channel = channel_search (server, arguments);
+ if (ptr_channel)
+ {
+ if (strncmp (pos, "\01ACTION ", 8) == 0)
+ {
+ pos += 8;
+ pos2 = strchr (pos, '\01');
+ if (pos2)
+ pos2[0] = '\0';
+ irc_display_prefix (ptr_channel->window, PREFIX_ACTION_ME);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK, "%s", host);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, " %s\n", pos);
+ }
+ else
+ {
+ ptr_nick = nick_search (ptr_channel, host);
+ if (ptr_nick)
+ {
+ irc_display_nick (ptr_channel->window, ptr_nick,
+ MSG_TYPE_NICK, 1, 1, 0);
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_MSG,
+ COLOR_WIN_CHAT, "%s\n", pos);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s nick not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "privmsg");
+ return -1;
+ }
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "privmsg");
+ return -1;
+ }
+ }
+ }
+ else
+ {
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ if (pos[0] == ':')
+ pos++;
+
+ if (strcmp (pos, "\01VERSION\01") == 0)
+ {
+ buf = (struct utsname *) malloc (sizeof (struct utsname));
+ uname (buf);
+ server_sendf (server,
+ _("NOTICE %s :%sVERSION %s v%s"
+ " compiled on %s, host \"%s\" is running "
+ "%s %s / %s%s"),
+ host, "\01", WEECHAT_NAME, WEECHAT_VERSION, __DATE__,
+ &buf->nodename, &buf->sysname,
+ &buf->release, &buf->machine, "\01\r\n");
+ free (buf);
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, _("Received a "));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL, _("CTCP VERSION "));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, _("from"));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, " %s\n", host);
+ }
+ else
+ {
+ /* private message received */
+ ptr_channel = channel_search (server, host);
+ if (!ptr_channel)
+ {
+ 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);
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot parse \"%s\" command\n"),
+ WEECHAT_ERROR, "privmsg");
+ return -1;
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_quit: 'quit' command received
+ */
+
+int
+irc_cmd_recv_quit (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+
+ /* no host => we can't identify sender of message! */
+ if (host == NULL)
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without host\n"),
+ WEECHAT_ERROR, "quit");
+ return -1;
+ }
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ for (ptr_channel = server->channels; ptr_channel;
+ ptr_channel = ptr_channel->next_channel)
+ {
+ if (ptr_channel->type == CHAT_PRIVATE)
+ ptr_nick = NULL;
+ else
+ ptr_nick = nick_search (ptr_channel, host);
+
+ if (ptr_nick || (strcmp (ptr_channel->name, host) == 0))
+ {
+ if (ptr_nick)
+ nick_free (ptr_channel, ptr_nick);
+ irc_display_prefix (ptr_channel->window, PREFIX_QUIT);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK, "%s ", host);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, "(");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_HOST, "%s", pos + 1);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, ") ");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _("has quit"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, " (");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, "%s",
+ arguments);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, ")\n");
+ if ((ptr_channel->window == gui_current_window) &&
+ (ptr_channel->window->win_nick))
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_server_msg: command received from server (numeric)
+ */
+
+int
+irc_cmd_recv_server_msg (t_irc_server *server, char *host, char *arguments)
+{
+ /* make gcc happy */
+ (void) host;
+
+ /* skip nickname if at beginning of server message */
+ if (strncmp (server->nick, arguments, strlen (server->nick)) == 0)
+ {
+ arguments += strlen (server->nick) + 1;
+ while (arguments[0] == ' ')
+ arguments++;
+ }
+
+ if (arguments[0] == ':')
+ arguments++;
+
+ /* display server message */
+ irc_display_prefix (server->window, PREFIX_SERVER);
+ gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_server_reply: server reply
+ */
+
+int
+irc_cmd_recv_server_reply (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+ int first;
+
+ /* make gcc happy */
+ (void) server;
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ irc_display_prefix (server->window, PREFIX_ERROR);
+ first = 1;
+
+ while (pos && pos[0])
+ {
+ pos2 = strchr (pos, ' ');
+ if ((pos[0] == ':') || (!pos2))
+ {
+ if (pos[0] == ':')
+ pos++;
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ "%s%s\n", (first) ? "" : ": ", pos);
+ pos = NULL;
+ }
+ else
+ {
+ pos2[0] = '\0';
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s%s",
+ (first) ? "" : " ", pos);
+ first = 0;
+ pos = pos2 + 1;
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_topic: 'topic' command received
+ */
+
+int
+irc_cmd_recv_topic (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+ t_irc_channel *ptr_channel;
+ t_gui_window *window;
+
+ /* make gcc happy */
+ (void) host;
+
+ /* keep only nick name from host */
+ pos = strchr (host, '!');
+ if (pos)
+ pos[0] = '\0';
+
+ if (!string_is_channel (arguments))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command received without channel\n"),
+ WEECHAT_ERROR, "topic");
+ return -1;
+ }
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ if (pos[0] == ':')
+ pos++;
+ if (!pos[0])
+ pos = NULL;
+ }
+
+ ptr_channel = channel_search (server, arguments);
+ window = (ptr_channel) ? ptr_channel->window : server->window;
+
+ irc_display_prefix (window, PREFIX_INFO);
+ gui_printf_color (window,
+ COLOR_WIN_CHAT_NICK, "%s",
+ host);
+ if (pos)
+ {
+ gui_printf_color (window,
+ COLOR_WIN_CHAT, _(" has changed topic for "));
+ gui_printf_color (window,
+ COLOR_WIN_CHAT_CHANNEL, "%s",
+ arguments);
+ gui_printf_color (window,
+ COLOR_WIN_CHAT, _(" to: \"%s\"\n"),
+ pos);
+ }
+ else
+ {
+ gui_printf_color (window,
+ COLOR_WIN_CHAT, _(" has unset topic for "));
+ gui_printf_color (window,
+ COLOR_WIN_CHAT_CHANNEL, "%s\n",
+ arguments);
+ }
+
+ if (ptr_channel)
+ {
+ if (ptr_channel->topic)
+ free (ptr_channel->topic);
+ if (pos)
+ ptr_channel->topic = strdup (pos);
+ else
+ ptr_channel->topic = strdup ("");
+ gui_redraw_window_title (ptr_channel->window);
+ }
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_004: '004' command (connected to irc server)
+ */
+
+int
+irc_cmd_recv_004 (t_irc_server *server, char *host, char *arguments)
+{
+ /* make gcc happy */
+ (void) host;
+ (void) arguments;
+
+ irc_cmd_recv_server_msg (server, host, arguments);
+
+ /* connection to IRC server is ok! */
+ server->is_connected = 1;
+ gui_redraw_window_status (server->window);
+ gui_redraw_window_input (server->window);
+
+ /* execute command once connected */
+ if (server->command && server->command[0])
+ user_command(server, server->command);
+
+ /* autojoin */
+ if (server->autojoin && server->autojoin[0])
+ return irc_cmd_send_join (server, server->autojoin);
+
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_311: '311' command (away message)
+ */
+
+int
+irc_cmd_recv_301 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_message;
+
+ /* make gcc happy */
+ (void) server;
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_message = strchr (pos_nick, ' ');
+ if (pos_message)
+ {
+ pos_message[0] = '\0';
+ pos_message++;
+ while (pos_message[0] == ' ')
+ pos_message++;
+ if (pos_message[0] == ':')
+ pos_message++;
+
+ irc_display_prefix (gui_current_window, PREFIX_INFO);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT, _(" is away: %s\n"), pos_message);
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_311: '311' command (whois, user)
+ */
+
+int
+irc_cmd_recv_311 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_user, *pos_host, *pos_realname;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_user = strchr (pos_nick, ' ');
+ if (pos_user)
+ {
+ pos_user[0] = '\0';
+ pos_user++;
+ while (pos_user[0] == ' ')
+ pos_user++;
+ pos_host = strchr (pos_user, ' ');
+ if (pos_host)
+ {
+ pos_host[0] = '\0';
+ pos_host++;
+ while (pos_host[0] == ' ')
+ pos_host++;
+ pos_realname = strchr (pos_host, ' ');
+ if (pos_realname)
+ {
+ pos_realname[0] = '\0';
+ pos_realname++;
+ while (pos_realname[0] == ' ')
+ pos_realname++;
+ if (pos_realname[0] == '*')
+ pos_realname++;
+ while (pos_realname[0] == ' ')
+ pos_realname++;
+ if (pos_realname[0] == ':')
+ pos_realname++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] (");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_HOST, "%s@%s",
+ pos_user, pos_host);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, ")");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, ": %s\n", pos_realname);
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_312: '312' command (whois, server)
+ */
+
+int
+irc_cmd_recv_312 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_server, *pos_serverinfo;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_server = strchr (pos_nick, ' ');
+ if (pos_server)
+ {
+ pos_server[0] = '\0';
+ pos_server++;
+ while (pos_server[0] == ' ')
+ pos_server++;
+ pos_serverinfo = strchr (pos_server, ' ');
+ if (pos_serverinfo)
+ {
+ pos_serverinfo[0] = '\0';
+ pos_serverinfo++;
+ while (pos_serverinfo[0] == ' ')
+ pos_serverinfo++;
+ if (pos_serverinfo[0] == ':')
+ pos_serverinfo++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, "%s ", pos_server);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "(");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, "%s", pos_serverinfo);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, ")\n");
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_313: '313' command (whois, operator)
+ */
+
+int
+irc_cmd_recv_313 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_message;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_message = strchr (pos_nick, ' ');
+ if (pos_message)
+ {
+ pos_message[0] = '\0';
+ pos_message++;
+ while (pos_message[0] == ' ')
+ pos_message++;
+ if (pos_message[0] == ':')
+ pos_message++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, "%s\n", pos_message);
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_317: '317' command (whois, idle)
+ */
+
+int
+irc_cmd_recv_317 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_idle, *pos_signon, *pos_message;
+ int idle_time, day, hour, min, sec;
+ time_t datetime;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_idle = strchr (pos_nick, ' ');
+ if (pos_idle)
+ {
+ pos_idle[0] = '\0';
+ pos_idle++;
+ while (pos_idle[0] == ' ')
+ pos_idle++;
+ pos_signon = strchr (pos_idle, ' ');
+ if (pos_signon)
+ {
+ pos_signon[0] = '\0';
+ pos_signon++;
+ while (pos_signon[0] == ' ')
+ pos_signon++;
+ pos_message = strchr (pos_signon, ' ');
+ if (pos_message)
+ {
+ pos_message[0] = '\0';
+
+ idle_time = atoi (pos_idle);
+ day = idle_time / (60 * 60 * 24);
+ hour = (idle_time % (60 * 60 * 24)) / (60 * 60);
+ min = ((idle_time % (60 * 60 * 24)) % (60 * 60)) / 60;
+ sec = ((idle_time % (60 * 60 * 24)) % (60 * 60)) % 60;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, _("idle: "));
+ if (day > 0)
+ {
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", day);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ (day > 1) ? _("days") : _("day"));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ ", ");
+ }
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%02d ", hour);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ (hour > 1) ? _("hours") : _("hour"));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ " %02d ", min);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ (min > 1) ? _("minutes") : _("minute"));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ " %02d ", sec);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ (sec > 1) ? _("seconds") : _("second"));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT,
+ ", ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, _("signon at: "));
+ datetime = (time_t)(atol (pos_signon));
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s", ctime (&datetime));
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_318: '318' command (whois, end)
+ */
+
+int
+irc_cmd_recv_318 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_message;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_message = strchr (pos_nick, ' ');
+ if (pos_message)
+ {
+ pos_message[0] = '\0';
+ pos_message++;
+ while (pos_message[0] == ' ')
+ pos_message++;
+ if (pos_message[0] == ':')
+ pos_message++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, "%s\n", pos_message);
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_319: '319' command (whois, end)
+ */
+
+int
+irc_cmd_recv_319 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_channel, *pos;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_channel = strchr (pos_nick, ' ');
+ if (pos_channel)
+ {
+ pos_channel[0] = '\0';
+ pos_channel++;
+ while (pos_channel[0] == ' ')
+ pos_channel++;
+ if (pos_channel[0] == ':')
+ pos_channel++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, _("Channels: "));
+
+ while (pos_channel && pos_channel[0])
+ {
+ if (pos_channel[0] == '@')
+ {
+ gui_printf_color (server->window,
+ COLOR_WIN_NICK_OP, "@");
+ pos_channel++;
+ }
+ else
+ {
+ if (pos_channel[0] == '%')
+ {
+ gui_printf_color (server->window,
+ COLOR_WIN_NICK_HALFOP, "%");
+ pos_channel++;
+ }
+ else
+ if (pos_channel[0] == '+')
+ {
+ gui_printf_color (server->window,
+ COLOR_WIN_NICK_VOICE, "+");
+ pos_channel++;
+ }
+ }
+ pos = strchr (pos_channel, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s%s",
+ pos_channel,
+ (pos && pos[0]) ? " " : "\n");
+ pos_channel = pos;
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_320: '320' command (whois, identified user)
+ */
+
+int
+irc_cmd_recv_320 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_nick, *pos_message;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_nick = strchr (arguments, ' ');
+ if (pos_nick)
+ {
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_message = strchr (pos_nick, ' ');
+ if (pos_message)
+ {
+ pos_message[0] = '\0';
+ pos_message++;
+ while (pos_message[0] == ' ')
+ pos_message++;
+ if (pos_message[0] == ':')
+ pos_message++;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "[");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT_DARK, "] ");
+ gui_printf_color (server->window,
+ COLOR_WIN_CHAT, "%s\n", pos_message);
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_321: '321' command (/list start)
+ */
+
+int
+irc_cmd_recv_321 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf (server->window, "%s\n", pos);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_322: '322' command (channel for /list)
+ */
+
+int
+irc_cmd_recv_322 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf (server->window, "%s\n", pos);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_323: '323' command (/list end)
+ */
+
+int
+irc_cmd_recv_323 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf (server->window, "%s\n", pos);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_331: '331' command received (no topic for channel)
+ */
+
+int
+irc_cmd_recv_331 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos;
+
+ /* make gcc happy */
+ (void) server;
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ pos[0] = '\0';
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT, _("No topic set for "));
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT_CHANNEL, "%s\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_332: '332' command received (topic of channel)
+ */
+
+int
+irc_cmd_recv_332 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+ t_irc_channel *ptr_channel;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ while (pos[0] == ' ')
+ pos++;
+ pos2 = strchr (pos, ' ');
+ if (pos2)
+ {
+ pos2[0] = '\0';
+ ptr_channel = channel_search (server, pos);
+ if (ptr_channel)
+ {
+ pos2++;
+ while (pos2[0] == ' ')
+ pos2++;
+ if (pos2[0] == ':')
+ pos2++;
+ if (ptr_channel->topic)
+ free (ptr_channel->topic);
+ ptr_channel->topic = strdup (pos2);
+
+ irc_display_prefix (ptr_channel->window, PREFIX_INFO);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _("Topic for "));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL, "%s", pos);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _(" is: \"%s\"\n"), pos2);
+
+ gui_redraw_window_title (ptr_channel->window);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "332");
+ return -1;
+ }
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot identify channel for \"%s\" command\n"),
+ WEECHAT_ERROR, "332");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_333: '333' command received (infos about topic (nick / date)
+ */
+
+int
+irc_cmd_recv_333 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos_channel, *pos_nick, *pos_date;
+ t_irc_channel *ptr_channel;
+ time_t datetime;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos_channel = strchr (arguments, ' ');
+ if (pos_channel)
+ {
+ while (pos_channel[0] == ' ')
+ pos_channel++;
+ pos_nick = strchr (pos_channel, ' ');
+ if (pos_nick)
+ {
+ pos_nick[0] = '\0';
+ pos_nick++;
+ while (pos_nick[0] == ' ')
+ pos_nick++;
+ pos_date = strchr (pos_nick, ' ');
+ if (pos_date)
+ {
+ pos_date[0] = '\0';
+ pos_date++;
+ while (pos_date[0] == ' ')
+ pos_date++;
+
+ ptr_channel = channel_search (server, pos_channel);
+ if (ptr_channel)
+ {
+ irc_display_prefix (ptr_channel->window, PREFIX_INFO);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _("Topic set by "));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_NICK, "%s", pos_nick);
+ datetime = (time_t)(atol (pos_date));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, ", %s", ctime (&datetime));
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s channel not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "333");
+ return -1;
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot identify date/time for \"%s\" command\n"),
+ WEECHAT_ERROR, "333");
+ return -1;
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot identify nickname for \"%s\" command\n"),
+ WEECHAT_ERROR, "333");
+ return -1;
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot identify channel for \"%s\" command\n"),
+ WEECHAT_ERROR, "333");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_351: '351' command received (server version)
+ */
+
+int
+irc_cmd_recv_351 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+
+ /* make gcc happy */
+ (void) server;
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ }
+ else
+ pos = arguments;
+
+ pos2 = strstr (pos, " :");
+ if (pos2)
+ {
+ pos2[0] = '\0';
+ pos2 += 2;
+ }
+
+ irc_display_prefix (server->window, PREFIX_SERVER);
+ if (pos2)
+ gui_printf (server->window, "%s %s\n", pos, pos2);
+ else
+ gui_printf (server->window, "%s\n", pos);
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_353: '353' command received (list of users on a channel)
+ */
+
+int
+irc_cmd_recv_353 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos_nick;
+ int is_op, is_halfop, has_voice;
+ t_irc_channel *ptr_channel;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strstr (arguments, " = ");
+ if (pos)
+ arguments = pos + 3;
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+
+ ptr_channel = channel_search (server, arguments);
+ if (!ptr_channel)
+ return 0;
+
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ if (pos[0] != ':')
+ {
+ gui_printf (server->window,
+ _("%s cannot parse \"%s\" command\n"),
+ WEECHAT_ERROR, "353");
+ return -1;
+ }
+ pos++;
+ if (pos[0])
+ {
+ while (pos && pos[0])
+ {
+ is_op = 0;
+ is_halfop = 0;
+ has_voice = 0;
+ while ((pos[0] == '@') || (pos[0] == '%') || (pos[0] == '+'))
+ {
+ if (pos[0] == '@')
+ is_op = 1;
+ if (pos[0] == '%')
+ is_halfop = 1;
+ if (pos[0] == '+')
+ has_voice = 1;
+ pos++;
+ }
+ pos_nick = pos;
+ pos = strchr (pos, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ }
+ if (!nick_new (ptr_channel, pos_nick, is_op, is_halfop, has_voice))
+ gui_printf (server->window,
+ _("%s cannot create nick \"%s\" for channel \"%s\"\n"),
+ WEECHAT_ERROR, pos_nick, ptr_channel->name);
+ }
+ }
+ gui_redraw_window_nick (ptr_channel->window);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s cannot parse \"%s\" command\n"),
+ WEECHAT_ERROR, "353");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_366: '366' command received (end of /names list)
+ */
+
+int
+irc_cmd_recv_366 (t_irc_server *server, char *host, char *arguments)
+{
+ char *pos, *pos2;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+ int num_nicks, num_op, num_halfop, num_voice, num_normal;
+
+ /* make gcc happy */
+ (void) host;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ while (pos[0] == ' ')
+ pos++;
+ pos2 = strchr (pos, ' ');
+ if (pos2)
+ {
+ pos2[0] = '\0';
+ pos2++;
+ while (pos2[0] == ' ')
+ pos2++;
+ if (pos2[0] == ':')
+ pos2++;
+
+ ptr_channel = channel_search (server, pos);
+ if (ptr_channel)
+ {
+
+ /* display users on channel */
+ irc_display_prefix (ptr_channel->window, PREFIX_INFO);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT,
+ _("Nicks "));
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL,
+ "%s", ptr_channel->name);
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT, ": ");
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, "[");
+
+ for (ptr_nick = ptr_channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick)
+ {
+ irc_display_nick (ptr_channel->window, ptr_nick,
+ MSG_TYPE_INFO, 0, 0, 1);
+ if (ptr_nick != ptr_channel->last_nick)
+ gui_printf (ptr_channel->window, " ");
+ }
+ gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, "]\n");
+
+ /* display number of nicks, ops, halfops & voices on the channel */
+ nick_count (ptr_channel, &num_nicks, &num_op, &num_halfop, &num_voice,
+ &num_normal);
+ irc_display_prefix (ptr_channel->window, PREFIX_INFO);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, _("Channel "));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%s", ptr_channel->name);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT, ": ");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", num_nicks);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ (num_nicks > 1) ? _("nicks") : _("nick"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, " (");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", num_op);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ (num_op > 1) ? _("ops") : _("op"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ ", ");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", num_halfop);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ (num_halfop > 1) ? _("halfops") : _("halfop"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ ", ");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", num_voice);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ (num_voice > 1) ? _("voices") : _("voice"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ ", ");
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_CHANNEL,
+ "%d ", num_normal);
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT,
+ _("normal"));
+ gui_printf_color (ptr_channel->window,
+ COLOR_WIN_CHAT_DARK, ")\n");
+ }
+ else
+ {
+ irc_display_prefix (gui_current_window, PREFIX_INFO);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT_CHANNEL, pos);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT, ": %s\n", pos2);
+ return 0;
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_recv_433: '433' command received (nickname already in use)
+ */
+
+int
+irc_cmd_recv_433 (t_irc_server *server, char *host, char *arguments)
+{
+ char hostname[128];
+
+ if (!server->is_connected)
+ {
+ if (strcmp (server->nick, server->nick1) == 0)
+ {
+ gui_printf (server->window,
+ _("%s: nickname \"%s\" is already in use, "
+ "trying 2nd nickname \"%s\"\n"),
+ WEECHAT_NAME, server->nick, server->nick2);
+ free (server->nick);
+ server->nick = strdup (server->nick2);
+ }
+ else
+ {
+ if (strcmp (server->nick, server->nick2) == 0)
+ {
+ gui_printf (server->window,
+ _("%s: nickname \"%s\" is already in use, "
+ "trying 3rd nickname \"%s\"\n"),
+ WEECHAT_NAME, server->nick, server->nick3);
+ free (server->nick);
+ server->nick = strdup (server->nick3);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s: all declared nicknames are already in use, "
+ "closing connection with server!\n"),
+ WEECHAT_NAME);
+ server_disconnect (server);
+ return 0;
+ }
+ }
+
+ gethostname (hostname, sizeof (hostname) - 1);
+ hostname[sizeof (hostname) - 1] = '\0';
+ if (!hostname[0])
+ strcpy (hostname, _("unknown"));
+ server_sendf (server,
+ "NICK %s\r\n",
+ server->nick);
+ }
+ else
+ return irc_cmd_recv_error (server, host, arguments);
+ return 0;
+}
diff --git a/weechat/src/irc/irc-send.c b/weechat/src/irc/irc-send.c
new file mode 100644
index 000000000..d086aee29
--- /dev/null
+++ b/weechat/src/irc/irc-send.c
@@ -0,0 +1,811 @@
+/*
+ * Copyright (c) 2003 by FlashCode <flashcode@flashtux.org>
+ * Bounga <bounga@altern.org>
+ * Xahlexx <xahlexx@tuxisland.org>
+ * See README for License detail.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+/* irc-send.c: implementation of IRC commands (client to server),
+ according to RFC 1459,2810,2811,2812 */
+
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <sys/utsname.h>
+
+#include "../weechat.h"
+#include "irc.h"
+#include "../command.h"
+#include "../config.h"
+#include "../gui/gui.h"
+
+
+/*
+ * irc_login: login to irc server
+ */
+
+void
+irc_login (t_irc_server *server)
+{
+ char hostname[128];
+
+ if ((server->password) && (server->password[0]))
+ server_sendf (server, "PASS %s\r\n", server->password);
+
+ gethostname (hostname, sizeof (hostname) - 1);
+ hostname[sizeof (hostname) - 1] = '\0';
+ if (!hostname[0])
+ strcpy (hostname, _("unknown"));
+ gui_printf (server->window,
+ _("%s: using local hostname \"%s\"\n"),
+ WEECHAT_NAME, hostname);
+ server_sendf (server,
+ "NICK %s\r\n"
+ "USER %s %s %s :%s\r\n",
+ server->nick, server->username, hostname, "servername",
+ server->realname);
+}
+
+/*
+ * irc_cmd_send_away: toggle away status
+ */
+
+int
+irc_cmd_send_away (t_irc_server *server, char *arguments)
+{
+ char *pos;
+ t_irc_server *ptr_server;
+
+ if (arguments && (strncmp (arguments, "-all", 4) == 0))
+ {
+ pos = arguments + 4;
+ while (pos[0] == ' ')
+ pos++;
+ if (!pos[0])
+ pos = NULL;
+
+ for (ptr_server = irc_servers; ptr_server;
+ ptr_server = ptr_server->next_server)
+ {
+ if (server->is_connected)
+ {
+ if (pos)
+ server_sendf (ptr_server, "AWAY :%s\r\n", pos);
+ else
+ server_sendf (ptr_server, "AWAY\r\n");
+ }
+ }
+ }
+ else
+ {
+ if (arguments)
+ server_sendf (server, "AWAY :%s\r\n", arguments);
+ else
+ server_sendf (server, "AWAY\r\n");
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_ctcp: send a ctcp message
+ */
+
+int
+irc_cmd_send_ctcp (t_irc_server *server, char *arguments)
+{
+ char *pos, *pos2;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ pos2 = strchr (pos, ' ');
+ if (pos2)
+ {
+ pos2[0] = '\0';
+ pos2++;
+ while (pos2[0] == ' ')
+ pos2++;
+ }
+ else
+ pos2 = NULL;
+
+ if (strcasecmp (pos, "version") == 0)
+ {
+ if (pos2)
+ server_sendf (server, "PRIVMSG %s :\01VERSION %s\01\r\n",
+ arguments, pos2);
+ else
+ server_sendf (server, "PRIVMSG %s :\01VERSION\01\r\n",
+ arguments);
+ }
+ if (strcasecmp (pos, "action") == 0)
+ {
+ if (pos2)
+ server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n",
+ arguments, pos2);
+ else
+ server_sendf (server, "PRIVMSG %s :\01ACTION\01\r\n",
+ arguments);
+ }
+
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_deop: remove operator privileges from nickname(s)
+ */
+
+int
+irc_cmd_send_deop (t_irc_server *server, int argc, char **argv)
+{
+ int i;
+
+ if (WIN_IS_CHANNEL(gui_current_window))
+ {
+ for (i = 0; i < argc; i++)
+ server_sendf (server, "MODE %s -o %s\r\n",
+ CHANNEL(gui_current_window)->name,
+ argv[i]);
+ }
+ else
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "deop");
+ return 0;
+}
+
+/*
+ * irc_cmd_send_devoice: remove voice from nickname(s)
+ */
+
+int
+irc_cmd_send_devoice (t_irc_server *server, int argc, char **argv)
+{
+ int i;
+
+ if (WIN_IS_CHANNEL(gui_current_window))
+ {
+ for (i = 0; i < argc; i++)
+ server_sendf (server, "MODE %s -v %s\r\n",
+ CHANNEL(gui_current_window)->name,
+ argv[i]);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "devoice");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_invite: invite a nick on a channel
+ */
+
+int
+irc_cmd_send_invite (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "INVITE %s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_join: join a new channel
+ */
+
+int
+irc_cmd_send_join (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "JOIN %s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_kick: forcibly remove a user from a channel
+ */
+
+int
+irc_cmd_send_kick (t_irc_server *server, char *arguments)
+{
+ if (string_is_channel (arguments))
+ server_sendf (server, "KICK %s\r\n", arguments);
+ else
+ {
+ if (WIN_IS_CHANNEL (gui_current_window))
+ {
+ server_sendf (server,
+ "KICK %s %s\r\n",
+ CHANNEL(gui_current_window)->name, arguments);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "kick");
+ return -1;
+ }
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_kill: close client-server connection
+ */
+
+int
+irc_cmd_send_kill (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "KILL %s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_list: close client-server connection
+ */
+
+int
+irc_cmd_send_list (t_irc_server *server, char *arguments)
+{
+ if (arguments)
+ server_sendf (server, "LIST %s\r\n", arguments);
+ else
+ server_sendf (server, "LIST\r\n");
+ return 0;
+}
+
+/*
+ * irc_cmd_send_me: send a ctcp action to the current channel
+ */
+
+int
+irc_cmd_send_me (t_irc_server *server, char *arguments)
+{
+ if (WIN_IS_SERVER(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can not be executed on a server window\n"),
+ WEECHAT_ERROR, "me");
+ return -1;
+ }
+ server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n",
+ CHANNEL(gui_current_window)->name, arguments);
+ irc_display_prefix (gui_current_window, PREFIX_ACTION_ME);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT_NICK, "%s", server->nick);
+ gui_printf_color (gui_current_window,
+ COLOR_WIN_CHAT, " %s\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_mode: change mode for channel/nickname
+ */
+
+int
+irc_cmd_send_mode (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "MODE %s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_msg: send a message to a nick or channel
+ */
+
+int
+irc_cmd_send_msg (t_irc_server *server, char *arguments)
+{
+ char *pos, *pos_comma;
+ t_irc_channel *ptr_channel;
+ t_irc_nick *ptr_nick;
+
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+
+ while (arguments && arguments[0])
+ {
+ pos_comma = strchr (arguments, ',');
+ if (pos_comma)
+ {
+ pos_comma[0] = '\0';
+ pos_comma++;
+ }
+ if (strcmp (arguments, "*") == 0)
+ {
+ if (WIN_IS_SERVER(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can not be executed on a server window\n"),
+ WEECHAT_ERROR, "msg *");
+ return -1;
+ }
+ ptr_channel = CHANNEL(gui_current_window);
+ ptr_nick = nick_search (ptr_channel, server->nick);
+ if (ptr_nick)
+ {
+ irc_display_nick (ptr_channel->window, ptr_nick,
+ MSG_TYPE_NICK, 1, 1, 0);
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_MSG,
+ COLOR_WIN_CHAT, "%s\n", pos);
+ }
+ else
+ gui_printf (server->window,
+ _("%s nick not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "msg");
+ server_sendf (server, "PRIVMSG %s :%s\r\n", ptr_channel->name, pos);
+ }
+ else
+ {
+ if (string_is_channel (arguments))
+ {
+ ptr_channel = channel_search (server, arguments);
+ if (ptr_channel)
+ {
+ ptr_nick = nick_search (ptr_channel, server->nick);
+ if (ptr_nick)
+ {
+ irc_display_nick (ptr_channel->window, ptr_nick,
+ MSG_TYPE_NICK, 1, 1, 0);
+ gui_printf_color_type (ptr_channel->window,
+ MSG_TYPE_MSG,
+ COLOR_WIN_CHAT, "%s\n", pos);
+ }
+ else
+ gui_printf (server->window,
+ _("%s nick not found for \"%s\" command\n"),
+ WEECHAT_ERROR, "msg");
+ }
+ server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos);
+ }
+ else
+ {
+ ptr_channel = channel_search (server, arguments);
+ if (!ptr_channel)
+ {
+ ptr_channel = channel_new (server, CHAT_PRIVATE, arguments);
+ if (!ptr_channel)
+ {
+ gui_printf (server->window,
+ _("%s cannot create new private window \"%s\"\n"),
+ WEECHAT_ERROR,
+ arguments);
+ return -1;
+ }
+ 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_SELF,
+ "%s", server->nick);
+ 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);
+ server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos);
+ }
+ }
+ arguments = pos_comma;
+ }
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s wrong argument count for \"%s\" command\n"),
+ WEECHAT_ERROR, "msg");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_names: list nicknames on channels
+ */
+
+int
+irc_cmd_send_names (t_irc_server *server, char *arguments)
+{
+ if (arguments)
+ server_sendf (server, "NAMES %s\r\n", arguments);
+ else
+ {
+ if (!WIN_IS_CHANNEL(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "names");
+ return -1;
+ }
+ else
+ server_sendf (server, "NAMES %s\r\n",
+ CHANNEL(gui_current_window)->name);
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_nick: change nickname
+ */
+
+int
+irc_cmd_send_nick (t_irc_server *server, int argc, char **argv)
+{
+ if (argc != 1)
+ return -1;
+ server_sendf (server, "NICK %s\r\n", argv[0]);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_notice: send notice message
+ */
+
+int
+irc_cmd_send_notice (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "NOTICE %s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_op: give operator privileges to nickname(s)
+ */
+
+int
+irc_cmd_send_op (t_irc_server *server, int argc, char **argv)
+{
+ int i;
+
+ if (WIN_IS_CHANNEL(gui_current_window))
+ {
+ for (i = 0; i < argc; i++)
+ server_sendf (server, "MODE %s +o %s\r\n",
+ CHANNEL(gui_current_window)->name,
+ argv[i]);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "op");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_oper: get oper privileges
+ */
+
+int
+irc_cmd_send_oper (t_irc_server *server, int argc, char **argv)
+{
+ if (argc != 2)
+ return -1;
+ server_sendf (server, "OPER %s %s\r\n", argv[0], argv[1]);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_part: leave a channel or close a private window
+ */
+
+int
+irc_cmd_send_part (t_irc_server *server, char *arguments)
+{
+ char *channel_name, *pos_args;
+ t_irc_channel *ptr_channel;
+
+ if (arguments)
+ {
+ if (string_is_channel (arguments))
+ {
+ channel_name = arguments;
+ pos_args = strchr (arguments, ' ');
+ if (pos_args)
+ {
+ pos_args[0] = '\0';
+ pos_args++;
+ while (pos_args[0] == ' ')
+ pos_args++;
+ }
+ }
+ else
+ {
+ if (WIN_IS_SERVER(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can not be executed on a server window\n"),
+ WEECHAT_ERROR, "part");
+ return -1;
+ }
+ channel_name = CHANNEL(gui_current_window)->name;
+ pos_args = arguments;
+ }
+ }
+ else
+ {
+ if (WIN_IS_SERVER(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can not be executed on a server window\n"),
+ WEECHAT_ERROR, "part");
+ return -1;
+ }
+ if (WIN_IS_PRIVATE(gui_current_window))
+ {
+ ptr_channel = CHANNEL(gui_current_window);
+ gui_window_free (ptr_channel->window);
+ channel_free (server, ptr_channel);
+ gui_redraw_window_status (gui_current_window);
+ gui_redraw_window_input (gui_current_window);
+ return 0;
+ }
+ channel_name = CHANNEL(gui_current_window)->name;
+ pos_args = NULL;
+ }
+
+ if (pos_args)
+ server_sendf (server, "PART %s :%s\r\n", channel_name, pos_args);
+ else
+ server_sendf (server, "PART %s\r\n", channel_name);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_ping: ping a server
+ */
+
+int
+irc_cmd_send_ping (t_irc_server *server, int argc, char **argv)
+{
+ if (argc == 1)
+ server_sendf (server, "PING %s\r\n", argv[0]);
+ if (argc == 2)
+ server_sendf (server, "PING %s %s\r\n", argv[0],
+ argv[1]);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_pong: send pong answer to a daemon
+ */
+
+int
+irc_cmd_send_pong (t_irc_server *server, int argc, char **argv)
+{
+ if (argc == 1)
+ server_sendf (server, "PONG %s\r\n", argv[0]);
+ if (argc == 2)
+ server_sendf (server, "PONG %s %s\r\n", argv[0],
+ argv[1]);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_quit: disconnect from all servers and quit WeeChat
+ */
+
+int
+irc_cmd_send_quit (t_irc_server *server, char *arguments)
+{
+ if (server && server->is_connected)
+ {
+ if (arguments)
+ server_sendf (server, "QUIT :%s\r\n", arguments);
+ else
+ server_sendf (server, "QUIT\r\n");
+ }
+ quit_weechat = 1;
+ return 0;
+}
+
+/*
+ * irc_cmd_send_quote: send raw data to server
+ */
+
+int
+irc_cmd_send_quote (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "%s\r\n", arguments);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_rehash: tell the server to reload its config file
+ */
+
+int
+irc_cmd_send_rehash (t_irc_server *server, char *arguments)
+{
+ /* make gcc happy */
+ (void) arguments;
+
+ server_sendf (server, "REHASH\r\n");
+ return 0;
+}
+
+/*
+ * irc_cmd_send_restart: tell the server to restart itself
+ */
+
+int
+irc_cmd_send_restart (t_irc_server *server, char *arguments)
+{
+ /* make gcc happy */
+ (void) arguments;
+
+ server_sendf (server, "RESTART\r\n");
+ return 0;
+}
+
+/*
+ * irc_cmd_send_stats: query statistics about server
+ */
+
+int
+irc_cmd_send_stats (t_irc_server *server, char *arguments)
+{
+ if (arguments)
+ server_sendf (server, "STATS %s\r\n", arguments);
+ else
+ server_sendf (server, "STATS\r\n");
+ return 0;
+}
+
+/*
+ * irc_cmd_send_topic: get/set topic for a channel
+ */
+
+int
+irc_cmd_send_topic (t_irc_server *server, char *arguments)
+{
+ char *channel_name, *new_topic, *pos;
+
+ channel_name = NULL;
+ new_topic = NULL;
+
+ if (arguments)
+ {
+ if (string_is_channel (arguments))
+ {
+ channel_name = arguments;
+ pos = strchr (arguments, ' ');
+ if (pos)
+ {
+ pos[0] = '\0';
+ pos++;
+ while (pos[0] == ' ')
+ pos++;
+ new_topic = (pos[0]) ? pos : NULL;
+ }
+ }
+ else
+ new_topic = arguments;
+ }
+
+ /* look for current channel if not specified */
+ if (!channel_name)
+ {
+ if (WIN_IS_SERVER(gui_current_window))
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can not be executed on a server window\n"),
+ WEECHAT_ERROR, "topic");
+ return -1;
+ }
+ channel_name = CHANNEL(gui_current_window)->name;
+ }
+
+ if (new_topic)
+ {
+ if (strcmp (new_topic, "-delete") == 0)
+ server_sendf (server, "TOPIC %s :\r\n", channel_name);
+ else
+ server_sendf (server, "TOPIC %s :%s\r\n", channel_name, new_topic);
+ }
+ else
+ server_sendf (server, "TOPIC %s\r\n", channel_name);
+ return 0;
+}
+
+/*
+ * irc_cmd_send_version: gives the version info of nick or server (current or specified)
+ */
+
+int
+irc_cmd_send_version (t_irc_server *server, char *arguments)
+{
+ if (arguments)
+ {
+ if (WIN_IS_CHANNEL(gui_current_window) &&
+ nick_search (CHANNEL(gui_current_window), arguments))
+ server_sendf (server, "PRIVMSG %s :\01VERSION\01\r\n",
+ arguments);
+ else
+ server_sendf (server, "VERSION %s\r\n",
+ arguments);
+ }
+ else
+ {
+ irc_display_prefix (server->window, PREFIX_INFO);
+ gui_printf (server->window, _("%s, compiled on %s %s\n"),
+ WEECHAT_NAME_AND_VERSION,
+ __DATE__, __TIME__);
+ server_sendf (server, "VERSION\r\n");
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_voice: give voice to nickname(s)
+ */
+
+int
+irc_cmd_send_voice (t_irc_server *server, int argc, char **argv)
+{
+ int i;
+
+ if (WIN_IS_CHANNEL(gui_current_window))
+ {
+ for (i = 0; i < argc; i++)
+ server_sendf (server, "MODE %s +v %s\r\n",
+ CHANNEL(gui_current_window)->name,
+ argv[i]);
+ }
+ else
+ {
+ gui_printf (server->window,
+ _("%s \"%s\" command can only be executed in a channel window\n"),
+ WEECHAT_ERROR, "voice");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * irc_cmd_send_whois: query information about user(s)
+ */
+
+int
+irc_cmd_send_whois (t_irc_server *server, char *arguments)
+{
+ server_sendf (server, "WHOIS %s\r\n", arguments);
+ return 0;
+}
diff --git a/weechat/src/irc/irc.h b/weechat/src/irc/irc.h
index 41591045f..0dfa33ac4 100644
--- a/weechat/src/irc/irc.h
+++ b/weechat/src/irc/irc.h
@@ -212,6 +212,7 @@ extern int irc_cmd_send_quit (t_irc_server *, char *);
extern int irc_cmd_send_quote (t_irc_server *, char *);
extern int irc_cmd_send_rehash (t_irc_server *, char *);
extern int irc_cmd_send_restart (t_irc_server *, char *);
+extern int irc_cmd_send_stats (t_irc_server *, char *);
extern int irc_cmd_send_topic (t_irc_server *, char *);
extern int irc_cmd_send_version (t_irc_server *, char *);
extern int irc_cmd_send_voice (t_irc_server *, int, char **);