first chatcleaner steps (simple badword and textflood check works on port 7777)

This commit is contained in:
doitux
2009-07-18 20:39:31 +00:00
parent 33a3f2f6d4
commit 196d9bd27c
10 changed files with 266 additions and 0 deletions
+23
View File
@@ -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
+21
View File
@@ -0,0 +1,21 @@
#include "badwordcheck.h"
#include <QtCore>
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;
}
+17
View File
@@ -0,0 +1,17 @@
#ifndef BADWORDCHECK_H
#define BADWORDCHECK_H
#include <QtCore>
class BadWordCheck: public QObject {
Q_OBJECT
public:
BadWordCheck();
bool run(QString);
private:
QStringList badWords;
};
#endif // BADWORDCHECK_H
+10
View File
@@ -0,0 +1,10 @@
#include <QtCore/QCoreApplication>
#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();
}
+40
View File
@@ -0,0 +1,40 @@
#include "cleanerserver.h"
#include <QtNetwork>
#include <QtCore>
#include <stdlib.h>
#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());
}
+27
View File
@@ -0,0 +1,27 @@
#ifndef CLEANERSERVER_H
#define CLEANERSERVER_H
#include <QtCore>
#include <QtNetwork>
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
+27
View File
@@ -0,0 +1,27 @@
#include "messagefilter.h"
#include <QtCore>
#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("<PokerTHCleaner> Der Blitz soll dich beim Scheißen erschlagen du Spammer\n");
}
if(myTextFloodCheck->run(1)) {
return QString("<PokerTHCleaner> Bitte langsamer schreiben!!!\n");
}
return QString("");
}
+31
View File
@@ -0,0 +1,31 @@
#ifndef MESSAGEFILTER_H
#define MESSAGEFILTER_H
#include <QtCore>
#include <stdlib.h>
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<unsigned, ClientWarnInfos> clientWarnLevelList;
};
#endif // MESSAGEFILTER_H
+43
View File
@@ -0,0 +1,43 @@
#include "textfloodcheck.h"
TextFloodCheck::TextFloodCheck()
{
timer.reset();
timer.start();
}
bool TextFloodCheck::run(unsigned playerId) {
QMapIterator<unsigned, TextFloodInfos> it(msgTimesList);
while (it.hasNext()) {
it.next();
qDebug() << msgTimesList.count() << it.key() << ": " << it.value().floodLevel << it.value().timeStamp << endl;
}
QMap<unsigned, TextFloodInfos>::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() {
}
+27
View File
@@ -0,0 +1,27 @@
#ifndef TEXTFLOODCHECK_H
#define TEXTFLOODCHECK_H
#include <QtCore>
#include <third_party/boost/timers.hpp>
#include <stdlib.h>
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<unsigned, TextFloodInfos> msgTimesList;
};
#endif // TEXTFLOODCHECK_H