/* * Copyright (c) 2003-2007 by FlashCode * 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 . */ /* irc-command.c: IRC commands managment */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #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; }