151 |
{ "restart", N_("tell the server to restart itself"), |
{ "restart", N_("tell the server to restart itself"), |
152 |
"", "", |
"", "", |
153 |
0, 0, 1, NULL, irc_cmd_send_restart, NULL }, |
0, 0, 1, NULL, irc_cmd_send_restart, NULL }, |
154 |
|
{ "stats", N_("query statistics about server"), |
155 |
|
"[query [server]]", |
156 |
|
"query: c/h/i/k/l/m/o/y/u (see RFC1459)\nserver: server name", |
157 |
|
0, 2, 1, NULL, irc_cmd_send_stats, NULL }, |
158 |
{ "topic", N_("get/set channel topic"), |
{ "topic", N_("get/set channel topic"), |
159 |
N_("[channel] [topic]"), N_("channel: channel name\ntopic: new topic for channel " |
N_("[channel] [topic]"), N_("channel: channel name\ntopic: new topic for channel " |
160 |
"(if topic is \"-delete\" then topic is deleted)"), |
"(if topic is \"-delete\" then topic is deleted)"), |
174 |
{ "003", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
{ "003", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
175 |
{ "004", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_004 }, |
{ "004", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_004 }, |
176 |
{ "005", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
{ "005", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
177 |
|
{ "212", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
178 |
|
{ "219", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
179 |
{ "250", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
{ "250", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
180 |
{ "251", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
{ "251", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
181 |
{ "252", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
{ "252", N_("a server message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_msg }, |
321 |
"", "", 0, MAX_ARGS, 1, NULL, NULL, irc_cmd_recv_error }, |
"", "", 0, MAX_ARGS, 1, NULL, NULL, irc_cmd_recv_error }, |
322 |
{ NULL, NULL, NULL, NULL, 0, 0, 1, NULL, NULL, NULL } |
{ NULL, NULL, NULL, NULL, 0, 0, 1, NULL, NULL, NULL } |
323 |
}; |
}; |
|
|
|
|
|
|
|
/* |
|
|
* irc_recv_command: executes action when receiving IRC command |
|
|
* returns: 0 = all ok, command executed |
|
|
* -1 = command failed |
|
|
* -2 = no command to execute |
|
|
* -3 = command not found |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_recv_command (t_irc_server *server, |
|
|
char *host, char *command, char *arguments) |
|
|
{ |
|
|
int i, cmd_found; |
|
|
|
|
|
if (command == NULL) |
|
|
return -2; |
|
|
|
|
|
/* looks for irc command */ |
|
|
cmd_found = -1; |
|
|
for (i = 0; irc_commands[i].command_name; i++) |
|
|
if (strcasecmp (irc_commands[i].command_name, command) == 0) |
|
|
{ |
|
|
cmd_found = i; |
|
|
break; |
|
|
} |
|
|
|
|
|
/* command not found */ |
|
|
if (cmd_found < 0) |
|
|
return -3; |
|
|
|
|
|
if (irc_commands[i].recv_function != NULL) |
|
|
return (int) (irc_commands[i].recv_function) (server, host, arguments); |
|
|
|
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_login: login to irc server |
|
|
*/ |
|
|
|
|
|
void |
|
|
irc_login (t_irc_server *server) |
|
|
{ |
|
|
char hostname[128]; |
|
|
|
|
|
if ((server->password) && (server->password[0])) |
|
|
server_sendf (server, "PASS %s\r\n", server->password); |
|
|
|
|
|
gethostname (hostname, sizeof (hostname) - 1); |
|
|
hostname[sizeof (hostname) - 1] = '\0'; |
|
|
if (!hostname[0]) |
|
|
strcpy (hostname, _("unknown")); |
|
|
gui_printf (server->window, |
|
|
_("%s: using local hostname \"%s\"\n"), |
|
|
WEECHAT_NAME, hostname); |
|
|
server_sendf (server, |
|
|
"NICK %s\r\n" |
|
|
"USER %s %s %s :%s\r\n", |
|
|
server->nick, server->username, hostname, "servername", |
|
|
server->realname); |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_away: toggle away status |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_away (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
char *pos; |
|
|
t_irc_server *ptr_server; |
|
|
|
|
|
if (arguments && (strncmp (arguments, "-all", 4) == 0)) |
|
|
{ |
|
|
pos = arguments + 4; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
if (!pos[0]) |
|
|
pos = NULL; |
|
|
|
|
|
for (ptr_server = irc_servers; ptr_server; |
|
|
ptr_server = ptr_server->next_server) |
|
|
{ |
|
|
if (server->is_connected) |
|
|
{ |
|
|
if (pos) |
|
|
server_sendf (ptr_server, "AWAY :%s\r\n", pos); |
|
|
else |
|
|
server_sendf (ptr_server, "AWAY\r\n"); |
|
|
} |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (arguments) |
|
|
server_sendf (server, "AWAY :%s\r\n", arguments); |
|
|
else |
|
|
server_sendf (server, "AWAY\r\n"); |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_ctcp: send a ctcp message |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_ctcp (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
char *pos, *pos2; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
pos2 = strchr (pos, ' '); |
|
|
if (pos2) |
|
|
{ |
|
|
pos2[0] = '\0'; |
|
|
pos2++; |
|
|
while (pos2[0] == ' ') |
|
|
pos2++; |
|
|
} |
|
|
else |
|
|
pos2 = NULL; |
|
|
|
|
|
if (strcasecmp (pos, "version") == 0) |
|
|
{ |
|
|
if (pos2) |
|
|
server_sendf (server, "PRIVMSG %s :\01VERSION %s\01\r\n", |
|
|
arguments, pos2); |
|
|
else |
|
|
server_sendf (server, "PRIVMSG %s :\01VERSION\01\r\n", |
|
|
arguments); |
|
|
} |
|
|
if (strcasecmp (pos, "action") == 0) |
|
|
{ |
|
|
if (pos2) |
|
|
server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n", |
|
|
arguments, pos2); |
|
|
else |
|
|
server_sendf (server, "PRIVMSG %s :\01ACTION\01\r\n", |
|
|
arguments); |
|
|
} |
|
|
|
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_deop: remove operator privileges from nickname(s) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_deop (t_irc_server *server, int argc, char **argv) |
|
|
{ |
|
|
int i; |
|
|
|
|
|
if (WIN_IS_CHANNEL(gui_current_window)) |
|
|
{ |
|
|
for (i = 0; i < argc; i++) |
|
|
server_sendf (server, "MODE %s -o %s\r\n", |
|
|
CHANNEL(gui_current_window)->name, |
|
|
argv[i]); |
|
|
} |
|
|
else |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command can only be executed in a channel window\n"), |
|
|
WEECHAT_ERROR, "deop"); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_devoice: remove voice from nickname(s) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_devoice (t_irc_server *server, int argc, char **argv) |
|
|
{ |
|
|
int i; |
|
|
|
|
|
if (WIN_IS_CHANNEL(gui_current_window)) |
|
|
{ |
|
|
for (i = 0; i < argc; i++) |
|
|
server_sendf (server, "MODE %s -v %s\r\n", |
|
|
CHANNEL(gui_current_window)->name, |
|
|
argv[i]); |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command can only be executed in a channel window\n"), |
|
|
WEECHAT_ERROR, "devoice"); |
|
|
return -1; |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_invite: invite a nick on a channel |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_invite (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
server_sendf (server, "INVITE %s\r\n", arguments); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_join: join a new channel |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_join (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
server_sendf (server, "JOIN %s\r\n", arguments); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_kick: forcibly remove a user from a channel |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_kick (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
if (string_is_channel (arguments)) |
|
|
server_sendf (server, "KICK %s\r\n", arguments); |
|
|
else |
|
|
{ |
|
|
if (WIN_IS_CHANNEL (gui_current_window)) |
|
|
{ |
|
|
server_sendf (server, |
|
|
"KICK %s %s\r\n", |
|
|
CHANNEL(gui_current_window)->name, arguments); |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command can only be executed in a channel window\n"), |
|
|
WEECHAT_ERROR, "kick"); |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_kill: close client-server connection |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_kill (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
server_sendf (server, "KILL %s\r\n", arguments); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_list: close client-server connection |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_list (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
if (arguments) |
|
|
server_sendf (server, "LIST %s\r\n", arguments); |
|
|
else |
|
|
server_sendf (server, "LIST\r\n"); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_me: send a ctcp action to the current channel |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_me (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
if (WIN_IS_SERVER(gui_current_window)) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command can not be executed on a server window\n"), |
|
|
WEECHAT_ERROR, "me"); |
|
|
return -1; |
|
|
} |
|
|
server_sendf (server, "PRIVMSG %s :\01ACTION %s\01\r\n", |
|
|
CHANNEL(gui_current_window)->name, arguments); |
|
|
irc_display_prefix (gui_current_window, PREFIX_ACTION_ME); |
|
|
gui_printf_color (gui_current_window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", server->nick); |
|
|
gui_printf_color (gui_current_window, |
|
|
COLOR_WIN_CHAT, " %s\n", arguments); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_mode: change mode for channel/nickname |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_mode (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
server_sendf (server, "MODE %s\r\n", arguments); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_msg: send a message to a nick or channel |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_msg (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
char *pos, *pos_comma; |
|
|
t_irc_channel *ptr_channel; |
|
|
t_irc_nick *ptr_nick; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
|
|
|
while (arguments && arguments[0]) |
|
|
{ |
|
|
pos_comma = strchr (arguments, ','); |
|
|
if (pos_comma) |
|
|
{ |
|
|
pos_comma[0] = '\0'; |
|
|
pos_comma++; |
|
|
} |
|
|
if (strcmp (arguments, "*") == 0) |
|
|
{ |
|
|
if (WIN_IS_SERVER(gui_current_window)) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command can not be executed on a server window\n"), |
|
|
WEECHAT_ERROR, "msg *"); |
|
|
return -1; |
|
|
} |
|
|
ptr_channel = CHANNEL(gui_current_window); |
|
|
ptr_nick = nick_search (ptr_channel, server->nick); |
|
|
if (ptr_nick) |
|
|
{ |
|
|
irc_display_nick (ptr_channel->window, ptr_nick, |
|
|
MSG_TYPE_NICK, 1, 1, 0); |
|
|
gui_printf_color_type (ptr_channel->window, |
|
|
MSG_TYPE_MSG, |
|
|
COLOR_WIN_CHAT, "%s\n", pos); |
|
|
} |
|
|
else |
|
|
gui_printf (server->window, |
|
|
_("%s nick not found for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "msg"); |
|
|
server_sendf (server, "PRIVMSG %s :%s\r\n", ptr_channel->name, pos); |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (string_is_channel (arguments)) |
|
|
{ |
|
|
ptr_channel = channel_search (server, arguments); |
|
|
if (ptr_channel) |
|
|
{ |
|
|
ptr_nick = nick_search (ptr_channel, server->nick); |
|
|
if (ptr_nick) |
|
|
{ |
|
|
irc_display_nick (ptr_channel->window, ptr_nick, |
|
|
MSG_TYPE_NICK, 1, 1, 0); |
|
|
gui_printf_color_type (ptr_channel->window, |
|
|
MSG_TYPE_MSG, |
|
|
COLOR_WIN_CHAT, "%s\n", pos); |
|
|
} |
|
|
else |
|
|
gui_printf (server->window, |
|
|
_("%s nick not found for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "msg"); |
|
|
} |
|
|
server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos); |
|
|
} |
|
|
else |
|
|
{ |
|
|
ptr_channel = channel_search (server, arguments); |
|
|
if (!ptr_channel) |
|
|
{ |
|
|
ptr_channel = channel_new (server, CHAT_PRIVATE, arguments); |
|
|
if (!ptr_channel) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s cannot create new private window \"%s\"\n"), |
|
|
WEECHAT_ERROR, |
|
|
arguments); |
|
|
return -1; |
|
|
} |
|
|
gui_redraw_window_title (ptr_channel->window); |
|
|
} |
|
|
|
|
|
gui_printf_color_type (ptr_channel->window, |
|
|
MSG_TYPE_NICK, |
|
|
COLOR_WIN_CHAT_DARK, "<"); |
|
|
gui_printf_color_type (ptr_channel->window, |
|
|
MSG_TYPE_NICK, |
|
|
COLOR_WIN_NICK_SELF, |
|
|
"%s", server->nick); |
|
|
gui_printf_color_type (ptr_channel->window, |
|
|
MSG_TYPE_NICK, |
|
|
COLOR_WIN_CHAT_DARK, "> "); |
|
|
gui_printf_color_type (ptr_channel->window, |
|
|
MSG_TYPE_MSG, |
|
|
COLOR_WIN_CHAT, "%s\n", pos); |
|
|
server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos); |
|
|
} |
|
|
} |
|
|
arguments = pos_comma; |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s wrong argument count for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "msg"); |
|
|
return -1; |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_names: list nicknames on channels |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_names (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
if (arguments) |
|
|
server_sendf (server, "NAMES %s\r\n", arguments); |
|
|
else |
|
|
{ |
|
|
if (!WIN_IS_CHANNEL(gui_current_window)) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command can only be executed in a channel window\n"), |
|
|
WEECHAT_ERROR, "names"); |
|
|
return -1; |
|
|
} |
|
|
else |
|
|
server_sendf (server, "NAMES %s\r\n", |
|
|
CHANNEL(gui_current_window)->name); |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_nick: change nickname |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_nick (t_irc_server *server, int argc, char **argv) |
|
|
{ |
|
|
if (argc != 1) |
|
|
return -1; |
|
|
server_sendf (server, "NICK %s\r\n", argv[0]); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_notice: send notice message |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_notice (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
server_sendf (server, "NOTICE %s\r\n", arguments); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_op: give operator privileges to nickname(s) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_op (t_irc_server *server, int argc, char **argv) |
|
|
{ |
|
|
int i; |
|
|
|
|
|
if (WIN_IS_CHANNEL(gui_current_window)) |
|
|
{ |
|
|
for (i = 0; i < argc; i++) |
|
|
server_sendf (server, "MODE %s +o %s\r\n", |
|
|
CHANNEL(gui_current_window)->name, |
|
|
argv[i]); |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command can only be executed in a channel window\n"), |
|
|
WEECHAT_ERROR, "op"); |
|
|
return -1; |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_oper: get oper privileges |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_oper (t_irc_server *server, int argc, char **argv) |
|
|
{ |
|
|
if (argc != 2) |
|
|
return -1; |
|
|
server_sendf (server, "OPER %s %s\r\n", argv[0], argv[1]); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_part: leave a channel or close a private window |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_part (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
char *channel_name, *pos_args; |
|
|
t_irc_channel *ptr_channel; |
|
|
|
|
|
if (arguments) |
|
|
{ |
|
|
if (string_is_channel (arguments)) |
|
|
{ |
|
|
channel_name = arguments; |
|
|
pos_args = strchr (arguments, ' '); |
|
|
if (pos_args) |
|
|
{ |
|
|
pos_args[0] = '\0'; |
|
|
pos_args++; |
|
|
while (pos_args[0] == ' ') |
|
|
pos_args++; |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (WIN_IS_SERVER(gui_current_window)) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command can not be executed on a server window\n"), |
|
|
WEECHAT_ERROR, "part"); |
|
|
return -1; |
|
|
} |
|
|
channel_name = CHANNEL(gui_current_window)->name; |
|
|
pos_args = arguments; |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (WIN_IS_SERVER(gui_current_window)) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command can not be executed on a server window\n"), |
|
|
WEECHAT_ERROR, "part"); |
|
|
return -1; |
|
|
} |
|
|
if (WIN_IS_PRIVATE(gui_current_window)) |
|
|
{ |
|
|
ptr_channel = CHANNEL(gui_current_window); |
|
|
gui_window_free (ptr_channel->window); |
|
|
channel_free (server, ptr_channel); |
|
|
gui_redraw_window_status (gui_current_window); |
|
|
gui_redraw_window_input (gui_current_window); |
|
|
return 0; |
|
|
} |
|
|
channel_name = CHANNEL(gui_current_window)->name; |
|
|
pos_args = NULL; |
|
|
} |
|
|
|
|
|
if (pos_args) |
|
|
server_sendf (server, "PART %s :%s\r\n", channel_name, pos_args); |
|
|
else |
|
|
server_sendf (server, "PART %s\r\n", channel_name); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_ping: ping a server |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_ping (t_irc_server *server, int argc, char **argv) |
|
|
{ |
|
|
if (argc == 1) |
|
|
server_sendf (server, "PING %s\r\n", argv[0]); |
|
|
if (argc == 2) |
|
|
server_sendf (server, "PING %s %s\r\n", argv[0], |
|
|
argv[1]); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_pong: send pong answer to a daemon |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_pong (t_irc_server *server, int argc, char **argv) |
|
|
{ |
|
|
if (argc == 1) |
|
|
server_sendf (server, "PONG %s\r\n", argv[0]); |
|
|
if (argc == 2) |
|
|
server_sendf (server, "PONG %s %s\r\n", argv[0], |
|
|
argv[1]); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_quit: disconnect from all servers and quit WeeChat |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_quit (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
if (server && server->is_connected) |
|
|
{ |
|
|
if (arguments) |
|
|
server_sendf (server, "QUIT :%s\r\n", arguments); |
|
|
else |
|
|
server_sendf (server, "QUIT\r\n"); |
|
|
} |
|
|
quit_weechat = 1; |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_quote: send raw data to server |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_quote (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
server_sendf (server, "%s\r\n", arguments); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_rehash: tell the server to reload its config file |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_rehash (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
/* make gcc happy */ |
|
|
(void) arguments; |
|
|
|
|
|
server_sendf (server, "REHASH\r\n"); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_restart: tell the server to restart itself |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_restart (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
/* make gcc happy */ |
|
|
(void) arguments; |
|
|
|
|
|
server_sendf (server, "RESTART\r\n"); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_topic: get/set topic for a channel |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_topic (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
char *channel_name, *new_topic, *pos; |
|
|
|
|
|
channel_name = NULL; |
|
|
new_topic = NULL; |
|
|
|
|
|
if (arguments) |
|
|
{ |
|
|
if (string_is_channel (arguments)) |
|
|
{ |
|
|
channel_name = arguments; |
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
new_topic = (pos[0]) ? pos : NULL; |
|
|
} |
|
|
} |
|
|
else |
|
|
new_topic = arguments; |
|
|
} |
|
|
|
|
|
/* look for current channel if not specified */ |
|
|
if (!channel_name) |
|
|
{ |
|
|
if (WIN_IS_SERVER(gui_current_window)) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command can not be executed on a server window\n"), |
|
|
WEECHAT_ERROR, "topic"); |
|
|
return -1; |
|
|
} |
|
|
channel_name = CHANNEL(gui_current_window)->name; |
|
|
} |
|
|
|
|
|
if (new_topic) |
|
|
{ |
|
|
if (strcmp (new_topic, "-delete") == 0) |
|
|
server_sendf (server, "TOPIC %s :\r\n", channel_name); |
|
|
else |
|
|
server_sendf (server, "TOPIC %s :%s\r\n", channel_name, new_topic); |
|
|
} |
|
|
else |
|
|
server_sendf (server, "TOPIC %s\r\n", channel_name); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_version: gives the version info of nick or server (current or specified) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_version (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
if (arguments) |
|
|
{ |
|
|
if (WIN_IS_CHANNEL(gui_current_window) && |
|
|
nick_search (CHANNEL(gui_current_window), arguments)) |
|
|
server_sendf (server, "PRIVMSG %s :\01VERSION\01\r\n", |
|
|
arguments); |
|
|
else |
|
|
server_sendf (server, "VERSION %s\r\n", |
|
|
arguments); |
|
|
} |
|
|
else |
|
|
{ |
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf (server->window, _("%s, compiled on %s %s\n"), |
|
|
WEECHAT_NAME_AND_VERSION, |
|
|
__DATE__, __TIME__); |
|
|
server_sendf (server, "VERSION\r\n"); |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_voice: give voice to nickname(s) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_voice (t_irc_server *server, int argc, char **argv) |
|
|
{ |
|
|
int i; |
|
|
|
|
|
if (WIN_IS_CHANNEL(gui_current_window)) |
|
|
{ |
|
|
for (i = 0; i < argc; i++) |
|
|
server_sendf (server, "MODE %s +v %s\r\n", |
|
|
CHANNEL(gui_current_window)->name, |
|
|
argv[i]); |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command can only be executed in a channel window\n"), |
|
|
WEECHAT_ERROR, "voice"); |
|
|
return -1; |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_send_whois: query information about user(s) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_send_whois (t_irc_server *server, char *arguments) |
|
|
{ |
|
|
server_sendf (server, "WHOIS %s\r\n", arguments); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_error: error received from server |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_error (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos, *pos2; |
|
|
int first; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) server; |
|
|
(void) host; |
|
|
|
|
|
if (strncmp (arguments, "Closing Link", 12) == 0) |
|
|
{ |
|
|
server_disconnect (server); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
} |
|
|
else |
|
|
pos = arguments; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_ERROR); |
|
|
first = 1; |
|
|
|
|
|
while (pos && pos[0]) |
|
|
{ |
|
|
pos2 = strchr (pos, ' '); |
|
|
if ((pos[0] == ':') || (!pos2)) |
|
|
{ |
|
|
if (pos[0] == ':') |
|
|
pos++; |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, |
|
|
"%s%s\n", (first) ? "" : ": ", pos); |
|
|
pos = NULL; |
|
|
} |
|
|
else |
|
|
{ |
|
|
pos2[0] = '\0'; |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%s%s", |
|
|
(first) ? "" : " ", pos); |
|
|
first = 0; |
|
|
pos = pos2 + 1; |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_join: 'join' message received |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_join (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
t_irc_channel *ptr_channel; |
|
|
char *pos; |
|
|
|
|
|
ptr_channel = channel_search (server, arguments); |
|
|
if (!ptr_channel) |
|
|
{ |
|
|
ptr_channel = channel_new (server, CHAT_CHANNEL, arguments); |
|
|
if (!ptr_channel) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s cannot create new channel \"%s\"\n"), |
|
|
WEECHAT_ERROR, arguments); |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
|
|
|
pos = strchr (host, '!'); |
|
|
if (pos) |
|
|
pos[0] = '\0'; |
|
|
|
|
|
irc_display_prefix (ptr_channel->window, PREFIX_JOIN); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK, |
|
|
"%s ", host); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, |
|
|
"("); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_HOST, |
|
|
"%s", pos + 1); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, |
|
|
")"); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT, |
|
|
_(" has joined ")); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL, |
|
|
"%s\n", arguments); |
|
|
nick_new (ptr_channel, host, 0, 0, 0); |
|
|
gui_redraw_window_nick (gui_current_window); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_kick: 'kick' message received |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_kick (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos, *pos_nick, *pos_comment; |
|
|
t_irc_channel *ptr_channel; |
|
|
t_irc_nick *ptr_nick; |
|
|
|
|
|
pos = strchr (host, '!'); |
|
|
if (pos) |
|
|
pos[0] = '\0'; |
|
|
|
|
|
pos_nick = strchr (arguments, ' '); |
|
|
if (pos_nick) |
|
|
{ |
|
|
pos_nick[0] = '\0'; |
|
|
pos_nick++; |
|
|
while (pos_nick[0] == ' ') |
|
|
pos_nick++; |
|
|
|
|
|
pos_comment = strchr (pos_nick, ' '); |
|
|
if (pos_comment) |
|
|
{ |
|
|
pos_comment[0] = '\0'; |
|
|
pos_comment++; |
|
|
while (pos_comment[0] == ' ') |
|
|
pos_comment++; |
|
|
if (pos_comment[0] == ':') |
|
|
pos_comment++; |
|
|
} |
|
|
|
|
|
ptr_channel = channel_search (server, arguments); |
|
|
if (!ptr_channel) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s channel not found for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "kick"); |
|
|
return -1; |
|
|
} |
|
|
|
|
|
irc_display_prefix (ptr_channel->window, PREFIX_PART); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK, |
|
|
"%s", host); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT, |
|
|
_(" has kicked ")); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_NICK, |
|
|
"%s", pos_nick); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT, |
|
|
_(" from ")); |
|
|
if (pos_comment) |
|
|
{ |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL, |
|
|
"%s ", arguments); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, |
|
|
"("); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT, |
|
|
"%s", pos_comment); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, |
|
|
")\n"); |
|
|
} |
|
|
else |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL, |
|
|
"%s\n", arguments); |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s nick not found for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "kick"); |
|
|
return -1; |
|
|
} |
|
|
ptr_nick = nick_search (ptr_channel, pos_nick); |
|
|
if (ptr_nick) |
|
|
{ |
|
|
nick_free (ptr_channel, ptr_nick); |
|
|
gui_redraw_window_nick (gui_current_window); |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_mode: 'mode' message received |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos, *pos2, *pos_parm; |
|
|
char set_flag; |
|
|
t_irc_channel *ptr_channel; |
|
|
t_irc_nick *ptr_nick; |
|
|
|
|
|
/* no host => we can't identify sender of message! */ |
|
|
if (host == NULL) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command received without host\n"), |
|
|
WEECHAT_ERROR, "mode"); |
|
|
return -1; |
|
|
} |
|
|
|
|
|
/* keep only nick name from host */ |
|
|
pos = strchr (host, '!'); |
|
|
if (pos) |
|
|
pos[0] = '\0'; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (!pos) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command received without channel or nickname\n"), |
|
|
WEECHAT_ERROR, "mode"); |
|
|
return -1; |
|
|
} |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
|
|
|
pos_parm = strchr (pos, ' '); |
|
|
if (pos_parm) |
|
|
{ |
|
|
pos_parm[0] = '\0'; |
|
|
pos_parm++; |
|
|
while (pos_parm[0] == ' ') |
|
|
pos_parm++; |
|
|
pos2 = strchr (pos_parm, ' '); |
|
|
if (pos2) |
|
|
pos2[0] = '\0'; |
|
|
} |
|
|
|
|
|
set_flag = '+'; |
|
|
|
|
|
if (string_is_channel (arguments)) |
|
|
{ |
|
|
ptr_channel = channel_search (server, arguments); |
|
|
if (ptr_channel) |
|
|
{ |
|
|
/* channel modes */ |
|
|
while (pos && pos[0]) |
|
|
{ |
|
|
switch (pos[0]) |
|
|
{ |
|
|
case '+': |
|
|
set_flag = '+'; |
|
|
break; |
|
|
case '-': |
|
|
set_flag = '-'; |
|
|
break; |
|
|
case 'b': |
|
|
irc_display_mode (ptr_channel->window, |
|
|
arguments, set_flag, "b", host, |
|
|
(set_flag == '+') ? |
|
|
_("sets ban on") : |
|
|
_("removes ban on"), |
|
|
pos_parm); |
|
|
/* TODO: change & redraw channel modes */ |
|
|
break; |
|
|
case 'i': |
|
|
irc_display_mode (ptr_channel->window, |
|
|
arguments, set_flag, "i", host, |
|
|
(set_flag == '+') ? |
|
|
_("sets invite-only channel flag") : |
|
|
_("removes invite-only channel flag"), |
|
|
NULL); |
|
|
/* TODO: change & redraw channel modes */ |
|
|
break; |
|
|
case 'l': |
|
|
irc_display_mode (ptr_channel->window, |
|
|
arguments, set_flag, "l", host, |
|
|
(set_flag == '+') ? |
|
|
_("sets the user limit to") : |
|
|
_("removes user limit"), |
|
|
(set_flag == '+') ? pos_parm : NULL); |
|
|
/* TODO: change & redraw channel modes */ |
|
|
break; |
|
|
case 'm': |
|
|
irc_display_mode (ptr_channel->window, |
|
|
arguments, set_flag, "m", host, |
|
|
(set_flag == '+') ? |
|
|
_("sets moderated channel flag") : |
|
|
_("removes moderated channel flag"), |
|
|
NULL); |
|
|
/* TODO: change & redraw channel modes */ |
|
|
break; |
|
|
case 'o': |
|
|
irc_display_mode (ptr_channel->window, |
|
|
arguments, set_flag, "o", host, |
|
|
(set_flag == '+') ? |
|
|
_("gives channel operator status to") : |
|
|
_("removes channel operator status from"), |
|
|
pos_parm); |
|
|
ptr_nick = nick_search (ptr_channel, pos_parm); |
|
|
if (ptr_nick) |
|
|
{ |
|
|
ptr_nick->is_op = (set_flag == '+') ? 1 : 0; |
|
|
nick_resort (ptr_channel, ptr_nick); |
|
|
gui_redraw_window_nick (ptr_channel->window); |
|
|
} |
|
|
break; |
|
|
/* TODO: remove this obsolete (?) channel flag? */ |
|
|
case 'p': |
|
|
irc_display_mode (ptr_channel->window, |
|
|
arguments, set_flag, "p", host, |
|
|
(set_flag == '+') ? |
|
|
_("sets private channel flag") : |
|
|
_("removes private channel flag"), |
|
|
NULL); |
|
|
/* TODO: change & redraw channel modes */ |
|
|
break; |
|
|
case 's': |
|
|
irc_display_mode (ptr_channel->window, |
|
|
arguments, set_flag, "s", host, |
|
|
(set_flag == '+') ? |
|
|
_("sets secret channel flag") : |
|
|
_("removes secret channel flag"), |
|
|
NULL); |
|
|
/* TODO: change & redraw channel modes */ |
|
|
break; |
|
|
case 't': |
|
|
irc_display_mode (ptr_channel->window, |
|
|
arguments, set_flag, "t", host, |
|
|
(set_flag == '+') ? |
|
|
_("sets topic protection") : |
|
|
_("removes topic protection"), |
|
|
NULL); |
|
|
/* TODO: change & redraw channel modes */ |
|
|
break; |
|
|
case 'v': |
|
|
irc_display_mode (ptr_channel->window, |
|
|
arguments, set_flag, "v", host, |
|
|
(set_flag == '+') ? |
|
|
_("gives voice to") : |
|
|
_("removes voice from"), |
|
|
pos_parm); |
|
|
|
|
|
ptr_nick = nick_search (ptr_channel, pos_parm); |
|
|
if (ptr_nick) |
|
|
{ |
|
|
ptr_nick->has_voice = (set_flag == '+') ? 1 : 0; |
|
|
nick_resort (ptr_channel, ptr_nick); |
|
|
gui_redraw_window_nick (ptr_channel->window); |
|
|
} |
|
|
break; |
|
|
} |
|
|
pos++; |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s channel not found for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "mode"); |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
/* nickname modes */ |
|
|
gui_printf (server->window, "(TODO!) nickname modes: channel=%s, args=%s\n", arguments, pos); |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_nick: 'nick' message received |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_nick (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos; |
|
|
t_irc_channel *ptr_channel; |
|
|
t_irc_nick *ptr_nick; |
|
|
int nick_is_me; |
|
|
|
|
|
/* no host => we can't identify sender of message! */ |
|
|
if (host == NULL) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command received without host\n"), |
|
|
WEECHAT_ERROR, "nick"); |
|
|
return -1; |
|
|
} |
|
|
|
|
|
/* keep only nick name from host */ |
|
|
pos = strchr (host, '!'); |
|
|
if (pos) |
|
|
pos[0] = '\0'; |
|
|
|
|
|
for (ptr_channel = server->channels; ptr_channel; |
|
|
ptr_channel = ptr_channel->next_channel) |
|
|
{ |
|
|
ptr_nick = nick_search (ptr_channel, host); |
|
|
if (ptr_nick) |
|
|
{ |
|
|
nick_is_me = (strcmp (ptr_nick->nick, server->nick) == 0); |
|
|
nick_change (ptr_channel, ptr_nick, arguments); |
|
|
irc_display_prefix (ptr_channel->window, PREFIX_INFO); |
|
|
if (nick_is_me) |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, |
|
|
_("You are ")); |
|
|
else |
|
|
{ |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_NICK, |
|
|
"%s", host); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, " is "); |
|
|
} |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, |
|
|
_("now known as ")); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_NICK, |
|
|
"%s\n", |
|
|
arguments); |
|
|
if (ptr_channel->window->win_nick) |
|
|
gui_redraw_window_nick (ptr_channel->window); |
|
|
} |
|
|
} |
|
|
|
|
|
if (strcmp (server->nick, host) == 0) |
|
|
{ |
|
|
free (server->nick); |
|
|
server->nick = strdup (arguments); |
|
|
} |
|
|
gui_redraw_window_input (gui_current_window); |
|
|
|
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_notice: 'notice' message received |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos, *pos2; |
|
|
|
|
|
if (host) |
|
|
{ |
|
|
pos = strchr (host, '!'); |
|
|
if (pos) |
|
|
pos[0] = '\0'; |
|
|
} |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
if (pos[0] == ':') |
|
|
pos++; |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s nickname not found for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "notice"); |
|
|
return -1; |
|
|
} |
|
|
irc_display_prefix (server->window, PREFIX_SERVER); |
|
|
if (strncmp (pos, "\01VERSION", 8) == 0) |
|
|
{ |
|
|
pos += 9; |
|
|
pos2 = strchr (pos, '\01'); |
|
|
if (pos2) |
|
|
pos2[0] = '\0'; |
|
|
gui_printf_color (server->window, COLOR_WIN_CHAT, "CTCP "); |
|
|
gui_printf_color (server->window, COLOR_WIN_CHAT_CHANNEL, "VERSION "); |
|
|
gui_printf_color (server->window, COLOR_WIN_CHAT, _("reply from")); |
|
|
gui_printf_color (server->window, COLOR_WIN_CHAT_NICK, " %s", host); |
|
|
gui_printf_color (server->window, COLOR_WIN_CHAT, ": %s\n", pos); |
|
|
} |
|
|
else |
|
|
gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", pos); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_part: 'part' message received |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_part (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos, *pos_args; |
|
|
t_irc_channel *ptr_channel; |
|
|
t_irc_nick *ptr_nick; |
|
|
|
|
|
/* no host => we can't identify sender of message! */ |
|
|
if (!host || !arguments) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command received without host or channel\n"), |
|
|
WEECHAT_ERROR, "part"); |
|
|
return -1; |
|
|
} |
|
|
|
|
|
pos_args = strchr (arguments, ' '); |
|
|
if (pos_args) |
|
|
{ |
|
|
pos_args[0] = '\0'; |
|
|
pos_args++; |
|
|
while (pos_args[0] == ' ') |
|
|
pos_args++; |
|
|
if (pos_args[0] == ':') |
|
|
pos_args++; |
|
|
} |
|
|
|
|
|
/* keep only nick name from host */ |
|
|
pos = strchr (host, '!'); |
|
|
if (pos) |
|
|
pos[0] = '\0'; |
|
|
|
|
|
ptr_channel = channel_search (server, arguments); |
|
|
if (ptr_channel) |
|
|
{ |
|
|
ptr_nick = nick_search (ptr_channel, host); |
|
|
if (ptr_nick) |
|
|
{ |
|
|
if (strcmp (ptr_nick->nick, server->nick) == 0) |
|
|
{ |
|
|
/* part request was issued by local client */ |
|
|
gui_window_free (ptr_channel->window); |
|
|
channel_free (server, ptr_channel); |
|
|
gui_redraw_window_status (gui_current_window); |
|
|
gui_redraw_window_input (gui_current_window); |
|
|
} |
|
|
else |
|
|
{ |
|
|
|
|
|
/* remove nick from nick list and display message */ |
|
|
nick_free (ptr_channel, ptr_nick); |
|
|
irc_display_prefix (ptr_channel->window, PREFIX_PART); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_NICK, "%s ", host); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_DARK, "("); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_HOST, "%s", pos+1); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_DARK, ")"); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, _(" has left ")); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%s", ptr_channel->name); |
|
|
if (pos_args && pos_args[0]) |
|
|
{ |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_DARK, " ("); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, "%s", pos_args); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_DARK, ")"); |
|
|
} |
|
|
gui_printf (ptr_channel->window, "\n"); |
|
|
|
|
|
/* redraw nick list if this is current window */ |
|
|
if (ptr_channel->window->win_nick) |
|
|
gui_redraw_window_nick (ptr_channel->window); |
|
|
} |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s channel not found for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "part"); |
|
|
return -1; |
|
|
} |
|
|
|
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_ping: 'ping' command received |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_ping (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos; |
|
|
|
|
|
(void)host; |
|
|
pos = strrchr (arguments, ' '); |
|
|
if (pos) |
|
|
pos[0] = '\0'; |
|
|
server_sendf (server, "PONG :%s\r\n", arguments); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_privmsg: 'privmsg' command received |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos, *pos2, *host2; |
|
|
t_irc_channel *ptr_channel; |
|
|
t_irc_nick *ptr_nick; |
|
|
struct utsname *buf; |
|
|
|
|
|
/* no host => we can't identify sender of message! */ |
|
|
if (host == NULL) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command received without host\n"), |
|
|
WEECHAT_ERROR, "privmsg"); |
|
|
return -1; |
|
|
} |
|
|
|
|
|
/* keep only nick name from host */ |
|
|
pos = strchr (host, '!'); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
host2 = pos+1; |
|
|
} |
|
|
else |
|
|
host2 = host; |
|
|
|
|
|
/* receiver is a channel ? */ |
|
|
if (string_is_channel (arguments)) |
|
|
{ |
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
if (pos[0] == ':') |
|
|
pos++; |
|
|
|
|
|
ptr_channel = channel_search (server, arguments); |
|
|
if (ptr_channel) |
|
|
{ |
|
|
if (strncmp (pos, "\01ACTION ", 8) == 0) |
|
|
{ |
|
|
pos += 8; |
|
|
pos2 = strchr (pos, '\01'); |
|
|
if (pos2) |
|
|
pos2[0] = '\0'; |
|
|
irc_display_prefix (ptr_channel->window, PREFIX_ACTION_ME); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", host); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, " %s\n", pos); |
|
|
} |
|
|
else |
|
|
{ |
|
|
ptr_nick = nick_search (ptr_channel, host); |
|
|
if (ptr_nick) |
|
|
{ |
|
|
irc_display_nick (ptr_channel->window, ptr_nick, |
|
|
MSG_TYPE_NICK, 1, 1, 0); |
|
|
gui_printf_color_type (ptr_channel->window, |
|
|
MSG_TYPE_MSG, |
|
|
COLOR_WIN_CHAT, "%s\n", pos); |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s nick not found for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "privmsg"); |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s channel not found for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "privmsg"); |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
pos = strchr (host, '!'); |
|
|
if (pos) |
|
|
pos[0] = '\0'; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
if (pos[0] == ':') |
|
|
pos++; |
|
|
|
|
|
if (strcmp (pos, "\01VERSION\01") == 0) |
|
|
{ |
|
|
buf = (struct utsname *) malloc (sizeof (struct utsname)); |
|
|
uname (buf); |
|
|
server_sendf (server, |
|
|
_("NOTICE %s :%sVERSION %s v%s" |
|
|
" compiled on %s, host \"%s\" is running " |
|
|
"%s %s / %s%s"), |
|
|
host, "\01", WEECHAT_NAME, WEECHAT_VERSION, __DATE__, |
|
|
&buf->nodename, &buf->sysname, |
|
|
&buf->release, &buf->machine, "\01\r\n"); |
|
|
free (buf); |
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, _("Received a ")); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, _("CTCP VERSION ")); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, _("from")); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_NICK, " %s\n", host); |
|
|
} |
|
|
else |
|
|
{ |
|
|
/* private message received */ |
|
|
ptr_channel = channel_search (server, host); |
|
|
if (!ptr_channel) |
|
|
{ |
|
|
ptr_channel = channel_new (server, CHAT_PRIVATE, host); |
|
|
if (!ptr_channel) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s cannot create new private window \"%s\"\n"), |
|
|
WEECHAT_ERROR, host); |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
if (!ptr_channel->topic) |
|
|
{ |
|
|
ptr_channel->topic = strdup (host2); |
|
|
gui_redraw_window_title (ptr_channel->window); |
|
|
} |
|
|
|
|
|
gui_printf_color_type (ptr_channel->window, |
|
|
MSG_TYPE_NICK, |
|
|
COLOR_WIN_CHAT_DARK, "<"); |
|
|
gui_printf_color_type (ptr_channel->window, |
|
|
MSG_TYPE_NICK, |
|
|
COLOR_WIN_NICK_PRIVATE, |
|
|
"%s", host); |
|
|
gui_printf_color_type (ptr_channel->window, |
|
|
MSG_TYPE_NICK, |
|
|
COLOR_WIN_CHAT_DARK, "> "); |
|
|
gui_printf_color_type (ptr_channel->window, |
|
|
MSG_TYPE_MSG, |
|
|
COLOR_WIN_CHAT, "%s\n", pos); |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s cannot parse \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "privmsg"); |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_quit: 'quit' command received |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_quit (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos; |
|
|
t_irc_channel *ptr_channel; |
|
|
t_irc_nick *ptr_nick; |
|
|
|
|
|
/* no host => we can't identify sender of message! */ |
|
|
if (host == NULL) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command received without host\n"), |
|
|
WEECHAT_ERROR, "quit"); |
|
|
return -1; |
|
|
} |
|
|
|
|
|
/* keep only nick name from host */ |
|
|
pos = strchr (host, '!'); |
|
|
if (pos) |
|
|
pos[0] = '\0'; |
|
|
|
|
|
for (ptr_channel = server->channels; ptr_channel; |
|
|
ptr_channel = ptr_channel->next_channel) |
|
|
{ |
|
|
if (ptr_channel->type == CHAT_PRIVATE) |
|
|
ptr_nick = NULL; |
|
|
else |
|
|
ptr_nick = nick_search (ptr_channel, host); |
|
|
|
|
|
if (ptr_nick || (strcmp (ptr_channel->name, host) == 0)) |
|
|
{ |
|
|
if (ptr_nick) |
|
|
nick_free (ptr_channel, ptr_nick); |
|
|
irc_display_prefix (ptr_channel->window, PREFIX_QUIT); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_NICK, "%s ", host); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_DARK, "("); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_HOST, "%s", pos + 1); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_DARK, ") "); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, _("has quit")); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_DARK, " ("); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, "%s", |
|
|
arguments); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_DARK, ")\n"); |
|
|
if ((ptr_channel->window == gui_current_window) && |
|
|
(ptr_channel->window->win_nick)) |
|
|
gui_redraw_window_nick (ptr_channel->window); |
|
|
} |
|
|
} |
|
|
|
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_server_msg: command received from server (numeric) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_server_msg (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
/* skip nickname if at beginning of server message */ |
|
|
if (strncmp (server->nick, arguments, strlen (server->nick)) == 0) |
|
|
{ |
|
|
arguments += strlen (server->nick) + 1; |
|
|
while (arguments[0] == ' ') |
|
|
arguments++; |
|
|
} |
|
|
|
|
|
if (arguments[0] == ':') |
|
|
arguments++; |
|
|
|
|
|
/* display server message */ |
|
|
irc_display_prefix (server->window, PREFIX_SERVER); |
|
|
gui_printf_color (server->window, COLOR_WIN_CHAT, "%s\n", arguments); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_server_reply: server reply |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_server_reply (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos, *pos2; |
|
|
int first; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) server; |
|
|
(void) host; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
} |
|
|
else |
|
|
pos = arguments; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_ERROR); |
|
|
first = 1; |
|
|
|
|
|
while (pos && pos[0]) |
|
|
{ |
|
|
pos2 = strchr (pos, ' '); |
|
|
if ((pos[0] == ':') || (!pos2)) |
|
|
{ |
|
|
if (pos[0] == ':') |
|
|
pos++; |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, |
|
|
"%s%s\n", (first) ? "" : ": ", pos); |
|
|
pos = NULL; |
|
|
} |
|
|
else |
|
|
{ |
|
|
pos2[0] = '\0'; |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%s%s", |
|
|
(first) ? "" : " ", pos); |
|
|
first = 0; |
|
|
pos = pos2 + 1; |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_topic: 'topic' command received |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_topic (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos; |
|
|
t_irc_channel *ptr_channel; |
|
|
t_gui_window *window; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
/* keep only nick name from host */ |
|
|
pos = strchr (host, '!'); |
|
|
if (pos) |
|
|
pos[0] = '\0'; |
|
|
|
|
|
if (!string_is_channel (arguments)) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s \"%s\" command received without channel\n"), |
|
|
WEECHAT_ERROR, "topic"); |
|
|
return -1; |
|
|
} |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
if (pos[0] == ':') |
|
|
pos++; |
|
|
if (!pos[0]) |
|
|
pos = NULL; |
|
|
} |
|
|
|
|
|
ptr_channel = channel_search (server, arguments); |
|
|
window = (ptr_channel) ? ptr_channel->window : server->window; |
|
|
|
|
|
irc_display_prefix (window, PREFIX_INFO); |
|
|
gui_printf_color (window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", |
|
|
host); |
|
|
if (pos) |
|
|
{ |
|
|
gui_printf_color (window, |
|
|
COLOR_WIN_CHAT, _(" has changed topic for ")); |
|
|
gui_printf_color (window, |
|
|
COLOR_WIN_CHAT_CHANNEL, "%s", |
|
|
arguments); |
|
|
gui_printf_color (window, |
|
|
COLOR_WIN_CHAT, _(" to: \"%s\"\n"), |
|
|
pos); |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf_color (window, |
|
|
COLOR_WIN_CHAT, _(" has unset topic for ")); |
|
|
gui_printf_color (window, |
|
|
COLOR_WIN_CHAT_CHANNEL, "%s\n", |
|
|
arguments); |
|
|
} |
|
|
|
|
|
if (ptr_channel) |
|
|
{ |
|
|
if (ptr_channel->topic) |
|
|
free (ptr_channel->topic); |
|
|
if (pos) |
|
|
ptr_channel->topic = strdup (pos); |
|
|
else |
|
|
ptr_channel->topic = strdup (""); |
|
|
gui_redraw_window_title (ptr_channel->window); |
|
|
} |
|
|
|
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_004: '004' command (connected to irc server) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_004 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
(void) arguments; |
|
|
|
|
|
irc_cmd_recv_server_msg (server, host, arguments); |
|
|
|
|
|
/* connection to IRC server is ok! */ |
|
|
server->is_connected = 1; |
|
|
gui_redraw_window_status (server->window); |
|
|
gui_redraw_window_input (server->window); |
|
|
|
|
|
/* execute command once connected */ |
|
|
if (server->command && server->command[0]) |
|
|
user_command(server, server->command); |
|
|
|
|
|
/* autojoin */ |
|
|
if (server->autojoin && server->autojoin[0]) |
|
|
return irc_cmd_send_join (server, server->autojoin); |
|
|
|
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_311: '311' command (away message) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_301 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos_nick, *pos_message; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) server; |
|
|
(void) host; |
|
|
|
|
|
pos_nick = strchr (arguments, ' '); |
|
|
if (pos_nick) |
|
|
{ |
|
|
while (pos_nick[0] == ' ') |
|
|
pos_nick++; |
|
|
pos_message = strchr (pos_nick, ' '); |
|
|
if (pos_message) |
|
|
{ |
|
|
pos_message[0] = '\0'; |
|
|
pos_message++; |
|
|
while (pos_message[0] == ' ') |
|
|
pos_message++; |
|
|
if (pos_message[0] == ':') |
|
|
pos_message++; |
|
|
|
|
|
irc_display_prefix (gui_current_window, PREFIX_INFO); |
|
|
gui_printf_color (gui_current_window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", pos_nick); |
|
|
gui_printf_color (gui_current_window, |
|
|
COLOR_WIN_CHAT, _(" is away: %s\n"), pos_message); |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_311: '311' command (whois, user) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_311 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos_nick, *pos_user, *pos_host, *pos_realname; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos_nick = strchr (arguments, ' '); |
|
|
if (pos_nick) |
|
|
{ |
|
|
while (pos_nick[0] == ' ') |
|
|
pos_nick++; |
|
|
pos_user = strchr (pos_nick, ' '); |
|
|
if (pos_user) |
|
|
{ |
|
|
pos_user[0] = '\0'; |
|
|
pos_user++; |
|
|
while (pos_user[0] == ' ') |
|
|
pos_user++; |
|
|
pos_host = strchr (pos_user, ' '); |
|
|
if (pos_host) |
|
|
{ |
|
|
pos_host[0] = '\0'; |
|
|
pos_host++; |
|
|
while (pos_host[0] == ' ') |
|
|
pos_host++; |
|
|
pos_realname = strchr (pos_host, ' '); |
|
|
if (pos_realname) |
|
|
{ |
|
|
pos_realname[0] = '\0'; |
|
|
pos_realname++; |
|
|
while (pos_realname[0] == ' ') |
|
|
pos_realname++; |
|
|
if (pos_realname[0] == '*') |
|
|
pos_realname++; |
|
|
while (pos_realname[0] == ' ') |
|
|
pos_realname++; |
|
|
if (pos_realname[0] == ':') |
|
|
pos_realname++; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "["); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", pos_nick); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "] ("); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_HOST, "%s@%s", |
|
|
pos_user, pos_host); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, ")"); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, ": %s\n", pos_realname); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_312: '312' command (whois, server) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_312 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos_nick, *pos_server, *pos_serverinfo; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos_nick = strchr (arguments, ' '); |
|
|
if (pos_nick) |
|
|
{ |
|
|
while (pos_nick[0] == ' ') |
|
|
pos_nick++; |
|
|
pos_server = strchr (pos_nick, ' '); |
|
|
if (pos_server) |
|
|
{ |
|
|
pos_server[0] = '\0'; |
|
|
pos_server++; |
|
|
while (pos_server[0] == ' ') |
|
|
pos_server++; |
|
|
pos_serverinfo = strchr (pos_server, ' '); |
|
|
if (pos_serverinfo) |
|
|
{ |
|
|
pos_serverinfo[0] = '\0'; |
|
|
pos_serverinfo++; |
|
|
while (pos_serverinfo[0] == ' ') |
|
|
pos_serverinfo++; |
|
|
if (pos_serverinfo[0] == ':') |
|
|
pos_serverinfo++; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "["); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", pos_nick); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "] "); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, "%s ", pos_server); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "("); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, "%s", pos_serverinfo); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, ")\n"); |
|
|
} |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_313: '313' command (whois, operator) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_313 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos_nick, *pos_message; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos_nick = strchr (arguments, ' '); |
|
|
if (pos_nick) |
|
|
{ |
|
|
while (pos_nick[0] == ' ') |
|
|
pos_nick++; |
|
|
pos_message = strchr (pos_nick, ' '); |
|
|
if (pos_message) |
|
|
{ |
|
|
pos_message[0] = '\0'; |
|
|
pos_message++; |
|
|
while (pos_message[0] == ' ') |
|
|
pos_message++; |
|
|
if (pos_message[0] == ':') |
|
|
pos_message++; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "["); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", pos_nick); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "] "); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, "%s\n", pos_message); |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_317: '317' command (whois, idle) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_317 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos_nick, *pos_idle, *pos_signon, *pos_message; |
|
|
int idle_time, day, hour, min, sec; |
|
|
time_t datetime; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos_nick = strchr (arguments, ' '); |
|
|
if (pos_nick) |
|
|
{ |
|
|
while (pos_nick[0] == ' ') |
|
|
pos_nick++; |
|
|
pos_idle = strchr (pos_nick, ' '); |
|
|
if (pos_idle) |
|
|
{ |
|
|
pos_idle[0] = '\0'; |
|
|
pos_idle++; |
|
|
while (pos_idle[0] == ' ') |
|
|
pos_idle++; |
|
|
pos_signon = strchr (pos_idle, ' '); |
|
|
if (pos_signon) |
|
|
{ |
|
|
pos_signon[0] = '\0'; |
|
|
pos_signon++; |
|
|
while (pos_signon[0] == ' ') |
|
|
pos_signon++; |
|
|
pos_message = strchr (pos_signon, ' '); |
|
|
if (pos_message) |
|
|
{ |
|
|
pos_message[0] = '\0'; |
|
|
|
|
|
idle_time = atoi (pos_idle); |
|
|
day = idle_time / (60 * 60 * 24); |
|
|
hour = (idle_time % (60 * 60 * 24)) / (60 * 60); |
|
|
min = ((idle_time % (60 * 60 * 24)) % (60 * 60)) / 60; |
|
|
sec = ((idle_time % (60 * 60 * 24)) % (60 * 60)) % 60; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "["); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", pos_nick); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "] "); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, _("idle: ")); |
|
|
if (day > 0) |
|
|
{ |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%d ", day); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, |
|
|
(day > 1) ? _("days") : _("day")); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, |
|
|
", "); |
|
|
} |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%02d ", hour); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, |
|
|
(hour > 1) ? _("hours") : _("hour")); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
" %02d ", min); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, |
|
|
(min > 1) ? _("minutes") : _("minute")); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
" %02d ", sec); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, |
|
|
(sec > 1) ? _("seconds") : _("second")); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, |
|
|
", "); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, _("signon at: ")); |
|
|
datetime = (time_t)(atol (pos_signon)); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%s", ctime (&datetime)); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_318: '318' command (whois, end) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_318 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos_nick, *pos_message; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos_nick = strchr (arguments, ' '); |
|
|
if (pos_nick) |
|
|
{ |
|
|
while (pos_nick[0] == ' ') |
|
|
pos_nick++; |
|
|
pos_message = strchr (pos_nick, ' '); |
|
|
if (pos_message) |
|
|
{ |
|
|
pos_message[0] = '\0'; |
|
|
pos_message++; |
|
|
while (pos_message[0] == ' ') |
|
|
pos_message++; |
|
|
if (pos_message[0] == ':') |
|
|
pos_message++; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "["); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", pos_nick); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "] "); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, "%s\n", pos_message); |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_319: '319' command (whois, end) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_319 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos_nick, *pos_channel, *pos; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos_nick = strchr (arguments, ' '); |
|
|
if (pos_nick) |
|
|
{ |
|
|
while (pos_nick[0] == ' ') |
|
|
pos_nick++; |
|
|
pos_channel = strchr (pos_nick, ' '); |
|
|
if (pos_channel) |
|
|
{ |
|
|
pos_channel[0] = '\0'; |
|
|
pos_channel++; |
|
|
while (pos_channel[0] == ' ') |
|
|
pos_channel++; |
|
|
if (pos_channel[0] == ':') |
|
|
pos_channel++; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "["); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", pos_nick); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "] "); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, _("Channels: ")); |
|
|
|
|
|
while (pos_channel && pos_channel[0]) |
|
|
{ |
|
|
if (pos_channel[0] == '@') |
|
|
{ |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_NICK_OP, "@"); |
|
|
pos_channel++; |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (pos_channel[0] == '%') |
|
|
{ |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_NICK_HALFOP, "%"); |
|
|
pos_channel++; |
|
|
} |
|
|
else |
|
|
if (pos_channel[0] == '+') |
|
|
{ |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_NICK_VOICE, "+"); |
|
|
pos_channel++; |
|
|
} |
|
|
} |
|
|
pos = strchr (pos_channel, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
} |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%s%s", |
|
|
pos_channel, |
|
|
(pos && pos[0]) ? " " : "\n"); |
|
|
pos_channel = pos; |
|
|
} |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_320: '320' command (whois, identified user) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_320 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos_nick, *pos_message; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos_nick = strchr (arguments, ' '); |
|
|
if (pos_nick) |
|
|
{ |
|
|
while (pos_nick[0] == ' ') |
|
|
pos_nick++; |
|
|
pos_message = strchr (pos_nick, ' '); |
|
|
if (pos_message) |
|
|
{ |
|
|
pos_message[0] = '\0'; |
|
|
pos_message++; |
|
|
while (pos_message[0] == ' ') |
|
|
pos_message++; |
|
|
if (pos_message[0] == ':') |
|
|
pos_message++; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "["); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", pos_nick); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT_DARK, "] "); |
|
|
gui_printf_color (server->window, |
|
|
COLOR_WIN_CHAT, "%s\n", pos_message); |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_321: '321' command (/list start) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_321 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
} |
|
|
else |
|
|
pos = arguments; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf (server->window, "%s\n", pos); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_322: '322' command (channel for /list) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_322 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
} |
|
|
else |
|
|
pos = arguments; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf (server->window, "%s\n", pos); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_323: '323' command (/list end) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_323 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
} |
|
|
else |
|
|
pos = arguments; |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_INFO); |
|
|
gui_printf (server->window, "%s\n", pos); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_331: '331' command received (no topic for channel) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_331 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) server; |
|
|
(void) host; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
pos[0] = '\0'; |
|
|
gui_printf_color (gui_current_window, |
|
|
COLOR_WIN_CHAT, _("No topic set for ")); |
|
|
gui_printf_color (gui_current_window, |
|
|
COLOR_WIN_CHAT_CHANNEL, "%s\n", arguments); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_332: '332' command received (topic of channel) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_332 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos, *pos2; |
|
|
t_irc_channel *ptr_channel; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
pos2 = strchr (pos, ' '); |
|
|
if (pos2) |
|
|
{ |
|
|
pos2[0] = '\0'; |
|
|
ptr_channel = channel_search (server, pos); |
|
|
if (ptr_channel) |
|
|
{ |
|
|
pos2++; |
|
|
while (pos2[0] == ' ') |
|
|
pos2++; |
|
|
if (pos2[0] == ':') |
|
|
pos2++; |
|
|
if (ptr_channel->topic) |
|
|
free (ptr_channel->topic); |
|
|
ptr_channel->topic = strdup (pos2); |
|
|
|
|
|
irc_display_prefix (ptr_channel->window, PREFIX_INFO); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, _("Topic for ")); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, "%s", pos); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, _(" is: \"%s\"\n"), pos2); |
|
|
|
|
|
gui_redraw_window_title (ptr_channel->window); |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s channel not found for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "332"); |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s cannot identify channel for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "332"); |
|
|
return -1; |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_333: '333' command received (infos about topic (nick / date) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_333 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos_channel, *pos_nick, *pos_date; |
|
|
t_irc_channel *ptr_channel; |
|
|
time_t datetime; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos_channel = strchr (arguments, ' '); |
|
|
if (pos_channel) |
|
|
{ |
|
|
while (pos_channel[0] == ' ') |
|
|
pos_channel++; |
|
|
pos_nick = strchr (pos_channel, ' '); |
|
|
if (pos_nick) |
|
|
{ |
|
|
pos_nick[0] = '\0'; |
|
|
pos_nick++; |
|
|
while (pos_nick[0] == ' ') |
|
|
pos_nick++; |
|
|
pos_date = strchr (pos_nick, ' '); |
|
|
if (pos_date) |
|
|
{ |
|
|
pos_date[0] = '\0'; |
|
|
pos_date++; |
|
|
while (pos_date[0] == ' ') |
|
|
pos_date++; |
|
|
|
|
|
ptr_channel = channel_search (server, pos_channel); |
|
|
if (ptr_channel) |
|
|
{ |
|
|
irc_display_prefix (ptr_channel->window, PREFIX_INFO); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, _("Topic set by ")); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_NICK, "%s", pos_nick); |
|
|
datetime = (time_t)(atol (pos_date)); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, ", %s", ctime (&datetime)); |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s channel not found for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "333"); |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s cannot identify date/time for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "333"); |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s cannot identify nickname for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "333"); |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s cannot identify channel for \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "333"); |
|
|
return -1; |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_351: '351' command received (server version) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_351 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos, *pos2; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) server; |
|
|
(void) host; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
} |
|
|
else |
|
|
pos = arguments; |
|
|
|
|
|
pos2 = strstr (pos, " :"); |
|
|
if (pos2) |
|
|
{ |
|
|
pos2[0] = '\0'; |
|
|
pos2 += 2; |
|
|
} |
|
|
|
|
|
irc_display_prefix (server->window, PREFIX_SERVER); |
|
|
if (pos2) |
|
|
gui_printf (server->window, "%s %s\n", pos, pos2); |
|
|
else |
|
|
gui_printf (server->window, "%s\n", pos); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_353: '353' command received (list of users on a channel) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_353 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos, *pos_nick; |
|
|
int is_op, is_halfop, has_voice; |
|
|
t_irc_channel *ptr_channel; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos = strstr (arguments, " = "); |
|
|
if (pos) |
|
|
arguments = pos + 3; |
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
|
|
|
ptr_channel = channel_search (server, arguments); |
|
|
if (!ptr_channel) |
|
|
return 0; |
|
|
|
|
|
pos++; |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
if (pos[0] != ':') |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s cannot parse \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "353"); |
|
|
return -1; |
|
|
} |
|
|
pos++; |
|
|
if (pos[0]) |
|
|
{ |
|
|
while (pos && pos[0]) |
|
|
{ |
|
|
is_op = 0; |
|
|
is_halfop = 0; |
|
|
has_voice = 0; |
|
|
while ((pos[0] == '@') || (pos[0] == '%') || (pos[0] == '+')) |
|
|
{ |
|
|
if (pos[0] == '@') |
|
|
is_op = 1; |
|
|
if (pos[0] == '%') |
|
|
is_halfop = 1; |
|
|
if (pos[0] == '+') |
|
|
has_voice = 1; |
|
|
pos++; |
|
|
} |
|
|
pos_nick = pos; |
|
|
pos = strchr (pos, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
pos[0] = '\0'; |
|
|
pos++; |
|
|
} |
|
|
if (!nick_new (ptr_channel, pos_nick, is_op, is_halfop, has_voice)) |
|
|
gui_printf (server->window, |
|
|
_("%s cannot create nick \"%s\" for channel \"%s\"\n"), |
|
|
WEECHAT_ERROR, pos_nick, ptr_channel->name); |
|
|
} |
|
|
} |
|
|
gui_redraw_window_nick (ptr_channel->window); |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s cannot parse \"%s\" command\n"), |
|
|
WEECHAT_ERROR, "353"); |
|
|
return -1; |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_366: '366' command received (end of /names list) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_366 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char *pos, *pos2; |
|
|
t_irc_channel *ptr_channel; |
|
|
t_irc_nick *ptr_nick; |
|
|
int num_nicks, num_op, num_halfop, num_voice, num_normal; |
|
|
|
|
|
/* make gcc happy */ |
|
|
(void) host; |
|
|
|
|
|
pos = strchr (arguments, ' '); |
|
|
if (pos) |
|
|
{ |
|
|
while (pos[0] == ' ') |
|
|
pos++; |
|
|
pos2 = strchr (pos, ' '); |
|
|
if (pos2) |
|
|
{ |
|
|
pos2[0] = '\0'; |
|
|
pos2++; |
|
|
while (pos2[0] == ' ') |
|
|
pos2++; |
|
|
if (pos2[0] == ':') |
|
|
pos2++; |
|
|
|
|
|
ptr_channel = channel_search (server, pos); |
|
|
if (ptr_channel) |
|
|
{ |
|
|
|
|
|
/* display users on channel */ |
|
|
irc_display_prefix (ptr_channel->window, PREFIX_INFO); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT, |
|
|
_("Nicks ")); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_CHANNEL, |
|
|
"%s", ptr_channel->name); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT, ": "); |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, "["); |
|
|
|
|
|
for (ptr_nick = ptr_channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick) |
|
|
{ |
|
|
irc_display_nick (ptr_channel->window, ptr_nick, |
|
|
MSG_TYPE_INFO, 0, 0, 1); |
|
|
if (ptr_nick != ptr_channel->last_nick) |
|
|
gui_printf (ptr_channel->window, " "); |
|
|
} |
|
|
gui_printf_color (ptr_channel->window, COLOR_WIN_CHAT_DARK, "]\n"); |
|
|
|
|
|
/* display number of nicks, ops, halfops & voices on the channel */ |
|
|
nick_count (ptr_channel, &num_nicks, &num_op, &num_halfop, &num_voice, |
|
|
&num_normal); |
|
|
irc_display_prefix (ptr_channel->window, PREFIX_INFO); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, _("Channel ")); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%s", ptr_channel->name); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, ": "); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%d ", num_nicks); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, |
|
|
(num_nicks > 1) ? _("nicks") : _("nick")); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_DARK, " ("); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%d ", num_op); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, |
|
|
(num_op > 1) ? _("ops") : _("op")); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, |
|
|
", "); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%d ", num_halfop); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, |
|
|
(num_halfop > 1) ? _("halfops") : _("halfop")); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, |
|
|
", "); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%d ", num_voice); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, |
|
|
(num_voice > 1) ? _("voices") : _("voice")); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, |
|
|
", "); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_CHANNEL, |
|
|
"%d ", num_normal); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT, |
|
|
_("normal")); |
|
|
gui_printf_color (ptr_channel->window, |
|
|
COLOR_WIN_CHAT_DARK, ")\n"); |
|
|
} |
|
|
else |
|
|
{ |
|
|
irc_display_prefix (gui_current_window, PREFIX_INFO); |
|
|
gui_printf_color (gui_current_window, |
|
|
COLOR_WIN_CHAT_CHANNEL, pos); |
|
|
gui_printf_color (gui_current_window, |
|
|
COLOR_WIN_CHAT, ": %s\n", pos2); |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
} |
|
|
|
|
|
/* |
|
|
* irc_cmd_recv_433: '433' command received (nickname already in use) |
|
|
*/ |
|
|
|
|
|
int |
|
|
irc_cmd_recv_433 (t_irc_server *server, char *host, char *arguments) |
|
|
{ |
|
|
char hostname[128]; |
|
|
|
|
|
if (!server->is_connected) |
|
|
{ |
|
|
if (strcmp (server->nick, server->nick1) == 0) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s: nickname \"%s\" is already in use, " |
|
|
"trying 2nd nickname \"%s\"\n"), |
|
|
WEECHAT_NAME, server->nick, server->nick2); |
|
|
free (server->nick); |
|
|
server->nick = strdup (server->nick2); |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (strcmp (server->nick, server->nick2) == 0) |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s: nickname \"%s\" is already in use, " |
|
|
"trying 3rd nickname \"%s\"\n"), |
|
|
WEECHAT_NAME, server->nick, server->nick3); |
|
|
free (server->nick); |
|
|
server->nick = strdup (server->nick3); |
|
|
} |
|
|
else |
|
|
{ |
|
|
gui_printf (server->window, |
|
|
_("%s: all declared nicknames are already in use, " |
|
|
"closing connection with server!\n"), |
|
|
WEECHAT_NAME); |
|
|
server_disconnect (server); |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
gethostname (hostname, sizeof (hostname) - 1); |
|
|
hostname[sizeof (hostname) - 1] = '\0'; |
|
|
if (!hostname[0]) |
|
|
strcpy (hostname, _("unknown")); |
|
|
server_sendf (server, |
|
|
"NICK %s\r\n", |
|
|
server->nick); |
|
|
} |
|
|
else |
|
|
return irc_cmd_recv_error (server, host, arguments); |
|
|
return 0; |
|
|
} |
|