| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 | #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),  myConnectionRetries(0),  myOnServerFlag(false),  mySpamMutedFlag(false),  myQWMutedFlag(false),  myJoinMessageTimer(new QTimer()),  myJoinMessagePrinted(false){  myEndFloodTime = QTime::currentTime();  myQWBroadcastFloodTime = myEndFloodTime;  mySpamBroadcastFloodTime = myEndFloodTime;  myJoinMessageTimer->setSingleShot(true);}Client::~Client(){  delete myJoinMessageTimer;}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 = "[" + 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;}void Client::retryConnection(){	if(myConnectionRetries == ConnectionRetries)	{		print("Giving up!\n");		disconnect();    myOnServerFlag = false;		return;	}	print("Reconnecting...\n");	reconnect();	myConnectionRetries++;}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)\\s*(.+)$");  if(regex.indexIn(message) == -1)    return;	/* Flood prot */  QTime currentTime = QTime::currentTime();  int timeLeft = currentTime.secsTo(myEndFloodTime);  if(timeLeft > 0)	{		if(!myFloodMsgPrinted)		{      say("> FloodProt: Not so fast, wait " + QString::number(timeLeft) + " sec(s).");			myFloodMsgPrinted = true;		}		return;	}  myEndFloodTime = QTime::currentTime().addSecs(Settings::globalInstance()->floodProtTime());  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("> Mute/Unmute: .qw_mute and .qw_unmute or .spam_mute or .spam_unmute");		return;	}  if(command == "qw" || command == "spam")	{    if(!args.trimmed().size())    {      say("> The format is ." + command + " <message>.");      return;    }    if(command == "qw")    {      timeLeft = currentTime.secsTo(myQWBroadcastFloodTime);      if(timeLeft > 0)      {        say("> FloodProt: Wait " + QString::number(timeLeft) + " sec(s) before broadcasting a new .qw message.");        return;      }      myQWBroadcastFloodTime = currentTime.addSecs(Settings::globalInstance()->qwFloodProtTime());    }    else if(command == "spam")    {      timeLeft = currentTime.secsTo(mySpamBroadcastFloodTime);      if(timeLeft > 0)      {        say("> FloodProt: Wait " + QString::number(timeLeft) + " sec(s) before broadcasting a new .spam message.");        return;      }      mySpamBroadcastFloodTime = currentTime.addSecs(Settings::globalInstance()->spamFloodProtTime());    }    QString server(QString(host()) + ":" + QString::number(port()));    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());    myApp->requestBroadcast("dev", nick, server, parsedMsg);    //myApp->requestBroadcast(command, nick, server, args.trimmed());		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;  }}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;  }  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	{		myConnectionRetries = 0;    myOnServerFlag = true;    myJoinMessageTimer->start(Settings::globalInstance()->timeToSayHiAfterConnected()*1000);    myJoinMessagePrinted = 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);}
 |