void MainWindowPageScripts::OnItemChanged(const LPNMLISTVIEW &pListView) {
    UpdateUpDown();

    if(bIgnoreItemChanged == true || pListView->iItem == -1 || (pListView->uNewState & LVIS_STATEIMAGEMASK) == (pListView->uOldState & LVIS_STATEIMAGEMASK)) {
        return;
    }

    if((((pListView->uNewState & LVIS_STATEIMAGEMASK) >> 12) - 1) == 0) {
        if(ScriptManager->ScriptTable[pListView->iItem]->bEnabled == false) {
            return;
        }

        ScriptManager->ScriptTable[pListView->iItem]->bEnabled = false;

        if(SettingManager->bBools[SETBOOL_ENABLE_SCRIPTING] == false || bServerRunning == false) {
			return;
        }

		ScriptManager->StopScript(ScriptManager->ScriptTable[pListView->iItem], false);
		ClearMemUsage((uint8_t)pListView->iItem);

		RichEditAppendText(hWndPageItems[REDT_SCRIPTS_ERRORS], (string(LanguageManager->sTexts[LAN_SCRIPT_STOPPED], (size_t)LanguageManager->ui16TextsLens[LAN_SCRIPT_STOPPED])+".").c_str());
    } else {
        if(ScriptManager->ScriptTable[pListView->iItem]->bEnabled == true) {
void ScriptEditorDialog::OnCheckSyntax() {
    int iAllocLen = ::GetWindowTextLength(m_hWndWindowItems[REDT_SCRIPT]);

    char * sBuf = (char *)malloc(iAllocLen+1);

    if(sBuf == nullptr) {
        ::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], LanguageManager::m_Ptr->m_sTexts[LAN_FAILED_TO_CHECK_SYNTAX], LanguageManager::m_Ptr->m_sTexts[LAN_ERROR], MB_OK);
        return;
    }

    ::GetWindowText(m_hWndWindowItems[REDT_SCRIPT], sBuf, iAllocLen+1);

	lua_State * L = lua_newstate(LuaAlocator, nullptr);

    if(L == nullptr) {
		free(sBuf);

		::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], LanguageManager::m_Ptr->m_sTexts[LAN_FAILED_TO_CHECK_SYNTAX], LanguageManager::m_Ptr->m_sTexts[LAN_ERROR], MB_OK);
        return;
    }

	luaL_openlibs(L);

    if(ServerManager::m_bServerRunning == true) {
#if LUA_VERSION_NUM > 501
        luaL_requiref(L, "Core", RegCore, 1);
        lua_pop(L, 1);

        luaL_requiref(L, "SetMan", RegSetMan, 1);
        lua_pop(L, 1);

        luaL_requiref(L, "RegMan", RegRegMan, 1);
        lua_pop(L, 1);

        luaL_requiref(L, "BanMan", RegBanMan, 1);
        lua_pop(L, 1);

        luaL_requiref(L, "ProfMan", RegProfMan, 1);
        lua_pop(L, 1);

        luaL_requiref(L, "TmrMan", RegTmrMan, 1);
        lua_pop(L, 1);

        luaL_requiref(L, "UDPDbg", RegUDPDbg, 1);
        lua_pop(L, 1);

        luaL_requiref(L, "ScriptMan", RegScriptMan, 1);
        lua_pop(L, 1);

        luaL_requiref(L, "IP2Country", RegIP2Country, 1);
        lua_pop(L, 1);
#else
        RegCore(L);
        RegSetMan(L);
        RegRegMan(L);
        RegBanMan(L);
        RegProfMan(L);
        RegTmrMan(L);
        RegUDPDbg(L);
        RegScriptMan(L);
        RegIP2Country(L);
#endif
    }

		if(luaL_dostring(L, sBuf) == 0) {
		::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], LanguageManager::m_Ptr->m_sTexts[LAN_NO_SYNERR_IN_SCRIPT], g_sPtokaXTitle, MB_OK);
			lua_close(L);
		} else {
			size_t szLen = 0;
		char * stmp = (char*)lua_tolstring(L, -1, &szLen);

        string sTmp(LanguageManager::m_Ptr->m_sTexts[LAN_SYNTAX], (size_t)LanguageManager::m_Ptr->m_ui16TextsLens[LAN_SYNTAX]);
        sTmp += " ";
        sTmp += stmp;

        RichEditAppendText(MainWindowPageScripts::m_Ptr->m_hWndPageItems[MainWindowPageScripts::REDT_SCRIPTS_ERRORS], sTmp.c_str());

        ::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], sTmp.c_str(), LanguageManager::m_Ptr->m_sTexts[LAN_ERROR], MB_OK);

			lua_close(L);
		}

	free(sBuf);
}
Example #3
0
void clsEventQueue::ProcessEvents() {
	event * next = NormalS;

	NormalS = NULL;
	NormalE = NULL;

	while(next != NULL) {
		event * cur = next;
		next = cur->next;

        switch(cur->ui8Id) {
			case EVENT_RESTART:
				clsServerManager::bIsRestart = true;
				clsServerManager::Stop();
                break;
			case EVENT_RSTSCRIPTS:
                clsScriptManager::mPtr->Restart();
                break;
            case EVENT_RSTSCRIPT: {
            	Script * curScript = clsScriptManager::mPtr->FindScript(cur->sMsg);
                if(curScript == NULL || curScript->bEnabled == false || curScript->LUA == NULL) {
                    return;
                }

                clsScriptManager::mPtr->StopScript(curScript, false);

				clsScriptManager::mPtr->StartScript(curScript, false);

                break;
            }
			case EVENT_STOPSCRIPT: {
				Script * curScript = clsScriptManager::mPtr->FindScript(cur->sMsg);
            	if(curScript == NULL || curScript->bEnabled == false || curScript->LUA == NULL) {
                    return;
                }

				clsScriptManager::mPtr->StopScript(curScript, true);

                break;
            }
			case EVENT_STOP_SCRIPTING:
                if(clsSettingManager::mPtr->bBools[SETBOOL_ENABLE_SCRIPTING] == true) {
                    clsSettingManager::mPtr->bBools[SETBOOL_ENABLE_SCRIPTING] = false;
                    clsScriptManager::mPtr->OnExit(true);
                    clsScriptManager::mPtr->Stop();
                }

                break;
			case EVENT_SHUTDOWN:
                if(clsServerManager::bIsClose == true) {
                    break;
                }

                clsServerManager::bIsClose = true;
                clsServerManager::Stop();

                break;
            default:
                break;
        }

#ifdef _WIN32
        if(cur->sMsg != NULL) {
            if(HeapFree(clsServerManager::hLibHeap, HEAP_NO_SERIALIZE, (void *)cur->sMsg) == 0) {
				AppendDebugLog("%s - [MEM] Cannot deallocate cur->sMsg in clsEventQueue::ProcessEvents\n", 0);
            }
        }
#else
		free(cur->sMsg);
#endif

        delete cur;
    }

#ifdef _WIN32
    EnterCriticalSection(&csEventQueue);
#else
	pthread_mutex_lock(&mtxEventQueue);
#endif

    next = ThreadS;

    ThreadS = NULL;
    ThreadE = NULL;

#ifdef _WIN32
    LeaveCriticalSection(&csEventQueue);
#else
	pthread_mutex_unlock(&mtxEventQueue);
#endif

    while(next != NULL) {
        event * cur = next;
        next = cur->next;

        switch(cur->ui8Id) {
            case EVENT_REGSOCK_MSG:
                clsUdpDebug::mPtr->Broadcast(cur->sMsg);
                break;
            case EVENT_SRVTHREAD_MSG:
                clsUdpDebug::mPtr->Broadcast(cur->sMsg);
                break;
            case EVENT_UDP_SR: {
                size_t szMsgLen = strlen(cur->sMsg);
                clsServerManager::ui64BytesRead += (uint64_t)szMsgLen;

                char *temp = strchr(cur->sMsg+4, ' ');
                if(temp == NULL) {
                    break;;
                }

                size_t szLen = (temp-cur->sMsg)-4;
                if(szLen > 64 || szLen == 0) {
                    break;
                }

				// terminate nick, needed for strcasecmp in clsHashManager
                temp[0] = '\0';

                User *u = clsHashManager::mPtr->FindUser(cur->sMsg+4, szLen);
                if(u == NULL) {
                    break;
                }

                // add back space after nick...
                temp[0] = ' ';

                if(memcmp(cur->ui128IpHash, u->ui128IpHash, 16) != 0) {
                    break;
                }

#ifdef _BUILD_GUI
    if(::SendMessage(clsMainWindowPageUsersChat::mPtr->hWndPageItems[clsMainWindowPageUsersChat::BTN_SHOW_COMMANDS], BM_GETCHECK, 0, 0) == BST_CHECKED) {
        char msg[128];
        int imsglen = sprintf(msg, "UDP > %s (%s) > ", u->sNick, u->sIP);
        if(CheckSprintf(imsglen, 128, "clsEventQueue::ProcessEvents") == true) {
            RichEditAppendText(clsMainWindowPageUsersChat::mPtr->hWndPageItems[clsMainWindowPageUsersChat::REDT_CHAT], (string(msg, imsglen)+cur->sMsg).c_str());
        }
    }
#endif

                clsDcCommands::mPtr->SRFromUDP(u, cur->sMsg, szMsgLen);
                break;
            }
            default:
                break;
        }

        free(cur->sMsg);

        delete cur;
    }
}