/*
 * PtokaX - hub server for Direct Connect peer to peer network.

 * Copyright (C) 2002-2005  Ptaczek, Ptaczek at PtokaX dot org
 * Copyright (C) 2004-2022  Petr Kozelka, PPK at PtokaX dot org

 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3
 * as published by the Free Software Foundation.

 * 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, see <http://www.gnu.org/licenses/>.
 */

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include "stdinc.h"
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include "colUsers.h"
#include "DcCommands.h"
#include "eventqueue.h"
#include "GlobalDataQueue.h"
#include "hashBanManager.h"
#include "hashRegManager.h"
#include "hashUsrManager.h"
#include "LanguageManager.h"
#include "LuaInc.h"
#include "LuaScriptManager.h"
#include "ProfileManager.h"
#include "ServerManager.h"
#include "serviceLoop.h"
#include "SettingManager.h"
#include "User.h"
#include "utility.h"
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include "HubCommands.h"
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#ifdef _WITH_SQLITE
#include "DB-SQLite.h"
#elif _WITH_POSTGRES
#include "DB-PostgreSQL.h"
#include <libpq-fe.h>
#elif _WITH_MYSQL
#include "DB-MySQL.h"
#include <mysql.h>
#endif

#include "LuaScript.h"
#include "TextFileManager.h"
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::RestartScripts(ChatCommand * pChatCommand)   // !restartscripts
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RSTSCRIPTS) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_ENABLE_SCRIPTING] == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RestartScripts1", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERR_SCRIPTS_DISABLED]);
		return true;
	}

	UncountDeflood(pChatCommand);

	// post restart message
	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == true)
	{
		GlobalDataQueue::m_Ptr->StatusMessageFormat("HubCommands::RestartScripts2", "<%s> *** %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_pUser->m_sNick, LanguageManager::m_Ptr->m_sTexts[LAN_RESTARTED_SCRIPTS]);
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == false || ((pChatCommand->m_pUser->m_ui32BoolBits & User::BIT_OPERATOR) == User::BIT_OPERATOR) == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RestartScripts3", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SCRIPTS_RESTARTED]);
	}

	ScriptManager::m_Ptr->Restart();

	return true;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::Restart(ChatCommand * pChatCommand)   // !restart
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RSTHUB) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	UncountDeflood(pChatCommand);

	// Send message to all that we are going to restart the hub
	int iMsgLen = snprintf(ServerManager::m_pGlobalBuffer, ServerManager::m_szGlobalBufferSize, "<%s> %s. %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], LanguageManager::m_Ptr->m_sTexts[LAN_HUB_WILL_BE_RESTARTED], LanguageManager::m_Ptr->m_sTexts[LAN_BACK_IN_FEW_MINUTES]);
	if (iMsgLen > 0)
	{
		Users::m_Ptr->SendChat2All(pChatCommand->m_pUser, ServerManager::m_pGlobalBuffer, iMsgLen, NULL);
	}

	// post a restart hub message
	EventQueue::m_Ptr->AddNormal(EventQueue::EVENT_RESTART, NULL);

	return true;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::ReloadTxt(ChatCommand * pChatCommand)   // !reloadtxt
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::REFRESHTXT) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_ENABLE_TEXT_FILES] == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::ReloadTxt1", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_TXT_SUP_NOT_ENABLED]);
		return true;
	}

	UncountDeflood(pChatCommand);

	TextFilesManager::m_Ptr->RefreshTextFiles();

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == true)
	{
		GlobalDataQueue::m_Ptr->StatusMessageFormat("HubCommands::ReloadTxt2", "<%s> *** %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_pUser->m_sNick, LanguageManager::m_Ptr->m_sTexts[LAN_RELOAD_TXT_FILES_LWR]);
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == false || ((pChatCommand->m_pUser->m_ui32BoolBits & User::BIT_OPERATOR) == User::BIT_OPERATOR) == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::ReloadTxt3", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_TXT_FILES_RELOADED]);
	}

	return true;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::RestartScript(ChatCommand * pChatCommand)   // !restartscript scriptname
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RSTSCRIPTS) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_ENABLE_SCRIPTING] == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RestartScript1", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERR_SCRIPTS_DISABLED]);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 15 || pChatCommand->m_sCommand[14] == '\0')
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RestartScript2", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %crestartscript <%s>. %s!|",
		        SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_SCRIPTNAME_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	pChatCommand->m_sCommand += 14;
	pChatCommand->m_ui32CommandLen -= 14;

	if (pChatCommand->m_ui32CommandLen > 256)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RestartScript3", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %crestartscript <%s>. %s!|",
		        SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_SCRIPTNAME_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_MAX_ALWD_SCRIPT_NAME_LEN_256_CHARS]);
		return true;
	}

	Script * curScript = ScriptManager::m_Ptr->FindScript(pChatCommand->m_sCommand);
	if (curScript == NULL || curScript->m_bEnabled == false || curScript->m_pLua == NULL)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RestartScript4", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERROR_SCRIPT], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_NOT_RUNNING]);
		return true;
	}

	UncountDeflood(pChatCommand);

	// stop script
	ScriptManager::m_Ptr->StopScript(curScript, false);

	// try to start script
	if (ScriptManager::m_Ptr->StartScript(curScript, false) == true)
	{
		if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == true)
		{
			GlobalDataQueue::m_Ptr->StatusMessageFormat("HubCommands::RestartScript5", "<%s> *** %s %s: %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_pUser->m_sNick, LanguageManager::m_Ptr->m_sTexts[LAN_RESTARTED_SCRIPT], pChatCommand->m_sCommand);
		}

		if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == false || ((pChatCommand->m_pUser->m_ui32BoolBits & User::BIT_OPERATOR) == User::BIT_OPERATOR) == false)
		{
			pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RestartScript6", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
			        LanguageManager::m_Ptr->m_sTexts[LAN_SCRIPT], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_RESTARTED_LWR]);
		}
		return true;
	}
	else
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RestartScript7", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERROR_SCRIPT], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_RESTART_FAILED]);
		return true;
	}
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::RangeBan(ChatCommand * pChatCommand)   // !rangeban fromip toip reason
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RANGE_BAN) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 24)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RangeBan", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %crangeban <%s> <%s> <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_FROMIP], LanguageManager::m_Ptr->m_sTexts[LAN_TOIP], LanguageManager::m_Ptr->m_sTexts[LAN_REASON_LWR],
		        LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	pChatCommand->m_sCommand += 9;
	pChatCommand->m_ui32CommandLen -= 9;

	return RangeBan(pChatCommand, false);
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::RangeTempBan(ChatCommand * pChatCommand)   // !rangetempban fromip toip time reason ... m = minutes, h = hours, d = days, w = weeks, M = months, Y = years
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RANGE_TBAN) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 31)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RangeTempBan", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %crangetempban <%s> <%s> <%s> <%s>. %s!|",
		        SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_FROMIP], LanguageManager::m_Ptr->m_sTexts[LAN_TOIP],
		        LanguageManager::m_Ptr->m_sTexts[LAN_TIME_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_REASON_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	pChatCommand->m_sCommand += 13;
	pChatCommand->m_ui32CommandLen -= 13;

	return RangeTempBan(pChatCommand, false);
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::RangeUnBan(ChatCommand * pChatCommand)   // !rangeunban fromip toip
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RANGE_UNBAN) == false && ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RANGE_TUNBAN) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 26)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RangeUnBan", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %crangeunban <%s> <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_FROMIP], LanguageManager::m_Ptr->m_sTexts[LAN_TOIP], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	pChatCommand->m_sCommand += 11;
	pChatCommand->m_ui32CommandLen -= 11;

	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RANGE_UNBAN) == true)
	{
		return RangeUnban(pChatCommand);
	}
	else if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RANGE_TUNBAN) == true)
	{
		return RangeUnban(pChatCommand, BanManager::TEMP);
	}
	else
	{
		SendNoPermission(pChatCommand);
		return true;
	}
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::RangeTempUnBan(ChatCommand * pChatCommand)   // !rangetempunban fromip toip
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RANGE_TUNBAN) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 30)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RangeTempUnBan", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %crangetempunban <%s> <%s>. %s!|",
		        SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_FROMIP], LanguageManager::m_Ptr->m_sTexts[LAN_TOIP],
		        LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	pChatCommand->m_sCommand += 15;
	pChatCommand->m_ui32CommandLen -= 15;

	return RangeUnban(pChatCommand, BanManager::TEMP);
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::RangePermUnBan(ChatCommand * pChatCommand)   // !rangepermunban fromip toip
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RANGE_UNBAN) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 30)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RangePermUnBan", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %crangepermunban <%s> <%s>. %s!|",
		        SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_FROMIP], LanguageManager::m_Ptr->m_sTexts[LAN_TOIP], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	pChatCommand->m_sCommand += 15;
	pChatCommand->m_ui32CommandLen -= 15;

	return RangeUnban(pChatCommand, BanManager::PERM);
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::RegNewUser(ChatCommand * pChatCommand)   // !reguser nick profile_name
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::ADDREGUSER) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen > 255)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RegNewUser1", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_CMD_TOO_LONG]);
		return true;
	}

	char * sNick = pChatCommand->m_sCommand + 8; // nick start

	char * sProfile = strchr(pChatCommand->m_sCommand + 8, ' ');
	if (sProfile == NULL)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RegNewUser2", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %creguser <%s> <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_NICK_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_PROFILENAME_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_BAD_PARAMS_GIVEN]);
		return true;
	}

	uint32_t ui32NickLen = (uint32_t)(sProfile - sNick);

	sProfile[0] = '\0';
	sProfile++;

	int iProfile = ProfileManager::m_Ptr->GetProfileIndex(sProfile);
	if (iProfile == -1)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RegNewUser3", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERR_NO_PROFILE_GIVEN_NAME_EXIST]);
		return true;
	}

	// check hierarchy
	// deny if pUser is not Master and tries add equal or higher profile
	if (pChatCommand->m_pUser->m_i32Profile > 0 && iProfile <= pChatCommand->m_pUser->m_i32Profile)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RegNewUser4", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_YOU_NOT_ALLOWED_TO_ADD_USER_THIS_PROFILE]);
		return true;
	}

	// check if user is registered
	if (RegManager::m_Ptr->Find(sNick, ui32NickLen) != NULL)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RegNewUser5", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %s %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_USER], sNick, LanguageManager::m_Ptr->m_sTexts[LAN_IS_ALREDY_REGISTERED]);
		return true;
	}

	User * pOtherUser = HashManager::m_Ptr->FindUser(sNick, ui32NickLen);
	if (pOtherUser == NULL)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RegNewUser6", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %s %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERROR], sNick, LanguageManager::m_Ptr->m_sTexts[LAN_IS_NOT_ONLINE]);
		return true;
	}

	UncountDeflood(pChatCommand);

	pOtherUser->SetBuffer(sProfile);
	pOtherUser->m_ui32BoolBits |= User::BIT_WAITING_FOR_PASS;

	pOtherUser->SendFormat("HubCommands::RegNewUser7", true, "<%s> %s.|$GetPass|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], LanguageManager::m_Ptr->m_sTexts[LAN_YOU_WERE_REGISTERED_PLEASE_ENTER_YOUR_PASSWORD]);

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == true)
	{
		GlobalDataQueue::m_Ptr->StatusMessageFormat("HubCommands::RegNewUser8", "<%s> *** %s %s %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_pUser->m_sNick, LanguageManager::m_Ptr->m_sTexts[LAN_REGISTERED], sNick,
		        LanguageManager::m_Ptr->m_sTexts[LAN_AS], sProfile);
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == false || ((pChatCommand->m_pUser->m_ui32BoolBits & User::BIT_OPERATOR) == User::BIT_OPERATOR) == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::RegNewUser9", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> %s %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], sNick,
		        LanguageManager::m_Ptr->m_sTexts[LAN_REGISTERED], LanguageManager::m_Ptr->m_sTexts[LAN_AS], sProfile);
	}

	return true;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::Stats(ChatCommand * pChatCommand)   // !stat !stats !statistic
{
	int iMsgLen = CheckFromPm(pChatCommand);

	int iRet = snprintf(ServerManager::m_pGlobalBuffer + iMsgLen, ServerManager::m_szGlobalBufferSize - iMsgLen, "<%s>", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC]);
	if (iRet <= 0)
	{
		return true;
	}
	iMsgLen += iRet;

	std::string Statinfo(ServerManager::m_pGlobalBuffer, iMsgLen);

	Statinfo += "\n------------------------------------------------------------\n";
	Statinfo += "Current stats:\n";
	Statinfo += "------------------------------------------------------------\n";
	Statinfo += "Uptime: " + std::to_string(ServerManager::m_ui64Days) + " days, " + std::to_string(ServerManager::m_ui64Hours) + " hours, " + std::to_string(ServerManager::m_ui64Mins) + " minutes\n";

	Statinfo += "Version: PtokaX DC Hub " PtokaXVersionString

