--//----------------------------------------//--
--//-- Регистрация v 2.0 (PtokaX > 0.3.6.0d)
--//-- Автор: DestroyNet © 09.10.2007
--//-- Базируется на скрипте от NRJ (22.09.06)
--//----------------------------------------//--
--[[
Возможность блокировать незареганым поиск/скачку/Чат (по выбору)
--
Выбор метода регистрации: самоличная/требуется подтверждение Оператора
--
При отказе в регистрации ника оператор может указать причину,
если юзер успел уйти с хаба, причину отказа ему покажет при следующем заходе
]]


--[[		Конфигурация					]]--
sBot		= ""	-- оставить "" чтобы взять ник бота хаба
--//----------------------------------------//--
BlockSearch = 1 -- Блокировать поиск незарегесрированным
BlockDL		= 1 -- Блокировать скачку незарегесрированным
BlockChat	= 1 -- Блокировать чат незарегесрированным
--//----------------------------------------//--
ShowInfo	= 1	-- позазывать дополнительную информацию о том, как можно избежать повторных вводов пароля при входе на хаб
ShowToAll	= 0	-- показывать всем пользователям, что на хабе новый зарегистрированный участник
--//----------------------------------------//--
RegMode		= 0 -- 1 - Пользователь может сам зарегестрироваться / 0 - Требуеться подтверждение оператора
--//----------------------------------------//--
NeedRegFile	= "Registration.dat"
--//----------------------------------------//--
-- Сообщение показываемое незарегестрированным пользователям
rMsg = "\r\n"..
		"\t"..string.rep("«»", 30).."\r\n"..
		"\t\tВЫ НЕ ЗАРЕГИСТРИРОВАНЫ НА ХАБЕ ! ! !\r\n"..
		"\t"..string.rep("«»", 30).."\r\n"..
		"\tНе зарегестрированным пользователям запрещены поиск, скачка файлов и общение в чате\r\n"..
		"\tДля регистрации на хабе отправьте запрос операторам\r\n"..
		"\t\r\n"..
		"\tПомощь по регистрации: !reghelp\r\n\r\n"..
		"\t"..string.rep("«»", 30)
--//----------------------------------------//--

--[[	Основной Код скрипта				]]--
--[[	Не редактируйте если не уверены		]]--
NeedReg = {}

na = "n/a"
tShareUnits = {"Б", "КБ", "МБ", "ГБ", "ТБ", "ПБ"}

tOpPrifiles = {
	[0] = true,
	[1] = true,
}

function OnStartup()
	sPtokaXsPath = Core.GetPtokaXPath():g("/", "\\")
	sScriptsPath = sPtokaXsPath.."scripts\\"
	if sBot == "" then
		sBot = SetMan.GetString(21)
	end
	if loadfile(sScriptsPath..NeedRegFile) then
		dofile(sScriptsPath..NeedRegFile)
	end
	TmrMan.AddTimer(1000, "ClearMemory")
end

function DoShareUnits(iSize)
	local iTableSize = #tShareUnits
	iSize = tonumber(iSize)
	local sUnits = ""
	for iTablePos = 1, iTableSize do
		if iSize < 1024 or iTablePos == iTableSize then
			sUnits = tShareUnits[iTablePos]
			break
		else
			iSize = iSize / 1024
		end
	end
	local sSize = string.format("%0.2f %s", iSize, sUnits)
	sSize = string.gsub(sSize, "%.", ",")
	local _,_, s1stChar, s2ndChar = string.find(sSize, "%d+,(%d)(%d)")
	s1stChar, s2ndChar = tonumber(s1stChar), tonumber(s2ndChar)
	if s2ndChar == 0 then
		sSize = string.gsub(sSize, ","..s1stChar..s2ndChar, ","..s1stChar)
		if s1stChar == 0 then
			sSize = string.gsub(sSize, ","..s1stChar, "")
		end
	end
	return sSize
end

function ClearMemory()
	collectgarbage("collect")
end

function Return(sData)
	if type(sData) == "function" then
		return sData
	end
	return function()
		return sData
	end
end

string.g = function(sData, s1, s2)
	return sData:gsub(s1, Return(s2))
end

function OnExit()
	local hFile = io.open(sScriptsPath..NeedRegFile, "w+")
	Serialize(NeedReg, "NeedReg", hFile)
	hFile:close()
end

