#include "Client.h" #include #include #include #include #include #include "App.h" #include "Settings.h" Client::Client(App *app): QWClient(), myApp(app), mySocket(NULL), myEndFloodTimer(new QTime()), myConnectionRetries(0), myOnServerFlag(false) { *myEndFloodTimer = QTime::currentTime(); } Client::~Client() { delete myEndFloodTimer; } void Client::setSocket(QTcpSocket *socket) { mySocket = socket; } void Client::say(const QString &msg) { QString cmd = "say " + msg; sendCmd(cmd.toAscii().data()); } void Client::sayTeam(const QString &msg) { QString cmd = "say_team " + 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 = QString(host()) + ":" + QString::number(port()) + "> " + msg; QByteArray b = str.toAscii(); Client::stripColor(b.data()); str = QString::fromAscii(b.data()); printf("%s", str.toAscii().data()); if(mySocket) { mySocket->write(str.toAscii()); mySocket->waitForBytesWritten(); } } void Client::onDisconnect() { print("Disconnected..\n"); myOnServerFlag = false; } void Client::retryConnection() { if(myConnectionRetries == ConnectionRetries) { print("Giving up!\n"); disconnect(); myOnServerFlag = false; return; } print("Reconnecting...\n"); reconnect(); myConnectionRetries++; } void Client::parsePrintedLine() { QRegExp regex("^(.+):\\s+\\.([A-Za-z]+)\\s*(.*)$"); if(regex.indexIn(myPrintLine) == -1) return; /* Flood prot */ int timeLeft = QTime::currentTime().secsTo(*myEndFloodTimer); if(timeLeft > 0) { if(!myFloodMsgPrinted) { say("> Wait " + QString::number(timeLeft) + " second(s) before issuing a new command."); myFloodMsgPrinted = true; } return; } *myEndFloodTimer = QTime::currentTime().addSecs(Settings::globalInstance()->floodProtTime()); QString nick = regex.capturedTexts().at(1); QString command = regex.capturedTexts().at(2); QString args = regex.capturedTexts().at(3); myFloodMsgPrinted = false; if(command == "help") { say("> commands:"); say("> .qw "); say("> .spam "); say("> .help to show this help message."); return; } if(command == "qw" || command == "spam") { if(!args.trimmed().size()) { say("> The format is ." + command + " ."); return; } say("> Broadcasting..."); QString server(QString(host()) + ":" + QString::number(port())); QString message("-" + command + "- " + nick + " - " + server + " : " + args.trimmed()); //-qw- Skillah - #crazy88 : 4on4 MIX qw.foppa.dk:27503 7/8 myApp->broadcast(message); //myApp->requestBroadcast(command, nick, server, args.trimmed()); nick = parseNameFun(nick); //for the irc message namefun must be removed. QString parsedMsg = parseNameFun(args.trimmed()); myApp->requestBroadcast("dev", nick, server, parsedMsg); return; } } 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; } 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::onOOBPrint(const char *msg) { print(QString(msg)); } void Client::onStuffedCmd(const char *cmd) { QString strCmd(cmd); if(strCmd == "skins") //connection sequence complete { myConnectionRetries = 0; myOnServerFlag = true; } } 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); }