#ifdef _WIN32
#ifdef _M_X64
	            " x64"
#elif _M_ARM
	            " ARM"
#endif
#endif

#ifdef _PtokaX_TESTING_
	            " [build " BUILD_NUMBER "]"
#endif
	            " built on " __DATE__ " " __TIME__ "\n"

#if LUA_VERSION_NUM > 501
	            "Lua: " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR "." LUA_VERSION_RELEASE "\n";
#else
	            LUA_RELEASE "\n";
#endif

#ifdef _WITH_SQLITE
	Statinfo += "SQLite: " SQLITE_VERSION "\n";
#elif _WITH_POSTGRES
	Statinfo += "PostgreSQL: " + string(PQlibVersion()) + "\n";
#elif _WITH_MYSQL
	Statinfo += "MySQL: " MYSQL_SERVER_VERSION "\n";
#endif

#ifdef _WIN32
	Statinfo += std::to_string("OS: ") + std::to_string(ServerManager::m_sOS) + "\r\n";
#else

	struct utsname osname;
	if (uname(&osname) >= 0)
	{
		Statinfo += "OS: " + string(osname.sysname) + " " + string(osname.release) + " (" + string(osname.machine) + ")"
#ifdef __clang__
		            " / Clang " __clang_version__
#elif __GNUC__
		            " / GCC " __VERSION__
#endif
		            "\n";
	}
