Ir para conteúdo
  • Cadastre-se

(resolvido) Contas inativas serem excluidas automaticamente


Posts Recomendados

Eae pessoal, tudo tranquuilo?

Entao minha duvida é a seguinte.

Tenho um ot baiak onde muitas pessoas entram, jogam um pouco e depois saem e não voltam mais, só que a maioria continua, mas essas pessoas que saem e nao voltam, compram casas e deixam lá, aí os players que permanecem no ot querem comprar casas mas nao pode porque estao ocupadas.

Aí minha duvida é a seguinte:

Como posso fazer para que as contas inativas a pelo menos uma semana sejam excluidas automaticamente?

A versao do meu ot é 8.6

Link para o post
Compartilhar em outros sites

você tem que criar um script, mas se for apenas por conta das casas no config.lua você define se a renda da casa será por semana, dia, ou mês...

ai a cada 7 server saves completos se for semana a pessoa tem que ter tantos gps no dp ou no banco para não perder a casa...

Link para o post
Compartilhar em outros sites

Está ai a query

DELETE FROM `players` WHERE `level` < 50 AND `lastlogin` < UNIX_TIMESTAMP() - 20 * 24 * 60 * 60

Retirado.

 

Skype: joaoxtibia85.

Link para o post
Compartilhar em outros sites

Está ai a query

DELETE FROM `players` WHERE `level` < 50 AND `lastlogin` < UNIX_TIMESTAMP() - 20 * 24 * 60 * 60

Opa, brigadao pela ajuda, mas onde eu posso colocar este código?

no config.lua?

O nosso ot a gente usa sqlite pra editar as coisas, isso interfere em algo?

e como eu poderia configurar para excluir o character com 4 dias de inatividade?

