Usando o script do Cjaker como base (e a descrição do tópico dele, na cara dura mesmo!), otimizei as operações no banco de dados (tava muito zuado) e adicionei um range de accounts protegidas pra evitar apagar os gms/samples/contas de spoofers do otservlist/etc... ;
Salve galera, mais um script para quem está precisando dar aquela limpada no banco de dados e otimizar o Servidor.
-- Especificações --
TFS 1.1+
Objetivo é limpar as contas inativas/vazias e os players Inativos assim removendo os usuários que estão inativos e ocupando espaço no banco de dados.
-- Instruções --
Em globalevents.xml insira essa linha
<globalevent type="startup" name="CleanDatabases" script="cleandatabase.lua" />
Crie um script chamado cleandatabase.lua na pasta globalevents/scripts e cole isso dentro dele.
---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by leu.
--- DateTime: 04/04/18 18:42
---
--[[ Clean Database by Cjaker | Refactor and SQL Optimizations by Leu ]]--
local inactiveMonths = 1 --> Quantos meses o player ficou inativo
local createdMonths = 1 --> Quantos meses a conta foi criada e não possui character criado.
local protectedAccIdEnd = 20 --ignorar accounts com id <= 20
local function clearInactivePlayers()
local inactiveTimestamp = os.time() - (86400 * (inactiveMonths*30))
local totalClear=0
local fromClause = "`players` WHERE `account_id` > ".. protectedAccIdEnd .." AND lastlogin <= "..inactiveTimestamp
local resultId = db.storeQuery("SELECT COUNT(*) as num_inativos FROM "..fromClause)
if resultId ~= false then
totalClear = result.getDataInt(resultId, 'num_inativos')
result.free(resultId)
if totalClear > 0 then
db.query("DELETE FROM "..fromClause)
end
end
return totalClear
end
local function clearEmptyAccounts()
local totalClear = 0
local createdTimestamp = os.time() - (86400 * (createdMonths*30))
local fromClause = "`accounts` ACCS WHERE `id` > ".. protectedAccIdEnd .." AND `creation` <= "..createdTimestamp.." AND (SELECT COUNT(*) from `players` WHERE `account_id` = ACCS.`id`) > 0"
local resultId = db.storeQuery("SELECT COUNT(*) as num_inativas FROM "..fromClause)
if resultId~= false then
totalClear = result.getDataInt(resultId,'num_inativas')
result.free(resultId)
if totalClear > 0 then
db.query("DELETE ACCS FROM "..fromClause)
end
end
return totalClear
end
function onStartup()
print('>> ' ..clearInactivePlayers().. " players inativos deletados.")
print('>> ' ..clearEmptyAccounts().. " contas vazias deletadas.")
end
é isso senhores, paganois, flw!
EDIT 24-04-2018: correção DELETE accs QUERY