function UserConnected(curUser)
	if curUser.iProfile == -1 then
		if NeedReg[curUser.sNick] then
			if NeedReg[curUser.sNick].Reason ~= "" then
				local tReason = NeedReg[curUser.sNick].Reason
				Core.SendPmToNick(curUser.sNick, sBot, "Ваш запрос на регистрацию ника '"..curUser.sNick.."' был отклонен. Причина: "..tReason)
				NeedReg[curUser.sNick] = nil
			else
				Core.SendToOpChat("Пользователь "..curUser.sNick.." ("..curUser.sIP..") ожидает подтверждения регистрации ника.\r\n"..
					"Для подтверждения напишите: !reguser "..curUser.sNick.."\r\n"..
					"Для отказа в регистрации: !noreg "..curUser.sNick.." <причина>")
			end
		end			
		Core.SendPmToNick(curUser.sNick, sBot, rMsg)
		Core.SendToUser(curUser, "$UserCommand 1 1 Регистрация\\Зарегистрироваться$<%[mynick]> !regme %[line:Введите пароль или оставьте поле пустым]&#124;")
	else
		Core.SendToUser(curUser, "$UserCommand 1 1 Регистрация\\Сменить пароль$<%[mynick]> !passwd %[line:Введите новый пароль]&#124;")
		Core.SendToUser(curUser, "$UserCommand 1 1 Регистрация\\Удалить регистрацию$<%[mynick]> !unreg&#124;")
		if tOpPrifiles[curUser.iProfile] then
			for i,v in pairs(NeedReg) do
				if v.Reason == "" then
					Core.SendPmToNick(curUser.sNick, sBot, "Пользователь "..i.." ("..v.IP..") подал запрос на регистрацию ника.\r\n"..
							(v.AddInfo or "")..
							"Для подтверждения напишите: !reguser "..i.."\r\n"..
							"Для отказа в регистрации: !noreg "..i.." <причина>")
				end
			end
		end
	end
end
RegConnected = UserConnected
OpConnected = UserConnected

function ChatArrival(curUser, sData)
	Core.GetUserAllData(curUser)
	local sData = string.sub(sData, 1, -2)
	local s,e,cmd =string.find(sData, "%b<>%s+(%S+)")
	if RegMode == 1 then
		if cmd == "!regme" then
			if curUser.iProfile == -1 then
				local s,e,pass = string.find(sData, "%b<>%s+%S+%s+(%S+)")
				if pass == nil then	
					local pass = math.random(os.date("%H%M%S"))
				end
				RegMan.AddReg(curUser.sNick, pass.."", 3)
				Core.SendToUser(curUser, "<"..sBot.."> Вы были зарегистрированы на хабе. Ваш ник:"..curUser.sNick.." Пароль: "..pass..". Не забудьте перезайти на хаб!")
				if ShowInfo == 1 then
					Core.SendToUser(curUser, "<"..sBot.."> Теперь для входа на хаб под вашим ником необходимо знать пароль. Вы можете вводить его каждый раз вручную, либо прописать пароль в настройках клиента. Для этого найдите в списке избранных хабов этот хаб, зайдите в его свойства и пропишите в строках Nick и Password ваши ник и пароль.")
				end
				if ShowToAll == 1 then
					Core.SendToAll("<"..sBot.."> Приветствуем нового зарегистрированого участника - "..curUser.sNick.." !!!")
				end
			else
				Core.SendToUser(curUser, "<"..sBot.."> Вы уже зарегистрированы!")
			end
			return true
		end
	else
		if cmd == "!regme" then
			if curUser.iProfile == -1 then
				if NeedReg[curUser.sNick] then
					Core.SendToUser(curUser, "<"..sBot.."> Заявка на регистрацию ника '"..curUser.sNick.."' уже рассматривается!")
				else
					local s,e,pass = string.find(sData, "%b<>%s+%S+%s+(%S+)")
					if pass == nil then	
						pass = math.random(os.date("%H%M%S"))
					end
					local sAddInfo = "\tШара: "..DoShareUnits(Core.GetUserValue(curUser, 16) or 0).."\r\n"..
						"\tОписание: "..(Core.GetUserValue(curUser, 2) or na).."\r\n"..
						"\tEmail: "..(Core.GetUserValue(curUser, 5) or na).."\r\n"..
						"\tТег: "..(Core.GetUserValue(curUser, 3) or na).."\r\n"
					NeedReg[curUser.sNick] = {
						Nick = curUser.sNick,
						IP = curUser.sIP,
						Password = pass,
						Reason = "",
						AddInfo = sAddInfo,
					}
					Core.SendToUser(curUser, "<"..sBot.."> Ваша заявка на регистрацию ника успешно отправлена.\r\n"..
						"Параметры заявки:\r\n"..
						"Ник: "..curUser.sNick.."\r\n"..
						"Пароль: "..pass.."\r\n"..
						"Не забудьте эти данные, после подтверждения регистрации, вы не сможете зайти на хаб под этим ником незная пароля!")
					Core.SendToOpChat("Пользователь "..curUser.sNick.." ("..curUser.sIP..") подал запрос на регистрацию ника.\r\n"..
						(sAddInfo or "")..
						"Для подтверждения напишите: !reguser "..curUser.sNick.."\r\n"..
						"Для отказа в регистрации: !noreg "..curUser.sNick.." <причина>")
				end
			else
				Core.SendToUser(curUser, "<"..sBot.."> Вы уже зарегистрированы!")
			end
			return true
		end
	end
	if cmd == "!unreg" then
		if curUser.iProfile ~= -1 then
			RegMan.DelReg(curUser.sNick)
			Core.SendToUser(curUser, "<"..sBot.."> Ваш аккаунт был был удален")
		else
			Core.SendToUser(curUser, "<"..sBot.."> Команда доступна только для зарегистрированных пользователей!")
		end
		return true
	elseif cmd == "!reghelp" then
		local hMsg = "\r\n\r\n"..
		"\t"..string.rep("«»", 30).."\r\n"..
		"\t\tПомощь по регистрации\r\n"..
		"\t"..string.rep("«»", 30).."\r\n\r\n"..
		"\t!reghelp\t\t - Этот файл помощи\r\n"..
		"\t!regme <пасс>\t - Зарегистрироваться (можно не указывать пасс)\r\n"..
		"\t!passwd <пасс>\t - Сменить пароль\r\n"..
		"\t!unreg\t\t - Удалить аккаунт\r\n\r\n"..
		"\tТакже все команды доступны в меню хаба:\r\n"..
		"\tНажмите правой кнопкой на закладке хаба\r\n"..
		"\tи выбирете подменю 'Регистрация'\r\n"..
		"\t"..string.rep("«»", 30)
		Core.SendPmToNick(curUser.sNick, sBot, hMsg)
		return true
	elseif cmd == "!reguser" then
		if tOpPrifiles[curUser.iProfile] then
			local s,e,rNick = string.find(sData, "%b<>%s+%S+%s+(%S+)")
			if NeedReg[rNick] then
				local pass = NeedReg[rNick].Password
				RegMan.AddReg(rNick, pass.."", 3)
				NeedReg[rNick] = nil
				if Core.GetUser(rNick) then
					Core.SendPmToNick(rNick, sBot, "Ваш запрос на регистрацию ника был одобрен.\r\n"..
						"Параметры заявки:\r\n"..
						"Ник:"..rNick.."\r\n"..
						"Пароль: "..pass..". Не забудьте перезайти на хаб!")
					if ShowInfo == 1 then
						Core.SendToNick(rNick, "<"..sBot.."> Теперь для входа на хаб под вашим ником необходимо знать пароль. Вы можете вводить его каждый раз вручную, либо прописать пароль в настройках клиента.\r\n"..
							"Для этого найдите в списке избранных хабов этот хаб, зайдите в его свойства и пропишите в строках Nick и Password ваши ник и пароль.")
					end
					if ShowToAll == 1 then
						Core.SendToAll("<"..sBot.."> Приветствуем нового зарегистрированого участника - "..rNick.."!")
					end
				end
				Core.SendToOpChat("Заявка на регистрацию ника '"..rNick.."' подтверждена. ("..curUser.sNick..")")
			else
				Core.SendToUser(curUser, "<"..sBot.."> Заявка на регистрацию ника '"..rNick.."' не найдена.")
			end			
		else
			
		end
		return true
	elseif cmd == "!noreg" then
		if tOpPrifiles[curUser.iProfile] then
			local s,e,rNick,tReason = string.find(sData, "%b<>%s+%S+%s+(%S+)%s+(.*)")
			if NeedReg[rNick] then
				local nrIP = NeedReg[rNick].IP
				local nrPASS = NeedReg[rNick].Password
				NeedReg[rNick].Reason = tReason
				if Core.GetUser(rNick) then
					Core.SendPmToNick(rNick, sBot, "Ваш запрос на регистрацию ника был отклонен. Причина: "..tReason)
					NeedReg[rNick] = nil
				end
				Core.SendToOpChat("Заявка на регистрацию ника '"..rNick.."' отвергнута. Причина: "..tReason.." ("..curUser.sNick..")")
			else
				Core.SendToUser(curUser, "<"..sBot.."> Заявка на регистрацию ника '"..rNick.."' не найдена.")
			end			
		end
		return true
	end
	if BlockChat == 1 and curUser.iProfile == -1 then
		Core.SendToUser(curUser, "<"..sBot.."> Зарегестрируйтесь для получения возможности общаться в чате. Помощь по регистрации: !reghelp")
		return true
	end
