2000 /* * XmNap A Motif napster client * * Copyright (C) 2000 Mats Peterson * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Please send any comments/bug reports to * mats_peterson@swipnet.se (Mats Peterson) */ #include #include #include #include #include #include #include #include "main.h" #include "configwin.h" #include "connect.h" #include "transfer.h" #include "command.h" #include "shared.h" #include "chat.h" #include "chnlist.h" #include "ullist.h" #include "linklist.h" #include "hotlist.h" #include "banlist.h" #include "search.h" #include "whois.h" #include "message.h" #include "srvstats.h" #include "msgbox.h" #include "util.h" AUTOCOMMAND *autoCommands = NULL; void CmdParse(String s) { String cmd, data, tmp, channel, level, nick, reason, topic, port; String server, portString, metaString; CHAN *curChan; if (strlen(s) < 2) { ErrMsg("Invalid command"); return; } if (s[0] != '/') { ErrMsg("Invalid command"); return; } cmd = strtok(s + 1, " \t"); if (! (data = strtok(NULL, "\0"))) data = ""; else { while (isspace(*data)) data++; } if (CmdMatch(cmd, "ban", 2)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (! (nick = strtok(data, " "))) { ErrMsg("Missing parameters"); return; } if (! (reason = strtok(NULL, "\0"))) reason = ""; tmp = XtMalloc(strlen(nick) + strlen(reason) + 4); sprintf(tmp, "%s \"%s\"", nick, reason); if (SendMsg(MSG_CLIENT_BAN, tmp)) Disconnect(strerror(errno)); XtFree(tmp); } else if (CmdMatch(cmd, "browse", 2)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } Browse(data); } else if (CmdMatch(cmd, "chlevel", 3)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (! (channel = strtok(data, " "))) { ErrMsg("Missing parameters"); return; } if (! (level = strtok(NULL, " "))) level = ""; tmp = XtMalloc(strlen(channel) + strlen(level) + 3); sprintf(tmp, "%s %s", channel, level); if (SendMsg(MSG_CLIENT_CHANNEL_LEVEL, tmp)) Disconnect(strerror(errno)); XtFree(tmp); } else if (CmdMatch(cmd, "clear", 3)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (! (channel = strtok(data, " "))) { ErrMsg("Missing parameters"); return; } if (! (reason = strtok(NULL, "\0"))) reason = ""; tmp = XtMalloc(strlen(channel) + strlen(reason) + 5); sprintf(tmp, "%s \"%s\"", channel, reason); if (SendMsg(MSG_CLIENT_CLEAR_CHANNEL, tmp)) Disconnect(strerror(errno)); XtFree(tmp); } else if (CmdMatch(cmd, "cloak", 3)) { if (! srvConn) return; if (SendMsg(MSG_CLIENT_CLOAK, "")) Disconnect(strerror(errno)); } else if (CmdMatch(cmd, "config", 4)) { ConfigWin(USER_PAGE); } else if (CmdMatch(cmd, "connect", 4)) { if (srvConn) return; if (! curServer.name) { ErrMsg("Define servers first"); return; } tmp = XtNewString(curServer.name); Connect(tmp, curServer.port, curServer.meta); XtFree(tmp); } else if (CmdMatch(cmd, "dataport", 2)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (! (nick = strtok(data, " "))) { ErrMsg("Missing parameters"); return; } if (! (port = strtok(NULL, " "))) { ErrMsg("Missing parameters"); return; } tmp = XtMalloc(strlen(nick) + strlen(port) + 2); sprintf(tmp, "%s %s", nick, port); if (SendMsg(MSG_CLIENT_ALTER_PORT, tmp)) Disconnect(strerror(errno)); XtFree(tmp); } else if (CmdMatch(cmd, "deop", 2)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (! (channel = strtok(data, " "))) { ErrMsg("Missing parameters"); return; } if (! (nick = strtok(NULL, " "))) { ErrMsg("Missing parameters"); return; } tmp = XtMalloc(strlen(channel) + strlen(nick) + 2); sprintf(tmp, "%s %s", channel, nick); if (SendMsg(MSG_CLIENT_DEOP, tmp)) Disconnect(strerror(errno)); XtFree(tmp); } else if (CmdMatch(cmd, "disconnect", 2)) { if (! srvConn) return; Disconnect(""); } else if (CmdMatch(cmd, "gmsg", 1)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (SendMsg(MSG_CLIENT_ANNOUNCE, data)) Disconnect(strerror(errno)); } else if (CmdMatch(cmd, "join", 1)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } JoinChannel(data); } else if (CmdMatch(cmd, "kick", 3)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (! (channel = strtok(data, " "))) { ErrMsg("Missing parameters"); return; } if (! (nick = strtok(NULL, " "))) { ErrMsg("Missing parameters"); return; } if (! (reason = strtok(NULL, "\0"))) reason = ""; tmp = XtMalloc(strlen(channel) + strlen(nick) + strlen(reason) + 5); sprintf(tmp, "%s %s \"%s\"", channel, nick, reason); if (SendMsg(MSG_CLIENT_KICK_USER, tmp)) Disconnect(strerror(errno)); XtFree(tmp); } else if (CmdMatch(cmd, "kill", 3)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (! (nick = strtok(data, " "))) { ErrMsg("Missing parameters"); return; } if (! (reason = strtok(NULL, "\0"))) reason = ""; tmp = XtMalloc(strlen(nick) + strlen(reason) + 4); sprintf(tmp, "%s \"%s\"", nick, reason); if (SendMsg(MSG_CLIENT_KILL, tmp)) Disconnect(strerror(errno)); XtFree(tmp); } else if (CmdMatch(cmd, "level", 2)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (! (nick = strtok(data, " "))) { ErrMsg("Missing parameters"); return; } if (! (level = strtok(NULL, "\0"))) { ErrMsg("Missing parameters"); return; } tmp = XtMalloc(strlen(nick) + strlen(level) + 4); sprintf(tmp, "%s %s", nick, level); if (SendMsg(MSG_CLIENT_SETUSERLEVEL, tmp)) Disconnect(strerror(errno)); XtFree(tmp); } else if (CmdMatch(cmd, "links", 3)) { if (! srvConn) return; ListLinks(); } else if (! strcmp(cmd, "list")) { if (! srvConn) return; ListChannels(); } else if (CmdMatch(cmd, "listbans", 5)) { if (! srvConn) return; ListBans(); } else if (! strcmp(cmd, "me")) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (! (curChan = FindChanByWin(curWin))) return; tmp = XtMalloc(strlen(curChan->name) + strlen(data) + 4); sprintf(tmp, "%s \"%s\"", curChan->name, data); if (SendMsg(MSG_CLIENT_EMOTE, tmp)) Disconnect(strerror(errno)); XtFree(tmp); } else if (CmdMatch(cmd, "motd", 2)) { if (! srvConn) return; if (SendMsg(MSG_CLIENT_MOTD, "")) Disconnect(strerror(errno)); } else if (CmdM 1059 atch(cmd, "msg", 2)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (SendMsg(MSG_CLIENT_PRIVMSG, data)) Disconnect(strerror(errno)); } else if (CmdMatch(cmd, "muzzle", 2)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (! (nick = strtok(data, " "))) { ErrMsg("Missing parameters"); return; } if (! (reason = strtok(NULL, "\0"))) reason = ""; tmp = XtMalloc(strlen(nick) + strlen(reason) + 4); sprintf(tmp, "%s \"%s\"", nick, reason); if (SendMsg(MSG_CLIENT_MUZZLE, tmp)) Disconnect(strerror(errno)); XtFree(tmp); } else if (CmdMatch(cmd, "online", 2)) { if (! srvConn) return; ListOnLine(); } else if (! strcmp(cmd, "op")) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (SendMsg(MSG_CLIENT_OP, data)) Disconnect(strerror(errno)); } else if (CmdMatch(cmd, "opmsg", 3)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (SendMsg(MSG_CLIENT_WALLOP, data)) Disconnect(strerror(errno)); } else if (CmdMatch(cmd, "part", 3)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } PartChannel(data); } else if (CmdMatch(cmd, "ping", 2)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } Ping(data); } else if (CmdMatch(cmd, "quit", 1)) { Quit(); } else if (CmdMatch(cmd, "search", 3)) { if (! srvConn) return; if (! strlen(data)) Search(); else { XtFree(search.artist); XtFree(search.title); search.artist = XtNewString(data); search.title = XtNewString(""); Search2(); } } else if (CmdMatch(cmd, "server", 3)) { if (! strlen(data)) { ConfigWin(SERVER_PAGE); } else { if (! SplitServer(data, &server, &portString, &metaString)) { ErrMsg("Invalid format"); return; } if (srvConn) Disconnect(""); Connect(server, atoi(portString), atoi(metaString)); } } else if (CmdMatch(cmd, "stats", 2)) { ShowServerStats(); } else if (CmdMatch(cmd, "topic", 2)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (! (channel = strtok(data, " "))) { ErrMsg("Missing parameters"); return; } if (! (topic = strtok(NULL, "\0"))) { ErrMsg("Missing parameters"); return; } tmp = XtMalloc(strlen(channel) + strlen(topic) + 4); sprintf(tmp, "%s %s", channel, topic); if (SendMsg(MSG_SERVER_TOPIC, tmp)) Disconnect(strerror(errno)); XtFree(tmp); } else if (CmdMatch(cmd, "ullist", 2)) { ListUploads(); } else if (CmdMatch(cmd, "unban", 3)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (SendMsg(MSG_CLIENT_UNBAN, data)) Disconnect(strerror(errno)); } else if (CmdMatch(cmd, "unmuzzle", 3)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } if (SendMsg(MSG_CLIENT_UNMUZZLE, data)) Disconnect(strerror(errno)); } else if (CmdMatch(cmd, "usermode", 5)) { if (! srvConn) return; if (SendMsg(MSG_CLIENT_USER_MODE, data)) Disconnect(strerror(errno)); } else if (CmdMatch(cmd, "version", 1)) { if (! srvConn) return; if (SendMsg(MSG_CLIENT_SERVER_VERSION, "")) Disconnect(strerror(errno)); } else if (CmdMatch(cmd, "whois", 1)) { if (! srvConn) return; if (! strlen(data)) { ErrMsg("Missing parameters"); return; } Whois(data); } else { ErrMsg("Invalid or ambiguous command"); } } void SendAutoCommands(void) { AUTOCOMMAND *ac; String tmp = XtMalloc(256); for (ac = autoCommands; ac; ac = ac->next) { sprintf(tmp, "/%s", ac->data); CmdParse(tmp); } XtFree(tmp); } . 0