#include "headers.h" MIRANDA_HOOK_EVENT(ME_DB_CONTACT_ADDED, w, l) { 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)(variables_parse(gbAuthRepl, hcntct).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 /* if(DBGetContactSettingWord(hContact, dbei->szModule, "ServerId", 0)) { DBDeleteContactSetting(hContact, "CList", "NotOnList"); return 0; }*/ /* if(gbDelNotInList) if(DBGetContactSettingStringPAN_A((HANDLE)w, "CList", "Group", "") == "Not In List") { CallService(MS_DB_CONTACT_DELETE, (WPARAM)w, 0); return 1; } */ if(DBGetContactSettingByte(hContact, pluginName, "Answered", 0)) return 0; 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... /* if((dbei->flags & DBEF_READ) || (dbei->eventType != EVENTTYPE_MESSAGE) || (dbei->eventType != EVENTTYPE_FILE) || (dbei->eventType != EVENTTYPE_URL) || (dbei->eventType != EVENTTYPE_CONTACTS)) // ...let the event go its way return 0; */ //we want block not only messages, i seen many types other eventtype flood 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) && 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 if(!DBGetContactSettingByte(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) // 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(gbCaseInsensitive?(stricmp(message.c_str(), (variables_parse(gbAnswer, hContact).c_str()))):( _tcscmp(message.c_str(), (variables_parse(gbAnswer, hContact).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(variables_parse(gbCongratulation, hContact).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) && (!gbInvisDisable || (gbInvisDisable && ((DBGetContactSettingWord(hContact,dbei->szModule,"ApparentMode",0) != ID_STATUS_OFFLINE) || (CallProtoService(dbei->szModule, PS_GETSTATUS, 0, 0) != ID_STATUS_INVISIBLE))))) //мегажесть ), да да, я знаю, так не кодят... { // send question tstring q = _T("StopSpam automatic message:\r\n") + variables_parse(gbQuestion, hContact); #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 (gbDosServiceExist) { if(gbDosServiceIntegration) { int i; i = rand()%255*13; CallService(MS_DOS_SERVICE, (WPARAM)hContact, (LPARAM)i); } } if(gbIgnoreContacts) { DBWriteContactSettingDword(hContact, "Ignore", "Mask1", 0x0000007F); } } 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; }