end

function ConnectToMeArrival(curUser, sData)
	if BlockDL == 1 and curUser.iProfile == -1 then
		Core.SendToUser(curUser, "<"..sBot.."> Зарегестрируйтесь для получения возможности скачивать файлы")
		return true
	end
end
MultiConnectToMeArrival = ConnectToMeArrival
RevConnectToMeArrival = ConnectToMeArrival

function SearchArrival(curUser, sData)
	if BlockSearch== 1 and curUser.iProfile == -1 then
		Core.SendToUser(curUser, "<"..sBot.."> Зарегестрируйтесь для получения возможности пользоваться поиском")
		return true
	end
end
SRArrival = SearchArrival

function Serialize(tTable, sTableName, hFile, sTab)
	sTab = sTab or "";
	hFile:write(sTab..sTableName.." = {\n");
	for key, value in pairs(tTable) do
		if (type(value) ~= "function") then
			local sKey = (type(key) == "string") and string.format("[%q]", key) or string.format("[%d]", key);
			if(type(value) == "table") then
				Serialize(value, sKey, hFile, sTab.."\t");
			else
				local sValue = (type(value) == "string") and string.format("%q", value) or tostring(value);
				hFile:write(sTab.."\t"..sKey.." = "..sValue);
			end
			hFile:write(",\n");
		end
	end
	hFile:write(sTab.."}");
end
