1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
|
/*
New Away System - plugin for Miranda IM
Copyright (c) 2005-2007 Chervov Dmitry
Copyright (c) 2004-2005 Iksaif Entertainment
Copyright (c) 2002-2003 Goblineye Entertainment
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
*/
#pragma once
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <CommCtrl.h>
#include <commdlg.h>
#include <Uxtheme.h>
#include <vsstyle.h>
#include <time.h>
#include <shellapi.h>
#include <crtdbg.h>
#include <stdarg.h>
#include "newpluginapi.h"
#include "m_clist.h"
#include "m_system.h"
#include "m_database.h"
#include "m_clistint.h"
#include "m_langpack.h"
#include "m_protosvc.h"
#include "m_options.h"
#include "m_netlib.h"
#include "../../protocols/IcqOscarJ/src/icq_constants.h"
#include "m_skin.h"
#include "m_awaymsg.h"
#include "m_utils.h"
#include "m_history.h"
#include "m_icolib.h"
#include "m_message.h"
#include "m_userinfo.h"
#include "m_icq.h"
#include "win2k.h"
#include "resource.h"
#include "m_variables.h"
#include "m_toptoolbar.h"
#include "m_popup.h"
#include "m_metacontacts.h"
#include "CString.h"
#include "Options.h"
#define CBSCHECK_UNCHECKED 1
#define CBSCHECK_CHECKED 5
#define CBSCHECK_MIXED 9
#define CBSSTATE_NORMAL 0
#define CBSSTATE_HOT 1
#define CBSSTATE_PRESSED 2
#define CBSSTATE_DISABLED 3
#define VAR_AWAYSINCE_TIME L"nas_awaysince_time"
#define VAR_AWAYSINCE_DATE L"nas_awaysince_date"
#define VAR_STATDESC L"nas_statdesc"
#define VAR_MYNICK L"nas_mynick"
#define VAR_REQUESTCOUNT L"nas_requestcount"
#define VAR_MESSAGENUM L"nas_messagecount"
#define VAR_TIMEPASSED L"nas_timepassed"
#define VAR_PREDEFINEDMESSAGE L"nas_predefinedmessage"
#define VAR_PROTOCOL L"nas_protocol"
#define SENDSMSG_EVENT_MSG 0x1
#define SENDSMSG_EVENT_URL 0x2
#define SENDSMSG_EVENT_FILE 0x4
#define AWAY_MSGDATA_MAX 8000
// Flags for status database settings
#define SF_OFF 0x1
#define SF_ONL 0x2
#define SF_AWAY 0x4
#define SF_NA 0x8
#define SF_OCC 0x10
#define SF_DND 0x20
#define SF_FFC 0x40
#define SF_INV 0x80
#define SF_OTP 0x100
#define SF_OTL 0x200
#define SF_OTHER 0x80000000
#define MOREOPTDLG_DEF_DONTPOPDLG (SF_ONL | SF_INV)
#define MOREOPTDLG_DEF_USEBYDEFAULT 0
// Event flags (used for "reply on event" options)
#define EF_MSG 1
#define EF_URL 2
#define EF_FILE 4
#define AUTOREPLY_DEF_REPLY 0
#define AUTOREPLY_DEF_REPLYONEVENT (EF_MSG | EF_URL | EF_FILE)
#define AUTOREPLY_DEF_PREFIX TranslateT("Miranda NG autoreply >\r\n%extratext%")
#define AUTOREPLY_DEF_DISABLEREPLY (SF_ONL | SF_INV)
#define AUTOREPLY_IDLE_WINDOWS 0
#define AUTOREPLY_IDLE_MIRANDA 1
#define AUTOREPLY_DEF_IDLEREPLYVALUE AUTOREPLY_IDLE_WINDOWS
#define AUTOREPLY_MAXPREFIXLEN 8000
#define VAL_USEDEFAULT 2 // undefined value for ignore/autoreply/notification settings in the db; must be 2 for proper ContactSettings support
// Set Away Message dialog flags
#define DF_SAM_SHOWMSGTREE 1
#define DF_SAM_SHOWCONTACTTREE 2
#define DF_SAM_DEFDLGFLAGS DF_SAM_SHOWMSGTREE
// WriteAwayMsgInDB option flags:
#define WRITE_LMSG 1
#define WRITE_RMSG 2
#define WRITE_INTERPRET 4
#define WRITE_CMSG 8
#define TOGGLE_SOE_COMMAND LPGENW("Toggle autoreply on/off")
#define DISABLE_SOE_COMMAND LPGENW("Toggle autoreply off")
#define ENABLE_SOE_COMMAND LPGENW("Toggle autoreply on")
#define STR_XSTATUSDESC TranslateT("extended status")
#define MODULENAME "NewAwaySys"
#define MOD_NAMEW L"NewAwaySys"
#define LOG_ID MODULENAME // LogService log ID
#define LOG_PREFIX MODULENAME ": " // netlib.log prefix for all NAS' messages
#define DB_SETTINGSVER "SettingsVer"
#ifndef _countof
#define _countof(s) (sizeof(s) / sizeof(*s))
#endif
#define UM_ICONSCHANGED (WM_USER + 121)
// IDD_READAWAYMSG user-defined message constants
#define UM_RAM_AWAYMSGACK (WM_USER + 10)
// IDD_SETAWAYMSG user-defined message constants
#define UM_SAM_SPLITTERMOVED (WM_USER + 1)
#define UM_SAM_SAVEDLGSETTINGS (WM_USER + 2)
#define UM_SAM_APPLYANDCLOSE (WM_USER + 3)
#define UM_SAM_KILLTIMER (WM_USER + 4)
#define UM_SAM_REPLYSETTINGCHANGED (WM_USER + 5)
#define UM_SAM_PROTOSTATUSCHANGED (WM_USER + 6) // wParam = (char*)szProto
#define UM_CLICK (WM_USER + 100)
#define SAM_DB_DLGPOSX "SAMDlgPosX"
#define SAM_DB_DLGPOSY "SAMDlgPosY"
#define SAM_DB_DLGSIZEX "SAMDlgSizeX"
#define SAM_DB_DLGSIZEY "SAMDlgSizeY"
#define SAM_DB_MSGSPLITTERPOS "SAMMsgSplitterPos"
#define SAM_DB_CONTACTSPLITTERPOS "SAMContactSplitterPos"
#define DB_MESSAGECOUNT "MessageCount"
#define DB_REQUESTCOUNT "RequestCount"
#define DB_SENDCOUNT "SendCount"
#define MESSAGES_DB_MSGTREEDEF "MsgTreeDef"
#define MSGTREE_RECENT_OTHERGROUP L"Other"
// GetMsgFormat flags
#define GMF_PERSONAL 1 // is also used to get global status message, when hContact = NULL (szProto = NULL)
#define GMF_PROTOORGLOBAL 2
#define GMF_LASTORDEFAULT 4 // this flag doesn't require hContact or szProto
#define GMF_TEMPORARY 8 // doesn't require status
#define GMF_ANYCURRENT (GMF_TEMPORARY | GMF_PERSONAL | GMF_PROTOORGLOBAL)
// SetMsgFormat flags
#define SMF_PERSONAL 1 // is also used to set global status message, when hContact = NULL (szProto = NULL)
#define SMF_LAST 2
#define SMF_TEMPORARY 4 // doesn't require status
// VAR_PARSE_DATA flags
#define VPF_XSTATUS 1 // use "extended status" instead of the usual status description in %nas_statdesc%, and XStatus message in %nas_message%
// options dialog
#define OPT_TITLE LPGENW("Away System")
#define OPT_MAINGROUP LPGEN("Status")
#define OPT_POPUPGROUP LPGEN("Popups")
#define MRM_MAX_GENERATED_TITLE_LEN 35 // maximum length of automatically generated title for recent messages
int ICQStatusToGeneralStatus(int bICQStat); // TODO: get rid of these protocol-specific functions, if possible
#define MS_AWAYSYS_SETCONTACTSTATMSG "AwaySys/SetContactStatMsg"
#define MS_AWAYSYS_AUTOREPLY_TOGGLE "AwaySys/AutoreplyToggle"
#define MS_AWAYSYS_AUTOREPLY_ON "AwaySys/AutoreplyOn"
#define MS_AWAYSYS_AUTOREPLY_OFF "AwaySys/AutoreplyOff"
#define MS_AWAYSYS_AUTOREPLY_USEDEFAULT "AwaySys/AutoreplyUseDefault"
#define MS_AWAYSYS_VARIABLESHANDLER "AwaySys/VariablesHandler"
#define MS_AWAYSYS_FREEVARMEM "AwaySys/FreeVarMem"
// these are obsolete AwaySysMod services, though they're still here for compatibility with old plugins
#define MS_AWAYSYS_SETSTATUSMODE "AwaySys/SetStatusMode" // change the status mode. wParam is new mode, lParam is new status message (AwaySys will interpret variables out of it), may be NULL.
#define MS_AWAYSYS_IGNORENEXT "AwaySys/IgnoreNextStatusChange" //ignore nest status change
/////////////////////////////////////////////////////////////////////////////////////////
struct CMPlugin : public PLUGIN<CMPlugin>
{
CMPlugin();
int Load() override;
int Unload() override;
};
struct SetAwayMsgData
{
CString szProtocol;
MCONTACT hInitContact; // initial contact (filled by caller)
TCString Message; // initial message, NULL means default
bool IsModeless; // means the dialog was created with the CreateDialogParam function, not DialogBoxParam
int ISW_Flags; // InvokeStatusWindow service flags
};
struct VAR_PARSE_DATA
{
char *szProto;
TCString Message;
DWORD UIN;
int Flags; // a combination of VPF_ flags
};
struct DYNAMIC_NOTIFY_DATA
{
MCONTACT hContact;
int iStatusMode;
TCString Proto;
};
struct PLUGIN_DATA
{
BYTE PopupLClickAction, PopupRClickAction;
MCONTACT hContact;
HICON hStatusIcon; // needed here to destroy its handle on UM_FREEPLUGINDATA
};
struct NAS_ISWINFOv1
{
int cbSize;
char *szProto;
MCONTACT hContact;
char *szMsg;
WORD status;
};
#define MTYPE_AUTOONLINE 0xE7 // required to support ICQ Plus online status messages
// Beware of conflicts between two different windows trying to use the same page at a time!
// Other windows than the owner of the Page must copy the page to their own memory,
// or use GetDBValueCopy to retrieve values
extern COptPage g_MessagesOptPage;
extern COptPage g_AutoreplyOptPage;
//extern COptPage g_PopupOptPage;
extern COptPage g_MoreOptPage;
extern COptPage g_SetAwayMsgPage;
extern int g_Messages_RecentRootID, g_Messages_PredefinedRootID;
extern VAR_PARSE_DATA VarParseData;
extern bool g_fNoProcessing;
extern int g_bIsIdle;
// AwaySys.cpp
TCString GetDynamicStatMsg(MCONTACT hContact, char *szProto = nullptr, DWORD UIN = 0, int iStatus = 0);
int IsAnICQProto(char *szProto);
// Client.cpp
void InitUpdateMsgs();
void ChangeProtoMessages(char* szProto, int iMode, const TCString &Msg);
int GetRecentGroupID(int iMode);
TCString VariablesEscape(TCString Str);
// SetAwayMsg.cpp
INT_PTR CALLBACK SetAwayMsgDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
// ReadAwayMsg.cpp
extern MWindowList g_hReadWndList;
INT_PTR GetContactStatMsg(WPARAM wParam, LPARAM lParam);
// AwayOpt.cpp
int OptsDlgInit(WPARAM wParam, LPARAM); // called on opening of the options dialog
void InitOptions(); // called once when plugin is loaded
//int ShowPopupNotification(COptPage &PopupNotifyData, MCONTACT hContact, int iStatusMode);
void ShowLog(TCString &LogFilePath);
void ShowMsg(wchar_t *szFirstLine, wchar_t *szSecondLine = L"", bool IsErrorMsg = false, int Timeout = 0);
#define AWAYSYS_STATUSMSGREQUEST_SOUND "AwaySysStatusMsgRequest"
// MsgEventAdded.cpp
int MsgEventAdded(WPARAM wParam, LPARAM lParam);
// buttons
INT_PTR ToggleSendOnEvent(WPARAM wParam, LPARAM lParam);
static __inline int LogMessage(const char *Format, ...)
{
va_list va;
char szText[8096];
mir_strcpy(szText, LOG_PREFIX);
va_start(va, Format);
mir_vsnprintf(szText + (_countof(LOG_PREFIX) - 1), sizeof(szText) - (_countof(LOG_PREFIX) - 1), Format, va);
va_end(va);
return Netlib_Log(nullptr, szText);
}
__inline int CallAllowedPS_SETAWAYMSG(const char *szProto, int iMode, const wchar_t *szMsg)
{ // we must use this function everywhere we want to call PS_SETAWAYMSG, otherwise NAS won't allow to change the message!
LogMessage("PS_SETAWAYMSG called by NAS. szProto=%s, Status=%d, Msg:\n%S", szProto, iMode, szMsg ? szMsg : L"NULL");
return CallProtoService(szProto, PS_SETAWAYMSG, iMode, (LPARAM)szMsg);
}
static __inline int my_variables_showhelp(HWND hwndDlg, UINT uIDEdit, int flags = 0, char *szSubjectDesc = nullptr, char *szExtraDesc = NULL)
{
if (ServiceExists(MS_VARS_SHOWHELPEX)) {
return variables_showhelp(hwndDlg, uIDEdit, flags, szSubjectDesc,szExtraDesc);
}
else {
ShowMsg(TranslateT("New Away System"), TranslateT("Variables plugin is not installed"), true);
return -1;
}
}
//icons
extern IconItem iconList[];
HICON GetIcon(int iconId, bool size = false);
|