From a68d1f2be2e3d6bbb1efc930c1d840ce932023bb Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Wed, 20 Mar 2013 18:35:18 +0000 Subject: BuddyPounce adopted git-svn-id: http://svn.miranda-ng.org/main/trunk@4127 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/BuddyPounce/src/main.cpp | 282 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 plugins/BuddyPounce/src/main.cpp (limited to 'plugins/BuddyPounce/src/main.cpp') diff --git a/plugins/BuddyPounce/src/main.cpp b/plugins/BuddyPounce/src/main.cpp new file mode 100644 index 0000000000..1d1dd26ef7 --- /dev/null +++ b/plugins/BuddyPounce/src/main.cpp @@ -0,0 +1,282 @@ +#include "headers.h" + +int hLangpack; +HINSTANCE hInst; +HANDLE hWindowList; + +PLUGININFOEX pluginInfo={ + sizeof(PLUGININFOEX), + __PLUGIN_NAME, + PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM), + __DESCRIPTION, + __AUTHOR, + __AUTHOREMAIL, + __COPYRIGHT, + __AUTHORWEB, + UNICODE_AWARE, + // {A9E9C114-84B9-434B-A3D5-89921D39DDFF} + {0xa9e9c114, 0x84b9, 0x434b, {0xa3, 0xd5, 0x89, 0x92, 0x1d, 0x39, 0xdd, 0xff}} +}; + +//======================== +// WINAPI DllMain +//======================== + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + hInst = hinstDLL; + return TRUE; +} +//======================== +// MirandaPluginInfo +//======================== + + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + return &pluginInfo; +} + +//=================== +// MainInit +//=================== + +int MainInit(WPARAM wParam, LPARAM lParam) +{ + CLISTMENUITEM mi = {0}; + mi.cbSize=sizeof(mi); + mi.position=10; + mi.flags=0; + mi.hIcon= LoadIcon(hInst,MAKEINTRESOURCE(IDI_POUNCE)); + mi.pszName="&Buddy Pounce"; + mi.pszService="BuddyPounce/MenuCommand"; + mi.pszContactOwner=NULL; + + Menu_AddContactMenuItem(&mi); + return 0; +} + +int MsgAck(WPARAM wParam, LPARAM lParam) +{ + ACKDATA *ack=(ACKDATA*)lParam; + + if (ack && ack->cbSize==sizeof(ACKDATA) + && ack->type==ACKTYPE_MESSAGE + && ack->hProcess==(HANDLE)WindowList_Find(hWindowList,ack->hContact)) + { + if (DBGetContactSettingByte(NULL, modname, "ShowDeliveryMessages", 1)) + CreateMessageAcknowlegedWindow(ack->hContact,ack->result == ACKRESULT_SUCCESS); + if (ack->result == ACKRESULT_SUCCESS) + { + // wrtie it to the DB + DBEVENTINFO dbei = { 0 }; + DBVARIANT dbv; + int reuse = DBGetContactSettingByte(ack->hContact,modname, "Reuse", 0); + if (!DBGetContactSetting(ack->hContact, modname, "PounceMsg", &dbv) && (dbv.pszVal[0] != '\0')) + { + + dbei.cbSize = sizeof(dbei); + dbei.eventType = EVENTTYPE_MESSAGE; + dbei.flags = DBEF_SENT; + dbei.szModule = (char*)ack->szModule; + dbei.timestamp = time(NULL); + dbei.cbBlob = lstrlenA(dbv.pszVal) + 1; + dbei.pBlob = (PBYTE) dbv.pszVal; + CallService(MS_DB_EVENT_ADD, (WPARAM) ack->hContact, (LPARAM) & dbei); + } + // check to reuse + if (reuse >1) + DBWriteContactSettingByte(ack->hContact,modname, "Reuse", (BYTE)(reuse-1)); + else + { + DBWriteContactSettingByte(ack->hContact,modname, "Reuse", 0); + DBWriteContactSettingString(ack->hContact,modname, "PounceMsg",""); + } + } + WindowList_Remove(hWindowList,(HWND)ack->hProcess); + } + return 0; +} + +int BuddyPounceOptInit(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = {0}; + odp.cbSize = sizeof(odp); + odp.flags = ODPF_BOLDGROUPS | ODPF_TCHAR; + odp.hInstance = hInst; + odp.pszTemplate = MAKEINTRESOURCE(IDD_OPTIONS); + odp.pszGroup = LPGENT("Plugins"); + odp.pszTitle = LPGENT("Buddy Pounce"); + odp.pfnDlgProc = BuddyPounceOptionsDlgProc; + Options_AddPage(wParam, &odp); + + return 0; +} + +int statusCheck(int statusFlag, int status) +{ + if (statusFlag == ANY || !statusFlag) return 1; + switch(status) + { + case ID_STATUS_OFFLINE: + return 0; + case ID_STATUS_ONLINE: + return (statusFlag & ONLINE); + case ID_STATUS_AWAY: + return (statusFlag & AWAY); + case ID_STATUS_NA: + return (statusFlag & NA); + case ID_STATUS_OCCUPIED: + return (statusFlag & OCCUPIED); + case ID_STATUS_DND: + return (statusFlag & DND); + case ID_STATUS_FREECHAT: + return (statusFlag & FFC); + case ID_STATUS_INVISIBLE: + return (statusFlag & INVISIBLE); + case ID_STATUS_OUTTOLUNCH: + return (statusFlag & LUNCH); + case ID_STATUS_ONTHEPHONE: + return (statusFlag & PHONE); + } + return 0; +} +int CheckDate(HANDLE hContact) +{ + time_t curtime = time (NULL); + if(!DBGetContactSettingByte(hContact,modname,"GiveUpDays",0)) + return 1; + if(DBGetContactSettingByte(hContact,modname,"GiveUpDays",0) && ( abs((time_t)DBGetContactSettingDword(hContact,modname,"GiveUpDate",0)) > curtime)) + return 1; + return 0; +} + +void SendPounce(char* text, HANDLE hContact) +{ + HANDLE hSendId; + if (hSendId = (HANDLE)CallContactService(hContact, PSS_MESSAGE, 0, (LPARAM)text)) + WindowList_Add(hWindowList,(HWND)hSendId,hContact); +} + +int UserOnlineSettingChanged(WPARAM wParam,LPARAM lParam) +{ + DBCONTACTWRITESETTING *cws=(DBCONTACTWRITESETTING*)lParam; + int newStatus,oldStatus; + DBVARIANT dbv; + HANDLE hContact; + char* szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)wParam,0); + char* message; + if((HANDLE)wParam==NULL || strcmp(cws->szSetting,"Status")) return 0; + if (szProto && (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_IM)) + { + newStatus=cws->value.wVal; + oldStatus=DBGetContactSettingWord((HANDLE)wParam,"UserOnline","OldStatus",ID_STATUS_OFFLINE); + + if ( ( newStatus != oldStatus ) && ( (HANDLE)wParam != NULL) && ( newStatus != ID_STATUS_OFFLINE) ) + { + hContact=(HANDLE)wParam; + if (!DBGetContactSetting(hContact, modname, "PounceMsg", &dbv) && (dbv.pszVal[0] != '\0')) + { + // check my status + if (statusCheck(DBGetContactSettingWord(hContact, modname, "SendIfMyStatusIsFLAG", 0), CallProtoService(szProto, PS_GETSTATUS,0,0)) + // check the contacts status + && statusCheck(DBGetContactSettingWord(hContact, modname, "SendIfTheirStatusIsFLAG", 0), newStatus) ) + { + // check if we r giving up after x days + if (CheckDate(hContact)) + { + + if (DBGetContactSettingByte(hContact, modname, "ConfirmTimeout", 0)) + { + struct SendPounceDlgProcStruct *spdps = (struct SendPounceDlgProcStruct *)malloc(sizeof(struct SendPounceDlgProcStruct)); + message = mir_tstrdup(dbv.pszVal); // will get free()ed in the send confirm window proc + spdps->hContact = hContact; + spdps->message = message; + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_CONFIRMSEND), 0, SendPounceDlgProc, (LPARAM)spdps); + // set the confirmation window to send the msg when the timeout is done + mir_free(message); + } + else SendPounce(dbv.pszVal, hContact); + } + } + } + + } + } + DBFreeVariant(&dbv); + return 0; +} + +INT_PTR BuddyPounceMenuCommand(WPARAM wParam, LPARAM lParam) +{ + if (DBGetContactSettingByte(NULL, modname, "UseAdvanced", 0) || DBGetContactSettingByte((HANDLE)wParam, modname, "UseAdvanced", 0)) + CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_POUNCE),0,BuddyPounceDlgProc, wParam); + else CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_POUNCE_SIMPLE),0,BuddyPounceSimpleDlgProc, wParam); + return 0; +} + +INT_PTR AddSimpleMessage(WPARAM wParam, LPARAM lParam) +{ + HANDLE hContact = (HANDLE)wParam; + char* message = (char*)lParam; + time_t today = time(NULL); + DBWriteContactSettingString(hContact, modname, "PounceMsg", message); + DBWriteContactSettingWord(hContact, modname, "SendIfMyStatusIsFLAG", (WORD)DBGetContactSettingWord(NULL, modname, "SendIfMyStatusIsFLAG",1)); + DBWriteContactSettingWord(hContact, modname, "SendIfTheirStatusIsFLAG", (WORD)DBGetContactSettingWord(NULL, modname, "SendIfTheirStatusIsFLAG",1)); + DBWriteContactSettingByte(hContact, modname, "Reuse", (BYTE)DBGetContactSettingByte(NULL, modname, "Reuse",0)); + DBWriteContactSettingByte(hContact, modname, "GiveUpDays", (BYTE)DBGetContactSettingByte(NULL, modname, "GiveUpDays",0)); + DBWriteContactSettingDword(hContact, modname, "GiveUpDate", (DWORD)(DBGetContactSettingByte(hContact, modname, "GiveUpDays",0)*SECONDSINADAY)); + return 0; +} + +INT_PTR AddToPounce(WPARAM wParam, LPARAM lParam) +{ + HANDLE hContact = (HANDLE)wParam; + char* message = (char*)lParam; + DBVARIANT dbv; + if (!DBGetContactSetting(hContact, modname, "PounceMsg",&dbv)) + { + char* newPounce = (char*)malloc(strlen(dbv.pszVal) + strlen(message) + 1); + if (!newPounce) return 1; + strcpy(newPounce, dbv.pszVal); + strcat(newPounce, message); + DBWriteContactSettingString(hContact, modname, "PounceMsg", newPounce); + free(newPounce); + DBFreeVariant(&dbv); + } + else AddSimpleMessage((WPARAM)hContact, (LPARAM)message); + return 0; +} + +//=========================== +// Load (hook ModulesLoaded) +//=========================== +extern "C" __declspec(dllexport) int Load(void) +{ + mir_getLP(&pluginInfo); + HookEvent(ME_SYSTEM_MODULESLOADED, MainInit); + HookEvent(ME_DB_CONTACT_SETTINGCHANGED, UserOnlineSettingChanged); + HookEvent(ME_OPT_INITIALISE, BuddyPounceOptInit); + HookEvent(ME_PROTO_ACK, MsgAck); + CreateServiceFunction("BuddyPounce/MenuCommand", BuddyPounceMenuCommand); + hWindowList = (HANDLE)CallService(MS_UTILS_ALLOCWINDOWLIST, 0, 0); + + /* service funcitons for other devs... */ + CreateServiceFunction("BuddyPounce/AddSimplePounce", AddSimpleMessage); // add a simple pounce to a contact + CreateServiceFunction("BuddyPounce/AddToPounce", AddToPounce); // add to the exsisitng pounce, if there isnt 1 then add a new simple pounce. + /* ******************************************************** */ + + { // known modules list + DBVARIANT dbv; + if (DBGetContactSetting(NULL,"KnownModules","Buddy Pounce", &dbv)) + DBWriteContactSettingString(NULL,"KnownModules","Buddy Pounce",modname); + DBFreeVariant(&dbv); + } + return 0; +} + + +extern "C" __declspec(dllexport) int Unload(void) +{ + return 0; +} -- cgit v1.2.3