/* 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 #include #include #include #include #include #include #include #include #include #include #include #include #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(); 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);