diff --git a/chatcleaner.pro b/chatcleaner.pro new file mode 100644 index 00000000..86a1c407 --- /dev/null +++ b/chatcleaner.pro @@ -0,0 +1,23 @@ +# ------------------------------------------------- +# Project created by QtCreator 2009-07-17T21:51:00 +# ------------------------------------------------- +CODECFORSRC = UTF-8 +QT += network +QT -= gui +TARGET = chatcleaner +CONFIG += console +CONFIG -= app_bundle +MOC_DIR = mocs +OBJECTS_DIR = obj +TEMPLATE = app +INCLUDEPATH += src/ src/chatcleaner/ +DEPENDPATH += src/ src/chatcleaner/ +SOURCES += chatcleaner.cpp \ + cleanerserver.cpp \ + messagefilter.cpp \ + badwordcheck.cpp \ + textfloodcheck.cpp +HEADERS += cleanerserver.h \ + messagefilter.h \ + badwordcheck.h \ + textfloodcheck.h diff --git a/src/chatcleaner/badwordcheck.cpp b/src/chatcleaner/badwordcheck.cpp new file mode 100644 index 00000000..81ab1598 --- /dev/null +++ b/src/chatcleaner/badwordcheck.cpp @@ -0,0 +1,21 @@ +#include "badwordcheck.h" + +#include + +BadWordCheck::BadWordCheck() +{ + badWords << "arsch" << "asshole" << "bastard" << "bitch" << "cunt" << " dick " << "drecksau" << " fag " << "fagget" << "fotze" << "fuker" + << "fuck" << " fuk " << "gay" << "horny" << "hure" << "mistgeburt" << "missgeburt" << "motherfucker" << "nazi" << "nigga" + << "nigger" << "nutte" << "ommak" << "penis" << "pussy" << "schlampe" << "schwanz" << "sex" << "shit" << "sieg heil" << "slut" + << "suck" << "whore"; +} + +bool BadWordCheck::run(QString msg) +{ + QStringListIterator it(badWords); + while (it.hasNext()) { + if(msg.toLower().contains(it.next())) + return true; + } + return false; +} diff --git a/src/chatcleaner/badwordcheck.h b/src/chatcleaner/badwordcheck.h new file mode 100644 index 00000000..f13bdaaa --- /dev/null +++ b/src/chatcleaner/badwordcheck.h @@ -0,0 +1,17 @@ +#ifndef BADWORDCHECK_H +#define BADWORDCHECK_H + +#include + +class BadWordCheck: public QObject { +Q_OBJECT +public: + BadWordCheck(); + + bool run(QString); +private: + + QStringList badWords; +}; + +#endif // BADWORDCHECK_H diff --git a/src/chatcleaner/chatcleaner.cpp b/src/chatcleaner/chatcleaner.cpp new file mode 100644 index 00000000..f2b76ede --- /dev/null +++ b/src/chatcleaner/chatcleaner.cpp @@ -0,0 +1,10 @@ +#include +#include "cleanerserver.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + CleanerServer server; + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + return a.exec(); +} diff --git a/src/chatcleaner/cleanerserver.cpp b/src/chatcleaner/cleanerserver.cpp new file mode 100644 index 00000000..b069a5f1 --- /dev/null +++ b/src/chatcleaner/cleanerserver.cpp @@ -0,0 +1,40 @@ +#include "cleanerserver.h" + +#include +#include +#include + +#include "messagefilter.h" + +CleanerServer::CleanerServer() +{ + myMessageFilter = new MessageFilter; + tcpServer = new QTcpServer(); + if (!tcpServer->listen(QHostAddress("127.0.0.1"), 7777) ) { + qDebug() << QString("Unable to start the server: %1.").arg(tcpServer->errorString()); + return; + } + + qDebug() << QString("The server is running on port %1.").arg(tcpServer->serverPort()); + + connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newCon())); +} + +CleanerServer::~CleanerServer() +{ +} + +void CleanerServer::newCon() + { + tcpSocket = tcpServer->nextPendingConnection(); + connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(onRead())); + } + +void CleanerServer::onRead() +{ + char buf[20000]; + tcpSocket->readLine(buf, sizeof(buf)); + QString message = QString::fromUtf8("%1").arg(buf); + QString checkMessage = myMessageFilter->check(message); + tcpSocket->write(checkMessage.toAscii().data(), checkMessage.length()); +} diff --git a/src/chatcleaner/cleanerserver.h b/src/chatcleaner/cleanerserver.h new file mode 100644 index 00000000..8c8878d3 --- /dev/null +++ b/src/chatcleaner/cleanerserver.h @@ -0,0 +1,27 @@ +#ifndef CLEANERSERVER_H +#define CLEANERSERVER_H + +#include +#include + +class MessageFilter; + +class CleanerServer: public QObject { +Q_OBJECT + +public: + CleanerServer(); + ~CleanerServer(); + +private slots: + void newCon(); + void onRead(); + +private: + QTcpServer *tcpServer; + QTcpSocket *tcpSocket; + MessageFilter *myMessageFilter; + +}; + +#endif // CLEANERSERVER_H diff --git a/src/chatcleaner/messagefilter.cpp b/src/chatcleaner/messagefilter.cpp new file mode 100644 index 00000000..fcae3735 --- /dev/null +++ b/src/chatcleaner/messagefilter.cpp @@ -0,0 +1,27 @@ +#include "messagefilter.h" + +#include +#include "badwordcheck.h" +#include "textfloodcheck.h" + +enum OffenceType { + BAD_WORD, + TEXT_FLOOD_LINES }; + +MessageFilter::MessageFilter() +{ + myBadWordCheck = new BadWordCheck; + myTextFloodCheck = new TextFloodCheck; +} + +QString MessageFilter::check(QString msg) +{ + if(myBadWordCheck->run(msg)) { + return QString(" Der Blitz soll dich beim Scheißen erschlagen du Spammer\n"); + } + if(myTextFloodCheck->run(1)) { + return QString(" Bitte langsamer schreiben!!!\n"); + } + + return QString(""); +} diff --git a/src/chatcleaner/messagefilter.h b/src/chatcleaner/messagefilter.h new file mode 100644 index 00000000..98b76018 --- /dev/null +++ b/src/chatcleaner/messagefilter.h @@ -0,0 +1,31 @@ +#ifndef MESSAGEFILTER_H +#define MESSAGEFILTER_H + +#include +#include + +class BadWordCheck; +class TextFloodCheck; + +class MessageFilter: public QObject { +Q_OBJECT +public: + MessageFilter(); + + QString check(QString); + +private: + BadWordCheck *myBadWordCheck; + TextFloodCheck *myTextFloodCheck; + + struct ClientWarnInfos { + QString nick; + int lastWarnType; + int warnLevel; + }; + + QMap clientWarnLevelList; + +}; + +#endif // MESSAGEFILTER_H diff --git a/src/chatcleaner/textfloodcheck.cpp b/src/chatcleaner/textfloodcheck.cpp new file mode 100644 index 00000000..8934fae9 --- /dev/null +++ b/src/chatcleaner/textfloodcheck.cpp @@ -0,0 +1,43 @@ +#include "textfloodcheck.h" + +TextFloodCheck::TextFloodCheck() +{ + timer.reset(); + timer.start(); +} + +bool TextFloodCheck::run(unsigned playerId) { + + QMapIterator it(msgTimesList); + while (it.hasNext()) { + it.next(); + qDebug() << msgTimesList.count() << it.key() << ": " << it.value().floodLevel << it.value().timeStamp << endl; + } + + QMap::const_iterator i = msgTimesList.find(playerId); + + if(i == msgTimesList.end()) { + myTextFloodInfos.floodLevel = 0; + myTextFloodInfos.timeStamp = timer.elapsed().total_seconds(); + msgTimesList.insert(playerId, myTextFloodInfos); + } + else { + if(timer.elapsed().total_seconds()-i.value().timeStamp <= 1) { + if(i.value().floodLevel == 2) + return true; + else if(i.value().floodLevel == 1) + myTextFloodInfos.floodLevel = 2; + else + myTextFloodInfos.floodLevel = 1; + + } + myTextFloodInfos.timeStamp = timer.elapsed().total_seconds(); + msgTimesList.insert(playerId, myTextFloodInfos); + } + return false; +} + +void TextFloodCheck::cleanMsgTimesList() { + + +} diff --git a/src/chatcleaner/textfloodcheck.h b/src/chatcleaner/textfloodcheck.h new file mode 100644 index 00000000..4c29d325 --- /dev/null +++ b/src/chatcleaner/textfloodcheck.h @@ -0,0 +1,27 @@ +#ifndef TEXTFLOODCHECK_H +#define TEXTFLOODCHECK_H + +#include +#include +#include + + +class TextFloodCheck +{ +public: + TextFloodCheck(); + bool run(unsigned); + void cleanMsgTimesList(); + +private: + QTimer cleanTimer; + boost::timers::portable::second_timer timer; + struct TextFloodInfos { + int floodLevel; + size_t timeStamp; + }; + TextFloodInfos myTextFloodInfos; + QMap msgTimesList; +}; + +#endif // TEXTFLOODCHECK_H