summaryrefslogtreecommitdiff
path: root/plugins/SeenPlugin/src/missed.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/SeenPlugin/src/missed.cpp')
-rw-r--r--plugins/SeenPlugin/src/missed.cpp301
1 files changed, 301 insertions, 0 deletions
diff --git a/plugins/SeenPlugin/src/missed.cpp b/plugins/SeenPlugin/src/missed.cpp
new file mode 100644
index 0000000000..179dd8ee4d
--- /dev/null
+++ b/plugins/SeenPlugin/src/missed.cpp
@@ -0,0 +1,301 @@
+/*
+"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.
+
+File name : $URL: http://svn.berlios.de/svnroot/repos/mgoodies/trunk/lastseen-mod/missed.c $
+Revision : $Rev: 1570 $
+Last change on : $Date: 2007-12-30 01:30:07 +0300 (Вс, 30 дек 2007) $
+Last change by : $Author: y_b $
+*/
+#include "seen.h"
+
+#include <m_ignore.h>
+
+
+
+MISSEDCONTACTS mcs;
+extern HANDLE ehmissed;
+extern HINSTANCE hInstance;
+
+
+
+WPARAM IsUserMissed(WPARAM contact)
+{
+ int loop=0;
+
+ for (;loop<mcs.count;loop++)
+ {
+ if(mcs.wpcontact[loop]==contact)
+ return MAKEWPARAM(1,loop);
+ }
+
+ return 0;
+}
+
+
+
+int RemoveUser(int pos)
+{
+ int loop;
+
+ for(loop=pos;loop<mcs.count-1;loop++)
+ mcs.wpcontact[loop]=mcs.wpcontact[loop+1];
+
+ mcs.count--;
+
+ return 0;
+}
+
+
+
+int ResetMissed(void)
+{
+ HANDLE hcontact=NULL;
+
+ hcontact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
+ while(hcontact!=NULL)
+ {
+ DBWriteContactSettingByte(hcontact,S_MOD,"Missed",0);
+ hcontact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hcontact,0);
+ }
+
+ ZeroMemory(&mcs,sizeof(mcs));
+
+ return 0;
+}
+
+
+int CheckIfOnline(void)
+{
+ HANDLE hcontact;
+// char *szProto;
+// WORD status;
+
+ hcontact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
+ while(hcontact!=NULL)
+ {
+/* szProto=(char *)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hcontact,0);
+ status=(szProto==NULL)?ID_STATUS_OFFLINE:DBGetContactSettingWord(hcontact,szProto,"Status",ID_STATUS_OFFLINE);
+ if(status!=ID_STATUS_OFFLINE)
+*/
+ if(CallService(MS_CLIST_GETCONTACTICON,(WPARAM)hcontact,0)!=ICON_OFFLINE)
+ DBWriteContactSettingByte(hcontact,S_MOD,"Missed",2);
+
+ hcontact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hcontact,0);
+ }
+
+ 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,(LPCSTR)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)
+{
+ int loop=0;
+ char sztemp[1024]="",szcount[7];
+
+ if (!mcs.count) return 0;
+
+ for (;loop<mcs.count;loop++)
+ {
+ strcat(sztemp,(const char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,mcs.wpcontact[loop],0));
+ if(DBGetContactSettingByte(NULL,S_MOD,"MissedOnes_Count",0))
+ {
+ wsprintf(szcount," [%i]",mcs.times[loop]);
+ strcat(sztemp,szcount);
+ }
+
+ strcat(sztemp,"\n");
+ }
+
+ CreateDialogParam(hInstance,MAKEINTRESOURCE(IDD_MISSED),NULL,MissedDlgProc,(LPARAM)&sztemp[0]);
+
+ return 0;
+}
+
+/*
+
+int LogStatus(WPARAM wparam,LPARAM lparam)
+{
+ DBCONTACTWRITESETTING *cws;
+ WPARAM wpvar;
+
+ cws=(DBCONTACTWRITESETTING *)lparam;
+
+ if(strcmp(cws->szSetting,"Status") || (strcmp(cws->szModule,"ICQ") && strcmp(cws->szModule,"MSN")) || (HANDLE)wparam==NULL) return 0;
+
+ if(CallService(MS_IGNORE_ISIGNORED,wparam,IGNOREEVENT_USERONLINE))
+ return 0;
+
+ if(cws->value.wVal==ID_STATUS_OFFLINE)
+ {
+ if(DBGetContactSettingByte((HANDLE)wparam,S_MOD,"Missed",0)==1)
+ {
+ mcs.times[mcs.count]++;
+ mcs.wpcontact[mcs.count++]=wparam;
+ DBWriteContactSettingByte((HANDLE)wparam,S_MOD,"Missed",0);
+ }
+
+ else if(DBGetContactSettingByte((HANDLE)wparam,S_MOD,"Missed",0)==3)
+ mcs.times[HIWORD(IsUserMissed(wparam))]++;
+
+ return 0;
+ }
+
+ wpvar=IsUserMissed(wparam);
+ if(LOWORD(wpvar))
+ DBWriteContactSettingByte((HANDLE)wparam,S_MOD,"Missed",3);
+
+ else
+ DBWriteContactSettingByte((HANDLE)wparam,S_MOD,"Missed",1);
+
+ 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(DBGetContactSettingByte((HANDLE)wparam,S_MOD,"Missed",0)==2)
+ return 0;
+
+ switch(lparam){
+
+ case ICON_OFFLINE:
+ if(DBGetContactSettingByte((HANDLE)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)]++;
+
+ DBWriteContactSettingByte((HANDLE)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:
+ DBWriteContactSettingByte((HANDLE)wparam,S_MOD,"Missed",1);
+ break;
+ }
+
+ return 0;
+}
+
+
+
+int ModeChange_mo(WPARAM wparam,LPARAM lparam)
+{
+ ACKDATA *ack;
+ int isetting=0;
+
+ ack=(ACKDATA *)lparam;
+
+ if(ack->type!=ACKTYPE_STATUS || ack->result!=ACKRESULT_SUCCESS || ack->hContact!=NULL) return 0;
+
+ 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_DB_CONTACT_SETTINGCHANGED,LogStatus);
+ ehmissed=HookEvent(ME_CLIST_CONTACTICONCHANGED,Test);
+ }
+ break;
+
+ default:
+ if(ehmissed!=NULL)
+ {
+ UnhookEvent(ehmissed);
+ ehmissed=NULL;
+ ShowMissed();
+ ResetMissed();
+ }
+ break;
+ }
+
+ return 0;
+}