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, "");
}