From ac74105b7a7681dcd104768041a92037d7c112d7 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy <watcherhd@gmail.com> Date: Tue, 10 Dec 2013 14:39:15 +0000 Subject: mydyndns, rps, SmartAutoAway, SmartAutoReplier moved back to Not Adopted until adopted properly (real doubts about mydyndns working state since service has changed a lot recently) git-svn-id: http://svn.miranda-ng.org/main/trunk@7119 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- .../!NotAdopted/SmartAutoReplier/SarLuaScript.cpp | 358 +++++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100644 plugins/!NotAdopted/SmartAutoReplier/SarLuaScript.cpp (limited to 'plugins/!NotAdopted/SmartAutoReplier/SarLuaScript.cpp') diff --git a/plugins/!NotAdopted/SmartAutoReplier/SarLuaScript.cpp b/plugins/!NotAdopted/SmartAutoReplier/SarLuaScript.cpp new file mode 100644 index 0000000000..14000649b5 --- /dev/null +++ b/plugins/!NotAdopted/SmartAutoReplier/SarLuaScript.cpp @@ -0,0 +1,358 @@ +/* + * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM + * + * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna <volodymyr@shcherbyna.com> + * + * This code is inspired by article of RichardS at http://www.codeproject.com/Articles/11508/Integrating-Lua-into-C + * + * This file is part of SAR. + * + * SAR 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 3 of the License, or + * (at your option) any later version. + * + * SAR 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 SAR. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "stdafx.h" +#include "SarLuaScript.h" + +#include <m_protomod.h> +#include <m_protosvc.h> + +extern INT g_nCurrentMode; +extern CMessagesHandler *g_pMessHandler; + +wchar_t* Utf8toUtf16(CHAR * szStrIn, UINT & nSize); +char* Utf16toUtf8(LPCWSTR lpwszStrIn, UINT & nSize); + +CSarLuaScript::CSarLuaScript(CLuaBridge & luaBridge) : CLuaScript(luaBridge) +{ + m_nFuncBaseIndex = RegisterFunction("SendMessage"); + + RegisterFunction("GetMyStatus"); + RegisterFunction("SetMyStatus"); + RegisterFunction("Wait"); + RegisterFunction("FindUser"); + RegisterFunction("SetVariable"); + RegisterFunction("GetVariable"); +} + +CSarLuaScript::~CSarLuaScript(void) +{ +} + +int CSarLuaScript::ScriptCalling(CLuaBridge & luaBridge, int nFncNumber) +{ + switch (nFncNumber - m_nFuncBaseIndex) + { + case 0: + return SendMessage(luaBridge); + + case 1: + return GetMyStatus(luaBridge); + + case 2: + return SetMyStatus(luaBridge); + + case 3: + return Wait(luaBridge); + + case 4: + return FindUser(luaBridge); + + case 5: + return SetVariable(luaBridge); + + case 6: + return GetVariable(luaBridge); + } + + return FALSE; +} + +int CSarLuaScript::SendMessage(CLuaBridge & luaBridge) +{ + lua_State *pFunctionContext = (lua_State*)luaBridge; + + UINT nMessageLen = lua_strlen(pFunctionContext, -1); + const char * szMessage = lua_tostring(pFunctionContext, -1); + int hUserToken = (int)lua_tonumber(pFunctionContext, -2); + + if (szMessage == NULL) + { + return FALSE; + } + + int nRetVal = 0; + +#ifdef _UNICODE + /*/// as I am in unicode, I have to convert all strings from utf8 to utf16 :) + wchar_t * szwMessage = Utf8toUtf16((char*)szMessage, nMessageLen);*/ + + nRetVal = CallContactService((HANDLE)hUserToken, PSS_MESSAGE, PREF_UTF, reinterpret_cast<LPARAM>(szMessage)); + + /*free(szwMessage);*/ +#else + nRetVal = CallContactService((HANDLE)hUserToken, PSS_MESSAGE, 0, reinterpret_cast<LPARAM>(szMessage)); +#endif + + return FALSE; +} + +int CSarLuaScript::GetMyStatus(CLuaBridge & luaBridge) +{ + lua_State *pFunctionContext = (lua_State*)luaBridge; + int nStatusMode = CallService(MS_CLIST_GETSTATUSMODE, 0, 0); + + nStatusMode = g_nCurrentMode; + + switch (nStatusMode) + { + case ID_STATUS_ONLINE: + AddParam("Online"); + break; + + case ID_STATUS_OFFLINE: + AddParam("Offline"); + break; + + case ID_STATUS_AWAY: + AddParam("Away"); + break; + + case ID_STATUS_DND: + AddParam("DND"); + break; + + case ID_STATUS_NA: + AddParam("NA"); + break; + + case ID_STATUS_OCCUPIED: + AddParam("Occupied"); + break; + + case ID_STATUS_FREECHAT: + AddParam("FreeChat"); + break; + + case ID_STATUS_INVISIBLE: + AddParam("Invisible"); + break; + + case ID_STATUS_ONTHEPHONE: + AddParam("OnThePhone"); + break; + + case ID_STATUS_OUTTOLUNCH: + AddParam("OutToLunch"); + break; + + default: + AddParam("Unknown"); + break; + } + + return TRUE; +} + +int CSarLuaScript::SetMyStatus(CLuaBridge & luaBridge) +{ + int nNewStatus = 0; + lua_State *pFunctionContext = (lua_State*)luaBridge; + + const char * szStatus = lua_tostring(pFunctionContext, -1); + + if (szStatus == NULL) + { + return FALSE; + } + + if (strcmp(szStatus, "Online") == 0) + { + nNewStatus = ID_STATUS_ONLINE; + } + else if (strcmp(szStatus, "Offline") == 0) + { + nNewStatus = ID_STATUS_OFFLINE; + } + else if (strcmp(szStatus, "Away") == 0) + { + nNewStatus = ID_STATUS_AWAY; + } + else if (strcmp(szStatus, "DND") == 0) + { + nNewStatus = ID_STATUS_DND; + } + else if (strcmp(szStatus, "NA") == 0) + { + nNewStatus = ID_STATUS_NA; + } + else if (strcmp(szStatus, "Occupied") == 0) + { + nNewStatus = ID_STATUS_OCCUPIED; + } + else if (strcmp(szStatus, "FreeChat") == 0) + { + nNewStatus = ID_STATUS_FREECHAT; + } + else if (strcmp(szStatus, "Invisible") == 0) + { + nNewStatus = ID_STATUS_INVISIBLE; + } + else if (strcmp(szStatus, "OnThePhone") == 0) + { + nNewStatus = ID_STATUS_ONTHEPHONE; + } + else if (strcmp(szStatus, "OutToLunch") == 0) + { + nNewStatus = ID_STATUS_OUTTOLUNCH; + } + + CallService(MS_CLIST_SETSTATUSMODE, (WPARAM)nNewStatus, 0); + + return FALSE; +} + +typedef map<wstring, wstring> MapOfStrings; + +MapOfStrings g_MapOfVariables; + +int CSarLuaScript::SetVariable(CLuaBridge & luaBridge) +{ + lua_State *pFunctionContext = (lua_State*)luaBridge; + + UINT nNameLength = lua_strlen(pFunctionContext, -2); + const char * szName = lua_tostring(pFunctionContext, -2); + + UINT nVariableLength = lua_strlen(pFunctionContext, -1); + const char * szVariable = lua_tostring(pFunctionContext, -1); + + if (szName == NULL || szVariable == NULL) + { + return FALSE; + } + + wchar_t * szwName = Utf8toUtf16((char*)szName, nNameLength); + wchar_t * szwVariable = Utf8toUtf16((char*)szVariable, nVariableLength); + + if (szwName && szwVariable) + { + g_MapOfVariables[szwName] = szwVariable; + } + + if (szwName) + { + free(szwName); + } + + if (szwVariable) + { + free(szwVariable); + } + + return FALSE; +} + +int CSarLuaScript::GetVariable(CLuaBridge & luaBridge) +{ + lua_State *pFunctionContext = (lua_State*)luaBridge; + + UINT nNameLength = lua_strlen(pFunctionContext, -1); + const char * szName = lua_tostring(pFunctionContext, -1); + + if (szName == NULL) + { + return FALSE; + } + + wchar_t * szwName = Utf8toUtf16((char*)szName, nNameLength); + + if (szwName) + { + MapOfStrings::iterator it = g_MapOfVariables.find(szwName); + + if (it != g_MapOfVariables.end()) + { + UINT nSize = 0; + char * szUtf = Utf16toUtf8(it->second.c_str(), nSize); + + if (szUtf != NULL) + { + AddParam(szUtf); + free(szUtf); + free(szwName); + + return TRUE; + } + } + } + + if (szwName) + { + free(szwName); + } + + return FALSE; +} + +int CSarLuaScript::Wait(CLuaBridge & luaBridge) +{ + lua_State *pFunctionContext = (lua_State*)luaBridge; + + int nSleepInterval = (int)lua_tonumber(pFunctionContext, -1); + + Sleep(1000 * nSleepInterval); + + return FALSE; +} + +int CSarLuaScript::FindUser(CLuaBridge & luaBridge) +{ + lua_State *pFunctionContext = (lua_State*)luaBridge; + + const CHAR * szUser = (CHAR*)lua_tostring(pFunctionContext, -2); + const CHAR * szProtocol = (CHAR*)lua_tostring(pFunctionContext, -1); + + if (szProtocol == NULL || szUser == NULL) + { + return FALSE; + } + + HANDLE hContact = db_find_first(); + CHAR* szContactName = NULL; + CHAR* szProto = NULL; + DWORD wId = 0; + + while (hContact != NULL) + { + szContactName = reinterpret_cast<CHAR*>(CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_NOMYHANDLE)); + szProto = (CHAR*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + + if (szProto && szContactName) + { + if ( (strcmp(szUser, szContactName)) == 0 && (strcmp(szProto, szProtocol) == 0)) + { + AddParam((int)hContact); + return TRUE; + } + } + + hContact = db_find_next(hContact); + } + + return FALSE; +} + +void CSarLuaScript::HandleReturns(CLuaBridge & luaBridge, const char *szFunc) +{ + +} \ No newline at end of file -- cgit v1.2.3