Jump to content
Sign in to follow this  
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.

 

Share this post


Link to post
Majesty    1,755
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!

Share this post


Link to post
Guest
This topic is now closed to further replies.
Sign in to follow this  
  • Recently Browsing   0 members

    No registered users viewing this page.

×