Ir para conteúdo
Entre para seguir isso  
Movie

[TFS 1.X] AntiBot

Recommended Posts

Movie    5
Movie

[AntiBot]

VlVKQKC.png.c3d54634f6e97f7b4999481291da99d3.png

Fiz esse sistema para o Thunder porém vou deixá-lo a parte nesse tópico aqui para quem quiser implementar em seu otserv.

Lembrando que esse sistema é para TFS 1.X e qualquer sugestão/problema nesse sistema, deve ser reportado no GitHub.

VlVKQKC.png.c3d54634f6e97f7b4999481291da99d3.png

Crie um arquivo na pasta lib com o nome antibot.lua

ANTIBOT = {
	prefix = "[AntiBot] ",
	questions = {
		{question = "Qual o ano que começou o COVID-19?", staticAnswer = true, answer = "2019"},
		{question = "Qual seu skill atual de Sword?", skill = true, answer = SKILL_SWORD},
		{question = "Qual seu skill atual de Club?", skill = true, answer = SKILL_CLUB},
		{question = "Qual seu skill atual de Distance?", skill = true, answer = SKILL_DISTANCE},
		{question = "Qual seu level atual?", answer = "level"},
		{question = "Qual o dia de hoje?", answer = "day"},
	},
	playerQuestion = {},
	messages = {
		time = "Você possui %s para responder a pergunta.",
		chat = "Esse chat só pode ser usado durante a verificação.",
		howAnswer = "Você deve responder somente a resposta, por exemplo: Qual o dia de hoje? Resposta: %d",
		correctAnswer = "Você acertou a pergunta. Obrigado.",
		incorrectAnswer = "Você errou a resposta, você ainda possui %d tentativas.",
		logout = "Você não pode deslogar enquanto hover uma verificação ativa.",
	},
	punishment = {
		try = {
			max = 3,
			reason = "Quantidade excessiva de tentativas.",
			timePunishment = 1, -- In days
			players = {},
		},
		time = {
			maxTime = 180, -- In seconds
			reason = "Não respondeu a pergunta dentro do tempo estipulado.",
			timePunishment = 2, -- In days
			players = {},
		},
	},
	verification = {40, 60}, -- in minutes
}

function ANTIBOT:addTry(playerId)

	local player = Player(playerId)

	if not player then 
		return false
	end

	playerId = player:getId()

	if not ANTIBOT.punishment.try.players[playerId] then
		ANTIBOT.punishment.try.players[playerId] = 0
	end

	ANTIBOT.punishment.try.players[playerId] = ANTIBOT.punishment.try.players[playerId] + 1

	if ANTIBOT.punishment.try.players[playerId] and ANTIBOT.punishment.try.players[playerId] >= ANTIBOT.punishment.try.max then
		sendChannelMessage(13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.punishment.try.reason)
		ANTIBOT:addPunishment(playerId)
	end
end

function ANTIBOT:time(playerId)
	local player = Player(playerId)

	if not player then
		ANTIBOT:reset(playerId)
		return false
	end

	playerId = player:getId()

	if not ANTIBOT.punishment.time.players[playerId] then
		ANTIBOT.punishment.time.players[playerId] = 0
		ANTIBOT:sendQuestions(playerId)
	end

	addEvent(function()
		if ANTIBOT.punishment.time.players[playerId] and ANTIBOT.punishment.time.players[playerId] >= 0 and ANTIBOT.punishment.time.players[playerId] < ANTIBOT.punishment.time.maxTime then
			ANTIBOT.punishment.time.players[playerId] = ANTIBOT.punishment.time.players[playerId] + 1
			player:sendCancelMessage(ANTIBOT.prefix .. ANTIBOT.messages.time:format(string.diff(ANTIBOT.punishment.time.maxTime - ANTIBOT.punishment.time.players[playerId], true)))
			ANTIBOT:time(playerId)
		end
	end, 1000)

	if ANTIBOT.punishment.time.players[playerId] and ANTIBOT.punishment.time.players[playerId] >= ANTIBOT.punishment.time.maxTime then
		ANTIBOT:addPunishment(playerId)
	end

end

