summaryrefslogtreecommitdiff
path: root/plugins/BuddyPounce/src
diff options
context:
space:
mode:
authorKirill Volinsky <mataes2007@gmail.com>2013-03-20 18:35:18 +0000
committerKirill Volinsky <mataes2007@gmail.com>2013-03-20 18:35:18 +0000
commita68d1f2be2e3d6bbb1efc930c1d840ce932023bb (patch)
treee86992bf8a1795aefbc5de4920b6d4754d3bbf29 /plugins/BuddyPounce/src
parentc890a6f80c22d608cbb449e788b8ed791b5d9f51 (diff)
BuddyPounce adopted
git-svn-id: http://svn.miranda-ng.org/main/trunk@4127 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/BuddyPounce/src')
-rw-r--r--plugins/BuddyPounce/src/Version.h14
-rw-r--r--plugins/BuddyPounce/src/dialog.cpp666
-rw-r--r--plugins/BuddyPounce/src/headers.h75
-rw-r--r--plugins/BuddyPounce/src/main.cpp282
-rw-r--r--plugins/BuddyPounce/src/resource.h81
-rw-r--r--plugins/BuddyPounce/src/stdafx.cpp18
6 files changed, 1136 insertions, 0 deletions
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 <windows.h>
+#include <commctrl.h>
+#include <time.h>
+
+#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 <http://www.gnu.org/licenses/>.
+*/
+
+#include "headers.h" \ No newline at end of file