the bot should understand JOIN and QUIT

This commit is contained in:
unknown 2015-05-26 14:20:03 +02:00
parent 98c8a64d6a
commit 49ba5d82df
6 changed files with 77 additions and 37 deletions

View File

@ -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();
}
}

View File

@ -12,6 +12,7 @@ public:
User* src;
QString command;
QString target;
QString target2;
QString args;
Message(QString str, UserList users);
~Message();

View File

@ -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()));
}

View File

@ -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);

View File

@ -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);
}

3
user.h
View File

@ -14,12 +14,15 @@ public:
void rename(QString newNick);
QString getNick();
bool isOp();
void setOp(bool newStatus);
};
class UserList : public std::vector<User*>
{
public:
User* getOrAdd(QString nick);
User* getFromNick(QString nick);
void remove(User* user);
};
#endif // USER_H