diff --git a/message.cpp b/message.cpp index dc10e24..9eabb55 100644 --- a/message.cpp +++ b/message.cpp @@ -12,7 +12,7 @@ Message::Message(QString str, UserList users) command = "PING"; target = "PING"; src = NULL; - args = str; + args = str.split(':')[1]; } else { @@ -24,13 +24,15 @@ Message::Message(QString str, UserList users) args = str.right(str.size()-(mid+1)); // the interesting infos before the separator are separated by spaces QStringList list = str.split(' '); - // source of the message + // source of the message (creates the user if he is new) QString nick = list.takeFirst(); - src = users.getFromNick(nick.left(nick.indexOf('!'))); + src = users.getOrAdd(nick.left(nick.indexOf('!'))); // command issued by the source command = list.takeFirst(); // target of the command target = list.takeFirst(); + if(!list.empty()) + target2 = list.takeFirst(); } } diff --git a/message.h b/message.h index d87c494..fef3968 100644 --- a/message.h +++ b/message.h @@ -12,6 +12,7 @@ public: User* src; QString command; QString target; + QString target2; QString args; Message(QString str, UserList users); ~Message(); diff --git a/sparrowbot.cpp b/sparrowbot.cpp index d2a4332..837e01f 100644 --- a/sparrowbot.cpp +++ b/sparrowbot.cpp @@ -5,26 +5,26 @@ using namespace std; -void SparrowBot::receiveMsg(QString msg) +void SparrowBot::receiveMsg(QString str) { - string str; - if(msg.contains("PING")) - { - str = "PONG\r\n"; - emit sendMsg(QString(str.c_str())); - } + Message msg = Message(str, users); + switch(status) { case OFFLINE : status = ONLINE; - sendRawMessage("NICK " + nick + "\r\nUSER " + nick + " 0 * " + nick + "\r\n"); + sendMsg(QString("NICK %1\r\nUSER %2 0 * %3\r\n").arg(nick).arg(nick).arg(nick)); break; case ONLINE : - status = ON_CHAN; - sendRawMessage("JOIN #" + chan + "\r\n"); + if(str.contains("PING")) + { + status = ON_CHAN; + sendMsg(QString("PONG :%1\r\n").arg(msg.args)); + sendMsg("JOIN #" + chan + "\r\n"); + } break; case ON_CHAN : - handleMessage(Message(msg, users)); + handleMessage(msg); break; } } @@ -52,20 +52,20 @@ void SparrowBot::handleMessage(Message msg) // mise à jour du bot if(msg.args.compare("!update") == 0 && msg.src != NULL && msg.src->isOp()) { - sendRawMessage("QUIT :i'll be back\r\n"); + emit sendMsg("QUIT :i'll be back\r\n"); exit(0); } // affiche les gens connectés if(msg.args.compare("!list") == 0) { - string str = "Online users : "; - for(User* u : users) - str += u->getNick().toStdString() + " "; - say(str); - str = "Online ops : "; + QString str = "Online users : "; for(User* u : users) + { if(u->isOp()) - str += u->getNick().toStdString() + " "; + str.append("@"); + str.append(u->getNick()); + str.append(" "); + } say(str); } if(msg.args.compare("plop ?") == 0) @@ -73,8 +73,13 @@ void SparrowBot::handleMessage(Message msg) } // renommage - else if(msg.command.compare(QString("NICK"), Qt::CaseInsensitive) == 0) + 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("JOIN", Qt::CaseInsensitive) == 0 + && msg.args.contains(chan)) + emit sendMsg(QString("WHOIS %1\r\n").arg(msg.src->getNick())); // 353 = code de la ligne qui liste les nicks connectés // on les parse et on effectue un WHOIS sur chaque nick @@ -86,22 +91,33 @@ void SparrowBot::handleMessage(Message msg) { User* u = new User(s); users.push_back(u); - sendRawMessage("WHOIS "+u->getNick().toStdString()+"\r\n"); + emit sendMsg(QString("WHOIS %1\r\n").arg(u->getNick())); + } + } + + // 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; + } } } } -void SparrowBot::say(string str) +void SparrowBot::say(QString str) { - sendRawMessage("PRIVMSG #" + chan + " :" + str + "\r\n"); + emit sendMsg(QString("PRIVMSG #%1 :%2\r\n").arg(chan).arg(str)); } -void SparrowBot::action(string str) +void SparrowBot::action(QString str) { - sendRawMessage("PRIVMSG #" + chan + " :ACTION " + str + "\r\n"); + emit sendMsg(QString("PRIVMSG #%1 :ACTION %2\r\n").arg(chan).arg(str)); } -void SparrowBot::sendRawMessage(string str) -{ - emit sendMsg(QString(str.c_str())); -} diff --git a/sparrowbot.h b/sparrowbot.h index c4d541a..c559c2c 100644 --- a/sparrowbot.h +++ b/sparrowbot.h @@ -11,20 +11,19 @@ class SparrowBot : public QObject enum{OFFLINE, ONLINE, ON_CHAN}; - std::string nick; - std::string chan; + QString nick; + QString chan; int status; UserList users; public: SparrowBot() : nick("SparrowBot"), chan("epicsparrow"), status(OFFLINE) {} - SparrowBot(std::string nick_, std::string chan_) : nick(nick_), chan(chan_), status(OFFLINE) {} + SparrowBot(QString nick_, QString chan_) : nick(nick_), chan(chan_), status(OFFLINE) {} private: void handleMessage(Message msg); - void say(std::string str); - void action(std::string str); - void sendRawMessage(std::string str); + void say(QString str); + void action(QString str); public slots: void receiveMsg(QString msg); diff --git a/user.cpp b/user.cpp index a7df4d5..58e1147 100644 --- a/user.cpp +++ b/user.cpp @@ -23,6 +23,19 @@ bool User::isOp() return op; } +void User::setOp(bool newStatus) +{ + op = newStatus; +} + +User* UserList::getOrAdd(QString nick) +{ + User* u = getFromNick(nick); + if(u == NULL) + u = new User(nick); + return u; +} + User* UserList::getFromNick(QString nick) { for(User* u : *this) @@ -30,3 +43,9 @@ User* UserList::getFromNick(QString nick) return u; return NULL; } + +void UserList::remove(User* user) +{ + erase(std::remove(begin(), end(), user), end()); + delete(user); +} diff --git a/user.h b/user.h index 64ff102..6e5f9b4 100644 --- a/user.h +++ b/user.h @@ -14,12 +14,15 @@ public: void rename(QString newNick); QString getNick(); bool isOp(); + void setOp(bool newStatus); }; class UserList : public std::vector { public: + User* getOrAdd(QString nick); User* getFromNick(QString nick); + void remove(User* user); }; #endif // USER_H