diff options
Diffstat (limited to 'src/plugins/irc/irc-command.c')
-rw-r--r-- | src/plugins/irc/irc-command.c | 3897 |
1 files changed, 3897 insertions, 0 deletions
diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c new file mode 100644 index 000000000..528bdda31 --- /dev/null +++ b/src/plugins/irc/irc-command.c @@ -0,0 +1,3897 @@ +/* + * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * 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 3 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, see <http://www.gnu.org/licenses/>. + */ + +/* irc-command.c: IRC commands managment */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +#include "../../core/weechat.h" +#include "irc.h" +#include "../../core/command.h" +#include "../../core/util.h" +#include "../../core/weechat-config.h" +#include "../../gui/gui.h" + + +t_weechat_command irc_commands[] = +{ { "admin", N_("find information about the administrator of the server"), + N_("[target]"), + N_("target: server"), + NULL, 0, 1, 0, irc_cmd_admin }, + { "ame", N_("send a CTCP action to all channels of all connected servers"), + N_("message"), + N_("message: message to send"), + "", 1, MAX_ARGS, 1, irc_cmd_ame }, + { "amsg", N_("send message to all channels of all connected servers"), + N_("text"), + N_("text: text to send"), + "", 1, MAX_ARGS, 1, irc_cmd_amsg }, + { "away", N_("toggle away status"), + N_("[-all] [message]"), + N_(" -all: toggle away status on all connected servers\n" + "message: message for away (if no message is given, away status is " + "removed)"), + "-all", 0, MAX_ARGS, 1, irc_cmd_away }, + { "ban", N_("bans nicks or hosts"), + N_("[channel] [nickname [nickname ...]]"), + N_(" channel: channel for ban\n" + "nickname: user or host to ban"), + "%N", 0, MAX_ARGS, 0, irc_cmd_ban }, + { "connect", N_("connect to server(s)"), + N_("[-all [-nojoin] | servername [servername ...] [-nojoin] | hostname " + "[-port port] [-ipv6] [-ssl]]"), + N_(" -all: connect to all servers\n" + "servername: internal server name to connect\n" + " -nojoin: do not join any channel (even if autojoin is enabled on " + "server)\n" + " hostname: hostname to connect, creating temporary server\n" + " port: port for server (integer, default is 6667)\n" + " ipv6: use IPv6 protocol\n" + " ssl: use SSL protocol"), + "%S|-all|-nojoin|%*", 0, MAX_ARGS, 0, irc_cmd_connect }, + { "ctcp", N_("send a CTCP message (Client-To-Client Protocol)"), + N_("receiver type [arguments]"), + N_(" receiver: nick or channel to send CTCP to\n" + " type: CTCP type (examples: \"version\", \"ping\", ..)\n" + "arguments: arguments for CTCP"), + "%c|%n action|ping|version", 2, MAX_ARGS, 1, irc_cmd_ctcp }, + { "cycle", N_("leave and rejoin a channel"), + N_("[channel[,channel]] [part_message]"), + N_(" channel: channel name for cycle\n" + "part_message: part message (displayed to other users)"), + "%p", 0, MAX_ARGS, 0, irc_cmd_cycle }, + { "dcc", N_("starts DCC (file or chat) or close chat"), + N_("action [nickname [file]]"), + N_(" action: 'send' (file) or 'chat' or 'close' (chat)\n" + "nickname: nickname to send file or chat\n" + " file: filename (on local host)"), + "chat|send|close %n %f", 1, MAX_ARGS, 0, irc_cmd_dcc }, + { "dehalfop", N_("removes half channel operator status from nickname(s)"), + N_("[nickname [nickname]]"), "", + "", 0, MAX_ARGS, 0, irc_cmd_dehalfop }, + { "deop", N_("removes channel operator status from nickname(s)"), + N_("[nickname [nickname]]"), "", + "", 0, MAX_ARGS, 0, irc_cmd_deop }, + { "devoice", N_("removes voice from nickname(s)"), + N_("[nickname [nickname]]"), "", + "", 0, MAX_ARGS, 0, irc_cmd_devoice }, + { "die", N_("shutdown the server"), "", "", + NULL, 0, 0, 0, irc_cmd_die }, + { "disconnect", N_("disconnect from server(s)"), + N_("[-all | servername [servername ...]]"), + N_(" -all: disconnect from all servers\n" + "servername: server name to disconnect"), + "%S|-all", 0, MAX_ARGS, 0, irc_cmd_disconnect }, + { "halfop", N_("gives half channel operator status to nickname(s)"), + N_("[nickname [nickname]]"), "", + "", 0, MAX_ARGS, 0, irc_cmd_halfop }, + { "info", N_("get information describing the server"), + N_("[target]"), + N_("target: server name"), + NULL, 0, 1, 0, irc_cmd_info }, + { "invite", N_("invite a nick on a channel"), + N_("nickname channel"), + N_("nickname: nick to invite\n" + " channel: channel to invite"), + "%n %c", 1, 2, 0, irc_cmd_invite }, + { "ison", N_("check if a nickname is currently on IRC"), + N_("nickname [nickname ...]"), + N_("nickname: nickname"), + "", 1, MAX_ARGS, 0, irc_cmd_ison }, + { "join", N_("join a channel"), + N_("channel[,channel] [key[,key]]"), + N_("channel: channel name to join\n" + " key: key to join the channel"), + "%C", 1, MAX_ARGS, 0, irc_cmd_join }, + { "kick", N_("forcibly remove a user from a channel"), + N_("[channel] nickname [comment]"), + N_(" channel: channel where user is\n" + "nickname: nickname to kick\n" + " comment: comment for kick"), + "%n %-", 1, MAX_ARGS, 0, irc_cmd_kick }, + { "kickban", N_("kicks and bans a nick from a channel"), + N_("[channel] nickname [comment]"), + N_(" channel: channel where user is\n" + "nickname: nickname to kick and ban\n" + " comment: comment for kick"), + "%n %-", 1, MAX_ARGS, 0, irc_cmd_kickban }, + { "kill", N_("close client-server connection"), + N_("nickname comment"), + N_("nickname: nickname\n" + " comment: comment for kill"), + "%n %-", 2, MAX_ARGS, 0, irc_cmd_kill }, + { "links", + N_("list all servernames which are known by the server answering " + "the query"), + N_("[[server] server_mask]"), + N_(" server: this server should answer the query\n" + "server_mask: list of servers must match this mask"), + NULL, 0, 2, 0, irc_cmd_links }, + { "list", N_("list channels and their topic"), + N_("[channel[,channel] [server]]"), + N_("channel: channel to list (a regexp is allowed)\nserver: server name"), + NULL, 0, MAX_ARGS, 0, irc_cmd_list }, + { "lusers", N_("get statistics about the size of the IRC network"), + N_("[mask [target]]"), + N_(" mask: servers matching the mask only\n" + "target: server for forwarding request"), + NULL, 0, 2, 0, irc_cmd_lusers }, + { "me", N_("send a CTCP action to the current channel"), + N_("message"), + N_("message: message to send"), + "", 0, MAX_ARGS, 1, irc_cmd_me }, + { "mode", N_("change channel or user mode"), + N_("{ channel {[+|-]|o|p|s|i|t|n|b|v} [limit] [user] [ban mask] } | " + "{ nickname {[+|-]|i|w|s|o} }"), + N_("channel modes:\n" + " channel: channel name to modify\n" + " o: give/take channel operator privileges\n" + " p: private channel flag\n" + " s: secret channel flag\n" + " i: invite-only channel flag\n" + " t: topic settable by channel operator only flag\n" + " n: no messages to channel from clients on the outside\n" + " m: moderated channel\n" + " l: set the user limit to channel\n" + " b: set a ban mask to keep users out\n" + " e: set exception mask\n" + " v: give/take the ability to speak on a moderated channel\n" + " k: set a channel key (password)\n" + "user modes:\n" + " nickname: nickname to modify\n" + " i: mark a user as invisible\n" + " s: mark a user for receive server notices\n" + " w: user receives wallops\n" + " o: operator flag"), + "%c|%m", 1, MAX_ARGS, 0, irc_cmd_mode }, + { "motd", N_("get the \"Message Of The Day\""), + N_("[target]"), + N_("target: server name"), + NULL, 0, 1, 0, irc_cmd_motd }, + { "msg", N_("send message to a nick or channel"), + N_("receiver[,receiver] text"), + N_("receiver: nick or channel (may be mask, '*' = current channel)\n" + "text: text to send"), + "", 2, MAX_ARGS, 1, irc_cmd_msg }, + { "names", N_("list nicknames on channels"), + N_("[channel[,channel]]"), + N_("channel: channel name"), + NULL, 0, 1, 0, irc_cmd_names }, + { "nick", N_("change current nickname"), + N_("[-all] nickname"), + N_(" -all: set new nickname for all connected servers\n" + "nickname: new nickname"), + "-all", 1, 2, 0, irc_cmd_nick }, + { "notice", N_("send notice message to user"), + N_("nickname text"), + N_("nickname: user to send notice to\n" + " text: text to send"), + "%n %-", 2, MAX_ARGS, 1, irc_cmd_notice }, + { "op", N_("gives channel operator status to nickname(s)"), + N_("nickname [nickname]"), "", + "", 1, MAX_ARGS, 0, irc_cmd_op }, + { "oper", N_("get operator privileges"), + N_("user password"), + N_("user/password: used to get privileges on current IRC server"), + NULL, 2, 2, 0, irc_cmd_oper }, + { "part", N_("leave a channel"), + N_("[channel[,channel]] [part_message]"), + N_(" channel: channel name to leave\n" + "part_message: part message (displayed to other users)"), + "%p", 0, MAX_ARGS, 0, irc_cmd_part }, + { "ping", N_("ping server"), + N_("server1 [server2]"), + N_("server1: server to ping\nserver2: forward ping to this server"), + NULL, 1, 2, 0, irc_cmd_ping }, + { "pong", N_("answer to a ping message"), + N_("daemon [daemon2]"), + N_(" daemon: daemon who has responded to Ping message\n" + "daemon2: forward message to this daemon"), + NULL, 1, 2, 0, irc_cmd_pong }, + { "query", N_("send a private message to a nick"), + N_("nickname [text]"), + N_("nickname: nickname for private conversation\n" + " text: text to send"), + "%n %-", 1, MAX_ARGS, 1, irc_cmd_query }, + { "quit", N_("close all connections and quit"), + N_("[quit_message]"), + N_("quit_message: quit message (displayed to other users)"), + "%q", 0, MAX_ARGS, 1, irc_cmd_quit }, + { "quote", N_("send raw data to server without parsing"), + N_("data"), + N_("data: raw data to send"), + "", 1, MAX_ARGS, 1, irc_cmd_quote }, + { "reconnect", N_("reconnect to server(s)"), + N_("[-all [-nojoin] | servername [servername ...] [-nojoin]]"), + N_(" -all: reconnect to all servers\n" + "servername: server name to reconnect\n" + " -nojoin: do not join any channel (even if autojoin is enabled on " + "server)"), + "%S|-all|-nojoin|%*", 0, MAX_ARGS, 0, irc_cmd_reconnect }, + { "rehash", N_("tell the server to reload its config file"), "", "", + NULL, 0, 0, 0, irc_cmd_rehash }, + { "restart", N_("tell the server to restart itself"), "", "", + NULL, 0, 0, 0, irc_cmd_restart }, + { "service", N_("register a new service"), + N_("nickname reserved distribution type reserved info"), + N_("distribution: visibility of service\n" + " type: reserved for future usage"), + NULL, 6, 6, 0, irc_cmd_service }, + { "server", N_("list, add or remove servers"), + N_("[list [servername]] | [listfull [servername]] | [add servername " + "hostname [-port port] [-temp] [-auto | -noauto] [-ipv6] [-ssl] " + "[-pwd password] [-nicks nick1 nick2 nick3] [-username username] " + "[-realname realname] [-command command] " + "[-autojoin channel[,channel]] ] | [copy servername newservername] | " + "[rename servername newservername] | [keep servername] | " + "[del servername]"), + N_(" list: list servers (no parameter implies this list)\n" + " listfull: list servers with detailed info for each server\n" + " add: create a new server\n" + "servername: server name, for internal and display use\n" + " hostname: name or IP address of server\n" + " port: port for server (integer, default is 6667)\n" + " temp: create temporary server (not saved in config file)\n" + " auto: automatically connect to server when WeeChat starts\n" + " noauto: do not connect to server when WeeChat starts (default)\n" + " ipv6: use IPv6 protocol\n" + " ssl: use SSL protocol\n" + " password: password for server\n" + " nick1: first nick for server\n" + " nick2: alternate nick for server\n" + " nick3: second alternate nick for server\n" + " username: user name\n" + " realname: real name of user\n" + " copy: duplicate a server\n" + " rename: rename a server\n" + " keep: keep server in config file (for temporary servers only)\n" + " del: delete a server\n" + " deloutq: delete messages out queue for all servers (all messages " + "WeeChat is currently sending)"), + "add|copy|rename|keep|del|deloutq|list|listfull %S %S", + 0, MAX_ARGS, 0, irc_cmd_server }, + { "servlist", N_("list services currently connected to the network"), + N_("[mask [type]]"), + N_("mask: list only services matching this mask\n" + "type: list only services of this type"), + NULL, 0, 2, 0, irc_cmd_servlist }, + { "squery", N_("deliver a message to a service"), + N_("service text"), + N_("service: name of service\ntext: text to send"), + NULL, 2, MAX_ARGS, 1, irc_cmd_squery }, + { "squit", N_("disconnect server links"), + N_("server comment"), + N_( "server: server name\n" + "comment: comment for quit"), + NULL, 2, 2, 1, irc_cmd_squit }, + { "stats", N_("query statistics about server"), + N_("[query [server]]"), + N_(" query: c/h/i/k/l/m/o/y/u (see RFC1459)\n" + "server: server name"), + NULL, 0, 2, 0, irc_cmd_stats }, + { "summon", + N_("give users who are on a host running an IRC server a message " + "asking them to please join IRC"), + N_("user [target [channel]]"), + N_(" user: username\ntarget: server name\n" + "channel: channel name"), + NULL, 1, 3, 0, irc_cmd_summon }, + { "time", N_("query local time from server"), + N_("[target]"), + N_("target: query time from specified server"), + NULL, 0, 1, 0, irc_cmd_time }, + { "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)"), + "%t|-delete %-", 0, MAX_ARGS, 1, irc_cmd_topic }, + { "trace", N_("find the route to specific server"), + N_("[target]"), + N_("target: server"), + NULL, 0, 1, 0, irc_cmd_trace }, + { "unban", N_("unbans nicks or hosts"), + N_("[channel] nickname [nickname ...]"), + N_(" channel: channel for unban\n" + "nickname: user or host to unban"), + "", 1, MAX_ARGS, 0, irc_cmd_unban }, + { "userhost", N_("return a list of information about nicknames"), + N_("nickname [nickname ...]"), + N_("nickname: nickname"), + "%n", 1, MAX_ARGS, 0, irc_cmd_userhost }, + { "users", N_("list of users logged into the server"), + N_("[target]"), + N_("target: server"), + NULL, 0, 1, 0, irc_cmd_users }, + { "version", + N_("gives the version info of nick or server (current or specified)"), + N_("[server | nickname]"), + N_(" server: server name\n" + "nickname: nickname"), + "%n", 0, 1, 0, irc_cmd_version }, + { "voice", N_("gives voice to nickname(s)"), + N_("[nickname [nickname]]"), "", + "", 0, MAX_ARGS, 0, irc_cmd_voice }, + { "wallops", N_("send a message to all currently connected users who have " + "set the 'w' user mode for themselves"), + N_("text"), + N_("text to send"), + NULL, 1, MAX_ARGS, 1, irc_cmd_wallops }, + { "who", N_("generate a query which returns a list of information"), + N_("[mask [\"o\"]]"), + N_("mask: only information which match this mask\n" + " o: only operators are returned according to the mask supplied"), + "%C", 0, 2, 0, irc_cmd_who }, + { "whois", N_("query information about user(s)"), + N_("[server] nickname[,nickname]"), + N_(" server: server name\n" + "nickname: nickname (may be a mask)"), + "", 1, MAX_ARGS, 0, irc_cmd_whois }, + { "whowas", + N_("ask for information about a nickname which no longer exists"), + N_("nickname [,nickname [,nickname ...]] [count [target]]"), + N_("nickname: nickname to search\n" + " count: number of replies to return " + "(full search if negative number)\n" + " target: reply should match this mask"), + "", 1, MAX_ARGS, 0, irc_cmd_whowas }, + { NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL } +}; + + +/* + * irc_cmd_admin: find information about the administrator of the server + */ + +int +irc_cmd_admin (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "ADMIN %s", arguments); + else + irc_server_sendf (ptr_server, "ADMIN"); + return 0; +} + +/* + * irc_cmd_me_channel: send a ctcp action to a channel + */ + +int +irc_cmd_me_channel (t_irc_server *server, t_irc_channel *channel, + char *arguments) +{ + char *string; + + irc_server_sendf (server, "PRIVMSG %s :\01ACTION %s\01", + channel->name, + (arguments && arguments[0]) ? arguments : ""); + string = (arguments && arguments[0]) ? + (char *)irc_color_decode ((unsigned char *)arguments, 1, 0) : NULL; + gui_chat_printf_action (channel->buffer, + "%s%s %s%s\n", + GUI_COLOR(GUI_COLOR_CHAT_NICK), + server->nick, + GUI_COLOR(GUI_COLOR_CHAT), + (string) ? string : ""); + if (string) + free (string); + return 0; +} + +/* + * irc_cmd_me_all_channels: send a ctcp action to all channels of a server + */ + +int +irc_cmd_me_all_channels (t_irc_server *server, char *arguments) +{ + t_irc_channel *ptr_channel; + + for (ptr_channel = server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + if (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL) + irc_cmd_me_channel (server, ptr_channel, arguments); + } + return 0; +} + +/* + * irc_cmd_mode_nicks: send mode change for many nicks on a channel + */ + +void +irc_cmd_mode_nicks (t_irc_server *server, char *channel, + char *set, char *mode, int argc, char **argv) +{ + int i, length; + char *command; + + length = 0; + for (i = 0; i < argc; i++) + length += strlen (argv[i]) + 1; + length += strlen (channel) + (argc * strlen (mode)) + 32; + command = (char *)malloc (length); + if (command) + { + snprintf (command, length, "MODE %s %s", channel, set); + for (i = 0; i < argc; i++) + strcat (command, mode); + for (i = 0; i < argc; i++) + { + strcat (command, " "); + strcat (command, argv[i]); + } + irc_server_sendf (server, "%s", command); + free (command); + } +} + +/* + * irc_cmd_ame: send a ctcp action to all channels of all connected servers + */ + +int +irc_cmd_ame (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + t_irc_server *ptr_server; + t_irc_channel *ptr_channel; + + /* make C compiler happy */ + (void) window; + (void) argc; + (void) argv; + + gui_add_hotlist = 0; + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + if (ptr_server->is_connected) + { + for (ptr_channel = ptr_server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + if (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL) + irc_cmd_me_channel (ptr_server, ptr_channel, arguments); + } + } + } + gui_add_hotlist = 1; + return 0; +} + +/* + * irc_cmd_amsg: send message to all channels of all connected servers + */ + +int +irc_cmd_amsg (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + t_irc_server *ptr_server; + t_irc_channel *ptr_channel; + t_irc_nick *ptr_nick; + char *string; + + /* make C compiler happy */ + (void) window; + (void) argc; + (void) argv; + + if (arguments) + { + gui_add_hotlist = 0; + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + if (ptr_server->is_connected) + { + for (ptr_channel = ptr_server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + if (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL) + { + irc_server_sendf (ptr_server, "PRIVMSG %s :%s", + ptr_channel->name, arguments); + ptr_nick = irc_nick_search (ptr_channel, + ptr_server->nick); + if (ptr_nick) + { + irc_display_nick (ptr_channel->buffer, ptr_nick, + NULL, GUI_MSG_TYPE_NICK, 1, + NULL, 0); + string = (char *)irc_color_decode ( + (unsigned char *)arguments, 1, 0); + gui_chat_printf (ptr_channel->buffer, "%s\n", + (string) ? string : arguments); + if (string) + free (string); + } + else + { + gui_chat_printf_error (ptr_server->buffer, + _("%s cannot find nick for " + "sending message\n"), + WEECHAT_ERROR); + } + } + } + } + } + gui_add_hotlist = 1; + } + else + return -1; + return 0; +} + +/* + * irc_cmd_away_server: toggle away status for one server + */ + +void +irc_cmd_away_server (t_irc_server *server, char *arguments) +{ + char *string, buffer[4096]; + t_gui_window *ptr_window; + time_t time_now, elapsed; + + if (!server) + return; + + if (arguments) + { + if (server->away_message) + free (server->away_message); + server->away_message = (char *) malloc (strlen (arguments) + 1); + if (server->away_message) + strcpy (server->away_message, arguments); + + /* if server is connected, send away command now */ + if (server->is_connected) + { + server->is_away = 1; + server->away_time = time (NULL); + irc_server_sendf (server, "AWAY :%s", arguments); + if (irc_cfg_irc_display_away != CFG_IRC_DISPLAY_AWAY_OFF) + { + string = (char *)irc_color_decode ((unsigned char *)arguments, + 1, 0); + if (irc_cfg_irc_display_away == CFG_IRC_DISPLAY_AWAY_LOCAL) + irc_display_away (server, "away", + (string) ? string : arguments); + else + { + snprintf (buffer, sizeof (buffer), "is away: %s", + (string) ? string : arguments); + irc_cmd_me_all_channels (server, buffer); + } + if (string) + free (string); + } + irc_server_set_away (server, server->nick, 1); + for (ptr_window = gui_windows; ptr_window; + ptr_window = ptr_window->next_window) + { + if (strcmp (ptr_window->buffer->category, server->name) == 0) + ptr_window->buffer->last_read_line = + ptr_window->buffer->last_line; + } + } + else + { + /* server not connected, store away for future usage + (when connecting to server) */ + string = (char *)irc_color_decode ((unsigned char *)arguments, + 1, 0); + gui_chat_printf_info_nolog (server->buffer, + _("Future away on %s%s%s: %s\n"), + GUI_COLOR(GUI_COLOR_CHAT_SERVER), + server->name, + GUI_COLOR(GUI_COLOR_CHAT), + (string) ? string : arguments); + if (string) + free (string); + } + } + else + { + if (server->away_message) + { + free (server->away_message); + server->away_message = NULL; + } + + /* if server is connected, send away command now */ + if (server->is_connected) + { + irc_server_sendf (server, "AWAY"); + server->is_away = 0; + if (server->away_time != 0) + { + time_now = time (NULL); + elapsed = (time_now >= server->away_time) ? + time_now - server->away_time : 0; + server->away_time = 0; + if (irc_cfg_irc_display_away != CFG_IRC_DISPLAY_AWAY_OFF) + { + if (irc_cfg_irc_display_away == CFG_IRC_DISPLAY_AWAY_LOCAL) + { + snprintf (buffer, sizeof (buffer), + "gone %.2ld:%.2ld:%.2ld", + (long int)(elapsed / 3600), + (long int)((elapsed / 60) % 60), + (long int)(elapsed % 60)); + irc_display_away (server, "back", buffer); + } + else + { + snprintf (buffer, sizeof (buffer), + "is back (gone %.2ld:%.2ld:%.2ld)", + (long int)(elapsed / 3600), + (long int)((elapsed / 60) % 60), + (long int)(elapsed % 60)); + irc_cmd_me_all_channels (server, buffer); + } + } + } + irc_server_set_away (server, server->nick, 0); + } + else + { + /* server not connected, remove away message but do not send + anything */ + gui_chat_printf_info_nolog (server->buffer, + _("Future away on %s%s%s removed.\n"), + GUI_COLOR(GUI_COLOR_CHAT_SERVER), + server->name, + GUI_COLOR(GUI_COLOR_CHAT)); + } + } +} + +/* + * irc_cmd_away: toggle away status + */ + +int +irc_cmd_away (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos; + + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + gui_add_hotlist = 0; + 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 (ptr_server->is_connected) + irc_cmd_away_server (ptr_server, pos); + } + } + else + irc_cmd_away_server (ptr_server, arguments); + + gui_status_draw (window->buffer, 1); + gui_add_hotlist = 1; + return 0; +} + +/* + * irc_cmd_ban: bans nicks or hosts + */ + +int +irc_cmd_ban (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos_channel, *pos, *pos2; + + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + { + pos_channel = NULL; + pos = strchr (arguments, ' '); + if (pos) + { + pos[0] = '\0'; + + if (irc_channel_is_channel (arguments)) + { + pos_channel = arguments; + pos++; + while (pos[0] == ' ') + pos++; + } + else + { + pos[0] = ' '; + pos = arguments; + } + } + else + pos = arguments; + + /* channel not given, use default buffer */ + if (!pos_channel) + { + if (!ptr_channel) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only " + "be executed in a channel " + "buffer\n"), + WEECHAT_ERROR, "ban"); + return -1; + } + pos_channel = ptr_channel->name; + } + + /* loop on users */ + while (pos && pos[0]) + { + pos2 = strchr (pos, ' '); + if (pos2) + { + pos2[0] = '\0'; + pos2++; + while (pos2[0] == ' ') + pos2++; + } + irc_server_sendf (ptr_server, "MODE %s +b %s", pos_channel, pos); + pos = pos2; + } + } + else + { + if (!ptr_channel) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "ban"); + return -1; + } + irc_server_sendf (ptr_server, "MODE %s +b", ptr_channel->name); + } + + return 0; +} + +/* + * irc_cmd_connect_one_server: connect to one server + * return 0 if error, 1 if ok + */ + +int +irc_cmd_connect_one_server (t_irc_server *server, int no_join) +{ + if (!server) + return 0; + + if (server->is_connected) + { + gui_chat_printf_error (NULL, + _("%s already connected to server " + "\"%s\"!\n"), + WEECHAT_ERROR, server->name); + return 0; + } + if (server->child_pid > 0) + { + gui_chat_printf_error (NULL, + _("%s currently connecting to server " + "\"%s\"!\n"), + WEECHAT_ERROR, server->name); + return 0; + } + if (irc_server_connect (server, no_join)) + { + server->reconnect_start = 0; + server->reconnect_join = (server->channels) ? 1 : 0; + gui_status_draw (server->buffer, 1); + } + + /* connect ok */ + return 1; +} + +/* + * irc_cmd_connect: connect to server(s) + */ + +int +irc_cmd_connect (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + t_irc_server server_tmp; + int i, nb_connect, connect_ok, all_servers, no_join, port, ipv6, ssl; + char *error; + long number; + + IRC_BUFFER_GET_SERVER(window->buffer); + + /* make C compiler happy */ + (void) window; + (void) arguments; + + nb_connect = 0; + connect_ok = 1; + port = IRC_SERVER_DEFAULT_PORT; + ipv6 = 0; + ssl = 0; + + all_servers = 0; + no_join = 0; + for (i = 0; i < argc; i++) + { + if (weechat_strcasecmp (argv[i], "-all") == 0) + all_servers = 1; + if (weechat_strcasecmp (argv[i], "-nojoin") == 0) + no_join = 1; + if (weechat_strcasecmp (argv[i], "-ipv6") == 0) + ipv6 = 1; + if (weechat_strcasecmp (argv[i], "-ssl") == 0) + ssl = 1; + if (weechat_strcasecmp (argv[i], "-port") == 0) + { + if (i == (argc - 1)) + { + gui_chat_printf_error (NULL, + _("%s missing argument for \"%s\" " + "option\n"), + WEECHAT_ERROR, "-port"); + return -1; + } + error = NULL; + number = strtol (argv[++i], &error, 10); + if (error && (error[0] == '\0')) + port = number; + } + } + + if (all_servers) + { + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + nb_connect++; + if (!ptr_server->is_connected && (ptr_server->child_pid == 0)) + { + if (!irc_cmd_connect_one_server (ptr_server, no_join)) + connect_ok = 0; + } + } + } + else + { + for (i = 0; i < argc; i++) + { + if (argv[i][0] != '-') + { + nb_connect++; + ptr_server = irc_server_search (argv[i]); + if (ptr_server) + { + if (!irc_cmd_connect_one_server (ptr_server, no_join)) + connect_ok = 0; + } + else + { + irc_server_init (&server_tmp); + server_tmp.name = strdup (argv[i]); + server_tmp.address = strdup (argv[i]); + server_tmp.port = port; + server_tmp.ipv6 = ipv6; + server_tmp.ssl = ssl; + ptr_server = irc_server_new (server_tmp.name, + server_tmp.autoconnect, + server_tmp.autoreconnect, + server_tmp.autoreconnect_delay, + 1, /* temp server */ + server_tmp.address, + server_tmp.port, + server_tmp.ipv6, + server_tmp.ssl, + server_tmp.password, + server_tmp.nick1, + server_tmp.nick2, + server_tmp.nick3, + server_tmp.username, + server_tmp.realname, + server_tmp.hostname, + server_tmp.command, + 1, /* command_delay */ + server_tmp.autojoin, + 1, /* autorejoin */ + NULL); + if (ptr_server) + { + gui_chat_printf_info (NULL, + _("Server %s%s%s created " + "(temporary server, " + "NOT SAVED!)\n"), + GUI_COLOR(GUI_COLOR_CHAT_SERVER), + server_tmp.name, + GUI_COLOR(GUI_COLOR_CHAT)); + if (!irc_cmd_connect_one_server (ptr_server, 0)) + connect_ok = 0; + } + else + { + gui_chat_printf_error (NULL, + _("%s unable to create server " + "\"%s\"\n"), + WEECHAT_ERROR, argv[i]); + } + } + } + else + { + if (weechat_strcasecmp (argv[i], "-port") == 0) + i++; + } + } + } + + if (nb_connect == 0) + connect_ok = irc_cmd_connect_one_server (ptr_server, no_join); + + if (!connect_ok) + return -1; + + return 0; +} + +/* + * irc_cmd_ctcp: send a ctcp message + */ + +int +irc_cmd_ctcp (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos_type, *pos_args, *pos; + struct timeval tv; + + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + pos_type = strchr (arguments, ' '); + if (pos_type) + { + pos_type[0] = '\0'; + pos_type++; + while (pos_type[0] == ' ') + pos_type++; + pos_args = strchr (pos_type, ' '); + if (pos_args) + { + pos_args[0] = '\0'; + pos_args++; + while (pos_args[0] == ' ') + pos_args++; + } + else + pos_args = NULL; + + pos = pos_type; + while (pos[0]) + { + pos[0] = toupper (pos[0]); + pos++; + } + + gui_chat_printf_server (ptr_server->buffer, + "CTCP%s(%s%s%s)%s: %s%s", + GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), + GUI_COLOR(GUI_COLOR_CHAT_NICK), + arguments, + GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), + GUI_COLOR(GUI_COLOR_CHAT), + GUI_COLOR(GUI_COLOR_CHAT_CHANNEL), + pos_type); + + if ((weechat_strcasecmp (pos_type, "ping") == 0) && (!pos_args)) + { + gettimeofday (&tv, NULL); + irc_server_sendf (ptr_server, "PRIVMSG %s :\01PING %d %d\01", + arguments, tv.tv_sec, tv.tv_usec); + gui_chat_printf (ptr_server->buffer, " %s%d %d\n", + GUI_COLOR(GUI_COLOR_CHAT), + tv.tv_sec, tv.tv_usec); + } + else + { + if (pos_args) + { + irc_server_sendf (ptr_server, "PRIVMSG %s :\01%s %s\01", + arguments, pos_type, pos_args); + gui_chat_printf (ptr_server->buffer, " %s%s\n", + GUI_COLOR(GUI_COLOR_CHAT), + pos_args); + } + else + { + irc_server_sendf (ptr_server, "PRIVMSG %s :\01%s\01", + arguments, pos_type); + gui_chat_printf (ptr_server->buffer, "\n"); + } + } + } + return 0; +} + +/* + * irc_cmd_cycle: leave and rejoin a channel + */ + +int +irc_cmd_cycle (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *channel_name, *pos_args, *ptr_arg, *buf; + char **channels; + int i, num_channels; + + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + { + if (irc_channel_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++; + } + channels = weechat_explode_string (channel_name, ",", 0, + &num_channels); + if (channels) + { + for (i = 0; i < num_channels; i++) + { + ptr_channel = irc_channel_search (ptr_server, channels[i]); + /* mark channel as cycling */ + if (ptr_channel && + (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + ptr_channel->cycle = 1; + } + weechat_free_exploded_string (channels); + } + } + else + { + if (!ptr_channel) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can not be " + "executed on a server " + "buffer\n"), + WEECHAT_ERROR, "cycle"); + return -1; + } + + /* does nothing on private buffer (cycle has no sense!) */ + if (ptr_channel->type != IRC_CHANNEL_TYPE_CHANNEL) + return 0; + + channel_name = ptr_channel->name; + pos_args = arguments; + ptr_channel->cycle = 1; + } + } + else + { + if (!ptr_channel) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can not be " + "executed on a server buffer\n"), + WEECHAT_ERROR, "part"); + return -1; + } + + /* does nothing on private buffer (cycle has no sense!) */ + if (ptr_channel->type != IRC_CHANNEL_TYPE_CHANNEL) + return 0; + + channel_name = ptr_channel->name; + pos_args = NULL; + ptr_channel->cycle = 1; + } + + ptr_arg = (pos_args) ? pos_args : + (irc_cfg_irc_default_msg_part && irc_cfg_irc_default_msg_part[0]) ? + irc_cfg_irc_default_msg_part : NULL; + + if (ptr_arg) + { + buf = weechat_strreplace (ptr_arg, "%v", PACKAGE_VERSION); + irc_server_sendf (ptr_server, "PART %s :%s", channel_name, + (buf) ? buf : ptr_arg); + if (buf) + free (buf); + } + else + irc_server_sendf (ptr_server, "PART %s", channel_name); + + return 0; +} + +/* + * irc_cmd_dcc: DCC control (file or chat) + */ + +int +irc_cmd_dcc (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos_nick, *pos_file; + + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make compiler happy */ + (void) argc; + (void) argv; + + /* DCC SEND file */ + if (strncasecmp (arguments, "send", 4) == 0) + { + pos_nick = strchr (arguments, ' '); + if (!pos_nick) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s wrong argument count for " + "\"%s\" command\n"), + WEECHAT_ERROR, "dcc send"); + return -1; + } + while (pos_nick[0] == ' ') + pos_nick++; + + pos_file = strchr (pos_nick, ' '); + if (!pos_file) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s wrong argument count for " + "\"%s\" command\n"), + WEECHAT_ERROR, "dcc send"); + return -1; + } + pos_file[0] = '\0'; + pos_file++; + while (pos_file[0] == ' ') + pos_file++; + + irc_dcc_send_request (ptr_server, IRC_DCC_FILE_SEND, + pos_nick, pos_file); + } + /* DCC CHAT */ + else if (strncasecmp (arguments, "chat", 4) == 0) + { + pos_nick = strchr (arguments, ' '); + if (!pos_nick) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s wrong argument count for " + "\"%s\" command\n"), + WEECHAT_ERROR, "dcc chat"); + return -1; + } + while (pos_nick[0] == ' ') + pos_nick++; + + irc_dcc_send_request (ptr_server, IRC_DCC_CHAT_SEND, + pos_nick, NULL); + } + /* close DCC CHAT */ + else if (weechat_strcasecmp (arguments, "close") == 0) + { + if (ptr_channel && (ptr_channel != IRC_CHANNEL_TYPE_CHANNEL) + && (ptr_channel->dcc_chat)) + { + irc_dcc_close ((t_irc_dcc *)(ptr_channel->dcc_chat), + IRC_DCC_ABORTED); + irc_dcc_redraw (1); + } + } + /* unknown DCC action */ + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s wrong arguments for \"%s\" " + "command\n"), + WEECHAT_ERROR, "dcc"); + return -1; + } + + return 0; +} + +/* + * irc_cmd_dehalfop: remove half operator privileges from nickname(s) + */ + +int +irc_cmd_dehalfop (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) arguments; + + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + { + if (argc == 0) + irc_server_sendf (ptr_server, "MODE %s -h %s", + ptr_channel->name, + ptr_server->nick); + else + irc_cmd_mode_nicks (ptr_server, ptr_channel->name, + "-", "h", argc, argv); + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "dehalfop"); + } + return 0; +} + +/* + * irc_cmd_deop: remove operator privileges from nickname(s) + */ + +int +irc_cmd_deop (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) arguments; + + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + { + if (argc == 0) + irc_server_sendf (ptr_server, "MODE %s -o %s", + ptr_channel->name, + ptr_server->nick); + else + irc_cmd_mode_nicks (ptr_server, ptr_channel->name, + "-", "o", argc, argv); + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "deop"); + } + return 0; +} + +/* + * irc_cmd_devoice: remove voice from nickname(s) + */ + +int +irc_cmd_devoice (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) arguments; + + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + { + if (argc == 0) + irc_server_sendf (ptr_server, "MODE %s -v %s", + ptr_channel->name, + ptr_server->nick); + else + irc_cmd_mode_nicks (ptr_server, ptr_channel->name, + "-", "v", argc, argv); + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "devoice"); + return -1; + } + return 0; +} + +/* + * irc_cmd_die: shotdown the server + */ + +int +irc_cmd_die (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) arguments; + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "DIE"); + return 0; +} + +/* + * irc_cmd_quit_server: send QUIT to a server + */ + +void +irc_cmd_quit_server (t_irc_server *server, char *arguments) +{ + char *ptr_arg, *buf; + + if (!server) + return; + + if (server->is_connected) + { + ptr_arg = (arguments) ? arguments : + (irc_cfg_irc_default_msg_quit && irc_cfg_irc_default_msg_quit[0]) ? + irc_cfg_irc_default_msg_quit : NULL; + + if (ptr_arg) + { + buf = weechat_strreplace (ptr_arg, "%v", PACKAGE_VERSION); + irc_server_sendf (server, "QUIT :%s", + (buf) ? buf : ptr_arg); + if (buf) + free (buf); + } + else + irc_server_sendf (server, "QUIT"); + } +} + +/* + * irc_cmd_disconnect_one_server: disconnect from a server + * return 0 if error, 1 if ok + */ + +int +irc_cmd_disconnect_one_server (t_irc_server *server) +{ + if (!server) + return 0; + + if ((!server->is_connected) && (server->child_pid == 0) + && (server->reconnect_start == 0)) + { + gui_chat_printf_error (server->buffer, + _("%s not connected to server \"%s\"!\n"), + WEECHAT_ERROR, server->name); + return 0; + } + if (server->reconnect_start > 0) + { + gui_chat_printf_info (server->buffer, + _("Auto-reconnection is cancelled\n")); + } + irc_cmd_quit_server (server, NULL); + irc_server_disconnect (server, 0); + gui_status_draw (server->buffer, 1); + + /* disconnect ok */ + return 1; +} + +/* + * irc_cmd_disconnect: disconnect from server(s) + */ + +int +irc_cmd_disconnect (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + int i, disconnect_ok; + + IRC_BUFFER_GET_SERVER(window->buffer); + + /* make C compiler happy */ + (void) arguments; + + if (argc == 0) + disconnect_ok = irc_cmd_disconnect_one_server (ptr_server); + else + { + disconnect_ok = 1; + + if (weechat_strcasecmp (argv[0], "-all") == 0) + { + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + if ((ptr_server->is_connected) || (ptr_server->child_pid != 0) + || (ptr_server->reconnect_start != 0)) + { + if (!irc_cmd_disconnect_one_server (ptr_server)) + disconnect_ok = 0; + } + } + } + else + { + for (i = 0; i < argc; i++) + { + ptr_server = irc_server_search (argv[i]); + if (ptr_server) + { + if (!irc_cmd_disconnect_one_server (ptr_server)) + disconnect_ok = 0; + } + else + { + gui_chat_printf_error (NULL, + _("%s server \"%s\" not found\n"), + WEECHAT_ERROR, argv[i]); + disconnect_ok = 0; + } + } + } + } + + if (!disconnect_ok) + return -1; + + return 0; +} + +/* + * irc_cmd_halfop: give half operator privileges to nickname(s) + */ + +int +irc_cmd_halfop (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) arguments; + + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + { + if (argc == 0) + irc_server_sendf (ptr_server, "MODE %s +h %s", + ptr_channel->name, + ptr_server->nick); + else + irc_cmd_mode_nicks (ptr_server, ptr_channel->name, + "+", "h", argc, argv); + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "halfop"); + return -1; + } + return 0; +} + +/* + * irc_cmd_info: get information describing the server + */ + +int +irc_cmd_info (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "INFO %s", arguments); + else + irc_server_sendf (ptr_server, "INFO"); + return 0; +} + +/* + * irc_cmd_invite: invite a nick on a channel + */ + +int +irc_cmd_invite (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) arguments; + + if (argc == 2) + irc_server_sendf (ptr_server, "INVITE %s %s", argv[0], argv[1]); + else + { + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + irc_server_sendf (ptr_server, "INVITE %s %s", + argv[0], ptr_channel->name); + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "invite"); + return -1; + } + + } + return 0; +} + +/* + * irc_cmd_ison: check if a nickname is currently on IRC + */ + +int +irc_cmd_ison (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "ISON %s", arguments); + return 0; +} + +/* + * irc_cmd_join_server: send JOIN command on a server + */ + +void +irc_cmd_join_server (t_irc_server *server, char *arguments) +{ + if (irc_channel_is_channel (arguments)) + irc_server_sendf (server, "JOIN %s", arguments); + else + irc_server_sendf (server, "JOIN #%s", arguments); +} + +/* + * irc_cmd_join: join a new channel + */ + +int +irc_cmd_join (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_cmd_join_server (ptr_server, arguments); + + return 0; +} + +/* + * irc_cmd_kick: forcibly remove a user from a channel + */ + +int +irc_cmd_kick (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos_channel, *pos_nick, *pos_comment; + + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (irc_channel_is_channel (arguments)) + { + pos_channel = arguments; + pos_nick = strchr (arguments, ' '); + if (!pos_nick) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s wrong arguments for \"%s\" " + "command\n"), + WEECHAT_ERROR, "kick"); + return -1; + } + pos_nick[0] = '\0'; + pos_nick++; + while (pos_nick[0] == ' ') + pos_nick++; + } + else + { + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + { + pos_channel = ptr_channel->name; + pos_nick = arguments; + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "kick"); + return -1; + } + } + + pos_comment = strchr (pos_nick, ' '); + if (pos_comment) + { + pos_comment[0] = '\0'; + pos_comment++; + while (pos_comment[0] == ' ') + pos_comment++; + } + + if (pos_comment) + irc_server_sendf (ptr_server, "KICK %s %s :%s", + pos_channel, pos_nick, pos_comment); + else + irc_server_sendf (ptr_server, "KICK %s %s", + pos_channel, pos_nick); + + return 0; +} + +/* + * irc_cmd_kickban: forcibly remove a user from a channel and ban it + */ + +int +irc_cmd_kickban (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos_channel, *pos_nick, *pos_comment; + + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (irc_channel_is_channel (arguments)) + { + pos_channel = arguments; + pos_nick = strchr (arguments, ' '); + if (!pos_nick) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s wrong arguments for \"%s\" " + "command\n"), + WEECHAT_ERROR, "kickban"); + return -1; + } + pos_nick[0] = '\0'; + pos_nick++; + while (pos_nick[0] == ' ') + pos_nick++; + } + else + { + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + { + pos_channel = ptr_channel->name; + pos_nick = arguments; + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "kickban"); + return -1; + } + } + + pos_comment = strchr (pos_nick, ' '); + if (pos_comment) + { + pos_comment[0] = '\0'; + pos_comment++; + while (pos_comment[0] == ' ') + pos_comment++; + } + + irc_server_sendf (ptr_server, "MODE %s +b %s", + pos_channel, pos_nick); + if (pos_comment) + irc_server_sendf (ptr_server, "KICK %s %s :%s", + pos_channel, pos_nick, pos_comment); + else + irc_server_sendf (ptr_server, "KICK %s %s", + pos_channel, pos_nick); + + return 0; +} + +/* + * irc_cmd_kill: close client-server connection + */ + +int +irc_cmd_kill (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos; + + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + pos = strchr (arguments, ' '); + if (pos) + { + pos[0] = '\0'; + pos++; + while (pos[0] == ' ') + pos++; + irc_server_sendf (ptr_server, "KILL %s :%s", + arguments, pos); + } + else + irc_server_sendf (ptr_server, "KILL %s", + arguments); + return 0; +} + +/* + * irc_cmd_links: list all servernames which are known by the server + * answering the query + */ + +int +irc_cmd_links (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "LINKS %s", arguments); + else + irc_server_sendf (ptr_server, "LINKS"); + return 0; +} + +/* + * irc_cmd_list: close client-server connection + */ + +int +irc_cmd_list (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char buf[512]; + int ret; + + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (ptr_server->cmd_list_regexp) + { + regfree (ptr_server->cmd_list_regexp); + free (ptr_server->cmd_list_regexp); + ptr_server->cmd_list_regexp = NULL; + } + + if (arguments) + { + ptr_server->cmd_list_regexp = (regex_t *) malloc (sizeof (regex_t)); + if (ptr_server->cmd_list_regexp) + { + if ((ret = regcomp (ptr_server->cmd_list_regexp, + arguments, + REG_NOSUB | REG_ICASE)) != 0) + { + regerror (ret, ptr_server->cmd_list_regexp, + buf, sizeof(buf)); + gui_chat_printf (ptr_server->buffer, + _("%s \"%s\" is not a valid regular " + "expression (%s)\n"), + WEECHAT_ERROR, arguments, buf); + } + else + irc_server_sendf (ptr_server, "LIST"); + } + else + { + gui_chat_printf (ptr_server->buffer, + _("%s not enough memory for regular " + "expression\n"), + WEECHAT_ERROR); + } + } + else + irc_server_sendf (ptr_server, "LIST"); + + return 0; +} + +/* + * irc_cmd_lusers: get statistics about ths size of the IRC network + */ + +int +irc_cmd_lusers (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "LUSERS %s", arguments); + else + irc_server_sendf (ptr_server, "LUSERS"); + return 0; +} + +/* + * irc_cmd_me: send a ctcp action to the current channel + */ + +int +irc_cmd_me (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (!ptr_channel) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can not be executed " + "on a server buffer\n"), + WEECHAT_ERROR, "me"); + return -1; + } + irc_cmd_me_channel (ptr_server, ptr_channel, arguments); + return 0; +} + +/* + * irc_cmd_mode_server! send MODE command on a server + */ + +void +irc_cmd_mode_server (t_irc_server *server, char *arguments) +{ + irc_server_sendf (server, "MODE %s", arguments); +} + +/* + * irc_cmd_mode: change mode for channel/nickname + */ + +int +irc_cmd_mode (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_cmd_mode_server (ptr_server, arguments); + + return 0; +} + +/* + * irc_cmd_motd: get the "Message Of The Day" + */ + +int +irc_cmd_motd (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "MOTD %s", arguments); + else + irc_server_sendf (ptr_server, "MOTD"); + return 0; +} + +/* + * irc_cmd_msg: send a message to a nick or channel + */ + +int +irc_cmd_msg (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos, *pos_comma; + char *msg_pwd_hidden; + t_irc_nick *ptr_nick; + char *string; + + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + 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 (!ptr_channel + || ((ptr_channel->type != IRC_CHANNEL_TYPE_CHANNEL) + && (ptr_channel->type != IRC_CHANNEL_TYPE_PRIVATE))) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can " + "only be executed in a " + "channel or private " + "buffer\n"), + WEECHAT_ERROR, "msg *"); + return -1; + } + if (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL) + ptr_nick = irc_nick_search (ptr_channel, ptr_server->nick); + else + ptr_nick = NULL; + irc_display_nick (ptr_channel->buffer, ptr_nick, + (ptr_nick) ? NULL : ptr_server->nick, + GUI_MSG_TYPE_NICK, 1, NULL, 0); + string = (char *)irc_color_decode ((unsigned char *)pos, 1, 0); + gui_chat_printf_type (ptr_channel->buffer, GUI_MSG_TYPE_MSG, + NULL, -1, + "%s\n", + (string) ? string : ""); + if (string) + free (string); + + irc_server_sendf (ptr_server, "PRIVMSG %s :%s", + ptr_channel->name, pos); + } + else + { + if (irc_channel_is_channel (arguments)) + { + ptr_channel = irc_channel_search (ptr_server, arguments); + if (ptr_channel) + { + ptr_nick = irc_nick_search (ptr_channel, + ptr_server->nick); + if (ptr_nick) + { + irc_display_nick (ptr_channel->buffer, ptr_nick, + NULL, GUI_MSG_TYPE_NICK, 1, + NULL, 0); + string = (char *)irc_color_decode ( + (unsigned char *)pos, 1, 0); + gui_chat_printf_type (ptr_channel->buffer, + GUI_MSG_TYPE_MSG, + NULL, -1, + "%s\n", + (string) ? string : ""); + if (string) + free (string); + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s nick \"%s\" " + "not found for " + "\"%s\" command\n"), + WEECHAT_ERROR, + ptr_server->nick, + "msg"); + } + } + irc_server_sendf (ptr_server, "PRIVMSG %s :%s", + arguments, pos); + } + else + { + /* message to nickserv with identify ? */ + if (strcmp (arguments, "nickserv") == 0) + { + msg_pwd_hidden = strdup (pos); + if (irc_cfg_log_hide_nickserv_pwd) + irc_display_hide_password (msg_pwd_hidden, 0); + gui_chat_printf_type (ptr_server->buffer, + GUI_MSG_TYPE_NICK, + cfg_look_prefix_server, + cfg_col_chat_prefix_server, + "%s-%s%s%s- ", + GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), + GUI_COLOR(GUI_COLOR_CHAT_NICK), + arguments, + GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS)); + string = (char *)irc_color_decode ( + (unsigned char *)msg_pwd_hidden, 1, 0); + gui_chat_printf (ptr_server->buffer, + "%s%s\n", + GUI_COLOR(GUI_COLOR_CHAT), + (string) ? string : ""); + if (string) + free (string); + irc_server_sendf (ptr_server, "PRIVMSG %s :%s", + arguments, pos); + free (msg_pwd_hidden); + return 0; + } + + string = (char *)irc_color_decode ( + (unsigned char *)pos, 1, 0); + ptr_channel = irc_channel_search (ptr_server, arguments); + if (ptr_channel) + { + irc_display_nick (ptr_channel->buffer, NULL, + ptr_server->nick, + GUI_MSG_TYPE_NICK, 1, + GUI_COLOR(GUI_CHAT_NICK_SELF), + 0); + gui_chat_printf_type (ptr_channel->buffer, + GUI_MSG_TYPE_MSG, + NULL, -1, + "%s%s\n", + GUI_COLOR(GUI_COLOR_CHAT), + (string) ? string : ""); + } + else + { + gui_chat_printf_server (ptr_server->buffer, + "MSG%s(%s%s%s)%s: ", + GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), + GUI_COLOR(GUI_COLOR_CHAT_NICK), + arguments, + GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), + GUI_COLOR(GUI_COLOR_CHAT)); + gui_chat_printf_type (ptr_server->buffer, + GUI_MSG_TYPE_MSG, + cfg_look_prefix_server, + cfg_col_chat_prefix_server, + "%s\n", + (string) ? string : pos); + } + if (string) + free (string); + irc_server_sendf (ptr_server, "PRIVMSG %s :%s", + arguments, pos); + } + } + arguments = pos_comma; + } + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s wrong argument count for \"%s\" " + "command\n"), + WEECHAT_ERROR, "msg"); + return -1; + } + return 0; +} + +/* + * irc_cmd_names: list nicknames on channels + */ + +int +irc_cmd_names (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "NAMES %s", arguments); + else + { + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + irc_server_sendf (ptr_server, "NAMES %s", + ptr_channel->name); + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "names"); + return -1; + } + } + return 0; +} + +/* + * irc_send_nick_server: change nickname on a server + */ + +void +irc_send_nick_server (t_irc_server *server, char *nickname) +{ + t_irc_channel *ptr_channel; + + if (!server) + return; + + if (server->is_connected) + irc_server_sendf (server, "NICK %s", nickname); + else + { + if (server->nick) + free (server->nick); + server->nick = strdup (nickname); + gui_input_draw (server->buffer, 1); + for (ptr_channel = server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + gui_input_draw (ptr_channel->buffer, 1); + } + } +} + +/* + * irc_cmd_nick: change nickname + */ + +int +irc_cmd_nick (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server) + return -1; + + /* make C compiler happy */ + (void) arguments; + + if (argc == 2) + { + if (strncmp (argv[0], "-all", 4) != 0) + return -1; + + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + irc_send_nick_server (ptr_server, argv[1]); + } + } + else + { + if (argc == 1) + irc_send_nick_server (ptr_server, argv[0]); + else + return -1; + } + + return 0; +} + +/* + * irc_cmd_notice: send notice message + */ + +int +irc_cmd_notice (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos, *string; + + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + pos = strchr (arguments, ' '); + if (pos) + { + pos[0] = '\0'; + pos++; + while (pos[0] == ' ') + pos++; + string = (char *)irc_color_decode ((unsigned char *)pos, 1, 0); + gui_chat_printf_server (ptr_server->buffer, + "notice%s(%s%s%s)%s: %s\n", + GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), + GUI_COLOR(GUI_COLOR_CHAT_NICK), + arguments, + GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), + GUI_COLOR(GUI_COLOR_CHAT), + (string) ? string : ""); + if (string) + free (string); + irc_server_sendf (ptr_server, "NOTICE %s :%s", + arguments, pos); + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s wrong argument count for \"%s\" " + "command\n"), + WEECHAT_ERROR, "notice"); + return -1; + } + return 0; +} + +/* + * irc_cmd_op: give operator privileges to nickname(s) + */ + +int +irc_cmd_op (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) arguments; + + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + { + if (argc == 0) + irc_server_sendf (ptr_server, "MODE %s +o %s", + ptr_channel->name, + ptr_server->nick); + else + irc_cmd_mode_nicks (ptr_server, ptr_channel->name, + "+", "o", argc, argv); + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "op"); + return -1; + } + return 0; +} + +/* + * irc_cmd_oper: get oper privileges + */ + +int +irc_cmd_oper (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "OPER %s", arguments); + return 0; +} + +/* + * irc_cmd_part: leave a channel or close a private window + */ + +int +irc_cmd_part (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *channel_name, *pos_args, *ptr_arg, *buf; + + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + { + if (irc_channel_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 (!ptr_channel) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel or " + "private buffer\n"), + WEECHAT_ERROR, "part"); + return -1; + } + channel_name = ptr_channel->name; + pos_args = arguments; + } + } + else + { + if (!ptr_channel) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel or private " + "buffer\n"), + WEECHAT_ERROR, "part"); + return -1; + } + if (!ptr_channel->nicks) + { + gui_buffer_free (ptr_channel->buffer, 1); + irc_channel_free (ptr_server, ptr_channel); + gui_status_draw (gui_current_window->buffer, 1); + gui_input_draw (gui_current_window->buffer, 1); + return 0; + } + channel_name = ptr_channel->name; + pos_args = NULL; + } + + ptr_arg = (pos_args) ? pos_args : + (irc_cfg_irc_default_msg_part && irc_cfg_irc_default_msg_part[0]) ? + irc_cfg_irc_default_msg_part : NULL; + + if (ptr_arg) + { + buf = weechat_strreplace (ptr_arg, "%v", PACKAGE_VERSION); + irc_server_sendf (ptr_server, "PART %s :%s", + channel_name, + (buf) ? buf : ptr_arg); + if (buf) + free (buf); + } + else + irc_server_sendf (ptr_server, "PART %s", channel_name); + + return 0; +} + +/* + * irc_cmd_ping: ping a server + */ + +int +irc_cmd_ping (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "PING %s", arguments); + return 0; +} + +/* + * irc_cmd_pong: send pong answer to a daemon + */ + +int +irc_cmd_pong (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "PONG %s", arguments); + return 0; +} + +/* + * irc_cmd_query: start private conversation with a nick + */ + +int +irc_cmd_query (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos, *string; + + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + pos = strchr (arguments, ' '); + if (pos) + { + pos[0] = '\0'; + pos++; + while (pos[0] == ' ') + pos++; + if (!pos[0]) + pos = NULL; + } + + /* create private window if not already opened */ + ptr_channel = irc_channel_search (ptr_server, arguments); + if (!ptr_channel) + { + ptr_channel = irc_channel_new (ptr_server, + IRC_CHANNEL_TYPE_PRIVATE, + arguments, 1); + if (!ptr_channel) + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s cannot create new private " + "buffer \"%s\"\n"), + WEECHAT_ERROR, arguments); + return -1; + } + gui_chat_draw_title (ptr_channel->buffer, 1); + } + else + { + if (window->buffer != ptr_channel->buffer) + { + gui_window_switch_to_buffer (window, ptr_channel->buffer); + gui_window_redraw_buffer (ptr_channel->buffer); + } + } + + /* display text if given */ + if (pos) + { + irc_display_nick (ptr_channel->buffer, NULL, ptr_server->nick, + GUI_MSG_TYPE_NICK, 1, + GUI_COLOR(GIU_COLOR_CHAT_NICK_SELF), 0); + string = (char *)irc_color_decode ((unsigned char *)pos, 1, 0); + gui_chat_printf_type (ptr_channel->buffer, GUI_MSG_TYPE_MSG, + NULL, -1, + "%s%s\n", + GUI_COLOR(GUI_COLOR_CHAT), + (string) ? string : ""); + if (string) + free (string); + irc_server_sendf (ptr_server, "PRIVMSG %s :%s", + arguments, pos); + } + return 0; +} + +/* + * irc_cmd_quit: disconnect from all servers and quit WeeChat + */ + +int +irc_cmd_quit (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + t_irc_server *ptr_server; + + /* make C compiler happy */ + (void) window; + (void) argc; + (void) argv; + + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + irc_cmd_quit_server (ptr_server, arguments); + } + quit_weechat = 1; + return 0; +} + +/* + * irc_cmd_quote: send raw data to server + */ + +int +irc_cmd_quote (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (ptr_server->sock < 0) + { + gui_chat_printf_error_nolog (NULL, + _("%s command \"%s\" needs a server " + "connection!\n"), + WEECHAT_ERROR, "quote"); + return -1; + } + irc_server_sendf (ptr_server, "%s", arguments); + return 0; +} + +/* + * irc_cmd_reconnect_one_server: reconnect to a server + * return 0 if error, 1 if ok + */ + +int +irc_cmd_reconnect_one_server (t_irc_server *server, int no_join) +{ + if (!server) + return 0; + + if ((!server->is_connected) && (server->child_pid == 0)) + { + gui_chat_printf_error (server->buffer, + _("%s not connected to server \"%s\"!\n"), + WEECHAT_ERROR, server->name); + return 0; + } + irc_cmd_quit_server (server, NULL); + irc_server_disconnect (server, 0); + if (irc_server_connect (server, no_join)) + { + server->reconnect_start = 0; + server->reconnect_join = (server->channels) ? 1 : 0; + } + gui_status_draw (server->buffer, 1); + + /* reconnect ok */ + return 1; +} + +/* + * irc_cmd_reconnect: reconnect to server(s) + */ + +int +irc_cmd_reconnect (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + int i, nb_reconnect, reconnect_ok, all_servers, no_join; + + IRC_BUFFER_GET_SERVER(window->buffer); + + /* make C compiler happy */ + (void) arguments; + + nb_reconnect = 0; + reconnect_ok = 1; + + all_servers = 0; + no_join = 0; + for (i = 0; i < argc; i++) + { + if (weechat_strcasecmp (argv[i], "-all") == 0) + all_servers = 1; + if (weechat_strcasecmp (argv[i], "-nojoin") == 0) + no_join = 1; + } + + if (all_servers) + { + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + nb_reconnect++; + if ((ptr_server->is_connected) || (ptr_server->child_pid != 0)) + { + if (!irc_cmd_reconnect_one_server (ptr_server, no_join)) + reconnect_ok = 0; + } + } + } + else + { + for (i = 0; i < argc; i++) + { + if (argv[i][0] != '-') + { + nb_reconnect++; + ptr_server = irc_server_search (argv[i]); + if (ptr_server) + { + if (!irc_cmd_reconnect_one_server (ptr_server, no_join)) + reconnect_ok = 0; + } + else + { + gui_chat_printf_error (NULL, + _("%s server \"%s\" not found\n"), + WEECHAT_ERROR, argv[i]); + reconnect_ok = 0; + } + } + } + } + + if (nb_reconnect == 0) + reconnect_ok = irc_cmd_reconnect_one_server (ptr_server, no_join); + + if (!reconnect_ok) + return -1; + + return 0; +} + +/* + * irc_cmd_rehash: tell the server to reload its config file + */ + +int +irc_cmd_rehash (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) arguments; + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "REHASH"); + return 0; +} + +/* + * irc_cmd_restart: tell the server to restart itself + */ + +int +irc_cmd_restart (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) arguments; + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "RESTART"); + return 0; +} + +/* + * irc_cmd_server: manage IRC servers + */ + +int +irc_cmd_server (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + int i, detailed_list, one_server_found; + t_irc_server server_tmp, *ptr_server, *server_found, *new_server; + char *server_name, *error; + long number; + t_gui_buffer *ptr_buffer; + + /* make C compiler happy */ + (void) arguments; + + if ((argc == 0) + || (weechat_strcasecmp (argv[0], "list") == 0) + || (weechat_strcasecmp (argv[0], "listfull") == 0)) + { + /* list servers */ + server_name = NULL; + detailed_list = 0; + for (i = 0; i < argc; i++) + { + if (weechat_strcasecmp (argv[i], "list") == 0) + continue; + if (weechat_strcasecmp (argv[i], "listfull") == 0) + { + detailed_list = 1; + continue; + } + if (!server_name) + server_name = argv[i]; + } + if (!server_name) + { + if (irc_servers) + { + gui_chat_printf (NULL, "\n"); + gui_chat_printf (NULL, _("All servers:\n")); + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + irc_display_server (ptr_server, detailed_list); + } + } + else + gui_chat_printf_info (NULL, _("No server.\n")); + } + else + { + one_server_found = 0; + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + if (weechat_strcasestr (ptr_server->name, server_name)) + { + if (!one_server_found) + { + gui_chat_printf (NULL, "\n"); + gui_chat_printf (NULL, _("Servers with '%s':\n"), + server_name); + } + one_server_found = 1; + irc_display_server (ptr_server, detailed_list); + } + } + if (!one_server_found) + gui_chat_printf_info (NULL, + _("No server with '%s' found.\n"), + server_name); + } + } + else + { + if (weechat_strcasecmp (argv[0], "add") == 0) + { + if (argc < 3) + { + gui_chat_printf_error (NULL, + _("%s missing parameters for \"%s\" " + "command\n"), + WEECHAT_ERROR, "server"); + return -1; + } + + if (irc_server_name_already_exists (argv[1])) + { + gui_chat_printf_error (NULL, + _("%s server \"%s\" already exists, " + "can't create it!\n"), + WEECHAT_ERROR, argv[1]); + return -1; + } + + /* init server struct */ + irc_server_init (&server_tmp); + + server_tmp.name = strdup (argv[1]); + server_tmp.address = strdup (argv[2]); + server_tmp.port = IRC_SERVER_DEFAULT_PORT; + + /* parse arguments */ + for (i = 3; i < argc; i++) + { + if (argv[i][0] == '-') + { + if (weechat_strcasecmp (argv[i], "-temp") == 0) + server_tmp.temp_server = 1; + if (weechat_strcasecmp (argv[i], "-auto") == 0) + server_tmp.autoconnect = 1; + if (weechat_strcasecmp (argv[i], "-noauto") == 0) + server_tmp.autoconnect = 0; + if (weechat_strcasecmp (argv[i], "-ipv6") == 0) + server_tmp.ipv6 = 1; + if (weechat_strcasecmp (argv[i], "-ssl") == 0) + server_tmp.ssl = 1; + if (weechat_strcasecmp (argv[i], "-port") == 0) + { + if (i == (argc - 1)) + { + gui_chat_printf_error (NULL, + _("%s missing argument for " + "\"%s\" option\n"), + WEECHAT_ERROR, "-port"); + irc_server_destroy (&server_tmp); + return -1; + } + error = NULL; + number = strtol (argv[++i], &error, 10); + if (error && (error[0] == '\0')) + server_tmp.port = number; + } + if (weechat_strcasecmp (argv[i], "-pwd") == 0) + { + if (i == (argc - 1)) + { + gui_chat_printf_error (NULL, + _("%s missing argument for " + "\"%s\" option\n"), + WEECHAT_ERROR, "-pwd"); + irc_server_destroy (&server_tmp); + return -1; + } + server_tmp.password = strdup (argv[++i]); + } + if (weechat_strcasecmp (argv[i], "-nicks") == 0) + { + if (i >= (argc - 3)) + { + gui_chat_printf_error (NULL, + _("%s missing argument for " + "\"%s\" option\n"), + WEECHAT_ERROR, "-nicks"); + irc_server_destroy (&server_tmp); + return -1; + } + server_tmp.nick1 = strdup (argv[++i]); + server_tmp.nick2 = strdup (argv[++i]); + server_tmp.nick3 = strdup (argv[++i]); + } + if (weechat_strcasecmp (argv[i], "-username") == 0) + { + if (i == (argc - 1)) + { + gui_chat_printf_error (NULL, + _("%s missing argument for " + "\"%s\" option\n"), + WEECHAT_ERROR, "-username"); + irc_server_destroy (&server_tmp); + return -1; + } + server_tmp.username = strdup (argv[++i]); + } + if (weechat_strcasecmp (argv[i], "-realname") == 0) + { + if (i == (argc - 1)) + { + gui_chat_printf_error (NULL, + _("%s missing argument for " + "\"%s\" option\n"), + WEECHAT_ERROR, "-realname"); + irc_server_destroy (&server_tmp); + return -1; + } + server_tmp.realname = strdup (argv[++i]); + } + if (weechat_strcasecmp (argv[i], "-command") == 0) + { + if (i == (argc - 1)) + { + gui_chat_printf_error (NULL, + _("%s missing argument for " + "\"%s\" option\n"), + WEECHAT_ERROR, "-command"); + irc_server_destroy (&server_tmp); + return -1; + } + server_tmp.command = strdup (argv[++i]); + } + if (weechat_strcasecmp (argv[i], "-autojoin") == 0) + { + if (i == (argc - 1)) + { + gui_chat_printf_error (NULL, + _("%s missing argument for " + "\"%s\" option\n"), + WEECHAT_ERROR, "-autojoin"); + irc_server_destroy (&server_tmp); + return -1; + } + server_tmp.autojoin = strdup (argv[++i]); + } + } + } + + /* create new server */ + new_server = irc_server_new (server_tmp.name, + server_tmp.autoconnect, + server_tmp.autoreconnect, + server_tmp.autoreconnect_delay, + server_tmp.temp_server, + server_tmp.address, + server_tmp.port, + server_tmp.ipv6, + server_tmp.ssl, + server_tmp.password, + server_tmp.nick1, + server_tmp.nick2, + server_tmp.nick3, + server_tmp.username, + server_tmp.realname, + server_tmp.hostname, + server_tmp.command, + 1, /* command_delay */ + server_tmp.autojoin, + 1, /* autorejoin */ + NULL); + if (new_server) + { + gui_chat_printf_info (NULL, _("Server %s%s%s created\n"), + GUI_COLOR(GUI_COLOR_CHAT_SERVER), + server_tmp.name, + GUI_COLOR(GUI_COLOR_CHAT)); + } + else + { + gui_chat_printf_error (NULL, + _("%s unable to create server\n"), + WEECHAT_ERROR); + irc_server_destroy (&server_tmp); + return -1; + } + + if (new_server->autoconnect) + irc_server_connect (new_server, 0); + + irc_server_destroy (&server_tmp); + } + else if (weechat_strcasecmp (argv[0], "copy") == 0) + { + if (argc < 3) + { + gui_chat_printf_error (NULL, + _("%s missing server name for \"%s\" " + "command\n"), + WEECHAT_ERROR, "server copy"); + return -1; + } + + /* look for server by name */ + server_found = irc_server_search (argv[1]); + if (!server_found) + { + gui_chat_printf_error (NULL, + _("%s server \"%s\" not found for " + "\"%s\" command\n"), + WEECHAT_ERROR, argv[1], "server copy"); + return -1; + } + + /* check if target name already exists */ + if (irc_server_search (argv[2])) + { + gui_chat_printf_error (NULL, + _("%s server \"%s\" already exists for " + "\"%s\" command\n"), + WEECHAT_ERROR, argv[2], "server copy"); + return -1; + } + + /* duplicate server */ + new_server = irc_server_duplicate (server_found, argv[2]); + if (new_server) + { + gui_chat_printf_info (NULL, + _("Server %s%s%s has been copied to " + "%s%s\n"), + GUI_COLOR(GUI_COLOR_CHAT_SERVER), + argv[1], + GUI_COLOR(GUI_COLOR_CHAT), + GUI_COLOR(GUI_COLOR_CHAT_SERVER), + argv[2]); + gui_window_redraw_all_buffers (); + return 0; + } + + return -1; + } + else if (weechat_strcasecmp (argv[0], "rename") == 0) + { + if (argc < 3) + { + gui_chat_printf_error (NULL, + _("%s missing server name for \"%s\" " + "command\n"), + WEECHAT_ERROR, "server rename"); + return -1; + } + + /* look for server by name */ + server_found = irc_server_search (argv[1]); + if (!server_found) + { + gui_chat_printf_error (NULL, + _("%s server \"%s\" not found for " + "\"%s\" command\n"), + WEECHAT_ERROR, argv[1], + "server rename"); + return -1; + } + + /* check if target name already exists */ + if (irc_server_search (argv[2])) + { + gui_chat_printf_error (NULL, + _("%s server \"%s\" already exists for " + "\"%s\" command\n"), + WEECHAT_ERROR, argv[2], + "server rename"); + return -1; + } + + /* rename server */ + if (irc_server_rename (server_found, argv[2])) + { + gui_chat_printf_info (NULL, + _("Server %s%s%s has been renamed to " + "%s%s\n"), + GUI_COLOR(GUI_COLOR_CHAT_SERVER), + argv[1], + GUI_COLOR(GUI_COLOR_CHAT), + GUI_COLOR(GUI_COLOR_CHAT_SERVER), + argv[2]); + gui_window_redraw_all_buffers (); + return 0; + } + + return -1; + } + else if (weechat_strcasecmp (argv[0], "keep") == 0) + { + if (argc < 2) + { + gui_chat_printf_error (NULL, + _("%s missing server name for \"%s\" " + "command\n"), + WEECHAT_ERROR, "server keep"); + return -1; + } + + /* look for server by name */ + server_found = irc_server_search (argv[1]); + if (!server_found) + { + gui_chat_printf_error (NULL, + _("%s server \"%s\" not found for " + "\"%s\" command\n"), + WEECHAT_ERROR, argv[1], "server keep"); + return -1; + } + + /* check that it is temporary server */ + if (!server_found->temp_server) + { + gui_chat_printf_error (NULL, + _("%s server \"%s\" is not a temporary " + "server\n"), + WEECHAT_ERROR, argv[1]); + return -1; + } + + /* remove temporary flag on server */ + server_found->temp_server = 0; + + gui_chat_printf_info (NULL, + _("Server %s%s%s is not temporary any " + "more\n"), + GUI_COLOR(GUI_COLOR_CHAT_SERVER), + argv[1], + GUI_COLOR(GUI_COLOR_CHAT)); + + return 0; + } + else if (weechat_strcasecmp (argv[0], "del") == 0) + { + if (argc < 2) + { + gui_chat_printf_error (NULL, + _("%s missing server name for \"%s\" " + "command\n"), + WEECHAT_ERROR, "server del"); + return -1; + } + + /* look for server by name */ + server_found = irc_server_search (argv[1]); + if (!server_found) + { + gui_chat_printf_error (NULL, + _("%s server \"%s\" not found for " + "\"%s\" command\n"), + WEECHAT_ERROR, argv[1], "server del"); + return -1; + } + if (server_found->is_connected) + { + gui_chat_printf_error (NULL, + _("%s you can not delete server \"%s\" " + "because you are connected to. " + "Try /disconnect %s before.\n"), + WEECHAT_ERROR, argv[1], argv[1]); + return -1; + } + + for (ptr_buffer = gui_buffers; ptr_buffer; + ptr_buffer = ptr_buffer->next_buffer) + { + if ((ptr_buffer->protocol == irc_protocol) + && (IRC_BUFFER_SERVER(ptr_buffer) == server_found)) + { + IRC_BUFFER_SERVER(ptr_buffer) = NULL; + IRC_BUFFER_CHANNEL(ptr_buffer) = NULL; + } + } + + server_name = strdup (server_found->name); + + irc_server_free (server_found); + + gui_chat_printf_info (NULL, _("Server %s%s%s has been deleted\n"), + GUI_COLOR(GUI_COLOR_CHAT_SERVER), + server_name, + GUI_COLOR(GUI_COLOR_CHAT)); + if (server_name) + free (server_name); + + gui_window_redraw_buffer (window->buffer); + + return 0; + } + else if (weechat_strcasecmp (argv[0], "deloutq") == 0) + { + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + irc_server_outqueue_free_all (ptr_server); + } + gui_chat_printf_info_nolog (NULL, + _("Messages outqueue DELETED for all " + "servers. Some messages from you or " + "WeeChat may have been lost!\n")); + return 0; + } + else + { + gui_chat_printf_error (NULL, + _("%s unknown option for \"%s\" command\n"), + WEECHAT_ERROR, "server"); + return -1; + } + } + return 0; +} + +/* + * irc_cmd_service: register a new service + */ + +int +irc_cmd_service (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "SERVICE %s", arguments); + return 0; +} + +/* + * irc_cmd_servlist: list services currently connected to the network + */ + +int +irc_cmd_servlist (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "SERVLIST %s", arguments); + else + irc_server_sendf (ptr_server, "SERVLIST"); + return 0; +} + +/* + * irc_cmd_squery: deliver a message to a service + */ + +int +irc_cmd_squery (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos; + + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + pos = strchr (arguments, ' '); + if (pos) + { + pos[0] = '\0'; + pos++; + while (pos[0] == ' ') + { + pos++; + } + irc_server_sendf (ptr_server, "SQUERY %s :%s", arguments, pos); + } + else + irc_server_sendf (ptr_server, "SQUERY %s", arguments); + + return 0; +} + +/* + * irc_cmd_squit: disconnect server links + */ + +int +irc_cmd_squit (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "SQUIT %s", arguments); + return 0; +} + +/* + * irc_cmd_stats: query statistics about server + */ + +int +irc_cmd_stats (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "STATS %s", arguments); + else + irc_server_sendf (ptr_server, "STATS"); + return 0; +} + +/* + * irc_cmd_summon: give users who are on a host running an IRC server + * a message asking them to please join IRC + */ + +int +irc_cmd_summon (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "SUMMON %s", arguments); + return 0; +} + +/* + * irc_cmd_time: query local time from server + */ + +int +irc_cmd_time (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "TIME %s", arguments); + else + irc_server_sendf (ptr_server, "TIME"); + return 0; +} + +/* + * irc_cmd_topic: get/set topic for a channel + */ + +int +irc_cmd_topic (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *channel_name, *new_topic, *pos; + + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + channel_name = NULL; + new_topic = NULL; + + if (arguments) + { + if (irc_channel_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 (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + channel_name = ptr_channel->name; + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "topic"); + return -1; + } + } + + if (new_topic) + { + if (strcmp (new_topic, "-delete") == 0) + irc_server_sendf (ptr_server, "TOPIC %s :", + channel_name); + else + irc_server_sendf (ptr_server, "TOPIC %s :%s", + channel_name, new_topic); + } + else + irc_server_sendf (ptr_server, "TOPIC %s", + channel_name); + + return 0; +} + +/* + * irc_cmd_trace: find the route to specific server + */ + +int +irc_cmd_trace (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "TRACE %s", arguments); + else + irc_server_sendf (ptr_server, "TRACE"); + return 0; +} + +/* + * irc_cmd_unban: unbans nicks or hosts + */ + +int +irc_cmd_unban (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + char *pos_channel, *pos, *pos2; + + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + { + pos_channel = NULL; + pos = strchr (arguments, ' '); + if (pos) + { + pos[0] = '\0'; + + if (irc_channel_is_channel (arguments)) + { + pos_channel = arguments; + pos++; + while (pos[0] == ' ') + pos++; + } + else + { + pos[0] = ' '; + pos = arguments; + } + } + else + pos = arguments; + + /* channel not given, use default buffer */ + if (!pos_channel) + { + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + pos_channel = ptr_channel->name; + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel " + "buffer\n"), + WEECHAT_ERROR, "unban"); + return -1; + } + } + + /* loop on users */ + while (pos && pos[0]) + { + pos2 = strchr (pos, ' '); + if (pos2) + { + pos2[0] = '\0'; + pos2++; + while (pos2[0] == ' ') + pos2++; + } + irc_server_sendf (ptr_server, "MODE %s -b %s", + pos_channel, pos); + pos = pos2; + } + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s wrong argument count for \"%s\" " + "command\n"), + WEECHAT_ERROR, "unban"); + return -1; + } + return 0; +} + +/* + * irc_cmd_userhost: return a list of information about nicknames + */ + +int +irc_cmd_userhost (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "USERHOST %s", arguments); + return 0; +} + +/* + * irc_cmd_users: list of users logged into the server + */ + +int +irc_cmd_users (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "USERS %s", arguments); + else + irc_server_sendf (ptr_server, "USERS"); + return 0; +} + +/* + * irc_cmd_version: gives the version info of nick or server (current or specified) + */ + +int +irc_cmd_version (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + { + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL) + && irc_nick_search (ptr_channel, arguments)) + irc_server_sendf (ptr_server, "PRIVMSG %s :\01VERSION\01", + arguments); + else + irc_server_sendf (ptr_server, "VERSION %s", + arguments); + } + else + { + gui_chat_printf_info (ptr_server->buffer, + _("%s, compiled on %s %s\n"), + PACKAGE_STRING, + __DATE__, __TIME__); + irc_server_sendf (ptr_server, "VERSION"); + } + return 0; +} + +/* + * irc_cmd_voice: give voice to nickname(s) + */ + +int +irc_cmd_voice (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER_CHANNEL(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) arguments; + + if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL)) + { + if (argc == 0) + irc_server_sendf (ptr_server, "MODE %s +v %s", + ptr_channel->name, + ptr_server->nick); + else + irc_cmd_mode_nicks (ptr_server, ptr_channel->name, + "+", "v", argc, argv); + } + else + { + gui_chat_printf_error_nolog (ptr_server->buffer, + _("%s \"%s\" command can only be " + "executed in a channel buffer\n"), + WEECHAT_ERROR, "voice"); + return -1; + } + return 0; +} + +/* + * irc_cmd_wallops: send a message to all currently connected users who + * have set the 'w' user mode for themselves + */ + +int +irc_cmd_wallops (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "WALLOPS :%s", arguments); + return 0; +} + +/* + * irc_cmd_who: generate a query which returns a list of information + */ + +int +irc_cmd_who (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + if (arguments) + irc_server_sendf (ptr_server, "WHO %s", arguments); + else + irc_server_sendf (ptr_server, "WHO"); + return 0; +} + +/* + * irc_cmd_whois: query information about user(s) + */ + +int +irc_cmd_whois (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "WHOIS %s", arguments); + return 0; +} + +/* + * irc_cmd_whowas: ask for information about a nickname which no longer exists + */ + +int +irc_cmd_whowas (t_gui_window *window, + char *arguments, int argc, char **argv) +{ + IRC_BUFFER_GET_SERVER(window->buffer); + if (!ptr_server || !ptr_server->is_connected) + return -1; + + /* make C compiler happy */ + (void) argc; + (void) argv; + + irc_server_sendf (ptr_server, "WHOWAS %s", arguments); + return 0; +} |