123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454 |
- #include "Client.h"
- #include <QString>
- #include <stdio.h>
- #include <QTcpSocket>
- #include <QStringList>
- #include <QTime>
- #include <QTimer>
- #include "App.h"
- #include "Settings.h"
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Client::Client(App *app, ActiveClient* ac):
- QWClient(),
- myActiveClient(ac),
- myApp(app),
- myOnServerFlag(false),
- mySpamMutedFlag(false),
- myQWMutedFlag(false),
- myJoinMessageTimer(new QTimer()),
- myKeepNickTimer(new QTimer()),
- myFloodTimer(new QTimer()),
- myQWBroadcastFloodTimer(new QTimer()),
- mySpamBroadcastFloodTimer(new QTimer()),
- myJoinMessagePrinted(false),
- myJoinMessageScheduled(false),
- myMaxClients(0)
- {
- myJoinMessageTimer->setSingleShot(true);
- myKeepNickTimer->setSingleShot(true);
- myFloodTimer->setSingleShot(true);
- myQWBroadcastFloodTimer->setSingleShot(true);
- mySpamBroadcastFloodTimer->setSingleShot(true);
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Client::~Client()
- {
- delete myJoinMessageTimer;
- delete myKeepNickTimer;
- delete myFloodTimer;
- delete myQWBroadcastFloodTimer;
- delete mySpamBroadcastFloodTimer;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::connect(const char *host, quint16 port)
- {
- myJoinMessageScheduled = true; //Hi message only scheduled at bot connection
- QWClient::connect(host, port);
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::say(const QString &msg)
- {
- QString cmd = "say " + msg;
- sendCmd(cmd.toAscii().data());
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::setTeam(const QString &msg)
- {
- sendCmd(QString("setinfo \"team\" \"" + msg + "\"").toAscii().data());
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::disconnect()
- {
- QWClient::disconnect();
- myOnServerFlag = false;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::print(const QString &msg)
- {
- QString str;
- str = "[" + QTime::currentTime().toString(Qt::ISODate) + "] " + QString(host()) + ":" + QString::number(port()) + "> " + msg;
- QByteArray b = str.toAscii();
- Client::stripColor(b.data());
- str = QString::fromAscii(b.data());
- myApp->print(str);
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::setPlayerList(PlayerList &playerList)
- {
- myPlayerList = playerList;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onDisconnect()
- {
- print("Disconnected..\n");
- myOnServerFlag = false;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- bool Client::isQWMuted() const
- {
- return myQWMutedFlag;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- bool Client::isSpamMuted() const
- {
- return mySpamMutedFlag;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::parsePrintedLine()
- {
- Player player;
- bool parsed = false;
- quint16 lastMatchSize = 0;
- QByteArray playerName;
- QByteArray printLine(myPrintLine.toAscii());
- QWClient::stripColor(printLine.data());
- foreach(player, myPlayerList)
- {
- playerName = player.name.toAscii();
- QWClient::stripColor(playerName.data());
- if(printLine.startsWith(playerName) || (player.spectator && printLine.startsWith(QString("[SPEC] " + player.name).toAscii())))
- {
- if(player.spectator && printLine.startsWith("[SPEC] "))
- {
- if(lastMatchSize < (playerName.size() + 7))
- lastMatchSize = (playerName.size() + 7);
- }
- else if(lastMatchSize < playerName.size())
- {
- lastMatchSize = playerName.size();
- }
- parsed = true;
- }
- }
- if(!parsed)
- return;
- QString nick(myPrintLine.left(lastMatchSize));
- QString message(myPrintLine.right(myPrintLine.size() - lastMatchSize));
- QRegExp regex("^:\\s+\\.(spam|qw|help|qw_mute|qw_unmute|spam_mute|spam_unmute|lastmsgs)\\s*(.+)$");
- if(regex.indexIn(message) == -1)
- return;
- /* Flood prot */
- QTime currentTime = QTime::currentTime();
- int floodProtTime = Settings::globalInstance()->floodProtTime();
- if(myFloodTimer->isActive())
- {
- if(!myFloodMsgPrinted)
- {
- say("> FloodProt: Not so fast, wait " + QString::number(floodProtTime + currentTime.secsTo(myFloodTimerStart)) + " sec(s).");
- myFloodMsgPrinted = true;
- }
- return;
- }
- myFloodTimerStart = currentTime;
- myFloodTimer->start(floodProtTime*1000);
- myFloodMsgPrinted = false;
- QString command = regex.capturedTexts().at(1);
- QString args = regex.capturedTexts().at(2);
- if(command == "help")
- {
- //say("> Commands:");
- say("> Broadcast a message: .qw <message> and .spam <message>");
- //, beware of the floodprot limits 600s for .qw and 300s for .spam");
- say("> (Un)Mute: .qw_mute .qw_unmute or .spam_mute .spam_unmute");
- say("> Last 5 messages: .lastmsgs");
- return;
- }
- if(command == "qw" || command == "spam")
- {
- if(!args.trimmed().size())
- {
- say("> The format is ." + command + " <message>.");
- return;
- }
- /* Floodprot for broadcasting commands */
- if(command == "qw")
- {
- int qwFloodProtTime = Settings::globalInstance()->qwFloodProtTime();
- if(myQWBroadcastFloodTimer->isActive())
- {
- say("> FloodProt: Wait " + QString::number(qwFloodProtTime + currentTime.secsTo(myQWBroadcastFloodTimerStart)) + " secs before new .qw");
- return;
- }
- myQWBroadcastFloodTimerStart = currentTime;
- myQWBroadcastFloodTimer->start(qwFloodProtTime*1000);
- }
- else if(command == "spam")
- {
- int spamFloodProtTime = Settings::globalInstance()->spamFloodProtTime();
- if(mySpamBroadcastFloodTimer->isActive())
- {
- say("> FloodProt: Wait " + QString::number(spamFloodProtTime + currentTime.secsTo(mySpamBroadcastFloodTimerStart)) + " secs before new .spam");
- return;
- }
- mySpamBroadcastFloodTimerStart = currentTime;
- mySpamBroadcastFloodTimer->start(spamFloodProtTime*1000);
- }
- QString server(QString(host()) + ":" + QString::number(port()) + " " + QString::number(playerCount()) + "/" + QString::number(myMaxClients));
- QString message("-" + command + "- " + nick + " - " + server + " : " + args.trimmed());
- /* Broadcast within QW servers */
- myApp->broadcast(message, myActiveClient);
- /* Broadcast outside QW */
- nick = parseNameFun(nick); //for the irc message namefun must be removed.
- QString parsedMsg = parseNameFun(args.trimmed());
- if(!Settings::globalInstance()->developerMode())
- myApp->requestBroadcast(command, nick, server, args.trimmed());
- else
- myApp->requestBroadcast("dev", nick, server, parsedMsg);
- return;
- }
- if(command == "qw_mute")
- {
- say("> .qw Frequency Muted.");
- myQWMutedFlag = true;
- return;
- }
- if(command == "qw_unmute")
- {
- say("> .qw Frequency Unmuted.");
- myQWMutedFlag = false;
- return;
- }
- if(command == "spam_mute")
- {
- say("> .spam Frequency Muted.");
- mySpamMutedFlag = true;
- return;
- }
- if(command == "spam_unmute")
- {
- say("> .spam Frequency Unmuted.");
- mySpamMutedFlag = false;
- return;
- }
- if(command == "lastmsgs")
- {
- QStringList messages = myApp->lastMessages();
- if(!messages.size())
- {
- say("None");
- return;
- }
- QString msg;
- int i = 0;
- foreach(msg, messages)
- {
- if(++i > 5)
- break;
- say(msg);
- }
- return;
- }
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- int Client::playerCount() const
- {
- Player c;
- int pc = 0;
- foreach(c, myPlayerList)
- {
- if(c.spectator)
- continue;
- pc++;
- }
- return pc;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::setMaxClients(int maxClients)
- {
- myMaxClients = maxClients;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- int Client::maxClients() const
- {
- return myMaxClients;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onPrint(int, const char *msg)
- {
- if(!strlen(msg))
- return;
- QString text(msg);
- if(text.endsWith('\n'))
- {
- myPrintLine.append(text);
- parsePrintedLine();
- print(myPrintLine);
- myPrintLine.clear();
- }
- else
- {
- myPrintLine.append(text);
- }
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- bool Client::isOnServer() const
- {
- return myOnServerFlag;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onError(const char *description)
- {
- QString desc(description);
- if(desc == "Client Timed Out.")
- {
- print("Error (" + QString(description) + ")\n");
- }
- else
- {
- print("Error (" + QString(description) + ")\n");
- }
- myOnServerFlag = false;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onLevelChanged(int, const char *levelName, float, float, float, float, float, float, float, float, float, float)
- {
- print(QString(levelName) + "\n");
- myDownloadProgressPrintedFlag = false;
- mySpamMutedFlag = false;
- myQWMutedFlag = false;
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onChallenge()
- {
- print("challenge\n");
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onConnection()
- {
- print("connection\n");
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onConnected()
- {
- print("connected\n");
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onDownloadStarted(const char *fileName)
- {
- print("Download started " + QString(fileName) + "\n");
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::run()
- {
- if(!myJoinMessageTimer->isActive() && !myJoinMessagePrinted)
- {
- say("Hi, I am QWNET's bot, type .help to see my commands.");
- myJoinMessagePrinted = true;
- }
- /* Keep nick... Simply set name again after 10 secs */
- if(!myKeepNickTimer->isActive())
- {
- setName(Settings::globalInstance()->botName().toAscii().data());
- myKeepNickTimer->start(30000);
- }
- QWClient::run();
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onOOBPrint(const char *msg)
- {
- print(QString(msg));
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onStuffedCmd(const char *cmd)
- {
- QString strCmd(cmd);
- if(strCmd == "skins") //connection sequence complete
- {
- myOnServerFlag = true;
- /* Only say hi if hi is scheduled */
- if(myJoinMessageScheduled)
- {
- myJoinMessageTimer->start(Settings::globalInstance()->timeToSayHiAfterConnected()*1000);
- myJoinMessagePrinted = false;
- myJoinMessageScheduled = false;
- }
- }
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onDownloadProgress(int percent)
- {
- if(!(percent % 10))
- {
- if(!myDownloadProgressPrintedFlag)
- {
- print("Download " + QString::number(percent) + "%\n");
- myDownloadProgressPrintedFlag = true;
- }
- }
- else
- {
- myDownloadProgressPrintedFlag = false;
- }
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- void Client::onDownloadFinished()
- {
- print("Download 100% finished.\n");
- }
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- QString Client::parseNameFun(const QString &string)
- {
- QByteArray b(string.toAscii());
- QWClient::stripColor(b.data());
- return QString(b);
- }
|