#include <regex>

static const String:g_sLogPath[] = "addons/sourcemod/logs/admin_password_checker.log";
new String:sInfoVar[32];

public Plugin:myinfo = 
{
	name = "Admin Password Checker", 
	author = "Danyas",
	version = "1.3.1"
}

public OnPluginStart()
{
	if (!GetPassInfoVar(sInfoVar, sizeof(sInfoVar)))
	{
		SetFailState("PassInfoVar не найден в файле core.cfg");
	}
//	else	LogMessage("Переменная PassInfoVar имеет значение '%s'",sInfoVar);
}

public Action:OnClientPreAdminCheck(client)
{
	if (client > 0)
	{
		decl String:sBuff[64], String:sPassword[64];
		GetClientAuthId(client, AuthId_Engine, sBuff, sizeof(sBuff));
		new AdminId:admin = FindAdminByIdentity(AUTHMETHOD_STEAM, sBuff);
		if (admin != INVALID_ADMIN_ID)
		{
			if (GetAdminPassword(admin, sPassword, sizeof(sPassword)))
			{
				if(GetClientInfo(client, sInfoVar, sBuff, sizeof(sBuff)) && sBuff[0] != 0)
				{
					if (!StrEqual(sPassword, sBuff))
					{
						KickClient(client, "Вы ввели неверный пароль! 'setinfo %s ПАРОЛЬ'", sInfoVar);
						LogToFileEx(g_sLogPath, "%L<%s> Пытался зайти с паролем %s", client, GetClientIP(client, sPassword, 21) ? sPassword : "?", sBuff);
					}
				}
				else 
				{
					KickClient(client, "Введите пароль в консоле. 'setinfo %s ПАРОЛЬ'", sInfoVar);
					LogToFileEx(g_sLogPath, "%L<%s> Пытался зайти без пароля", client, GetClientIP(client, sPassword, 21) ? sPassword : "?");
				}
			}
			//else PrintToServer("Админ без пароля");
		}
		//else PrintToServer("INVALID_ADMIN_ID");
	}
}


bool:GetPassInfoVar(String:value[], maxlength)
{
	new Handle:file = OpenFile("addons/sourcemod/configs/core.cfg", "rt");
	if (file != INVALID_HANDLE)
	{
		new Handle:re = CompileRegex("^\\s+\"PassInfoVar\"\\s+\"(\\w+)\""); // ([^\"]*)
		if (re != INVALID_HANDLE)
		{
			decl String:buffer[PLATFORM_MAX_PATH];
			while (!IsEndOfFile(file) && ReadFileLine(file, buffer, sizeof(buffer)))
			{
				if (MatchRegex(re, buffer) > 0 && GetRegexSubString(re, 1, value, maxlength))
				{
					CloseHandle(re);
					CloseHandle(file);
					return true;
				}
			}
			CloseHandle(re);
		}
		CloseHandle(file);
	}
	return false;
}