diff --git a/chatcleaner.pro b/chatcleaner.pro index c0bc04d8..d002bc6f 100644 --- a/chatcleaner.pro +++ b/chatcleaner.pro @@ -27,7 +27,8 @@ SOURCES += chatcleaner.cpp \ tinyxml.cpp \ tinyxmlerror.cpp \ tinyxmlparser.cpp \ - capsfloodcheck.cpp + capsfloodcheck.cpp \ + letterrepeatingcheck.cpp HEADERS += cleanerserver.h \ messagefilter.h \ badwordcheck.h \ @@ -35,4 +36,5 @@ HEADERS += cleanerserver.h \ cleanerconfig.h \ tinyxml.h \ tinystr.h \ - capsfloodcheck.h + capsfloodcheck.h \ + letterrepeatingcheck.h diff --git a/src/chatcleaner/cleanerconfig.cpp b/src/chatcleaner/cleanerconfig.cpp index a1a43af2..440b844a 100644 --- a/src/chatcleaner/cleanerconfig.cpp +++ b/src/chatcleaner/cleanerconfig.cpp @@ -43,7 +43,7 @@ using namespace std; CleanerConfig::CleanerConfig() { // !!!! Revisionsnummer der Configdefaults !!!!! - configRev = 3; + configRev = 4; // Pfad und Dateinamen setzen #ifdef _WIN32 @@ -117,6 +117,7 @@ CleanerConfig::CleanerConfig() configList.push_back(ConfigInfo("WarnLevelToKick", CONFIG_TYPE_INT, "2")); configList.push_back(ConfigInfo("TextFloodLevelToTrigger", CONFIG_TYPE_INT, "3")); configList.push_back(ConfigInfo("CapsFloodCapsNumberToTrigger", CONFIG_TYPE_INT, "10")); + configList.push_back(ConfigInfo("LetterRepeatingNumberToTrigger", CONFIG_TYPE_INT, "10")); list badWordsList; diff --git a/src/chatcleaner/letterrepeatingcheck.cpp b/src/chatcleaner/letterrepeatingcheck.cpp new file mode 100644 index 00000000..711b5b05 --- /dev/null +++ b/src/chatcleaner/letterrepeatingcheck.cpp @@ -0,0 +1,25 @@ +#include "letterrepeatingcheck.h" + +#include + +LetterRepeatingCheck::LetterRepeatingCheck() +{ +} + +bool LetterRepeatingCheck::run(QString msg) +{ + msg = msg.simplified().remove(" "); + QRegExp e(QString(".*(.)\\1{%1,}.*").arg(letterNumberToTrigger-1)); + if(e.isValid()) { + if(e.exactMatch(msg)) { + return true; + } + else { + return false; + } + } + else { + qDebug() << "The current Letter Repeating RegExp is invalid" << endl; + return false; + } +} diff --git a/src/chatcleaner/letterrepeatingcheck.h b/src/chatcleaner/letterrepeatingcheck.h new file mode 100644 index 00000000..e23126f7 --- /dev/null +++ b/src/chatcleaner/letterrepeatingcheck.h @@ -0,0 +1,19 @@ +#ifndef LETTERREPEATINGCHECK_H +#define LETTERREPEATINGCHECK_H + +#include + +class LetterRepeatingCheck: public QObject { +Q_OBJECT +public: + LetterRepeatingCheck(); + + void setLetterNumberToTrigger(int n) { letterNumberToTrigger = n; } + bool run(QString); + +private: + + int letterNumberToTrigger; +}; + +#endif // CAPSFLOODCHECK_H diff --git a/src/chatcleaner/messagefilter.cpp b/src/chatcleaner/messagefilter.cpp index 7046ddb6..263dff58 100644 --- a/src/chatcleaner/messagefilter.cpp +++ b/src/chatcleaner/messagefilter.cpp @@ -5,6 +5,7 @@ #include "textfloodcheck.h" #include "cleanerconfig.h" #include "capsfloodcheck.h" +#include "letterrepeatingcheck.h" enum ActionType { NOTHING, @@ -15,7 +16,8 @@ enum OffenceType { NONE, BAD_WORD, TEXT_FLOOD_LINES, - CAPS_FLOOD + CAPS_FLOOD, + LETTER_REPEATING }; MessageFilter::MessageFilter(CleanerConfig *c): config(c) @@ -23,6 +25,7 @@ MessageFilter::MessageFilter(CleanerConfig *c): config(c) myBadWordCheck = new BadWordCheck; myTextFloodCheck = new TextFloodCheck; myCapsFloodCheck = new CapsFloodCheck; + myLetterRepeatingCheck = new LetterRepeatingCheck; } QString MessageFilter::check(unsigned playerId, QString nick, QString msg) @@ -34,6 +37,7 @@ QString MessageFilter::check(unsigned playerId, QString nick, QString msg) if(myBadWordCheck->run(msg)) offence = BAD_WORD; if(myCapsFloodCheck->run(msg)) offence = CAPS_FLOOD; + if(myLetterRepeatingCheck->run(msg)) offence = LETTER_REPEATING; if(myTextFloodCheck->run(playerId)) offence = TEXT_FLOOD_LINES; if(offence){ @@ -82,6 +86,10 @@ QString MessageFilter::check(unsigned playerId, QString nick, QString msg) returnMessage = QString (" %1: Warning: You've triggered caps flood protection, release your caps!\n").arg(nick); } break; + case LETTER_REPEATING: { + returnMessage = QString (" %1: Warning: You've triggered letter repeating protection, stop repeating!\n").arg(nick); + } + break; default:; } } @@ -109,4 +117,6 @@ void MessageFilter::refreshConfig() { myTextFloodCheck->setTextFloodLevelToTrigger(config->readConfigInt("TextFloodLevelToTrigger")); myCapsFloodCheck->setCapsNumberToTrigger(config->readConfigInt("CapsFloodCapsNumberToTrigger")); + myLetterRepeatingCheck->setLetterNumberToTrigger(config->readConfigInt("LetterRepeatingNumberToTrigger")); + } diff --git a/src/chatcleaner/messagefilter.h b/src/chatcleaner/messagefilter.h index f7e512e4..a04c5a17 100644 --- a/src/chatcleaner/messagefilter.h +++ b/src/chatcleaner/messagefilter.h @@ -8,6 +8,7 @@ class BadWordCheck; class TextFloodCheck; class CleanerConfig; class CapsFloodCheck; +class LetterRepeatingCheck; class MessageFilter: public QObject { Q_OBJECT @@ -21,6 +22,7 @@ private: BadWordCheck *myBadWordCheck; TextFloodCheck *myTextFloodCheck; CapsFloodCheck *myCapsFloodCheck; + LetterRepeatingCheck *myLetterRepeatingCheck; struct ClientWarnInfos { QString nick;