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/Version.h | 14 + plugins/BuddyPounce/src/dialog.cpp | 666 +++++++++++++++++++++++++++++++++++++ plugins/BuddyPounce/src/headers.h | 75 +++++ plugins/BuddyPounce/src/main.cpp | 282 ++++++++++++++++ plugins/BuddyPounce/src/resource.h | 81 +++++ plugins/BuddyPounce/src/stdafx.cpp | 18 + 6 files changed, 1136 insertions(+) create mode 100644 plugins/BuddyPounce/src/Version.h create mode 100644 plugins/BuddyPounce/src/dialog.cpp create mode 100644 plugins/BuddyPounce/src/headers.h create mode 100644 plugins/BuddyPounce/src/main.cpp create mode 100644 plugins/BuddyPounce/src/resource.h create mode 100644 plugins/BuddyPounce/src/stdafx.cpp (limited to 'plugins/BuddyPounce/src') diff --git a/plugins/BuddyPounce/src/Version.h b/plugins/BuddyPounce/src/Version.h new file mode 100644 index 0000000000..df85e84b0d --- /dev/null +++ b/plugins/BuddyPounce/src/Version.h @@ -0,0 +1,14 @@ +#define __MAJOR_VERSION 0 +#define __MINOR_VERSION 3 +#define __RELEASE_NUM 2 +#define __BUILD_NUM 1 + +#define __FILEVERSION_STRING __MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM + +#define __PLUGIN_NAME "Buddy pounce" +#define __FILENAME "BuddyPounce.dll" +#define __DESCRIPTION "Allows you to send a message to contacts if they change status." +#define __AUTHOR "Jonathan Gordon" +#define __AUTHOREMAIL "jdgordy@gmail.com" +#define __AUTHORWEB "http://miranda-ng.org/" +#define __COPYRIGHT "© 2004 Jonathan Gordon" diff --git a/plugins/BuddyPounce/src/dialog.cpp b/plugins/BuddyPounce/src/dialog.cpp new file mode 100644 index 0000000000..76cb17a37c --- /dev/null +++ b/plugins/BuddyPounce/src/dialog.cpp @@ -0,0 +1,666 @@ +#include "headers.h" + +void populateSettingsList(HWND hwnd2List) +{ + SendMessage(hwnd2List, LB_ADDSTRING, 0, (LPARAM)Translate("Send If My Status Is...")); + SendMessage(hwnd2List, LB_ADDSTRING, 0, (LPARAM)Translate("Send If They Change Status to...")); + SendMessage(hwnd2List, LB_ADDSTRING, 0, (LPARAM)"----------------------------"); + SendMessage(hwnd2List, LB_ADDSTRING, 0, (LPARAM)Translate("Reuse Pounce")); + SendMessage(hwnd2List, LB_ADDSTRING, 0, (LPARAM)Translate("Give Up delay")); + SendMessage(hwnd2List, LB_ADDSTRING, 0, (LPARAM)Translate("Confirmation Window")); +// SendMessage(hwnd2List, LB_ADDSTRING, 0, (LPARAM)"----------------------------")); +// SendMessage(hwnd2List, LB_ADDSTRING, 0, (LPARAM)Translate("Send a File")); +} + +void populateContacts(HANDLE BPhContact,HWND hwnd2CB) +{ + HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); + char name[300], *szProto; + int index, selectedIndex = 0; + while (hContact) + { + szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if (szProto && (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_IM)) + { + _snprintf(name, 300, "%s (%s)", (char*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)hContact,0), szProto); + index = SendMessage(hwnd2CB, CB_ADDSTRING, 0, (LPARAM)name); + SendMessage(hwnd2CB, CB_SETITEMDATA, index, (LPARAM)hContact); + if (BPhContact == hContact) SendMessage(hwnd2CB, CB_SETCURSEL, index, 0); + } + hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); + } +} + + +void saveLastSetting(HANDLE hContact, HWND hwnd) +{ + char number[8], string[1024]; + switch (DBGetContactSettingByte(hContact, modname, "LastSetting", 2)) // nothing to do + { + case 0: // Send If My Status Is... + break; + case 1: // Send If They Change status to + break; + case 2: // ------, fall through + case 6: // nothing to do... + break; + case 3: // Reuse Pounce + GetDlgItemText(hwnd, IDC_SETTINGNUMBER, number, 8); + DBWriteContactSettingByte(hContact, modname, "Reuse", (BYTE)atoi(number)); + break; + case 4: // Give Up delay + GetDlgItemText(hwnd, IDC_SETTINGNUMBER, number, 8); + DBWriteContactSettingByte(hContact, modname, "GiveUpDays", (BYTE)atoi(number)); + { + time_t today = time(NULL); + DBWriteContactSettingDword(hContact, modname, "GiveUpDate", (DWORD)(atoi(number)*SECONDSINADAY)); + } + break; + case 5: // confirm window + GetDlgItemText(hwnd, IDC_SETTINGNUMBER, number, 8); + DBWriteContactSettingByte(hContact, modname, "ConfirmTimeout", (BYTE)atoi(number)); + break; + + case 7: // send a file + GetDlgItemText(hwnd, IDC_SETTINGTEXT, string, 1024); + DBWriteContactSettingString(hContact, modname, "FileToSend", string); + break; + } +} + +void hideAll(HWND hwnd) +{ + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG2), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_BUTTON), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGNUMBER), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_SPIN), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGTEXT), SW_HIDE); +} + +void getDefaultMessage(HWND hwnd, UINT control, HANDLE hContact) +{ + DBVARIANT dbv; + if (!DBGetContactSetting(hContact,modname, "PounceMsg", &dbv)) + SetDlgItemText(hwnd, control, dbv.pszVal); + else if (!DBGetContactSetting(NULL,modname, "PounceMsg", &dbv)) + SetDlgItemText(hwnd, control, dbv.pszVal); + DBFreeVariant(&dbv); +} +INT_PTR CALLBACK StatusModesDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + struct windowInfo *wi = (struct windowInfo *)lParam; + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)wi); + TranslateDialogDefault(hwnd); + + } + return FALSE; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDOK: + case IDCANCEL: + { + struct windowInfo *wi = (struct windowInfo *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + char type[32]; + int flag = 0; + GetDlgItemText(hwnd, IDC_CHECK1, type, 32); + flag = (IsDlgButtonChecked(hwnd, IDC_CHECK1)) + |(IsDlgButtonChecked(hwnd, IDC_CHECK2)<<1) + |(IsDlgButtonChecked(hwnd, IDC_CHECK3)<<2) + |(IsDlgButtonChecked(hwnd, IDC_CHECK4)<<3) + |(IsDlgButtonChecked(hwnd, IDC_CHECK5)<<4) + |(IsDlgButtonChecked(hwnd, IDC_CHECK6)<<5) + |(IsDlgButtonChecked(hwnd, IDC_CHECK7)<<6) + |(IsDlgButtonChecked(hwnd, IDC_CHECK8)<<7) + |(IsDlgButtonChecked(hwnd, IDC_CHECK9)<<8) + |(IsDlgButtonChecked(hwnd, IDC_CHECK10)<<9); + if (!strcmp(type, "Any")) + { + if (LOWORD(wParam) == IDOK) + DBWriteContactSettingWord(wi->hContact, modname, "SendIfMyStatusIsFLAG", (WORD)flag); + wi->SendIfMy = 0; + } + else + { + if (LOWORD(wParam) == IDOK) + DBWriteContactSettingWord(wi->hContact, modname, "SendIfTheirStatusIsFLAG", (WORD)flag); + wi->SendWhenThey = 0; + } + DestroyWindow(hwnd); + } + break; + } + break; + } + return FALSE; +} +void statusModes(struct windowInfo *wi, int myStatusMode) // myStatusMode=1 sendIfMyStatusFlag +{ + int statusFlag; + HWND hwnd; + + if (myStatusMode) + { + if (wi->SendIfMy) { SetForegroundWindow(wi->SendIfMy); return; } + else + { + hwnd = wi->SendIfMy = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_STATUSMODES), 0, StatusModesDlgProc, (LPARAM)wi); + statusFlag = DBGetContactSettingWord(wi->hContact, modname, "SendIfMyStatusIsFLAG", 0); + SetWindowText(hwnd, Translate("Send If My Status Is")); + SetDlgItemText(hwnd, IDC_CHECK1, Translate("Any")); + SetDlgItemText(hwnd, IDC_CHECK2, Translate("Online")); + SetDlgItemText(hwnd, IDC_CHECK3, Translate("Away")); + SetDlgItemText(hwnd, IDC_CHECK4, Translate("NA")); + SetDlgItemText(hwnd, IDC_CHECK5, Translate("Occupied")); + SetDlgItemText(hwnd, IDC_CHECK6, Translate("DND")); + SetDlgItemText(hwnd, IDC_CHECK7, Translate("Free For Chat")); + SetDlgItemText(hwnd, IDC_CHECK8, Translate("Invisible")); + SetDlgItemText(hwnd, IDC_CHECK9, Translate("On The Phone")); + SetDlgItemText(hwnd, IDC_CHECK10, Translate("Out To Lunch")); + } + } + else + { + if (wi->SendWhenThey) { SetForegroundWindow(wi->SendWhenThey); return; } + else + { + hwnd = wi->SendWhenThey = CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_STATUSMODES),0,StatusModesDlgProc, (LPARAM)wi); + statusFlag = DBGetContactSettingWord(wi->hContact, modname, "SendIfTheirStatusIsFLAG", 0); + SetWindowText(hwnd, Translate("Send If Their Status changes")); + SetDlgItemText(hwnd, IDC_CHECK1, Translate("From Offline")); + SetDlgItemText(hwnd, IDC_CHECK2, Translate("To Online")); + SetDlgItemText(hwnd, IDC_CHECK3, Translate("To Away")); + SetDlgItemText(hwnd, IDC_CHECK4, Translate("To NA")); + SetDlgItemText(hwnd, IDC_CHECK5, Translate("To Occupied")); + SetDlgItemText(hwnd, IDC_CHECK6, Translate("To DND")); + SetDlgItemText(hwnd, IDC_CHECK7, Translate("To Free For Chat")); + SetDlgItemText(hwnd, IDC_CHECK8, Translate("To Invisible")); + SetDlgItemText(hwnd, IDC_CHECK9, Translate("To On The Phone")); + SetDlgItemText(hwnd, IDC_CHECK10, Translate("To Out To Lunch")); + } + } + CheckDlgButton(hwnd, IDC_CHECK1, statusFlag&ANY); + CheckDlgButton(hwnd, IDC_CHECK2, (statusFlag&ONLINE)>>1); + CheckDlgButton(hwnd, IDC_CHECK3, (statusFlag&AWAY)>>2); + CheckDlgButton(hwnd, IDC_CHECK4, (statusFlag&NA)>>3); + CheckDlgButton(hwnd, IDC_CHECK5, (statusFlag&OCCUPIED)>>4); + CheckDlgButton(hwnd, IDC_CHECK6, (statusFlag&DND)>>5); + CheckDlgButton(hwnd, IDC_CHECK7, (statusFlag&FFC)>>6); + CheckDlgButton(hwnd, IDC_CHECK8, (statusFlag&INVISIBLE)>>7); + CheckDlgButton(hwnd, IDC_CHECK9, (statusFlag&PHONE)>>8); + CheckDlgButton(hwnd, IDC_CHECK10, (statusFlag&LUNCH)>>9); +} + +void deletePounce(HANDLE hContact) +{ + DBDeleteContactSetting(hContact,modname, "PounceMsg"); + DBDeleteContactSetting(hContact,modname, "SendIfMyStatusIsFLAG"); + DBDeleteContactSetting(hContact,modname, "SendIfTheirStatusIsFLAG"); + DBDeleteContactSetting(hContact,modname, "Reuse"); + DBDeleteContactSetting(hContact, modname, "GiveUpDays"); + DBDeleteContactSetting(hContact, modname, "GiveUpDate"); + DBDeleteContactSetting(hContact, modname, "ConfirmTimeout"); + DBDeleteContactSetting(hContact, modname, "FileToSend"); +} + +INT_PTR CALLBACK BuddyPounceSimpleDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + HANDLE hContact = (HANDLE)lParam; + char msg[1024]; + TranslateDialogDefault(hwnd); + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)lParam); + + getDefaultMessage(hwnd, IDC_MESSAGE, hContact); + _snprintf(msg, 1024, Translate("The Message (%d Characters)"), GetWindowTextLength(GetDlgItem(hwnd, IDC_MESSAGE))); + SetDlgItemText(hwnd, GRP_MSG, msg); + + } + return FALSE; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDC_MESSAGE: + { + if (HIWORD(wParam) == EN_CHANGE) + { + int length; + char msg[1024]; + length = GetWindowTextLength(GetDlgItem(hwnd, IDC_MESSAGE)); + _snprintf(msg, 1024, Translate("The Message (%d Characters)"), length); + SetDlgItemText(hwnd, GRP_MSG, msg); + } + } + break; + case IDC_ADVANCED: + // fall through + case IDOK: + { + char *text; + HANDLE hContact = (HANDLE)GetWindowLongPtr(hwnd, GWLP_USERDATA); + int length = GetWindowTextLength(GetDlgItem(hwnd, IDC_MESSAGE))+1; + if (length>1) + { + text = (char*)malloc(length); + if (!text) { msg("Couldnt Allocate enough memory",""); break; } + GetDlgItemText(hwnd, IDC_MESSAGE, text, length); + + } + else DBDeleteContactSetting(hContact, modname, "PounceMsg"); + } // fall through + case IDCANCEL: + if (LOWORD(wParam) == IDC_ADVANCED) + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_POUNCE), 0, BuddyPounceDlgProc, GetWindowLongPtr(hwnd, GWLP_USERDATA)); + DestroyWindow(hwnd); + break; + return FALSE; + } + break; + } + return FALSE; +} + +INT_PTR CALLBACK BuddyPounceDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + struct windowInfo *wi = (struct windowInfo *)malloc(sizeof(struct windowInfo)); + char msg[1024]; + if (!wi) { msg("error......","Buddy Pounce"); DestroyWindow(hwnd); } + TranslateDialogDefault(hwnd); + wi->hContact = (HANDLE)lParam; + wi->SendIfMy = 0; + wi->SendWhenThey = 0; + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)wi); + getDefaultMessage(hwnd, IDC_MESSAGE, wi->hContact); + _snprintf(msg, 1024, Translate("The Message (%d Characters)"), GetWindowTextLength(GetDlgItem(hwnd, IDC_MESSAGE))); + SetDlgItemText(hwnd, GRP_MSG, msg); + populateSettingsList(GetDlgItem(hwnd, IDC_SETTINGS)); + populateContacts(wi->hContact, GetDlgItem(hwnd,IDC_CONTACTS)); + SendMessage(GetDlgItem(hwnd,IDC_SPIN), UDM_SETRANGE, 0, (LPARAM) MAKELONG ((short) 1024, (short) 0)); + DBWriteContactSettingByte(wi->hContact, modname, "LastSetting", 0); + } + return FALSE; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDC_MESSAGE: + { + if (HIWORD(wParam) == EN_CHANGE) + { + int length; + char msg[1024]; + length = GetWindowTextLength(GetDlgItem(hwnd, IDC_MESSAGE)); + _snprintf(msg, 1024, Translate("The Message (%d Characters)"), length); + SetDlgItemText(hwnd, GRP_MSG, msg); + } + } + break; + case IDC_SIMPLE: + case IDOK: + { + char *text; + HANDLE hContact = (HANDLE)SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_GETITEMDATA, SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_GETCURSEL,0,0),0); + int length = GetWindowTextLength(GetDlgItem(hwnd, IDC_MESSAGE))+1; + if (length>1) + { + text = (char*)malloc(length); + if (!text) { msg("Couldnt Allocate enough memory",""); break; } + GetDlgItemText(hwnd, IDC_MESSAGE, text, length); + DBWriteContactSettingString(hContact, modname, "PounceMsg", text); + free(text); + } + else DBDeleteContactSetting(hContact, modname, "PounceMsg"); + saveLastSetting(hContact, hwnd); + } // fall through + if (LOWORD(wParam) == IDC_SIMPLE) + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_POUNCE_SIMPLE), 0, BuddyPounceSimpleDlgProc, (LPARAM)((struct windowInfo *)GetWindowLongPtr(hwnd, GWLP_USERDATA))->hContact); + // fall through + case IDCANCEL: + { + struct windowInfo *wi = (struct windowInfo *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + if (wi->SendIfMy) DestroyWindow(wi->SendIfMy); + if (wi->SendWhenThey) DestroyWindow(wi->SendWhenThey); + free(wi); + DestroyWindow(hwnd); + } + break; + case IDC_DELETE: + { + HANDLE hContact = ((struct windowInfo *)GetWindowLongPtr(hwnd, GWLP_USERDATA))->hContact; + deletePounce(hContact); + SetDlgItemText(hwnd, IDC_MESSAGE, ""); + SetDlgItemText(hwnd, GRP_MSG, "The Message (0 Characters)"); + } + break; + case IDC_DEFAULT: + { + HANDLE hContact = ((struct windowInfo *)GetWindowLongPtr(hwnd, GWLP_USERDATA))->hContact; + char msg[1024]; + getDefaultMessage(hwnd, IDC_MESSAGE, hContact); + _snprintf(msg, 1024, Translate("The Message (%d Characters)"), GetWindowTextLength(GetDlgItem(hwnd, IDC_MESSAGE))); + SetDlgItemText(hwnd, GRP_MSG, msg); + DBWriteContactSettingWord(hContact,modname, "SendIfMyStatusIsFLAG", (WORD)DBGetContactSettingWord(NULL, modname, "SendIfMyStatusIsFLAG",0)); + DBWriteContactSettingWord(hContact,modname, "SendIfTheirStatusIsFLAG", (WORD)DBGetContactSettingWord(NULL, modname, "SendIfTheirStatusIsFLAG",0)); + 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)DBGetContactSettingDword(NULL, modname, "GiveUpDate",0)); + DBWriteContactSettingByte(hContact, modname, "ConfirmTimeout", (BYTE)DBGetContactSettingByte(NULL, modname, "ConfirmTimeout",0)); + } + break; + case IDC_SETTINGS: + if (HIWORD(wParam) == LBN_SELCHANGE) + { + struct windowInfo *wi = (struct windowInfo *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + int item = SendMessage(GetDlgItem(hwnd, IDC_SETTINGS), LB_GETCURSEL, 0, 0); + char temp[5]; + saveLastSetting(wi->hContact, hwnd); + hideAll(hwnd); + switch (item) + { + case 0: // Send If My Status Is... + statusModes(wi, 1); + break; + case 1: // Send If They Change status to + statusModes(wi, 0); + break; + case 3: // Reuse Pounce + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG, "Reuse this message? (0 to use it once)"); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG2), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG2, "Times"); + SetDlgItemText(hwnd, IDC_SETTINGNUMBER, _itot(DBGetContactSettingByte(wi->hContact, modname, "Reuse", 0), temp, 10)); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGNUMBER), SW_SHOW); + ShowWindow(GetDlgItem(hwnd, IDC_SPIN), SW_SHOW); + break; + case 4: // Give Up delay + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG, "Giveup after.. (0 to not giveup)"); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG2), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG2, "Days"); + SetDlgItemText(hwnd, IDC_SETTINGNUMBER, _itot(DBGetContactSettingByte(wi->hContact, modname, "GiveUpDays", 0), temp, 10)); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGNUMBER), SW_SHOW); + ShowWindow(GetDlgItem(hwnd, IDC_SPIN), SW_SHOW); + break; + case 5: // confirm window + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG, "Show confirmation window? (0 to not Show)"); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG2), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG2, "Seconds to wait before sending"); + SetDlgItemText(hwnd, IDC_SETTINGNUMBER, _itot(DBGetContactSettingByte(wi->hContact, modname, "ConfirmTimeout", 0), temp, 10)); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGNUMBER), SW_SHOW); + ShowWindow(GetDlgItem(hwnd, IDC_SPIN), SW_SHOW); + break; + + case 7: // send a file + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG, "Send a file"); + ShowWindow(GetDlgItem(hwnd, IDC_BUTTON), SW_SHOW); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGTEXT), SW_SHOW); + break; + } + DBWriteContactSettingByte(wi->hContact, modname, "LastSetting", (BYTE)item); + } + break; + } + break; + } + return FALSE; +} + +INT_PTR CALLBACK BuddyPounceOptionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + struct windowInfo *wi = (struct windowInfo *)malloc(sizeof(struct windowInfo)); + char msg[1024]; + TranslateDialogDefault(hwnd); + wi->hContact = 0; + wi->SendIfMy = 0; + wi->SendWhenThey = 0; + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)wi); + + getDefaultMessage(hwnd, IDC_MESSAGE, wi->hContact); + _snprintf(msg, 1024, Translate("The Message (%d Characters)"), GetWindowTextLength(GetDlgItem(hwnd, IDC_MESSAGE))); + SetDlgItemText(hwnd, GRP_MSG, msg); + populateSettingsList(GetDlgItem(hwnd, IDC_SETTINGS)); + SendMessage(GetDlgItem(hwnd,IDC_SPIN), UDM_SETRANGE, 0, (LPARAM) MAKELONG ((short) 1024, (short) 0)); + CheckDlgButton(hwnd, IDC_USEADVANCED, DBGetContactSettingByte(NULL, modname, "UseAdvanced", 0)); + CheckDlgButton(hwnd, IDC_SHOWDELIVERYMSGS, DBGetContactSettingByte(NULL, modname, "ShowDeliveryMessages", 1)); + DBWriteContactSettingByte(wi->hContact, modname, "LastSetting", 0); + } + return FALSE; + case WM_NOTIFY: + switch(((LPNMHDR)lParam)->idFrom) { + case 0: + switch (((LPNMHDR)lParam)->code) + { + case PSN_APPLY: + { + char *text; + struct windowInfo *wi = (struct windowInfo *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + HANDLE hContact = ((struct windowInfo *)GetWindowLongPtr(hwnd, GWLP_USERDATA))->hContact; + int length = GetWindowTextLength(GetDlgItem(hwnd, IDC_MESSAGE))+1; + if (length>1) + { + text = (char*)malloc(length); + if (!text) { msg("Couldnt Allocate enough memory",""); break; } + GetDlgItemText(hwnd, IDC_MESSAGE, text, length); + DBWriteContactSettingString(hContact, modname, "PounceMsg", text); + free(text); + } + else DBDeleteContactSetting(hContact, modname, "PounceMsg"); + DBWriteContactSettingByte(NULL, modname, "UseAdvanced", (BYTE)IsDlgButtonChecked(hwnd, IDC_USEADVANCED)); + DBWriteContactSettingByte(NULL, modname, "ShowDeliveryMessages", (BYTE)IsDlgButtonChecked(hwnd, IDC_SHOWDELIVERYMSGS)); + + if (wi->SendIfMy) DestroyWindow(wi->SendIfMy); + if (wi->SendWhenThey) DestroyWindow(wi->SendWhenThey); + } + break; + } + break; + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDC_MESSAGE: + { + if (HIWORD(wParam) == EN_CHANGE) + { + int length; + char msg[1024]; + length = GetWindowTextLength(GetDlgItem(hwnd, IDC_MESSAGE)); + _snprintf(msg, 1024, Translate("The Message (%d Characters)"), length); + SetDlgItemText(hwnd, GRP_MSG, msg); + SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); + } + } + break; + case IDC_SHOWDELIVERYMSGS: + case IDC_USEADVANCED: + SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); + break; + case IDC_SETTINGS: + if (HIWORD(wParam) == LBN_SELCHANGE) + { + struct windowInfo *wi = (struct windowInfo *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + int item = SendMessage(GetDlgItem(hwnd, IDC_SETTINGS), LB_GETCURSEL, 0, 0); + char temp[5]; + SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); + saveLastSetting(wi->hContact, hwnd); + hideAll(hwnd); + switch (item) + { + case 0: // Send If My Status Is... + statusModes(wi, 1); + break; + case 1: // Send If They Change status to + statusModes(wi, 0); + break; + case 3: // Reuse Pounce + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG, "Reuse this message? (0 to use it once)"); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG2), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG2, "Times"); + SetDlgItemText(hwnd, IDC_SETTINGNUMBER, _itot(DBGetContactSettingByte(wi->hContact, modname, "Reuse", 0), temp, 10)); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGNUMBER), SW_SHOW); + ShowWindow(GetDlgItem(hwnd, IDC_SPIN), SW_SHOW); + break; + case 4: // Give Up delay + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG, "Giveup after.. (0 to not giveup)"); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG2), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG2, "Days"); + SetDlgItemText(hwnd, IDC_SETTINGNUMBER, _itot(DBGetContactSettingByte(wi->hContact, modname, "GiveUpDays", 0), temp, 10)); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGNUMBER), SW_SHOW); + ShowWindow(GetDlgItem(hwnd, IDC_SPIN), SW_SHOW); + break; + case 5: // confirm window + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG, "Show confirmation window? (0 to not Show)"); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG2), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG2, "Seconds to wait before sending"); + SetDlgItemText(hwnd, IDC_SETTINGNUMBER, _itot(DBGetContactSettingByte(wi->hContact, modname, "ConfirmTimeout", 0), temp, 10)); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGNUMBER), SW_SHOW); + ShowWindow(GetDlgItem(hwnd, IDC_SPIN), SW_SHOW); + break; + + case 7: // send a file + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGMSG), SW_SHOW); + SetDlgItemText(hwnd, IDC_SETTINGMSG, "Send a file"); + ShowWindow(GetDlgItem(hwnd, IDC_BUTTON), SW_SHOW); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGTEXT), SW_SHOW); + break; + } + DBWriteContactSettingByte(wi->hContact, modname, "LastSetting", (BYTE)item); + } + break; + } + break; + } + return FALSE; +} + + + +INT_PTR CALLBACK SendPounceDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + { + DBVARIANT dbv; + struct SendPounceDlgProcStruct *spdps = (struct SendPounceDlgProcStruct *)lParam; + if (!spdps) DestroyWindow(hwnd); + TranslateDialogDefault(hwnd); + spdps->timer = DBGetContactSettingByte(spdps->hContact, modname, "ConfirmTimeout", 0); + SetWindowLongPtr(hwnd, GWLP_USERDATA, (WPARAM)spdps); + if (DBGetContactSetting(spdps->hContact,modname,"PounceMsg",&dbv)) DestroyWindow(hwnd); + SetDlgItemText(hwnd,IDC_MESSAGE,dbv.pszVal); + DBFreeVariant(&dbv); + SetTimer(hwnd,1,1000,NULL); + SendMessage(hwnd,WM_TIMER,0,0); + } + break; + case WM_TIMER: + { + struct SendPounceDlgProcStruct *spdps = (struct SendPounceDlgProcStruct *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + char message[1024]; + _snprintf(message,sizeof(message),Translate("Pounce being sent to %s in %d seconds"),CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)spdps->hContact, 0),spdps->timer); + SetDlgItemText(hwnd,LBL_CONTACT ,message); + spdps->timer--; + + if (spdps->timer == -1) + { + KillTimer(hwnd,1); + SendPounce(spdps->message, ((struct SendPounceDlgProcStruct *)GetWindowLongPtr(hwnd, GWLP_USERDATA))->hContact); + free((char*)((struct SendPounceDlgProcStruct *)GetWindowLongPtr(hwnd, GWLP_USERDATA))->message); + free((struct SendPounceDlgProcStruct *)GetWindowLongPtr(hwnd, GWLP_USERDATA)); + DestroyWindow(hwnd); + } + break; + } + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDOK: + KillTimer(hwnd,1); + SendPounce(((struct SendPounceDlgProcStruct *)GetWindowLongPtr(hwnd, GWLP_USERDATA))->message, ((struct SendPounceDlgProcStruct *)GetWindowLongPtr(hwnd, GWLP_USERDATA))->hContact); + // fall through + case IDCANCEL: + KillTimer(hwnd,1); + free(((struct SendPounceDlgProcStruct *)GetWindowLongPtr(hwnd, GWLP_USERDATA))->message); + free((struct SendPounceDlgProcStruct *)GetWindowLongPtr(hwnd, GWLP_USERDATA)); + DestroyWindow(hwnd); + break; + } + break; + } + return 0; +} + +INT_PTR CALLBACK PounceSentDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HANDLE hContact = (HANDLE)GetWindowLongPtr(hwnd, GWLP_USERDATA); + switch(msg) { + case WM_INITDIALOG: + { + DBVARIANT dbv; + SetWindowLongPtr(hwnd, GWLP_USERDATA, (WPARAM)lParam); + TranslateDialogDefault(hwnd); + hContact = (HANDLE)lParam; + if (DBGetContactSetting(hContact,modname,"PounceMsg",&dbv)) DestroyWindow(hwnd); + SetDlgItemText(hwnd,IDC_MESSAGE,dbv.pszVal); + DBFreeVariant(&dbv); + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDOK: + { + char text[2048]; + GetWindowText(GetDlgItem(hwnd,IDOK),text,16); + if (!strcmp(text,Translate("Retry"))) + { + GetWindowText(GetDlgItem(hwnd,IDC_MESSAGE),text,2048); + SendPounce(text,hContact); + } + } + // fall through + case IDCANCEL: + DestroyWindow(hwnd); + break; + } + break; + } + return 0; +} +void CreateMessageAcknowlegedWindow(HANDLE hContact, int SentSuccess) +{ + HWND hwnd = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_CONFIRMSEND), 0, PounceSentDlgProc, (LPARAM)hContact); + char msg[256]; + if (SentSuccess) + { + _snprintf(msg,256,Translate("Message successfully sent to %s"),CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, 0) ); + SetWindowText(GetDlgItem(hwnd,IDOK),"OK"); + ShowWindow(GetDlgItem(hwnd,IDCANCEL),0); + } + else + { + _snprintf(msg,256,Translate("Message failed to send to %s"),CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, 0)); + SetWindowText(GetDlgItem(hwnd,IDOK),"Retry"); + } + SetWindowText(GetDlgItem(hwnd,LBL_CONTACT),msg); + SetWindowText(hwnd,modFullname); +} \ No newline at end of file diff --git a/plugins/BuddyPounce/src/headers.h b/plugins/BuddyPounce/src/headers.h new file mode 100644 index 0000000000..a2c3399063 --- /dev/null +++ b/plugins/BuddyPounce/src/headers.h @@ -0,0 +1,75 @@ +#ifndef _COMMONHEADERS_H +#define _COMMONHEADERS_H + +#define _CRT_SECURE_NO_WARNINGS +#define WIN32_LEAN_AND_MEAN + +#include +#include +#include + +#include "newpluginapi.h" +#include "m_clist.h" +#include "m_langpack.h" +#include "m_database.h" +#include "m_protocols.h" +#include "m_options.h" +#include "m_protosvc.h" + +#include "resource.h" +#include "Version.h" + +//======================================================= +// Definitions +//======================================================= +#define modname "buddypounce" +#define modFullname "Buddy Pounce" +#define msg(a,b) MessageBox(0,a,b,MB_OK) + +#define SECONDSINADAY 86400 + +/* flags for the sending and recieving.... */ +#define ANY 1 +#define ONLINE 2 +#define AWAY 4 +#define NA 8 +#define OCCUPIED 16 +#define DND 32 +#define FFC 64 +#define INVISIBLE 128 +#define PHONE 256 +#define LUNCH 512 + +//======================================================= +// Variables +//======================================================= + +struct windowInfo { + HANDLE hContact; + HWND SendIfMy; + HWND SendWhenThey; +}; + +struct SendPounceDlgProcStruct { + HANDLE hContact; + int timer; + char *message; +}; + +extern HINSTANCE hInst; + +//======================================================= +// Functions +//======================================================= + +// main.c +void SendPounce(char* text, HANDLE hContact); + +//dialog.c +INT_PTR CALLBACK BuddyPounceDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +INT_PTR CALLBACK BuddyPounceSimpleDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); +INT_PTR CALLBACK BuddyPounceOptionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); +INT_PTR CALLBACK SendPounceDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); +void CreateMessageAcknowlegedWindow(HANDLE hContact, int SentSuccess); + +#endif //_COMMONHEADERS_H \ No newline at end of file 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; +} diff --git a/plugins/BuddyPounce/src/resource.h b/plugins/BuddyPounce/src/resource.h new file mode 100644 index 0000000000..6ff38b88cc --- /dev/null +++ b/plugins/BuddyPounce/src/resource.h @@ -0,0 +1,81 @@ +//{{NO_DEPENDENCIES}} +// Включаемый файл, созданный в Microsoft Visual C++. +// Используется D:\MNG_orig\plugins\BuddyPounce\res\resource.rc +// +#define IDC_DELETE 5 +#define IDC_DEFAULT 6 +#define IDD_POUNCE 101 +#define IDI_POUNCE 104 +#define IDD_CONFIRMSEND 105 +#define IDD_POUNCE_SIMPLE 108 +#define IDD_STATUSMODES 109 +#define IDD_OPTIONS 110 +#define IDC_MESSAGE 1000 +#define CHK_OFFLINE 1003 +#define CHK_ONLINE 1004 +#define CHK_AWAY 1005 +#define CHK_NA 1006 +#define CHK_OCCUPIED 1007 +#define CHK_DND 1008 +#define CHK_FFC 1009 +#define CHK_PHONE 1010 +#define CHK_LUNCH 1011 +#define CHK_ANYSTATUS 1012 +#define CHK_ONLINE2 1013 +#define CHK_AWAY2 1014 +#define CHK_NA2 1015 +#define CHK_OCCUPIED2 1016 +#define CHK_DND2 1017 +#define CHK_FFC2 1018 +#define CHK_PHONE2 1019 +#define CHK_LUNCH2 1020 +#define CHK_REUSE 1028 +#define IDC_REUSETIMES 1029 +#define CHK_GIVEUP 1030 +#define IDC_GIVEUPDAYS 1031 +#define LBL_CONTACT 1034 +#define CHK_POUNCESETUP 1036 +#define CHK_CONFIRM 1037 +#define IDC_TIMEOUT 1038 +#define GRP_DEFAULT 1040 +#define GRP_MSG 1041 +#define GRP_SENDON 1042 +#define GRP_SENDIF 1043 +#define GRP_SETTINGS 1044 +#define IDC_STATICTIMES 1045 +#define IDC_STATICDAYS 1046 +#define IDC_STATICWAIT 1047 +#define IDC_STATICSECONDS 1048 +#define IDC_SETTINGMSG 1061 +#define IDC_SETTINGNUMBER 1066 +#define IDC_SPIN 1067 +#define IDC_SETTINGTEXT 1068 +#define IDC_BUTTON 1069 +#define IDC_SETTINGS 1075 +#define IDC_CONTACTS 1076 +#define IDC_ADVANCED 1078 +#define IDC_SIMPLE 1080 +#define IDC_CHECK1 1081 +#define IDC_CHECK2 1082 +#define IDC_CHECK3 1083 +#define IDC_CHECK4 1084 +#define IDC_CHECK5 1085 +#define IDC_CHECK6 1086 +#define IDC_CHECK7 1087 +#define IDC_CHECK8 1088 +#define IDC_CHECK9 1089 +#define IDC_CHECK10 1090 +#define IDC_SETTINGMSG2 1095 +#define IDC_USEADVANCED 1096 +#define IDC_SHOWDELIVERYMSGS 1097 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 112 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1098 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/plugins/BuddyPounce/src/stdafx.cpp b/plugins/BuddyPounce/src/stdafx.cpp new file mode 100644 index 0000000000..48d92d3d56 --- /dev/null +++ b/plugins/BuddyPounce/src/stdafx.cpp @@ -0,0 +1,18 @@ +/* +Copyright (C) 2012-13 Miranda NG Project (http://miranda-ng.org) + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 +of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "headers.h" \ No newline at end of file -- cgit v1.2.3