193 lines
5.5 KiB
C++
193 lines
5.5 KiB
C++
#include "basemodule.h"
|
|
#include "message.h"
|
|
#include <QStringList>
|
|
|
|
BaseModule::BaseModule() : Module(), status(OFFLINE)
|
|
{
|
|
users = new UserList();
|
|
}
|
|
|
|
BaseModule::~BaseModule()
|
|
{
|
|
delete(users);
|
|
}
|
|
|
|
bool BaseModule::messageHandler(Message msg)
|
|
{
|
|
bool ret = false;
|
|
answer = "";
|
|
if(msg.command.compare("PING", Qt::CaseInsensitive) == 0)
|
|
{
|
|
answer = pong(msg.target);
|
|
ret = true;
|
|
}
|
|
switch(status)
|
|
{
|
|
case OFFLINE :
|
|
status = ONLINE;
|
|
answer = QString("NICK %1\r\nUSER %2 0 * %3\r\n").arg(getNick()).arg(getNick()).arg(getNick());
|
|
ret = true;
|
|
break;
|
|
case ONLINE :
|
|
if(msg.command.compare("376") == 0)
|
|
{
|
|
status = ON_CHAN;
|
|
answer += join(getChan());
|
|
ret = true;
|
|
}
|
|
break;
|
|
case ON_CHAN :
|
|
ret |= onChanHandler(msg);
|
|
break;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
bool BaseModule::onChanHandler(Message msg)
|
|
{
|
|
bool ret = false;
|
|
User* src = users->getFromNick(msg.nick);
|
|
|
|
// 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 && src != NULL && src->isOp())
|
|
{
|
|
answer += quit("Rebooting for update...");
|
|
ret = true;
|
|
}
|
|
|
|
// affiche les gens connectés
|
|
else 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(" ");
|
|
}
|
|
answer += say(str);
|
|
ret = true;
|
|
}
|
|
|
|
// affiche l'aide
|
|
else if(msg.args.compare("!help") == 0)
|
|
{
|
|
QString str = "Available commands : !help !list";
|
|
if(src != NULL && src->isOp())
|
|
str += " !update !module";
|
|
answer += privateSay(str, msg.nick);
|
|
ret = true;
|
|
}
|
|
|
|
// gère les modules
|
|
else if(msg.args.startsWith("!module") && src != NULL && src->isOp())
|
|
{
|
|
QStringList list = msg.args.split(' ');
|
|
QString command = list.size() < 2 ? "" : list[1];
|
|
if(command.compare("list") == 0)
|
|
{
|
|
QString str = "Available modules : ";
|
|
for(int i=0; i<getNbModules(); ++i)
|
|
{
|
|
Module* m = getModule(i);
|
|
str += m->getName() + (m->isEnabled() ? "[ON] " : "[OFF] ");
|
|
}
|
|
answer += say(str);
|
|
ret = true;
|
|
}
|
|
else if(list.size() > 2 && (command.compare("disable") == 0 || command.compare("enable") == 0))
|
|
{
|
|
bool newStatus = command.compare("enable") == 0;
|
|
for(int i=2; i<list.size(); ++i)
|
|
for(int j=1; j<getNbModules(); ++j)
|
|
{
|
|
Module* m = getModule(j);
|
|
if(m->getName().compare(list[i]) == 0)
|
|
{
|
|
if(m->isEnabled() != newStatus)
|
|
answer += say((newStatus ? "enabled module " : "disabled module ") + list[i]);
|
|
m->setEnabled(newStatus);
|
|
}
|
|
else
|
|
answer += say("no module named " + list[i]);
|
|
}
|
|
ret = true;
|
|
}
|
|
else
|
|
{
|
|
answer += say("usage : !module (list | enable/disable <targets>)");
|
|
ret = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// renommage
|
|
else if(msg.command.compare("NICK", Qt::CaseInsensitive) == 0)
|
|
src->rename(msg.args);
|
|
else if(msg.command.compare("QUIT", Qt::CaseInsensitive) == 0)
|
|
users->remove(src);
|
|
else if(msg.command.compare("PART", Qt::CaseInsensitive) == 0)
|
|
users->remove(src);
|
|
else if(msg.command.compare("KICK", Qt::CaseInsensitive) == 0)
|
|
{
|
|
if(getNick().compare(msg.target2) == 0)
|
|
{
|
|
answer += quit("i've been kicked :(");
|
|
ret = true;
|
|
}
|
|
users->remove(users->getFromNick(msg.target2));
|
|
}
|
|
else if(msg.command.compare("JOIN", Qt::CaseInsensitive) == 0
|
|
&& msg.args.contains(getChan())
|
|
&& getNick().compare(msg.nick) != 0)
|
|
{
|
|
users->getOrAdd(msg.nick);
|
|
answer += whois(msg.nick);
|
|
ret = true;
|
|
}
|
|
|
|
// 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)
|
|
{
|
|
User* u = users->getOrAdd(s);
|
|
answer += whois(u->getNick());
|
|
ret = true;
|
|
}
|
|
}
|
|
|
|
// 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(getChan()))
|
|
{
|
|
u->setOp(s.startsWith('@'));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
UserList* BaseModule::getUserList()
|
|
{
|
|
return users;
|
|
}
|
|
|
|
QString BaseModule::getName()
|
|
{
|
|
return "base";
|
|
}
|