function ANTIBOT:sendQuestions(playerId)

	local player = Player(playerId)

	if not player then
		return false
	end

	playerId = player:getId()

	random = math.random(#ANTIBOT.questions)

	ANTIBOT.playerQuestion[playerId] = random

	player:say("ANTIBOT", TALKTYPE_MONSTER_SAY)
	player:openChannel(13)
	addEvent(sendChannelMessage, 500, 13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.howAnswer:format(os.date("%d")))
	addEvent(sendChannelMessage, 800, 13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.questions[random].question)
end

function ANTIBOT:reset(playerId)
	ANTIBOT.punishment.try.players[playerId] = nil
	ANTIBOT.punishment.time.players[playerId] = nil
	ANTIBOT.playerQuestion[playerId] = nil
end

function ANTIBOT:addPunishment(playerId)

	local player = Player(playerId)
	if not player then 
		return false
	end

	playerId = player:getId()

	local accountId = getAccountNumberByPlayerName(player:getName())
	if accountId == 0 then
		return false
	end

	local resultId = db.storeQuery("SELECT 1 FROM `account_bans` WHERE `account_id` = " .. accountId)
	if resultId ~= false then
		result.free(resultId)
		return false
	end

	local timeNow = os.time()

	if ANTIBOT.punishment.try.players[playerId] and ANTIBOT.punishment.try.players[playerId] >= ANTIBOT.punishment.try.max then
		db.query("INSERT INTO `account_bans` (`account_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" ..
			accountId .. ", " .. db.escapeString(ANTIBOT.prefix .. ANTIBOT.punishment.try.reason) .. ", " .. timeNow .. ", " .. timeNow + (ANTIBOT.punishment.try.timePunishment * 86400) .. ", " .. player:getGuid() .. ")")
	elseif ANTIBOT.punishment.time.players[playerId] and ANTIBOT.punishment.time.players[playerId] >= ANTIBOT.punishment.time.maxTime then
		db.query("INSERT INTO `account_bans` (`account_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" ..
			accountId .. ", " .. db.escapeString(ANTIBOT.prefix .. ANTIBOT.punishment.time.reason) .. ", " .. timeNow .. ", " .. timeNow + (ANTIBOT.punishment.time.timePunishment * 86400) .. ", " .. player:getGuid() .. ")")
	end

	ANTIBOT:reset(playerId)
	player:save()
	player:getPosition():sendMagicEffect(CONST_ME_POFF)
	player:remove()
end

Não esqueça de registrar essa lib no arquivo lib.lua

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

Na pasta chachannels/scripts crie um arquivo chamado antibot.lua

function onJoin(player)
	if not ANTIBOT.playerQuestion[player:getId()] then
		player:sendTextMessage(5, ANTIBOT.prefix .. ANTIBOT.messages.chat)
		player:getPosition():sendMagicEffect(CONST_ME_POFF)
		return false
	end
	return true
end

function onLeave(player)
	if ANTIBOT.playerQuestion[player:getId()] then
		return false
	end
	return true
end


function onSpeak(player, type, message)
	if not ANTIBOT.playerQuestion[player:getId()] then
		sendChannelMessage(13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.chat)
		player:getPosition():sendMagicEffect(CONST_ME_POFF)
		return false
	end

	local question = ANTIBOT.questions[ANTIBOT.playerQuestion[player:getId()]]

	if question.skill then
		correctAnswer = tonumber(player:getSkillLevel(question.answer))
		message = tonumber(message)
	elseif question.answer == "level" then
		correctAnswer = tonumber(player:getLevel())
		message = tonumber(message)
	elseif question.answer == "day" then
		correctAnswer = tonumber(os.date("%d"))
		message = tonumber(message)
	elseif question.staticAnswer then
		message = message:lower()
		correctAnswer = question.answer:lower()
	end

	verification = false

	if message == correctAnswer then
		verification = true
	end

	if verification then
		addEvent(sendChannelMessage, 200, 13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.correctAnswer)
		ANTIBOT:reset(player:getId())
	else
		ANTIBOT:addTry(player:getId())
		addEvent(function()
			if ANTIBOT.punishment.try.players[player:getId()] and ANTIBOT.punishment.try.players[player:getId()] < ANTIBOT.punishment.try.max and player then
				sendChannelMessage(13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.incorrectAnswer:format(ANTIBOT.punishment.try.max - ANTIBOT.punishment.try.players[player:getId()]))
			end
		end, 100)
	end

	return true
end
<channel id="13" name="AntiBot" script="antibot.lua" />

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

Agora na pasta creaturescripts/scripts crie um arquivo chamado antibot.lua

function onLogin(player)

	if player:getAccountType() >= ACCOUNT_TYPE_GAMEMASTER then
		return true
	end

	player:registerEvent("AntiBot")
	checkAnti(player:getId())
	
	return true
end

function checkAnti(playerId)
	local player = Player(playerId)
	if not player then
		return false
	end

	min, max = ANTIBOT.verification[1], ANTIBOT.verification[2]
	random = math.random(min, max)

	addEvent(function()
		ANTIBOT:time(player:getId())
		checkAnti(player:getId())
	end, random * 60 * 1000)
end
<event type="login" name="AntiBot" script="antibot.lua" />

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

Agora no arquivo logout.lua na pasta creaturescripts/scripts

antes do return true adicione isso

if ANTIBOT.punishment.try.players[player:getId()] or ANTIBOT.punishment.time.players[player:getId()] then
	player:sendTextMessage(MESSAGE_INFO_DESCR, ANTIBOT.prefix .. ANTIBOT.messages.logout)
	player:getPosition():sendMagicEffect(CONST_ME_POFF)
	return false
end
ANTIBOT:reset(player:getId())

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

Sistema 100% feito por mim.

 

Compartilhar este post


Link para o post
Majesty    1755
Majesty

Muito obrigado pela sua contribuição, seu conteúdo foi aprovado!
Nós do OTServ Brasil agradecemos, seu conteúdo com certeza ajudará a muitos outros. 
Você recebeu +1 REP!

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×