#endif

	Statinfo += "Users (Max/Actual Peak (Max Peak)/Logged): " + std::to_string(SettingManager::m_Ptr->m_i16Shorts[SETSHORT_MAX_USERS]) + " / " +
	            std::to_string(ServerManager::m_ui32Peak) + " (" + std::to_string(SettingManager::m_Ptr->m_i16Shorts[SETSHORT_MAX_USERS_PEAK]) + ") / " + std::to_string(ServerManager::m_ui32Logged) + "\n";
	Statinfo += "Joins / Parts: " + std::to_string(ServerManager::m_ui32Joins) + " / " + std::to_string(ServerManager::m_ui32Parts) + "\n";
	Statinfo += "Users shared size: " + std::to_string(ServerManager::m_ui64TotalShare) + " Bytes / " + std::to_string(formatBytes(ServerManager::m_ui64TotalShare)) + "\n";
	Statinfo += "Chat messages: " + std::to_string(DcCommands::m_Ptr->m_ui32StatChat) + " x\n";
	Statinfo += "Unknown commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdUnknown) + " x\n";
	Statinfo += "PM commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdTo) + " x\n";
	Statinfo += "Key commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdKey) + " x\n";
	Statinfo += "Supports commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdSupports) + " x\n";
	Statinfo += "MyINFO commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdMyInfo) + " x\n";
	Statinfo += "ValidateNick commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdValidate) + " x\n";
	Statinfo += "GetINFO commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdGetInfo) + " x\n";
	Statinfo += "Password commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdMyPass) + " x\n";
	Statinfo += "Version commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdVersion) + " x\n";
	Statinfo += "GetNickList commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdGetNickList) + " x\n";
	Statinfo += "Search commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdSearch) + " x (" + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdMultiSearch) + " x)\n";
	Statinfo += "SR commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdSR) + " x\n";
	Statinfo += "CTM commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdConnectToMe) + " x (" + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdMultiConnectToMe) + " x)\n";
	Statinfo += "RevCTM commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdRevCTM) + " x\n";
	Statinfo += "BotINFO commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatBotINFO) + " x\n";
	Statinfo += "Close commands: " + std::to_string(DcCommands::m_Ptr->m_ui32StatCmdClose) + " x\n";
	//Statinfo+="------------------------------------------------------------\n";
	//Statinfo+="ClientSocket Errors: "+string(iStatUserSocketErrors)+" x\n";
	Statinfo += "------------------------------------------------------------\n";

