From 62a74c235e863104364994183bdc20ef6d5dda5d Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@63852ff1-2cfd-40b9-8011-e561a9d89b1c> Date: Fri, 28 Nov 2008 09:54:30 +0000 Subject: recovering repository .... git-svn-id: http://172.18.13.13/svn/mim_plugs@2 63852ff1-2cfd-40b9-8011-e561a9d89b1c --- stopspam_mod/trunk/stopspam.cpp | 240 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 stopspam_mod/trunk/stopspam.cpp (limited to 'stopspam_mod/trunk/stopspam.cpp') diff --git a/stopspam_mod/trunk/stopspam.cpp b/stopspam_mod/trunk/stopspam.cpp new file mode 100644 index 0000000..04666da --- /dev/null +++ b/stopspam_mod/trunk/stopspam.cpp @@ -0,0 +1,240 @@ +#include "headers.h" + +extern TCHAR const * defQuestion; + +MIRANDA_HOOK_EVENT(ME_DB_CONTACT_ADDED, w, l) +{ + DBWriteContactSettingByte((HANDLE)w, "CList", "NotOnList", 1); + return 0; +} + +MIRANDA_HOOK_EVENT(ME_DB_EVENT_ADDED, wParam, lParam) +{ + HANDLE hContact = (HANDLE)wParam; + HANDLE hDbEvent = (HANDLE)lParam; + + DBEVENTINFO dbei = {0}; + dbei.cbSize = sizeof(dbei); + dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)hDbEvent, 0); + if(-1 == dbei.cbBlob) + return 0; + + dbei.pBlob = new BYTE[dbei.cbBlob]; + CallService(MS_DB_EVENT_GET, lParam, (LPARAM)&dbei); + + // if event is in protocol that is not despammed + if(!ProtoInList(dbei.szModule)) { + delete dbei.pBlob; + return 0; + } + + // event is an auth request + if(gbHandleAuthReq) + { + if(!(dbei.flags & DBEF_SENT) && !(dbei.flags & DBEF_READ) && dbei.eventType == EVENTTYPE_AUTHREQUEST) + { + HANDLE hcntct; + hcntct=*((PHANDLE)(dbei.pBlob+sizeof(DWORD))); + + /*char text[100]; + sprintf(text, "%d, %d, \r\n%d, %d", + (int)hcntct, + (int)hDbEvent, + DBGetContactSettingByte(hContact, pluginName, answeredSetting, 0), + DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)); + + int a = MessageBox( 0, text, "Авторизация",MB_OK|MB_ICONQUESTION );*/ + + + // if request is from unknown or not marked Answered contact + + int a = DBGetContactSettingByte(hcntct, "CList", "NotOnList", 0); + int b = !DBGetContactSettingByte(hcntct, pluginName, "Answered", 0); + + if(a && b)// + { + // ...send message + /*MessageBox( 0, "...send message", "yappp...",MB_OK|MB_ICONQUESTION );*/ + std::string allowService = dbei.szModule; + allowService += PS_AUTHDENY; + + if(gbHideContacts) + DBWriteContactSettingByte(hcntct, "CList", "Hidden", 1); + if(gbSpecialGroup) + DBWriteContactSettingTString(hcntct, "CList", "Group", gbSpammersGroup.c_str()); + + int a = CallService(allowService.c_str(), (WPARAM)hDbEvent, (LPARAM)gbAuthRepl.c_str()); + + //CallProtoService(dbei.szModule,PS_AUTHDENY,(WPARAM)hDbEvent,(LPARAM)GetAuthRepl().c_str()); + delete dbei.pBlob; + return 1; + } + } + } + delete dbei.pBlob; + return 0; +} + +MIRANDA_HOOK_EVENT(ME_DB_EVENT_FILTER_ADD, w, l) +{ + HANDLE hContact = (HANDLE)w; + DBEVENTINFO * dbei = (DBEVENTINFO*)l; + + + // if event is in protocol that is not despammed + if(!ProtoInList(dbei->szModule)) + // ...let the event go its way + return 0; + //do not check excluded contact + else if(DBGetContactSettingByte(hContact, pluginName, "Answered", 0)) + return 0; + else if(DBGetContactSettingByte(hContact, pluginName, "Excluded", 0)) + { + if(!DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) + DBDeleteContactSetting(hContact, pluginName, "Excluded"); + return 0; + } + // if event is not a message, or if the message has been read or sent... +/* else if(dbei->flags & DBEF_READ || dbei->eventType != EVENTTYPE_MESSAGE) + // ...let the event go its way + return 0; */ + //we want block not only messages, i seen many types other eventtype flood + else if(dbei->flags & DBEF_READ) + // ...let the event go its way + return 0; + //mark contact which we trying to contact for exclude from chack + else if((dbei->flags & DBEF_SENT) && DBGetContactSettingByte(hContact, "CList", "NotOnList", 0) + && (!gbMaxQuestCount || DBGetContactSettingDword(hContact, pluginName, "QuestionCount", 0) < gbMaxQuestCount) && gbExclude) + { + DBWriteContactSettingByte(hContact, pluginName, "Excluded", 1); + return 0; + } + // if message is from known or marked Answered contact + else if(!DBGetContactSettingByte(hContact, "CList", "NotOnList", 0) || + DBGetContactSettingWord(hContact, dbei->szModule, "ServerId", 0)) //fix for icq + // ...let the event go its way + return 0; + // if message is corrupted or empty it cannot be an answer. + else if(!dbei->cbBlob || !dbei->pBlob) + // reject processing of the event + return 1; + + tstring message; + + if(dbei->flags & DBEF_UTF){ + WCHAR* msg_u; + char* msg_a = mir_strdup(( char* )dbei->pBlob ); + mir_utf8decode( msg_a, &msg_u ); +#ifdef _UNICODE + message = msg_u; +#else + message = mir_u2a(msg_u); +#endif + } + else{ +#ifdef _UNICODE + message = mir_a2u((char*)(dbei->pBlob)); +#else + message = (char*)(dbei->pBlob); +#endif + } + + // if message contains right answer... + +// if( tstring::npos!=message.find(gbAnswer) ) + if(!wcscmp(message.c_str(), gbAnswer.c_str())) + { + // unhide contact + DBDeleteContactSetting(hContact, "CList", "Hidden"); + + // mark contact as Answered + DBWriteContactSettingByte(hContact, pluginName, "Answered", 1); + + //add contact permanently + if(gbAddPermanent) //do not use this ) + DBDeleteContactSetting(hContact, "CList", "NotOnList"); + + // send congratulation +#ifdef _UNICODE + char * buf=mir_utf8encodeW(gbCongratulation.c_str()); + CallContactService(hContact, PSS_MESSAGE, PREF_UTF, (LPARAM)buf); + mir_free(buf); +#else + CallContactService(hContact, PSS_MESSAGE, 0, (LPARAM)GetCongratulation().c_str()); +#endif + + // process the event + return 0; + } + + // if message message does not contain infintite talk protection prefix + // and question count for this contact is less then maximum + if( (!gbInfTalkProtection || tstring::npos==message.find(_T("StopSpam automatic message:\r\n"))) + && (!gbMaxQuestCount || DBGetContactSettingDword(hContact, pluginName, "QuestionCount", 0) < gbMaxQuestCount) ) + { + // send question + tstring q = _T("StopSpam automatic message:\r\n") + gbQuestion; + +#ifdef _UNICODE + char * buf=mir_utf8encodeW(q.c_str()); + CallContactService(hContact, PSS_MESSAGE, PREF_UTF, (LPARAM)buf); + mir_free(buf); +#else + CallContactService(hContact, PSS_MESSAGE, 0, (LPARAM)q.c_str()); +#endif + + // increment question count + DWORD questCount = DBGetContactSettingDword(hContact, pluginName, "QuestionCount", 0); + DBWriteContactSettingDword(hContact, pluginName, "QuestionCount", questCount + 1); + + } + else + { + if (gbDosServiceIntegration && gbDosServiceExist) + { + int i; + i = rand()%255*13; + CallService(MS_DOS_SERVICE, (WPARAM)hContact, (LPARAM)i); + } + if(gbIgnoreContacts) + { + DBWriteContactSettingDword(hContact, "Ignore", "Mask1", 0x0000007F); + return 1; + } + } + if(gbHideContacts) + DBWriteContactSettingByte(hContact, "CList", "Hidden", 1); + if(gbSpecialGroup) + DBWriteContactSettingTString(hContact, "CList", "Group", gbSpammersGroup.c_str()); + DBWriteContactSettingByte(hContact, "CList", "NotOnList", 1); + + // save message from contact + dbei->flags |= DBEF_READ; + CallService(MS_DB_EVENT_ADD, (WPARAM)hContact, (LPARAM)dbei); + + // reject processing of the event + return 1; +} + + +MIRANDA_HOOK_EVENT(ME_DB_CONTACT_SETTINGCHANGED, w, l) +{ + HANDLE hContact = (HANDLE)w; + DBCONTACTWRITESETTING * cws = (DBCONTACTWRITESETTING*)l; + + // if CList/NotOnList is being deleted then remove answeredSetting + if(strcmp(cws->szModule, "CList")) + return 0; + if(strcmp(cws->szSetting, "NotOnList")) + return 0; + if(!cws->value.type) + { + DBDeleteContactSetting(hContact, pluginName, "Answered"); + DBDeleteContactSetting(hContact, pluginName, "QuestionCount"); + } + + return 0; +} + + + -- cgit v1.2.3