Editado por leobrissac (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Nenhum faz o seguinte, ele deleta altomaticamente:

Em globalevents/script coloca:


------------------------------------------------------------------------------*

----- [[> Automated Database Cleanup 1.1 Structure //By Cybermaster <]] ------|

-------------- [[> System 2.0 Revamped by Teh Maverick <3 <]] ----------------|

------------- [[> Removal of empty accounts by darkaos  <]] ---------------|

--------------- [[> Function getDBPlayersCount() by Elf <]] ------------------|

------------------------------------------------------------------------------|

------------------------------------------------------------------------------|

--- ~!READ THIS!~ ------------------------------------------------------------|

--- Be sure to back up your database and test this on your server first, -----|

--- I(Teh Maverick) cannot guarantee it will work the same for every core. ---|

--- It is very easy to test, with the log file and values that are printed ---|

-----------------------------------Enjoy!-------------------------------------|

------------------------------------------------------------------------------*


function countRowsWhereInTable(table, field, condition)

local result = db.getResult("SELECT COUNT(" .. field .. ") as count FROM " .. table .. " WHERE " .. field .. " = '" .. condition .. "';")

local tmp = result:getDataInt("count")

result:free()

return tmp

end


function getDBPlayersCount()

local result = db.getResult("SELECT COUNT(id) as count FROM `players`;")

local tmp = result:getDataInt("count")

result:free()

return tmp

end


function getDBAccountsCount()

local result = db.getResult("SELECT COUNT(id) as count FROM `accounts`;")

local tmp = result:getDataInt("count")

result:free()

return tmp

end


function onstartup()

local DB_BEFORE = {players = getDBPlayersCount(), accounts = getDBAccountsCount()}

local result,result1, ii, numPlayersToDelete, numAccountsDeleted, tmp = 0, 0, 0, 0, 0

local pid, aid = {}, {}

local dropCount = {players={},accounts={}}


local config = {

deleteAccountWithNoPlayers = true,

cleanChildTables = true,

printResult = true,

saveResultToFile = true,

logFileName = 'db_cleanup.txt'

}


--In each table, players with below specified level, and days of inactivity will be deleted from db on server startup

local cleanup = {

[1] = {level = 100, time = 7 * 24 * 60 * 60},

[2] = {level = 300, time = 60 * 24 * 60 * 60}

}


local childAttributeTables = {

players = {

[1] = {table = "`player_viplist`", idField = "`player_id`"},

[2] = {table = "`player_storage`", idField = "`player_id`"},

[3] = {table = "`player_spells`", idField = "`player_id`"},

[4] = {table = "`player_skills`", idField = "`player_id`"},

[5] = {table = "`player_namelocks`", idField = "`player_id`"},

[6] = {table = "`player_items`", idField = "`player_id`"},

[7] = {table = "`player_depotitems`", idField = "`player_id`"},

[8] = {table = "`houses`", idField = "`owner`"},

[9] = {table = "`house_auctions`", idField = "`player_id`"},

[10] = {table = "`players`", idField = "`id`"} -- Keep this as the last item in the array

--Note: `houses` and `bans` are in the DB triggers for TFS so don't worry about them.

--Also I did not want to put killers, or deaths on here because that is historic data,

--do so at your ouwn risk.

},

accounts = {

[1] = {table = "`accounts`", idField = "`id`"},

[2] = {table = "`account_viplist`", idField = "`account_id`"}

}

}


--Clean up all the players and player data

for i = 1, #cleanup do

result = db.getResult("SELECT `id`,`name`,`account_id` FROM `players` WHERE `level` < ".. cleanup[i].level .." AND `name` NOT IN('Account Manager', 'Sorcerer Sample', 'Druid Sample', 'Paladin Sample', 'Knight Sample', 'Rook Sample') AND `group_id` < 2 AND `lastlogin` < UNIX_TIMESTAMP() - ".. cleanup[i].time ..";")

if(result:getID() ~= -1) then

ii = 1

repeat

pid[ii] = result:getDataInt("id") -- list the players id into an array

aid[ii] = result:getDataInt("account_id") -- list the account id of each player being removed into an array

ii = ii + 1

until not(result:next())

result:free()

end

numPlayersToDelete = ii - 1


--Drop players and their child table attribute data such as skills, items, etc.

for j = 1, numPlayersToDelete do


if(config.cleanChildTables) then

for k = 1, #childAttributeTables.players do

dropCount.players[k] = ((dropCount.players[k] or 0) + countRowsWhereInTable(childAttributeTables.players[k].table, childAttributeTables.players[k].idField, pid[j]))

db.executeQuery("DELETE FROM " .. childAttributeTables.players[k].table .. " WHERE " .. childAttributeTables.players[k].idField .. " = '" .. pid[j] .. "';")

end

else

db.executeQuery("DELETE FROM `players` WHERE `id` = '" .. pid[j] .. "';")

end

end

end


--Drop all the accounts that have 0 players linked to them (at the moment its only checking from the list of players removed)

if config.deleteAccountWithNoPlayers then

--This part was scripted by Darkhaos, modified/fixed by Teh Maverick --[[

for acc = 1, #aid do

result1 = db.getResult("SELECT `id` FROM `accounts` WHERE `id` = '" .. aid[acc] .. "';")

if result1:getID() ~= -1 then -- check to make sure the account exists

result1:free()

for i = 1, #childAttributeTables.accounts do

--Make sure there are no other players on the account

result1 = db.getResult("SELECT COUNT(id) as count FROM `players` WHERE `account_id` = '" .. aid[acc] .. "';")

tmp = result1:getDataInt("count")

if(tmp <= 0) then

--Remove accounts

dropCount.accounts[i] = ((dropCount.accounts[i] or 0) + countRowsWhereInTable(childAttributeTables.accounts[i].table, childAttributeTables.accounts[i].idField, aid[acc]))

db.executeQuery("DELETE FROM " .. childAttributeTables.accounts[i].table .. " WHERE " .. childAttributeTables.accounts[i].idField .. " = '" .. aid[acc] .. "';")

end

end

end

end

end

--]]


--Print and Save results (configurable)

local DB_NOW = {players = DB_BEFORE.players - getDBPlayersCount(), accounts = DB_BEFORE.accounts - getDBAccountsCount()}

if DB_NOW.players > 0 or DB_NOW.accounts > 0 then

local text = ">> [DBCLEANUP] " .. DB_NOW.players .. " inactive players" .. (config.deleteAccountWithNoPlayers and " and " .. DB_NOW.accounts .. " empty accounts" or "") .. " have been deleted from the database."


--Write to console

if config.printResult then

print("")

print(text)

if config.cleanChildTables then

--Write player info

for i = 1,#dropCount.players do

print("[!] --> Dropped: " .. dropCount.players[i] .. " from " .. childAttributeTables.players[i].table .. " table")

end

--Write account info

if config.deleteAccountWithNoPlayers then

for i = 1,#dropCount.accounts do

print("[!] --> Dropped: " .. dropCount.accounts[i] .. " from " .. childAttributeTables.accounts[i].table .. " table")

end

end

print("")

end

end


--Write to file

if config.saveResultToFile then


local file = io.open("data/logs/"..config.logFileName, "a")

file:write("[" .. os.date("%d %B %Y %X ", os.time()) .. "] " .. text .. "\n")


if config.cleanChildTables then

--Write player info

for i = 1, #dropCount.players do

file:write("[!] --> Dropped: " .. dropCount.players[i] .. " from " .. childAttributeTables.players[i].table .. " table\n")

end

--Write account info

if config.deleteAccountWithNoPlayers then

for i = 1, #dropCount.accounts do

file:write("[!] --> Dropped: " .. dropCount.accounts[i] .. " from " .. childAttributeTables.accounts[i].table .. " table\n")

end

end

file:write("\n")

end

file:close()

end

end

return true

end

[/code]




Ai no mesmo lugar vc cria um arquivo .txt com o nome db_cleanup...



Tag:

[code] <globalevent name="dbcleaner" type="startup" event="script" value="dbcleaner.lua"/>
Você só vai editar isso:

[1] = {level = 100, time = 7 * 24 * 60 * 60},

[2] = {level = 300, time = 60 * 24 * 60 * 60}

Level minimo e o tempo...

Por exemplo: level 100- deletar acada 7 dias de inativo... level 300- deletar acada 2 meses de inativo...

Link para o post
Compartilhar em outros sites

ai no caso se eu quiser que os com lvl menor que 200 sejam excluidos eu deixo assim?

[1] = {level = 100, time = 7 * 24 * 60 * 60},

[2] = {level = 200, time = 60 * 24 * 60 * 60}

Link para o post
Compartilhar em outros sites

pra que vc escreveu "só que a maioria continua" , vc quer mostrar que é foda?

dava pra vc ter escrito assim:

Tenho um ot baiak onde muitas pessoas entram, jogam um pouco e depois saem e não voltam mais, mas essas pessoas que saem e nao voltam, compram casas e deixam lá, aí os players que permanecem no ot querem comprar casas mas nao pode porque estao ocupadas.

Editado por MonsterOt (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

pra que vc escreveu "só que a maioria continua" , vc quer mostrar que é foda?

dava pra vc ter escrito assim:

Tenho um ot baiak onde muitas pessoas entram, jogam um pouco e depois saem e não voltam mais, mas essas pessoas que saem e nao voltam, compram casas e deixam lá, aí os players que permanecem no ot querem comprar casas mas nao pode porque estao ocupadas.

Vish cara calma ae, eu tentei explicar o que tava acontecendo comigo e pedi ajuda, se eu fosse foda nem pedindo ajuda eu estaria.

Porque vc pego tanta pilha assim só por causa de uma colocação minha?

Link para o post
Compartilhar em outros sites

ai no caso se eu quiser que os com lvl menor que 200 sejam excluidos eu deixo assim?

[1] = {level = 100, time = 7 * 24 * 60 * 60},

[2] = {level = 200, time = 60 * 24 * 60 * 60}

Exato.

pra que vc escreveu "só que a maioria continua" , vc quer mostrar que é foda?

dava pra vc ter escrito assim:

Tenho um ot baiak onde muitas pessoas entram, jogam um pouco e depois saem e não voltam mais, mas essas pessoas que saem e nao voltam, compram casas e deixam lá, aí os players que permanecem no ot querem comprar casas mas nao pode porque estao ocupadas.

Brigas não é aqui, se quiser falar algo, por favor envie um PM para ele ao invez de postar bobagem, isto é considerado flood. Leia as regras gerais, obrigado.

Link para o post
Compartilhar em outros sites

Olá, só uma dúvida, as contas que já estavam inativas há mais de uma semana, já eram para ter sido excluidas, pois eu configurei para que os players fossem deletados com 5 dias de inatividade mesmo com o lvl menor para o que eu configurei?

Link para o post
Compartilhar em outros sites

Não entendi muito bem no final da sua pergunta. Poderia expecifica-la?

Assim. Tem contas no servidor que já estão inativas a mais de uma semana e não foram excluidas ainda. Não seria melhor se tivesse como configurar esse tempo para segundos? Aí no caso eu colocaria para deletar as contas com "tantos" segundos de inatividade. Só que os segundos seriam equivalentes a uma semana.

Pois do jeito que está, tem contas com mais de uma semana de inatividade e não foram excluidas ainda.

Editado por leobrissac (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

gostaria de saber se funciona em mysql e que tabela tem que add...

ou soh os arqivos q precisa add?

e tbm gostaria de saber como faço pra editar assim

lvl 100 menos... deleta se em 1 semana

lvl 200 menos deleta se em 2 semanas..

level 300 menos deleta se em 3 semanas..

lvl 500 menos deleta se em 1 mes..

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo