summaryrefslogtreecommitdiff
path: root/plugins/StopSpamMod/src/stopspam.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/StopSpamMod/src/stopspam.cpp')
-rwxr-xr-xplugins/StopSpamMod/src/stopspam.cpp198
1 files changed, 79 insertions, 119 deletions
diff --git a/plugins/StopSpamMod/src/stopspam.cpp b/plugins/StopSpamMod/src/stopspam.cpp
index e193ba91fc..e70a584b09 100755
--- a/plugins/StopSpamMod/src/stopspam.cpp
+++ b/plugins/StopSpamMod/src/stopspam.cpp
@@ -15,57 +15,51 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-
#include "stdafx.h"
-MIRANDA_HOOK_EVENT(ME_DB_CONTACT_ADDED, w, l)
-{
- return 0;
-}
-
MIRANDA_HOOK_EVENT(ME_DB_EVENT_ADDED, hContact, hDbEvent)
{
DBEVENTINFO dbei = { sizeof(dbei) };
dbei.cbBlob = db_event_getBlobSize(hDbEvent);
if (dbei.cbBlob == -1)
return 0;
-
+
dbei.pBlob = (BYTE*)alloca(dbei.cbBlob);
db_event_get(hDbEvent, &dbei);
// if event is in protocol that is not despammed
- if(!ProtoInList(dbei.szModule))
+ if (!ProtoInList(dbei.szModule))
return 0;
// event is an auth request
- if(gbHandleAuthReq) {
- if(!(dbei.flags & DBEF_SENT) && !(dbei.flags & DBEF_READ) && dbei.eventType == EVENTTYPE_AUTHREQUEST) {
+ if (gbHandleAuthReq) {
+ if (!(dbei.flags & DBEF_SENT) && !(dbei.flags & DBEF_READ) && dbei.eventType == EVENTTYPE_AUTHREQUEST) {
MCONTACT hcntct = DbGetAuthEventContact(&dbei);
// if request is from unknown or not marked Answered contact
int a = db_get_b(hcntct, "CList", "NotOnList", 0);
int b = !db_get_b(hcntct, pluginName, "Answered", 0);
-
- if(a && b) {
+
+ if (a && b) {
// ...send message
- if(gbHideContacts)
+ if (gbHideContacts)
db_set_b(hcntct, "CList", "Hidden", 1);
- if(gbSpecialGroup)
+ if (gbSpecialGroup)
db_set_ws(hcntct, "CList", "Group", gbSpammersGroup.c_str());
BYTE msg = 1;
- if(gbIgnoreURL){
+ if (gbIgnoreURL) {
TCHAR* EventText = ReqGetText(&dbei); //else return NULL
- msg=!IsUrlContains(EventText);
+ msg = !IsUrlContains(EventText);
mir_free(EventText);
}
- if(gbInvisDisable) {
- if(CallProtoService(dbei.szModule, PS_GETSTATUS, 0, 0) == ID_STATUS_INVISIBLE)
+ if (gbInvisDisable) {
+ if (CallProtoService(dbei.szModule, PS_GETSTATUS, 0, 0) == ID_STATUS_INVISIBLE)
msg = 0;
- else if(db_get_w(hContact,dbei.szModule,"ApparentMode",0) == ID_STATUS_OFFLINE)
+ else if (db_get_w(hContact, dbei.szModule, "ApparentMode", 0) == ID_STATUS_OFFLINE)
msg = 0; //is it useful ?
}
- if(msg) {
+ if (msg) {
ptrA buff(mir_utf8encodeW(variables_parse(gbAuthRepl, hcntct).c_str()));
CallContactService(hcntct, PSS_MESSAGE, 0, (LPARAM)buff);
}
@@ -79,53 +73,49 @@ MIRANDA_HOOK_EVENT(ME_DB_EVENT_ADDED, hContact, hDbEvent)
MIRANDA_HOOK_EVENT(ME_DB_EVENT_FILTER_ADD, w, l)
{
MCONTACT hContact = (MCONTACT)w;
- if(!l) //fix potential DEP crash
+ if (!l) //fix potential DEP crash
return 0;
DBEVENTINFO * dbei = (DBEVENTINFO*)l;
-
+
// if event is in protocol that is not despammed
- if(!ProtoInList(dbei->szModule))
- {
+ if (!ProtoInList(dbei->szModule)) {
// ...let the event go its way
return 0;
}
//do not check excluded contact
- if(db_get_b(hContact, pluginName, "Answered", 0))
+ if (db_get_b(hContact, pluginName, "Answered", 0))
return 0;
- if(db_get_b(hContact, pluginName, "Excluded", 0))
- {
- if(!db_get_b(hContact, "CList", "NotOnList", 0))
+ if (db_get_b(hContact, pluginName, "Excluded", 0)) {
+ if (!db_get_b(hContact, "CList", "NotOnList", 0))
db_unset(hContact, pluginName, "Excluded");
return 0;
}
//we want block not only messages, i seen many types other eventtype flood
- if(dbei->flags & DBEF_READ)
+ if (dbei->flags & DBEF_READ)
// ...let the event go its way
return 0;
//mark contact which we trying to contact for exclude from check
- if((dbei->flags & DBEF_SENT) && db_get_b(hContact, "CList", "NotOnList", 0)
- && (!gbMaxQuestCount || db_get_dw(hContact, pluginName, "QuestionCount", 0) < gbMaxQuestCount) && gbExclude)
- {
+ if ((dbei->flags & DBEF_SENT) && db_get_b(hContact, "CList", "NotOnList", 0)
+ && (!gbMaxQuestCount || db_get_dw(hContact, pluginName, "QuestionCount", 0) < gbMaxQuestCount) && gbExclude) {
db_set_b(hContact, pluginName, "Excluded", 1);
return 0;
}
// if message is from known or marked Answered contact
- if(!db_get_b(hContact, "CList", "NotOnList", 0))
+ if (!db_get_b(hContact, "CList", "NotOnList", 0))
// ...let the event go its way
return 0;
// if message is corrupted or empty it cannot be an answer.
- if(!dbei->cbBlob || !dbei->pBlob)
+ if (!dbei->cbBlob || !dbei->pBlob)
// reject processing of the event
return 1;
tstring message;
-
- if(dbei->flags & DBEF_UTF)
- {
+
+ if (dbei->flags & DBEF_UTF) {
wchar_t* msg_u;
- char* msg_a = mir_strdup(( char* )dbei->pBlob );
- mir_utf8decode( msg_a, &msg_u );
+ char* msg_a = mir_strdup((char*)dbei->pBlob);
+ mir_utf8decode(msg_a, &msg_u);
message = msg_u;
}
else
@@ -135,47 +125,40 @@ MIRANDA_HOOK_EVENT(ME_DB_EVENT_FILTER_ADD, w, l)
boost::algorithm::erase_all(message, "\r");
boost::algorithm::erase_all(message, "\n");
-
- BYTE msg = 1;
- if(gbInvisDisable)
- {
- if(CallProtoService(dbei->szModule, PS_GETSTATUS, 0, 0) == ID_STATUS_INVISIBLE)
- msg = 0;
- else if(db_get_w(hContact,dbei->szModule,"ApparentMode",0) == ID_STATUS_OFFLINE)
- msg = 0; //is it useful ?
+
+ bool bSendMsg = true;
+ if (gbInvisDisable) {
+ if (CallProtoService(dbei->szModule, PS_GETSTATUS, 0, 0) == ID_STATUS_INVISIBLE)
+ bSendMsg = false;
+ else if (db_get_w(hContact, dbei->szModule, "ApparentMode", 0) == ID_STATUS_OFFLINE)
+ bSendMsg = false; //is it useful ?
}
bool answered = false;
- if(gbMathExpression)
- {
- if(boost::algorithm::all(message, boost::is_digit()))
- {
- int msg = _ttoi(message.c_str());
+ if (gbMathExpression) {
+ if (boost::algorithm::all(message, boost::is_digit())) {
+ int num = _ttoi(message.c_str());
int math_answer = db_get_dw(hContact, pluginName, "MathAnswer", 0);
- if(msg && math_answer)
- answered = (msg == math_answer);
+ if (num && math_answer)
+ answered = (num == math_answer);
}
}
- else if(!gbRegexMatch)
- answered = gbCaseInsensitive?(!Stricmp(message.c_str(), (variables_parse(gbAnswer, hContact).c_str()))):( !mir_tstrcmp(message.c_str(), (variables_parse(gbAnswer, hContact).c_str())));
- else
- {
- if(gbCaseInsensitive)
- {
+ else if (!gbRegexMatch)
+ answered = gbCaseInsensitive ? (!Stricmp(message.c_str(), (variables_parse(gbAnswer, hContact).c_str()))) : (!mir_tstrcmp(message.c_str(), (variables_parse(gbAnswer, hContact).c_str())));
+ else {
+ if (gbCaseInsensitive) {
std::string check(toUTF8(variables_parse(gbAnswer, hContact))), msg(toUTF8(message));
boost::algorithm::to_upper(check);
boost::algorithm::to_upper(msg);
boost::regex expr(check);
answered = boost::regex_search(msg.begin(), msg.end(), expr);
}
- else
- {
+ else {
std::string check(toUTF8(variables_parse(gbAnswer, hContact))), msg(toUTF8(message));
boost::regex expr(check);
answered = boost::regex_search(msg.begin(), msg.end(), expr);
}
}
- if(answered)
- {
+ if (answered) {
// unhide contact
db_unset(hContact, "CList", "Hidden");
@@ -185,82 +168,72 @@ MIRANDA_HOOK_EVENT(ME_DB_EVENT_FILTER_ADD, w, l)
db_set_b(hContact, pluginName, "Answered", 1);
//add contact permanently
- if(gbAddPermanent) //do not use this )
+ if (gbAddPermanent) //do not use this )
db_unset(hContact, "CList", "NotOnList");
// send congratulation
- if(msg)
- {
- tstring prot=DBGetContactSettingStringPAN(NULL,dbei->szModule,"AM_BaseProto", _T(""));
+ if (bSendMsg) {
+ tstring prot = DBGetContactSettingStringPAN(NULL, dbei->szModule, "AM_BaseProto", _T(""));
// for notICQ protocols or disable auto auth. reqwest
- if((Stricmp(_T("ICQ"),prot.c_str()))||(!gbAutoReqAuth))
- {
- char * buf=mir_utf8encodeW(variables_parse(gbCongratulation, hContact).c_str());
+ if ((Stricmp(_T("ICQ"), prot.c_str())) || (!gbAutoReqAuth)) {
+ char * buf = mir_utf8encodeW(variables_parse(gbCongratulation, hContact).c_str());
CallContactService(hContact, PSS_MESSAGE, 0, (LPARAM)buf);
mir_free(buf);
}
// Note: For ANSI can be not work
- if(!Stricmp(_T("ICQ"),prot.c_str())){
+ if (!Stricmp(_T("ICQ"), prot.c_str())) {
// grand auth.
- if(gbAutoAuth)
- CallProtoService(dbei->szModule, "/GrantAuth", w, 0);
- // add contact to server list and local group
- if(gbAutoAddToServerList)
- {
+ if (gbAutoAuth)
+ CallProtoService(dbei->szModule, "/GrantAuth", w, 0);
+ // add contact to server list and local group
+ if (gbAutoAddToServerList) {
db_set_ws(hContact, "CList", "Group", gbAutoAuthGroup.c_str());
CallProtoService(dbei->szModule, "/AddServerContact", w, 0);
db_unset(hContact, "CList", "NotOnList");
};
// auto auth. reqwest with send congratulation
- if(gbAutoReqAuth)
- CallContactService(hContact,PSS_AUTHREQUEST,0, (LPARAM)variables_parse(gbCongratulation, hContact).c_str());
+ if (gbAutoReqAuth)
+ CallContactService(hContact, PSS_AUTHREQUEST, 0, (LPARAM)variables_parse(gbCongratulation, hContact).c_str());
}
}
return 0;
}
// URL contains check
- msg=(msg&&gbIgnoreURL)?(!IsUrlContains((TCHAR *) message.c_str())):msg;
+ bSendMsg = (bSendMsg && gbIgnoreURL) ? (!IsUrlContains((TCHAR *)message.c_str())) : bSendMsg;
// if message message does not contain infintite talk protection prefix
// and question count for this contact is less then maximum
- if(msg)
- {
- if((!gbInfTalkProtection || tstring::npos==message.find(_T("StopSpam automatic message:\r\n")))
- && (!gbMaxQuestCount || db_get_dw(hContact, pluginName, "QuestionCount", 0) < gbMaxQuestCount))
- {
+ if (bSendMsg) {
+ if ((!gbInfTalkProtection || tstring::npos == message.find(_T("StopSpam automatic message:\r\n")))
+ && (!gbMaxQuestCount || db_get_dw(hContact, pluginName, "QuestionCount", 0) < gbMaxQuestCount)) {
// send question
tstring q;
- if(gbInfTalkProtection)
+ if (gbInfTalkProtection)
q += _T("StopSpam automatic message:\r\n");
- if(gbMathExpression)
- { //parse math expression in question
+ if (gbMathExpression) { //parse math expression in question
tstring tmp_question = gbQuestion;
std::list<int> args;
std::list<TCHAR> actions;
tstring::size_type p1 = gbQuestion.find(_T("X")), p2 = 0;
const tstring expr_chars = _T("X+-/*"), expr_acts = _T("+-/*");
- while(p1 < gbQuestion.length() && p1 != tstring::npos && expr_chars.find(gbQuestion[p1]) != tstring::npos)
- {
+ while (p1 < gbQuestion.length() && p1 != tstring::npos && expr_chars.find(gbQuestion[p1]) != tstring::npos) {
std::string arg;
p2 = p1;
- for(p1 = gbQuestion.find(_T("X"), p1); (p1 < gbQuestion.length()) && (gbQuestion[p1] == L'X'); ++p1)
+ for (p1 = gbQuestion.find(_T("X"), p1); (p1 < gbQuestion.length()) && (gbQuestion[p1] == L'X'); ++p1)
arg += get_random_num(1);
tmp_question.replace(p2, arg.size(), toUTF16(arg));
args.push_back(atoi(arg.c_str()));
- if((p1 < gbQuestion.length()) && (p1 != tstring::npos) && (expr_acts.find(gbQuestion[p1]) != tstring::npos))
+ if ((p1 < gbQuestion.length()) && (p1 != tstring::npos) && (expr_acts.find(gbQuestion[p1]) != tstring::npos))
actions.push_back(gbQuestion[p1]);
++p1;
}
int math_answer = 0;
math_answer = args.front();
args.pop_front();
- while(!args.empty())
- {
- if(!actions.empty())
- {
- switch(actions.front())
- {
+ while (!args.empty()) {
+ if (!actions.empty()) {
+ switch (actions.front()) {
case _T('+'):
{
math_answer += args.front();
@@ -303,31 +276,19 @@ MIRANDA_HOOK_EVENT(ME_DB_EVENT_FILTER_ADD, w, l)
DWORD questCount = db_get_dw(hContact, pluginName, "QuestionCount", 0);
db_set_dw(hContact, pluginName, "QuestionCount", questCount + 1);
}
- else
- {
-/* if (gbDosServiceExist)
- {
- if(gbDosServiceIntegration)
- {
- int i;
- i = rand()%255*13;
- CallService(MS_DOS_SERVICE, hContact, (LPARAM)i);
- }
- } */
- if(gbIgnoreContacts)
- {
+ else {
+ if (gbIgnoreContacts)
db_set_dw(hContact, "Ignore", "Mask1", 0x0000007F);
- }
}
}
- if(gbHideContacts)
+ if (gbHideContacts)
db_set_b(hContact, "CList", "Hidden", 1);
- if(gbSpecialGroup)
+ if (gbSpecialGroup)
db_set_ws(hContact, "CList", "Group", gbSpammersGroup.c_str());
db_set_b(hContact, "CList", "NotOnList", 1);
// save first message from contact
- if (db_get_dw(hContact, pluginName, "QuestionCount", 0)<2){
+ if (db_get_dw(hContact, pluginName, "QuestionCount", 0) < 2) {
dbei->flags |= DBEF_READ;
db_event_add(hContact, dbei);
};
@@ -342,12 +303,11 @@ MIRANDA_HOOK_EVENT(ME_DB_CONTACT_SETTINGCHANGED, w, l)
DBCONTACTWRITESETTING * cws = (DBCONTACTWRITESETTING*)l;
// if CList/NotOnList is being deleted then remove answeredSetting
- if(mir_strcmp(cws->szModule, "CList"))
+ if (mir_strcmp(cws->szModule, "CList"))
return 0;
- if(mir_strcmp(cws->szSetting, "NotOnList"))
+ if (mir_strcmp(cws->szSetting, "NotOnList"))
return 0;
- if(!cws->value.type)
- {
+ if (!cws->value.type) {
db_unset(hContact, pluginName, "Answered");
db_unset(hContact, pluginName, "QuestionCount");
}