Mercurial > cabal
view sources/parser.cpp @ 0:bafff9de2a76
Initial commit since summer'07
| author | Vlad Glagolev <enqlave@gmail.com> |
|---|---|
| date | Sun, 20 Jan 2008 19:25:25 +0300 |
| parents | |
| children | 19227b0b7cc1 |
line wrap: on
line source
/** * parser.cpp (2007-05-13) * * -- CABAL -- irc commands parser * * Copyright (c) 2007 Vlad Glagolev <enqlave@gmail.com> * All rights reserved. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "cabal.h" // required: parser.h Parser::Parser(Connection *S, string parsing) : alien(""), alienid(""), alienact(""), alienloc(""), aliencmd(""), alienmsg ("") { if (parsing.substr(0, 6) == "PING :") { string pong = parsing; pong[1] = 'O'; S->msgSend(pong); } else { char *query = new char[parsing.size() + 1]; int e = 0; while ((query[e] = parsing[e])) e++; char *who = new char[e]; char *what = new char[e]; char *where = new char[e]; char *message = new char[e]; if (sscanf (query, "%s %s %s", who, what, where) == 3) { alienact = what; if ((alienid = strchr (who, '!'))) { alienid++, alien = strtok (who, "!"); if (*where == ':') alienloc = where + 1; else { alienloc = where; if ((aliencmd = strchr (strstr (query, alienloc), ' ')) \ && *++aliencmd == ':') { if (!strcmp (alienloc, S->nick)) alienloc = alien; if (*++aliencmd == CABAL->commander) { if ((alienmsg = strchr (aliencmd, ' '))) alienmsg++; else alienmsg = ""; aliencmd = strtok (aliencmd, " "), aliencmd++; } else alienmsg = aliencmd, aliencmd = ""; } else alienmsg = strtok (aliencmd, " "), aliencmd = ""; } } else alienid = ""; /* DEBUG cout << "-----------------------------------\n" \ << "Alien: \t" << alien << endl \ << "Alien ID:\t" << alienid << endl \ << "Alien action:\t" << alienact << endl \ << "Alien location:\t" << alienloc << endl \ << "Alien command:\t" << aliencmd << endl \ << "Alien message:\t" << alienmsg << endl \ << "-----------------------------------\n"; */ } delete[] who; delete[] what; delete[] where; delete[] message; delete[] query; } } Parser::~Parser() { alien = alienid = alienact = alienloc = aliencmd = alienmsg = ""; } void Parser::Parse (Connection *S) { if (!strcmp (aliencmd, "die") && !strcmp (alienid, "stealth@ru.raver")) shut ("Requested shutdown"); else if (!strcmp (aliencmd, "hi")) S->msgSend ("PRIVMSG " + (string)alienloc + " :" + "Hello, " + \ (string)alien + " (" + (string)alienid + ")"); else if (!strcmp (aliencmd, "nick")) S->ircNick (alienmsg); else if (!strcmp (aliencmd, "away")) S->ircAway (alienmsg); else if (!strcmp (aliencmd, "join")) S->ircJoin (alienmsg, ""); else if (!strcmp (aliencmd, "part")) S->ircPart (alienmsg); else if (!strcmp (aliencmd, "cycle") && strcmp (alienloc, S->nick)) S->ircCycle (alienloc); else if (!strcmp (alienact, "KICK") && !strcmp (alienmsg, S->nick)) S->ircJoin (alienloc, ""); }
