Jump to content

Verificar quantidade de contas


Recommended Posts

function countPlayerAccount(player)
	local result = 0
	local serial = getPlayerSerial(player)
	for _, account in ipairs(getAccounts()) do
		if getAccountData(account, "serial") == serial then
			result = result + 1
		end
	end
	return result
end

Fiz essa função há um tempo para não permitir criar mais de 2 contas por serial, porém esse loop do getAccounts() laga o servidor quando executado, qual outra possibilidade de fazer isso?

Link to comment
  • Other Languages Moderators

Bom, eu uso esse painel de login que também só permite 1 conta por serial. Na parte de registrar contas, ele verifica se já existe uma conta com o serial do jogador que está tentando registrar uma conta. Se tiver, bloqueia o registro e pede para que ele logue nela.

Em vez de você usar getAccountData que é um pouco pesado de processar, use a função getAccountsBySerial, que retorna todas as contas que possuem o serial específico. Se existe alguma, então cancela o registro do jogador e pede para que ele logue nela.

local myAccounts = getAccountsBySerial (getPlayerSerial (client)) -- myAccounts é uma table com todas as contas que existem com o serial do jogador.
if myAccounts[1] then -- Se existe o primeiro item da table, então:
	outputChatBox ("Você já tem uma conta registrada. Logue nela: "..getAccountName(myAccounts[1]), client) -- Manda isso no chat do jogador, informando o login da conta que já existe.
end

 

  • Thanks 1
Link to comment
  • Other Languages Moderators

O melhor a se fazer é criar um banco de dados com as contas dos jogadores. Sendo assim, com um SELECT (bem escrito), levaria menos de 1 segundo para realizar uma verificação.

  • Like 1
Link to comment
  • Other Languages Moderators
41 minutes ago, asrzk said:

O melhor a se fazer é criar um banco de dados com as contas dos jogadores.

Discordo.

Não acho útil criar outro banco de dados para colocar as contas dos jogadores. Não tem motivo algum pra fazer isso. É melhor usar o banco de dados nativo para isso.

Edited by Lord Henry
  • Like 2
Link to comment
  • Other Languages Moderators
1 minute ago, Lord Henry said:

Discordo.

Por que discorda. Lord?

Para mim, banco de dados além de ser um ótimo recurso para armazenar dados e obtê-los de forma rápida, as chances de você perder os dados são menores. Já dados salvos na internal ou registry, podem ser perdidos facilmente caso ocorra alguma falha na hospedagem do servidor ou algo do tipo. Também, banco de dados (MySQL pra ser mais específico), possui comandos de realizar backup e salvar em determinado local.

Bem, é assim que eu trabalho: usando banco de dados. Cada um faz do seu jeito.

Link to comment
  • Other Languages Moderators
3 minutes ago, asrzk said:

Por que discorda. Lord?

Discordo de vc ter dito que é mais fácil criar um banco de dados pra salvar as contas. Isso é desnecessário, pois já existe um banco de dados nativo para salvar as contas, não há motivo para criar algo que já existe. Além disso todas as funções nativas de obter dados das contas deixariam de funcionar.

No fim das contas é mais uma coisa pra ficar dando dores de cabeça mais tarde.

Edited by Lord Henry
  • Like 1
Link to comment
  • Other Languages Moderators
2 minutes ago, Lord Henry said:

Discordo de vc ter dito que é mais fácil criar um banco de dados pra salvar as contas. Isso não é possível, pois já existe um banco de dados nativo para salvar as contas, não há motivo para criar algo que já existe.

Ah, sim, tudo bem. Desculpe a minha má interpretação. É que eu costumo trabalhar com servidores vinculados à sites. Neste caso, para mim, é mais fácil. De qualquer forma; você está correto sobre criar coisas que já existem, não faz sentido. AHAUHAHUAUHA

  • Haha 1
Link to comment

Só uma dica também, antes de querer criar essa limitação, seria adequado utilizar métodos eficazes de recuperação de senha, pois constantemente o pessoal acaba se esquecendo de suas senhas (usam o “salvar senha” e em algum tempo limpa o cache e se esquece) e caso não consigam jogar criando uma outra conta, a perda de players seria considerável.

Exemplos recuperação de senha:

  • Like 1
Link to comment
3 hours ago, Lord Henry said:

Bom, eu uso esse painel de login que também só permite 1 conta por serial. Na parte de registrar contas, ele verifica se já existe uma conta com o serial do jogador que está tentando registrar uma conta. Se tiver, bloqueia o registro e pede para que ele logue nela.

Em vez de você usar getAccountData que é um pouco pesado de processar, use a função getAccountsBySerial, que retorna todas as contas que possuem o serial específico. Se existe alguma, então cancela o registro do jogador e pede para que ele logue nela.


local myAccounts = getAccountsBySerial (getPlayerSerial (client)) -- myAccounts é uma table com todas as contas que existem com o serial do jogador.
if myAccounts[1] then -- Se existe o primeiro item da table, então:
	outputChatBox ("Você já tem uma conta registrada. Logue nela: "..getAccountName(myAccounts[1]), client) -- Manda isso no chat do jogador, informando o login da conta que já existe.
end

 

Já utilizei essa função a um tempo atrás para a mesma coisa, porém, não usei dessa forma.

Muito obrigado @Lord Henry.

Link to comment
21 minutes ago, MaligNos said:

Só uma dica também, antes de querer criar essa limitação, seria adequado utilizar métodos eficazes de recuperação de senha, pois constantemente o pessoal acaba se esquecendo de suas senhas (usam o “salvar senha” e em algum tempo limpa o cache e se esquece) e caso não consigam jogar criando uma outra conta, a perda de players seria considerável.

Exemplos recuperação de senha:

Obrigado pela dica. 

Eu tenho um sistema de recuperação de senha em PHP(é preciso fazer a hospedagem desse arquivo em algum domínio) que funciona através da função callRemote.

Caso o jogador esquecer a senha, ele irá escrever seu nome de usuário e clicar no botão de recuperação, será enviado um e-mail dizendo a senha dele para o e-mail que ele cadastrou na hora que se registrou no servidor. (Isso tudo no próprio painel de login).

Link to comment

getAccountsBySerial na verdade já funciona com um SELECT pra retornar as contas, então dizer que um sistema de contas que utiliza banco de dados é mais rápido pode ser um engano.

Aqui está como a função é definida no código fonte do MTA:

https://github.com/multitheftauto/mtasa-blue/blob/master/Server/mods/deathmatch/logic/CAccountManager.cpp#L903

Edited by DNL291
  • Like 1
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...