diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2003-10-06 22:24:19 +0000 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2003-10-06 22:24:19 +0000 |
commit | 954f1b98bfc6d4862ba1cefd33eea7201124d258 (patch) | |
tree | 7e2dc03e86e933c03a25514c632bc622ff849cf1 /src/irc/irc-recv.c | |
parent | 641e5cd05a68a2a9e7e6b043de05687855cb5029 (diff) | |
download | weechat-954f1b98bfc6d4862ba1cefd33eea7201124d258.zip |
Added /stats command, splited irc-commands.c in 3 files (commands, send, recv)
Diffstat (limited to 'src/irc/irc-recv.c')
-rw-r--r-- | src/irc/irc-recv.c | 2113 |
1 files changed, 2113 insertions, 0 deletions
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; +} |