#ifdef _WIN32
#ifdef FLYLINKDC_USE_CPU_STAT
	FILETIME tmpa, tmpb, kernelTimeFT, userTimeFT;
	GetProcessTimes(GetCurrentProcess(), &tmpa, &tmpb, &kernelTimeFT, &userTimeFT);
	int64_t kernelTime = kernelTimeFT.dwLowDateTime | (((int64_t)kernelTimeFT.dwHighDateTime) << 32);
	int64_t userTime = userTimeFT.dwLowDateTime | (((int64_t)userTimeFT.dwHighDateTime) << 32);
	int64_t icpuSec = (kernelTime + userTime) / (10000000I64);

	char cpuusage[32];
	int iLen = snprintf(cpuusage, 32, "%.2f%%\r\n", ServerManager::m_dCpuUsage / 0.6);
	if (iLen <= 0)
	{
		return true;
	}
	Statinfo += "CPU usage (60 sec avg): " + string(cpuusage, iLen);

	char cputime[64];
	iLen = snprintf(cputime, 64, "%01I64d:%02d:%02d", icpuSec / (60 * 60), (int32_t)((icpuSec / 60) % 60), (int32_t)(icpuSec % 60));
	if (iLen <= 0)
	{
		return true;
	}
	Statinfo += "CPU time: " + string(cputime, iLen) + "\r\n";
#endif

	PROCESS_MEMORY_COUNTERS pmc;
	memset(&pmc, 0, sizeof(PROCESS_MEMORY_COUNTERS));
	pmc.cb = sizeof(pmc);

	::GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));

	Statinfo += "Mem usage (Peak): " + string(formatBytes(pmc.WorkingSetSize)) + " (" + string(formatBytes(pmc.PeakWorkingSetSize)) + ")\r\n";
	Statinfo += "VM size (Peak): " + string(formatBytes(pmc.PagefileUsage)) + " (" + string(formatBytes(pmc.PeakPagefileUsage)) + ")\r\n";
#else // _WIN32
	int iLen;
#ifdef FLYLINKDC_USE_CPU_STAT
	char cpuusage[32];
	iLen = snprintf(cpuusage, 32, "%.2f%%\n", (ServerManager::m_dCpuUsage / 0.6) / (double)ServerManager::m_ui32CpuCount);
	if (iLen <= 0)
	{
		return true;
	}
	Statinfo += "CPU usage (60 sec avg): " + string(cpuusage, iLen);
