/* "Last Seen mod" plugin for Miranda IM Copyright ( C ) 2002-03 micron-x Copyright ( C ) 2005-07 Y.B. 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; either version 2 of the License, or ( at your option ) any later version. 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, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "seen.h" MISSEDCONTACTS mcs; WPARAM IsUserMissed(WPARAM contact) { for (int loop=0; loop < mcs.count; loop++) if (mcs.wpcontact[loop] == contact) return MAKEWPARAM(1, loop); return 0; } int RemoveUser(int pos) { for(int loop=pos; loop < mcs.count-1; loop++) mcs.wpcontact[loop] = mcs.wpcontact[loop+1]; mcs.count--; return 0; } int ResetMissed(void) { for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) db_set_b(hContact, S_MOD, "Missed", 0); ZeroMemory(&mcs,sizeof(mcs)); return 0; } int CheckIfOnline(void) { for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) if ( CallService(MS_CLIST_GETCONTACTICON, (WPARAM)hContact, 0) != ICON_OFFLINE) db_set_b(hContact, S_MOD, "Missed", 2); return 0; } INT_PTR CALLBACK MissedDlgProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) { POINT pt; RECT rcinit,rcresized,rcb,rcd; HWND htemp; switch(msg) { case WM_INITDIALOG: TranslateDialogDefault(hdlg); htemp = GetDlgItem(hdlg, IDC_CONTACTS); GetWindowRect(htemp, &rcinit); SetWindowPos(htemp,NULL,0,0,rcinit.right-rcinit.left,mcs.count*(rcinit.bottom-rcinit.top)/2,SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE); GetWindowRect(htemp, &rcresized); htemp = GetDlgItem(hdlg, IDOK); GetWindowRect(htemp, &rcb); pt.x = rcb.left; pt.y = rcb.top; ScreenToClient(hdlg, &pt); MoveWindow(htemp,pt.x,pt.y+(rcresized.bottom-rcinit.bottom),(rcb.right-rcb.left),(rcb.bottom-rcb.top),FALSE); GetWindowRect(hdlg, &rcd); SetWindowPos(hdlg, NULL,0,0,rcd.right-rcd.left,rcd.bottom-rcd.top+(rcresized.bottom-rcinit.bottom),SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE); SetDlgItemText(hdlg, IDC_CONTACTS, (LPCTSTR)lparam); ShowWindow(hdlg, SW_SHOWNOACTIVATE); break; case WM_CLOSE: EndDialog(hdlg, 0); break; case WM_COMMAND: if (LOWORD(wparam) == IDOK) SendMessage(hdlg, WM_CLOSE, 0, 0); break; } return 0; } int ShowMissed(void) { if (!mcs.count) return 0; TCHAR sztemp[1024], szcount[7]; for (int loop=0; loop < mcs.count; loop++) { _tcsncat(sztemp, (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, mcs.wpcontact[loop], GCDNF_TCHAR), SIZEOF(sztemp)); if ( db_get_b(NULL, S_MOD, "MissedOnes_Count", 0)) { mir_sntprintf(szcount, SIZEOF(szcount), _T(" [%i]"), mcs.times[loop]); _tcscat(sztemp, szcount); } _tcscat(sztemp, _T("\n")); } CreateDialogParam(hInstance, MAKEINTRESOURCE(IDD_MISSED), NULL, MissedDlgProc, (LPARAM)sztemp); return 0; } int Test(WPARAM wparam,LPARAM lparam) { if (lparam < ICON_OFFLINE || lparam > ICON_INVIS) return 0; if (CallService(MS_IGNORE_ISIGNORED,wparam,IGNOREEVENT_USERONLINE)) return 0; if ( db_get_b((MCONTACT)wparam,S_MOD,"Missed",0)==2) return 0; switch(lparam) { case ICON_OFFLINE: if ( db_get_b((MCONTACT)wparam,S_MOD,"Missed",0) == 1) { WORD missed = IsUserMissed(wparam); if (!LOWORD(missed)) { mcs.times[mcs.count]=1; mcs.wpcontact[mcs.count++]=wparam; } else mcs.times[HIWORD(missed)]++; db_set_b((MCONTACT)wparam,S_MOD,"Missed",0); } break; case ICON_ONLINE: case ICON_AWAY: case ICON_NA: case ICON_OCC: case ICON_DND: case ICON_FREE: case ICON_INVIS: db_set_b((MCONTACT)wparam,S_MOD,"Missed",1); break; } return 0; } int ModeChange_mo(WPARAM,LPARAM lparam) { ACKDATA *ack = (ACKDATA *)lparam; if (ack->type != ACKTYPE_STATUS || ack->result != ACKRESULT_SUCCESS || ack->hContact != NULL) return 0; int isetting = CallProtoService(ack->szModule, PS_GETSTATUS, 0, 0); switch(isetting) { case ID_STATUS_AWAY: case ID_STATUS_DND: case ID_STATUS_NA: if (ehmissed == NULL) { ZeroMemory(&mcs,sizeof(mcs)); CheckIfOnline(); ehmissed = HookEvent(ME_CLIST_CONTACTICONCHANGED, Test); } break; default: if (ehmissed != NULL) { UnhookEvent(ehmissed); ehmissed = NULL; ShowMissed(); ResetMissed(); } break; } return 0; }