2000 #include #include #include #include #include #include #include #include #include #include "connap.h" #include "io.h" #include "connect.h" #include "command.h" #include "chat.h" #include "message.h" #include "whois.h" #include "util.h" AUTOCOMMAND *auto_commands = NULL; void cmd_parse(char *s) { char *cmd, *data, *tmp, *channel, *level, *nick, *text, *reason, *topic; char *server, *port_string, *meta_string; CHAN *cur_chan; SERVER *srv_p; int n, port, meta; if ((strlen(s) < 2) && (! join_chan)) { err_msg("Invalid command"); return; } if (s[0] != '/') { if (! join_chan) err_msg("Invalid command"); else { tmp = (char*)malloc(1024); sprintf(tmp, "%s %s", join_chan, s); if (send_msg(MSG_CLIENT_PUBLIC, tmp)) disconnect(ws_strerror()); free(tmp); } return; } cmd = strtok(s + 1, " \t"); if (! (data = strtok(NULL, "\0"))) data = ""; else { while (isspace(*data)) data++; } if (cmd_match(cmd, "ban", 2)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (! (nick = strtok(data, " "))) { err_msg("Missing parameters"); return; } if (! (reason = strtok(NULL, "\0"))) reason = ""; tmp = (char*)malloc(strlen(nick) + strlen(reason) + 4); sprintf(tmp, "%s \"%s\"", nick, reason); if (send_msg(MSG_CLIENT_BAN, tmp)) disconnect(ws_strerror()); free(tmp); } else if (cmd_match(cmd, "browse", 2)) { /* if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } browse(data); */ } else if (cmd_match(cmd, "chlevel", 3)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (! (channel = strtok(data, " "))) { err_msg("Missing parameters"); return; } if (! (level = strtok(NULL, " "))) level = ""; tmp = (char*)malloc(strlen(channel) + strlen(level) + 3); sprintf(tmp, "%s %s", channel, level); if (send_msg(MSG_CLIENT_CHANNEL_LEVEL, tmp)) disconnect(ws_strerror()); free(tmp); } else if (cmd_match(cmd, "clear", 3)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (! (channel = strtok(data, " "))) { err_msg("Missing parameters"); return; } if (! (reason = strtok(NULL, "\0"))) reason = ""; tmp = (char*)malloc(strlen(channel) + strlen(reason) + 5); sprintf(tmp, "%s \"%s\"", channel, reason); if (send_msg(MSG_CLIENT_CLEAR_CHANNEL, tmp)) disconnect(ws_strerror()); free(tmp); } else if (cmd_match(cmd, "cloak", 3)) { if (! srv_conn) return; if (send_msg(MSG_CLIENT_CLOAK, "")) disconnect(ws_strerror()); } else if (cmd_match(cmd, "connect", 4)) { if (srv_conn) return; if (! cur_server.name) { err_msg("Define servers first"); return; } tmp = new_string(cur_server.name); do_connect(tmp, cur_server.port, cur_server.meta); free(tmp); } else if (cmd_match(cmd, "dataport", 2)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (! (nick = strtok(data, " "))) { err_msg("Missing parameters"); return; } if (! (port_string = strtok(NULL, " "))) { err_msg("Missing parameters"); return; } tmp = (char*)malloc(strlen(nick) + strlen(port_string) + 2); sprintf(tmp, "%s %s", nick, port_string); if (send_msg(MSG_CLIENT_ALTER_PORT, tmp)) disconnect(ws_strerror()); free(tmp); } else if (cmd_match(cmd, "deop", 2)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (! (channel = strtok(data, " "))) { err_msg("Missing parameters"); return; } if (! (nick = strtok(NULL, " "))) { err_msg("Missing parameters"); return; } tmp = (char*)malloc(strlen(channel) + strlen(nick) + 2); sprintf(tmp, "%s %s", channel, nick); if (send_msg(MSG_CLIENT_DEOP, tmp)) disconnect(ws_strerror()); free(tmp); } else if (cmd_match(cmd, "disconnect", 2)) { if (! srv_conn) return; disconnect(""); } else if (cmd_match(cmd, "gmsg", 1)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (send_msg(MSG_CLIENT_ANNOUNCE, data)) disconnect(ws_strerror()); } else if (cmd_match(cmd, "join", 1)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } join_channel(data); } else if (cmd_match(cmd, "kick", 3)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (! (channel = strtok(data, " "))) { err_msg("Missing parameters"); return; } if (! (nick = strtok(NULL, " "))) { err_msg("Missing parameters"); return; } if (! (reason = strtok(NULL, "\0"))) reason = ""; tmp = (char*)malloc(strlen(channel) + strlen(nick) + strlen(reason) + 5); sprintf(tmp, "%s %s \"%s\"", channel, nick, reason); if (send_msg(MSG_CLIENT_KICK_USER, tmp)) disconnect(ws_strerror()); free(tmp); } else if (cmd_match(cmd, "kill", 3)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (! (nick = strtok(data, " "))) { err_msg("Missing parameters"); return; } if (! (reason = strtok(NULL, "\0"))) reason = ""; tmp = (char*)malloc(strlen(nick) + strlen(reason) + 4); sprintf(tmp, "%s \"%s\"", nick, reason); if (send_msg(MSG_CLIENT_KILL, tmp)) disconnect(ws_strerror()); free(tmp); } else if (cmd_match(cmd, "level", 2)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (! (nick = strtok(data, " "))) { err_msg("Missing parameters"); return; } if (! (level = strtok(NULL, "\0"))) { err_msg("Missing parameters"); return; } tmp = (char*)malloc(strlen(nick) + strlen(level) + 4); sprintf(tmp, "%s %s", nick, level); if (send_msg(MSG_CLIENT_SETUSERLEVEL, tmp)) disconnect(ws_strerror()); free(tmp); } else if (cmd_match(cmd, "links", 3)) { /* if (! srv_conn) return; list_links(); */ } else if (! strcmp(cmd, "list")) { /* if (! srv_conn) return; list_channels(); */ } else if (cmd_match(cmd, "listbans", 5)) { /* if (! srv_conn) return; list_bans(); */ } else if (! strcmp(cmd, "me")) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } tmp = (char*)malloc(strlen(join_chan) + strlen(data) + 4); sprintf(tmp, "%s \"%s\"", join_chan, data); if (send_msg(MSG_CLIENT_EMOTE, tmp)) disconnect(ws_strerror()); free(tmp); } else if (cmd_match(cmd, "motd", 2)) { if (! srv_conn) return; if (send_msg(MSG_CLIENT_MOTD, "")) disconnect(ws_strerror()); } else if (cmd_match(cmd, "msg", 2)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (! (nick = strtok(data, " "))) { err_msg("Missing parameters"); return; } if (! (text = strtok(NULL, "\0"))) text = ""; tmp = (char*)malloc(strlen(nick) + strlen(text) + 4); sprintf(tmp, "%s %s", nick, text); if (send_msg(MSG_CLIENT_PRIVMSG, tmp)) disconnect(ws_strerror()); sprintf(tmp, "%s> %s", nick, text); put_rcvd(tmp, PRIVMSG_COLOR); free(tmp); } else if (cmd_match(cmd, "muzzle", 2)) { if (! srv_conn) return; if (! strlen(dat 12fb a)) { err_msg("Missing parameters"); return; } if (! (nick = strtok(data, " "))) { err_msg("Missing parameters"); return; } if (! (reason = strtok(NULL, "\0"))) reason = ""; tmp = (char*)malloc(strlen(nick) + strlen(reason) + 4); sprintf(tmp, "%s \"%s\"", nick, reason); if (send_msg(MSG_CLIENT_MUZZLE, tmp)) disconnect(ws_strerror()); free(tmp); } else if (cmd_match(cmd, "online", 2)) { /* if (! srv_conn) return; list_online(); */ } else if (! strcmp(cmd, "op")) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (send_msg(MSG_CLIENT_OP, data)) disconnect(ws_strerror()); } else if (cmd_match(cmd, "opmsg", 3)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (send_msg(MSG_CLIENT_WALLOP, data)) disconnect(ws_strerror()); } else if (cmd_match(cmd, "part", 3)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } part_channel(data); } else if (cmd_match(cmd, "ping", 2)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } ping(data); } else if (cmd_match(cmd, "quit", 1)) { quit(); } else if (cmd_match(cmd, "search", 3)) { /* if (! srv_conn) return; if (! strlen(data)) search(); else { free(search.artist); free(search.title); search.artist = new_string(data); search.title = new_string(""); search2(); } */ } else if (cmd_match(cmd, "server", 3)) { if (! strlen(data)) { tmp = (char*)malloc(256); put_rcvd("\nServers\n", INFO_COLOR); for (srv_p = servers, n = 1; srv_p; srv_p = srv_p->next, n++) { sprintf(tmp, "%-4d%-25s%-10d%d", n, srv_p->name, srv_p->port, srv_p->meta); put_rcvd(tmp, INFO_COLOR); } put_rcvd("", NORMAL_COLOR); free(tmp); return; } if (split_server(data, &server, &port_string, &meta_string)) { port = atoi(port_string); meta = atoi(meta_string); } else { for (n = 0; n < (int)strlen(data); n++) { if (! isdigit(data[n])) { err_msg("Invalid format"); return; } } n = atoi(data); for (srv_p = servers; srv_p && ((n - 1) > 0); srv_p = srv_p->next, n--); if (! srv_p) { err_msg("Invalid server"); return; } server = srv_p->name; port = srv_p->port; meta = srv_p->meta; } if (srv_conn) disconnect(""); do_connect(server, port, meta); } else if (cmd_match(cmd, "stats", 2)) { /* show_server_stats(); */ } else if (cmd_match(cmd, "topic", 2)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (! (channel = strtok(data, " "))) { err_msg("Missing parameters"); return; } if (! (topic = strtok(NULL, "\0"))) { err_msg("Missing parameters"); return; } tmp = (char*)malloc(strlen(channel) + strlen(topic) + 4); sprintf(tmp, "%s %s", channel, topic); if (send_msg(MSG_SERVER_TOPIC, tmp)) disconnect(ws_strerror()); free(tmp); } else if (cmd_match(cmd, "ullist", 2)) { /* list_uploads(); */ } else if (cmd_match(cmd, "unban", 3)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (send_msg(MSG_CLIENT_UNBAN, data)) disconnect(ws_strerror()); } else if (cmd_match(cmd, "unmuzzle", 3)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } if (send_msg(MSG_CLIENT_UNMUZZLE, data)) disconnect(ws_strerror()); } else if (cmd_match(cmd, "usermode", 5)) { if (! srv_conn) return; if (send_msg(MSG_CLIENT_USER_MODE, data)) disconnect(ws_strerror()); } else if (cmd_match(cmd, "users", 5)) { if (! srv_conn) return; if (join_chan) show_users(join_chan); } else if (cmd_match(cmd, "version", 1)) { if (! srv_conn) return; if (send_msg(MSG_CLIENT_SERVER_VERSION, "")) disconnect(ws_strerror()); } else if (cmd_match(cmd, "whois", 1)) { if (! srv_conn) return; if (! strlen(data)) { err_msg("Missing parameters"); return; } whois(data); } else { err_msg("Invalid or ambiguous command"); } } void send_auto_commands(void) { AUTOCOMMAND *ac; char *tmp = (char*)malloc(256); for (ac = auto_commands; ac; ac = ac->next) { sprintf(tmp, "/%s", ac->data); cmd_parse(tmp); } free(tmp); } . 0