#include "ircbot.h" #include #include #include using namespace std; void IRCBot::receiveMsg(QString str) { Message msg = Message(str, &users); switch(status) { case OFFLINE : status = ONLINE; emit sendMsg(QString("NICK %1\r\nUSER %2 0 * %3").arg(nick).arg(nick).arg(nick)); break; case ONLINE : if(str.contains("PING")) { status = ON_CHAN; emit sendMsg(pong(msg.nick)); emit sendMsg(join(chan)); } break; case ON_CHAN : if(str.contains("PING")) emit sendMsg(pong(msg.nick)); handleMessage(msg); break; } } void IRCBot::handleMessage(Message msg) { // si la ligne est un message if(msg.command.compare(QString("PRIVMSG"), Qt::CaseInsensitive) == 0) { // mise à jour du bot if(msg.args.compare("!update") == 0 && msg.src != NULL && msg.src->isOp()) emit sendMsg(quit("Rebooting for update...")); // affiche les gens connectés if(msg.args.compare("!list") == 0) { QString str = "Online users : "; for(User* u : users) { if(u->isOp()) str.append("@"); str.append(u->getNick()); str.append(" "); } emit sendMsg(say(str)); } } // renommage else if(msg.command.compare("NICK", Qt::CaseInsensitive) == 0) msg.src->rename(msg.args); else if(msg.command.compare("QUIT", Qt::CaseInsensitive) == 0) users.remove(msg.src); else if(msg.command.compare("PART", Qt::CaseInsensitive) == 0) users.remove(msg.src); else if(msg.command.compare("KICK", Qt::CaseInsensitive) == 0) { if(nick.compare(msg.target2) == 0) emit sendMsg(quit("i've been kicked :(")); users.remove(users.getFromNick(msg.target2)); } else if(msg.command.compare("JOIN", Qt::CaseInsensitive) == 0 && msg.args.contains(chan) && nick.compare(msg.nick) != 0) { users.getOrAdd(msg.nick); emit sendMsg(whois(msg.nick)); } // 353 = code de la ligne qui liste les nicks connectés // on les parse et on effectue un WHOIS sur chaque nick else if(msg.command.compare(QString("353"), Qt::CaseInsensitive) == 0) { // names QStringList names = msg.args.split(' '); for(QString s : names) { users.getOrAdd(s); emit sendMsg(whois(s)); } } // 319 = code de la ligne de réponse au whois qui indique les chans d'un user, et son statut dessus else if(msg.command.compare(QString("319"), Qt::CaseInsensitive) == 0) { User* u = users.getOrAdd(msg.target2); QStringList chanList = msg.args.split(' '); for(QString s : chanList) { if(s.endsWith(chan)) { u->setOp(s.startsWith('@')); break; } } } } QString IRCBot::pong(QString target) { return QString("PONG :%1").arg(target); } QString IRCBot::join(QString theChan) { return QString("JOIN #%1").arg(theChan); } QString IRCBot::whois(QString nick) { return QString("WHOIS %1").arg(nick); } QString IRCBot::say(QString str) { return QString("PRIVMSG #%1 :%2").arg(chan).arg(str); } QString IRCBot::privateSay(QString str, QString target) { return QString("PRIVMSG %1 :%2").arg(target).arg(str); } QString IRCBot::action(QString str) { return QString("PRIVMSG #%1 :\001ACTION %2\001").arg(chan).arg(str); } QString IRCBot::quit(QString str) { return QString("QUIT :%1").arg(str); } void IRCBot::disconnect() { emit sendMsg(quit("I'll be back")); }