diff options
Diffstat (limited to 'plugins/StopSpamMod/src/stopspam.cpp')
-rwxr-xr-x | plugins/StopSpamMod/src/stopspam.cpp | 198 |
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"); } |