#endif // FLYLINKDC_USE_CPU_STAT

	struct rusage rs;

	getrusage(RUSAGE_SELF, &rs);

	uint64_t ui64cpuSec = uint64_t(rs.ru_utime.tv_sec) + (uint64_t(rs.ru_utime.tv_usec) / 1000000) +
	                      uint64_t(rs.ru_stime.tv_sec) + (uint64_t(rs.ru_stime.tv_usec) / 1000000);

	char cputime[64];
	iLen = snprintf(cputime, 64, "%01" PRIu64 ":%02" PRIu64 ":%02" PRIu64, ui64cpuSec / (60 * 60), (ui64cpuSec / 60) % 60, ui64cpuSec % 60);
	if (iLen <= 0)
	{
		return true;
	}
	Statinfo += "CPU time: " + string(cputime, iLen) + "\n";

	FILE *fp = fopen("/proc/self/status", "r");
	if (fp != NULL)
	{
		string memrss, memhwm, memvms, memvmp, memstk, memlib;
		char buf[1024];
		char * tmp = NULL;

		while (fgets(buf, 1024, fp) != NULL)
		{
			if (strncmp(buf, "VmRSS:", 6) == 0)
			{
				tmp = buf + 6;
				while (isspace(*tmp) && *tmp)
				{
					tmp++;
				}
				memrss = string(tmp, strlen(tmp) - 1);
			}
			else if (strncmp(buf, "VmHWM:", 6) == 0)
			{
				tmp = buf + 6;
				while (isspace(*tmp) && *tmp)
				{
					tmp++;
				}
				memhwm = string(tmp, strlen(tmp) - 1);
			}
			else if (strncmp(buf, "VmSize:", 7) == 0)
			{
				tmp = buf + 7;
				while (isspace(*tmp) && *tmp)
				{
					tmp++;
				}
				memvms = string(tmp, strlen(tmp) - 1);
			}
			else if (strncmp(buf, "VmPeak:", 7) == 0)
			{
				tmp = buf + 7;
				while (isspace(*tmp) && *tmp)
				{
					tmp++;
				}
				memvmp = string(tmp, strlen(tmp) - 1);
			}
			else if (strncmp(buf, "VmStk:", 6) == 0)
			{
				tmp = buf + 6;
				while (isspace(*tmp) && *tmp)
				{
					tmp++;
				}
				memstk = string(tmp, strlen(tmp) - 1);
			}
			else if (strncmp(buf, "VmLib:", 6) == 0)
			{
				tmp = buf + 6;
				while (isspace(*tmp) && *tmp)
				{
					tmp++;
				}
				memlib = string(tmp, strlen(tmp) - 1);
			}
		}

		fclose(fp);

		if (memhwm.size() != 0 && memrss.size() != 0)
		{
			Statinfo += "Mem usage (Peak): " + memrss + " (" + memhwm + ")\n";
		}
		else if (memrss.size() != 0)
		{
			Statinfo += "Mem usage: " + memrss + "\n";
		}

		if (memvmp.size() != 0 && memvms.size() != 0)
		{
			Statinfo += "VM size (Peak): " + memvms + " (" + memvmp + ")\n";
		}
		else if (memrss.size() != 0)
		{
			Statinfo += "VM size: " + memvms + "\n";
		}

		if (memstk.size() != 0 && memlib.size() != 0)
		{
			Statinfo += "Stack size / Libs size: " + memstk + " / " + memlib + "\n";
		}
	}
#endif

	Statinfo += "------------------------------------------------------------\n";
	Statinfo += "SendRests (Peak): " + std::to_string(ServiceLoop::m_Ptr->m_ui32LastSendRest) + " (" + std::to_string(ServiceLoop::m_Ptr->m_ui32SendRestsPeak) + ")\n";
	Statinfo += "RecvRests (Peak): " + std::to_string(ServiceLoop::m_Ptr->m_ui32LastRecvRest) + " (" + std::to_string(ServiceLoop::m_Ptr->m_ui32RecvRestsPeak) + ")\n";
	Statinfo += "Compression saved: " + std::to_string(formatBytes(ServerManager::m_ui64BytesSentSaved)) + " (" + std::to_string(DcCommands::m_Ptr->m_ui32StatZPipe) + ")\n";
	Statinfo += "Data sent: " + std::to_string(formatBytes(ServerManager::m_ui64BytesSent)) + "\n";
	Statinfo += "Data received: " + std::to_string(formatBytes(ServerManager::m_ui64BytesRead)) + "\n";
	Statinfo += "Tx (60 sec avg): " + std::to_string(formatBytesPerSecond(ServerManager::m_ui32ActualBytesSent)) + " (" + std::to_string(formatBytesPerSecond(ServerManager::m_ui32AverageBytesSent / 60)) + ")\n";
	Statinfo += "Rx (60 sec avg): " + std::to_string(formatBytesPerSecond(ServerManager::m_ui32ActualBytesRead)) + " (" + std::to_string(formatBytesPerSecond(ServerManager::m_ui32AverageBytesRead / 60)) + ")|";

	pChatCommand->m_pUser->SendCharDelayed(Statinfo.c_str(), Statinfo.size());

	return true;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::StopScript(ChatCommand * pChatCommand)   // !stopscript scriptname
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RSTSCRIPTS) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_ENABLE_SCRIPTING] == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StopScript1", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERR_SCRIPTS_DISABLED]);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 12)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StopScript2", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %cstopscript <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_SCRIPTNAME_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	pChatCommand->m_sCommand += 11;
	pChatCommand->m_ui32CommandLen -= 11;

	if (pChatCommand->m_ui32CommandLen > 256)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StopScript3", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %cstopscript <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_SCRIPTNAME_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_MAX_ALWD_SCRIPT_NAME_LEN_256_CHARS]);
		return true;
	}

	Script * curScript = ScriptManager::m_Ptr->FindScript(pChatCommand->m_sCommand);
	if (curScript == NULL || curScript->m_bEnabled == false || curScript->m_pLua == NULL)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StopScript4", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERROR_SCRIPT], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_NOT_RUNNING]);
		return true;
	}

	UncountDeflood(pChatCommand);

	ScriptManager::m_Ptr->StopScript(curScript, true);

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == true)
	{
		GlobalDataQueue::m_Ptr->StatusMessageFormat("HubCommands::StopScript5", "<%s> *** %s %s: %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_pUser->m_sNick, LanguageManager::m_Ptr->m_sTexts[LAN_STOPPED_SCRIPT], pChatCommand->m_sCommand);
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == false || ((pChatCommand->m_pUser->m_ui32BoolBits & User::BIT_OPERATOR) == User::BIT_OPERATOR) == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StopScript6", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SCRIPT], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_STOPPED_LWR]);
	}

	return true;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::StartScript(ChatCommand * pChatCommand)   // !startscript scriptname
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::RSTSCRIPTS) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_ENABLE_SCRIPTING] == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StartScript1", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERR_SCRIPTS_DISABLED]);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 13)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StartScript2", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %cstartscript <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_SCRIPTNAME_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	pChatCommand->m_sCommand += 12;
	pChatCommand->m_ui32CommandLen -= 12;

	if (pChatCommand->m_ui32CommandLen > 256)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StartScript3", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %cstartscript <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_SCRIPTNAME_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_MAX_ALWD_SCRIPT_NAME_LEN_256_CHARS]);
		return true;
	}

	char * sBadChar = strpbrk(pChatCommand->m_sCommand, "/\\");
	if (sBadChar != NULL || FileExist((ServerManager::m_sScriptPath + pChatCommand->m_sCommand).c_str()) == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StartScript4", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERROR_SCRIPT_NOT_EXIST]);
		return true;
	}

	Script * pScript = ScriptManager::m_Ptr->FindScript(pChatCommand->m_sCommand);
	if (pScript != NULL)
	{
		if (pScript->m_bEnabled == true && pScript->m_pLua != NULL)
		{
			pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StartScript5", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
			        LanguageManager::m_Ptr->m_sTexts[LAN_ERROR_SCRIPT_ALREDY_RUNNING]);
			return true;
		}

		UncountDeflood(pChatCommand);

		if (ScriptManager::m_Ptr->StartScript(pScript, true) == true)
		{
			if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == true)
			{
				GlobalDataQueue::m_Ptr->StatusMessageFormat("HubCommands::StartScript6", "<%s> *** %s %s: %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_pUser->m_sNick, LanguageManager::m_Ptr->m_sTexts[LAN_STARTED_SCRIPT], pChatCommand->m_sCommand);
			}

			if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == false || ((pChatCommand->m_pUser->m_ui32BoolBits & User::BIT_OPERATOR) == User::BIT_OPERATOR) == false)
			{
				pChatCommand->m_pUser->SendFormatCheckPM("HHubCommands::StartScript7", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
				        LanguageManager::m_Ptr->m_sTexts[LAN_SCRIPT], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_STARTED_LWR]);
			}
			return true;
		}
		else
		{
			pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StartScript8", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
			        LanguageManager::m_Ptr->m_sTexts[LAN_ERROR_SCRIPT], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_START_FAILED]);
			return true;
		}
	}

	UncountDeflood(pChatCommand);

	if (ScriptManager::m_Ptr->AddScript(pChatCommand->m_sCommand, true, true) == true && ScriptManager::m_Ptr->StartScript(ScriptManager::m_Ptr->m_ppScriptTable[ScriptManager::m_Ptr->m_ui8ScriptCount - 1], false) == true)
	{
		if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == true)
		{
			GlobalDataQueue::m_Ptr->StatusMessageFormat("HubCommands::StartScript9", "<%s> *** %s %s: %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_pUser->m_sNick, LanguageManager::m_Ptr->m_sTexts[LAN_STARTED_SCRIPT], pChatCommand->m_sCommand);
		}

		if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == false || ((pChatCommand->m_pUser->m_ui32BoolBits & User::BIT_OPERATOR) == User::BIT_OPERATOR) == false)
		{
			pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StartScript10", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
			        LanguageManager::m_Ptr->m_sTexts[LAN_SCRIPT], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_STARTED_LWR]);
		}
		return true;
	}
	else
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::StartScript11", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERROR_SCRIPT], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_START_FAILED]);
		return true;
	}
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::TempBan(ChatCommand * pChatCommand)   // !tempban nick time reason ... m = minutes, h = hours, d = day, w = weeks, M = months, Y = years
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::TEMP_BAN) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 11)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::TempBan", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %ctempban <%s> <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_NICK_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_TIME_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	pChatCommand->m_sCommand += 8;
	pChatCommand->m_ui32CommandLen -= 8;

	return TempBan(pChatCommand, false);
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::TempBanIp(ChatCommand * pChatCommand)   // !tempbanip nick time reason ... m = minutes, h = hours, d = day, w = weeks, M = months, Y = years
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::TEMP_BAN) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 14)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::TempBanIp", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %ctempbanip <%s> <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_IP], LanguageManager::m_Ptr->m_sTexts[LAN_TIME_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	pChatCommand->m_sCommand += 10;
	pChatCommand->m_ui32CommandLen -= 10;

	return TempBanIp(pChatCommand, false);
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::TempUnban(ChatCommand * pChatCommand)   // !tempunban nick/ip
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::TEMP_UNBAN) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 11 || pChatCommand->m_sCommand[10] == '\0')
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::TempUnban1", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %ctempunban <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_IP_OR_NICK], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen > 100)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::TempUnban2", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %ctempunban <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_IP_OR_NICK], LanguageManager::m_Ptr->m_sTexts[LAN_MAX_ALWD_NICK_LEN_64_CHARS]);
		return true;
	}

	pChatCommand->m_sCommand += 10;
	pChatCommand->m_ui32CommandLen -= 10;

	if (BanManager::m_Ptr->TempUnban(pChatCommand->m_sCommand) == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::TempUnban3", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SORRY], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_IS_NOT_IN_MY_TEMP_BANS]);
		return true;
	}

	UncountDeflood(pChatCommand);

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == true)
	{
		GlobalDataQueue::m_Ptr->StatusMessageFormat("HubCommands::TempUnban4", "<%s> *** %s %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_pUser->m_sNick, LanguageManager::m_Ptr->m_sTexts[LAN_REMOVED_LWR], pChatCommand->m_sCommand,
		        LanguageManager::m_Ptr->m_sTexts[LAN_FROM_TEMP_BANS]);
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == false || ((pChatCommand->m_pUser->m_ui32BoolBits & User::BIT_OPERATOR) == User::BIT_OPERATOR) == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::TempUnban5", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_sCommand,
		        LanguageManager::m_Ptr->m_sTexts[LAN_REMOVED_FROM_TEMP_BANS]);
	}

	return true;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::Topic(ChatCommand * pChatCommand)   // !topic text/off
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::TOPIC) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 7 || pChatCommand->m_sCommand[6] == '\0')
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::Topic1", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %ctopic <%s>, %ctopic <off>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_NEW_TOPIC], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	pChatCommand->m_sCommand += 6;
	pChatCommand->m_ui32CommandLen -= 6;

	UncountDeflood(pChatCommand);

	if (pChatCommand->m_ui32CommandLen > 256)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::Topic2", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %ctopic <%s>, %ctopic <off>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_NEW_TOPIC], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_MAX_ALWD_TOPIC_LEN_256_CHARS]);
		return true;
	}

	if (strcasecmp(pChatCommand->m_sCommand, "off") == 0)
	{
		SettingManager::m_Ptr->SetText(SETTXT_HUB_TOPIC, "", 0);

		GlobalDataQueue::m_Ptr->AddQueueItem(SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_NAME], SettingManager::m_Ptr->m_ui16PreTextsLens[SettingManager::SETPRETXT_HUB_NAME], NULL, 0, GlobalDataQueue::CMD_HUBNAME);

		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::Topic3", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_TOPIC_HAS_BEEN_CLEARED]);
	}
	else
	{
		SettingManager::m_Ptr->SetText(SETTXT_HUB_TOPIC, pChatCommand->m_sCommand, pChatCommand->m_ui32CommandLen);

		GlobalDataQueue::m_Ptr->AddQueueItem(SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_NAME], SettingManager::m_Ptr->m_ui16PreTextsLens[SettingManager::SETPRETXT_HUB_NAME], NULL, 0, GlobalDataQueue::CMD_HUBNAME);

		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::Topic4", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s: %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_TOPIC_HAS_BEEN_SET_TO], pChatCommand->m_sCommand);
	}

	return true;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::Unban(ChatCommand * pChatCommand)   // !unban nick/ip
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::UNBAN) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 7 || pChatCommand->m_sCommand[6] == '\0')
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::Unban1", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %cunban <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_IP_OR_NICK], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen > 106)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::Unban2", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %cunban <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_IP_OR_NICK], LanguageManager::m_Ptr->m_sTexts[LAN_MAX_ALWD_NICK_LEN_64_CHARS]);
		return true;
	}

	pChatCommand->m_sCommand += 6;
	pChatCommand->m_ui32CommandLen -= 6;

	if (BanManager::m_Ptr->Unban(pChatCommand->m_sCommand) == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::Unban3", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SORRY], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_IS_NOT_IN_BANS]);
		return true;
	}

	UncountDeflood(pChatCommand);

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == true)
	{
		GlobalDataQueue::m_Ptr->StatusMessageFormat("HubCommands::Unban4", "<%s> *** %s %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_pUser->m_sNick, LanguageManager::m_Ptr->m_sTexts[LAN_REMOVED_LWR], pChatCommand->m_sCommand,
		        LanguageManager::m_Ptr->m_sTexts[LAN_FROM_BANS]);
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == false || ((pChatCommand->m_pUser->m_ui32BoolBits & User::BIT_OPERATOR) == User::BIT_OPERATOR) == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::Unban5", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_sCommand,
		        LanguageManager::m_Ptr->m_sTexts[LAN_REMOVED_FROM_BANS]);
	}

	return true;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

bool HubCommands::Ungag(ChatCommand * pChatCommand)   // !ungag nick
{
	if (ProfileManager::m_Ptr->IsAllowed(pChatCommand->m_pUser, ProfileManager::GAG) == false)
	{
		SendNoPermission(pChatCommand);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen < 7 || pChatCommand->m_sCommand[6] == '\0')
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::DoCommand->ungag1", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %cungag <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_NICK_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_NO_PARAM_GIVEN]);
		return true;
	}

	if (pChatCommand->m_ui32CommandLen > 106)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::DoCommand->ungag2", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %cungag <%s>. %s!|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_SNTX_ERR_IN_CMD], SettingManager::m_Ptr->m_sTexts[SETTXT_CHAT_COMMANDS_PREFIXES][0], LanguageManager::m_Ptr->m_sTexts[LAN_NICK_LWR], LanguageManager::m_Ptr->m_sTexts[LAN_MAX_ALWD_NICK_LEN_64_CHARS]);
		return true;
	}

	pChatCommand->m_sCommand += 6;
	pChatCommand->m_ui32CommandLen -= 6;

	User * pOtherUser = HashManager::m_Ptr->FindUser(pChatCommand->m_sCommand, pChatCommand->m_ui32CommandLen);
	if (pOtherUser == NULL)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::DoCommand->ungag3", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERROR], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_IS_NOT_IN_USERLIST]);
		return true;
	}

	if (((pOtherUser->m_ui32BoolBits & User::BIT_GAGGED) == User::BIT_GAGGED) == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::DoCommand->ungag4", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> *** %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC],
		        LanguageManager::m_Ptr->m_sTexts[LAN_ERROR], pChatCommand->m_sCommand, LanguageManager::m_Ptr->m_sTexts[LAN_IS_NOT_GAGGED]);
		return true;
	}

	UncountDeflood(pChatCommand);

	pOtherUser->m_ui32BoolBits &= ~User::BIT_GAGGED;

	pOtherUser->SendFormat("HubCommands::DoCommand->ungag", pChatCommand->m_bFromPM, "<%s> %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], LanguageManager::m_Ptr->m_sTexts[LAN_YOU_ARE_UNGAGGED_BY], pChatCommand->m_pUser->m_sNick);

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == true)
	{
		GlobalDataQueue::m_Ptr->StatusMessageFormat("HubCommands::DoCommand->ungag", "<%s> *** %s %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pChatCommand->m_pUser->m_sNick, LanguageManager::m_Ptr->m_sTexts[LAN_HAS_UNGAGGED], pOtherUser->m_sNick);
	}

	if (SettingManager::m_Ptr->m_bBools[SETBOOL_SEND_STATUS_MESSAGES] == false || ((pChatCommand->m_pUser->m_ui32BoolBits & User::BIT_OPERATOR) == User::BIT_OPERATOR) == false)
	{
		pChatCommand->m_pUser->SendFormatCheckPM("HubCommands::DoCommand->ungag5", pChatCommand->m_bFromPM == true ? SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC] : NULL, true, "<%s> %s %s.|", SettingManager::m_Ptr->m_sPreTexts[SettingManager::SETPRETXT_HUB_SEC], pOtherUser->m_sNick,
		        LanguageManager::m_Ptr->m_sTexts[LAN_HAS_UNGAGGED]);
	}

	return true;
}

V1042 This file is marked with copyleft license, which requires you to open the derived source code.