23.05.2016, 02:31
(
Последний раз редактировалось F1N4L; 27.11.2017 в 12:22.
Причина: UpdateІ!
)
Esse tutorial aki й realmente muito ъtil para servidores, seja de pequeno ou grande porte.
Muitos aki do fуrum tinham dъvidas com relaзгo a EXCLUSГO DE CONTAS INUTILIZADAS. Eu fiz pela primeira vez e deu certo!
Bбsicamente verifica se a conta estб sendo utilizada ou nгo, caso a conta tenha ultrapassado tantos dias e nгo foi logado mais nela, automaticamente ela serб excluнda do BD.
OBS: Esse tutorial й diretamente voltado para Banco de Dados e estarei usando MySQL e SQLite.
Eu ia publicar isso na бrea cуdigos ъteis, mas achei melhor fazer como tutorial, pois assim os iniciantes podem postar suas dъvidas com relaзгo a esse sistema.
Suponho que vc jб tenha um sistema de registro e login completo em seu GM.
Toda vez que o jogador logar em seu servidor, vc precisa atualizar o tempo da conta para o tempo atual, obviamente.
O tempo que utilizei foi de 30 DIAS, entгo alterem para o tempo que vcs acham melhor.
ETAPA 1: Atualizando a conta.
Explicaзгo: Toda vez que o jogador logar em sua conta, a coluna onde guarda o valor do gettime irб ser resetada para o valor inicial, ou seja, voltarб ao inicio da contagem.
MySQL R7:
SQLite:
ETAPA 2: Verificando as contas.
Explicaзгo: Vamos criar um timer que serб responsбvel por verificar as contas inutilizadas e as mesmas, ao ultrapassarem o limite de tempo, serгo automaticamente excluнdas.
Timer (OnGameModeInit/OnFilterStriptInit):
MySQL R7:
SQLite:
Explicaзгo final (para iniciantes):
connection = Banco de dados.
table_name = Nome da tabela onde armazena os dados dos jogares.
colunm_name = Nome da coluna que serб inserida junto aos dados dos players.
player_name = Nome do jogador em questгo.
@ATUALIZAЗГO: 27/11/2017
Estou atualizando este tуpico para mostrar uma forma melhor e mais fбcil de verificaзгo sem precisar necessariamente formatar uma string para realizar tal verificaзгo, sem falar que desta forma fica mais legнvel e "humano", pois nгo vamos precisar converter os segundos.
Vamos trabalhar com quatro funзхes SQL:
* NOW (SQLite/MySQL) = Pega o tempo atual jб formatado em: AAAA/DD/MM HH/MM/SS
* DATEDIFF (MySQL) = Retorna a diferenзa entre 2 perнodos de tempo: AAAA/DD/MM HH/MM/SS - AAAA/DD/MM HH/MM/SS = X dias
* JULIANDAY (SQLite) = Retorna o tempo em segundos, mas computa cбlculos com datas e nгo necessariamente com segundos
* DATETIME (SQLite/MySQL) = Retorna a data e a hora
OBS.:
DATEDIFF(valor_maior, valor_menor)
Ex. correto: 1000 - 999 = 1
Ex. errado: 999 - 1000 = -1
O correto й calcular a data, claro, mas esse exemplo acima й sу pra ficar mais fбcil de compreender o modo correto de calcular a data com o comando DATEDIFF.
Usando de forma errada, como mostrado acima, retorna valor negativo. (Nгo que seja errado, mas nгo й nosso objetivo trabalhar com negativos.)
Para comeзarmos, devemos criar uma coluna em nossa tabela com o tipo TIMESTAMP para armazenarmos o valor de NOW().
Cуdigo SQL utilizado para criar a tabela:
OBS.: SQLite utiliza AUTOINCREMENT ao invйs de AUTO_INCREMENT.
Inserindo informaзхes:
MySQL:
SQLite:
Depois de criada a tabela, crie um temporizador global e a respectiva funзгo a ser chamada:
No cуdigo acima utilizamos um temporizador de 24 horas para chamar a verificaзгo.
Verificaзгo com MySQL:
Verificaзгo com SQLite:
Caso a conta estiver inativa por mais de 90 dias, entгo a mesma serб deletada!
Com base na primeira explicaзгo + essa segunda alternativa de verificaзгo, acredito que tenha ficado claro a forma de usar.
Muitos aki do fуrum tinham dъvidas com relaзгo a EXCLUSГO DE CONTAS INUTILIZADAS. Eu fiz pela primeira vez e deu certo!
Bбsicamente verifica se a conta estб sendo utilizada ou nгo, caso a conta tenha ultrapassado tantos dias e nгo foi logado mais nela, automaticamente ela serб excluнda do BD.
OBS: Esse tutorial й diretamente voltado para Banco de Dados e estarei usando MySQL e SQLite.
Eu ia publicar isso na бrea cуdigos ъteis, mas achei melhor fazer como tutorial, pois assim os iniciantes podem postar suas dъvidas com relaзгo a esse sistema.
Suponho que vc jб tenha um sistema de registro e login completo em seu GM.
Toda vez que o jogador logar em seu servidor, vc precisa atualizar o tempo da conta para o tempo atual, obviamente.
O tempo que utilizei foi de 30 DIAS, entгo alterem para o tempo que vcs acham melhor.
ETAPA 1: Atualizando a conta.
Explicaзгo: Toda vez que o jogador logar em sua conta, a coluna onde guarda o valor do gettime irб ser resetada para o valor inicial, ou seja, voltarб ao inicio da contagem.
MySQL R7:
Код:
new MySQL_Format[200], Name[24]; GetPlayerName(playerid, Name, sizeof Name); mysql_format(conection, MySQL_Format, "UPDATE `table_name` SET `colunm_name` = '%i' WHERE `player_name` = '%s'", 30 * 24 * 60 * 60 + gettime(), Name); mysql_function_query(conection, MySQL_Format, false, "", "");
Код:
new SQL_Format[200], Name[24]; GetPlayerName(playerid, Name, sizeof Name); format(SQL_Format, sizeof(SQL_Format), "UPDATE `table_name` SET `colunm_name` = '%i' WHERE `player_name` = '%s'", 30 * 24 * 60 * 60 + gettime(), Name); db_query(conection, SQL_Format);
Explicaзгo: Vamos criar um timer que serб responsбvel por verificar as contas inutilizadas e as mesmas, ao ultrapassarem o limite de tempo, serгo automaticamente excluнdas.
Timer (OnGameModeInit/OnFilterStriptInit):
Код:
SetTimer("CheckUnusedAccounts", (24 * 60 * 1000), true); // verifica a cada 1 dia
Код:
forward CheckUnusedAccounts(); public CheckUnusedAccounts() { new MySQL_Format[200]; mysql_format(connection, MySQL_Format, "DELETE FROM `table_name` WHERE `colunm_name` < '%i'", gettime()); mysql_function_query(connection, MySQL_Format, false, "", ""); return 1; }
Код:
forward CheckUnusedAccounts(); public CheckUnusedAccounts() { new SQL_Format[200]; format(SQL_Format, sizeof(SQL_Format), "DELETE FROM `table_name` WHERE `colunm_name` < '%i'", gettime()); db_query(connection, SQL_Format); return 1; }
Explicaзгo final (para iniciantes):
connection = Banco de dados.
table_name = Nome da tabela onde armazena os dados dos jogares.
colunm_name = Nome da coluna que serб inserida junto aos dados dos players.
player_name = Nome do jogador em questгo.
@ATUALIZAЗГO: 27/11/2017
Estou atualizando este tуpico para mostrar uma forma melhor e mais fбcil de verificaзгo sem precisar necessariamente formatar uma string para realizar tal verificaзгo, sem falar que desta forma fica mais legнvel e "humano", pois nгo vamos precisar converter os segundos.
Vamos trabalhar com quatro funзхes SQL:
* NOW (SQLite/MySQL) = Pega o tempo atual jб formatado em: AAAA/DD/MM HH/MM/SS
* DATEDIFF (MySQL) = Retorna a diferenзa entre 2 perнodos de tempo: AAAA/DD/MM HH/MM/SS - AAAA/DD/MM HH/MM/SS = X dias
* JULIANDAY (SQLite) = Retorna o tempo em segundos, mas computa cбlculos com datas e nгo necessariamente com segundos
* DATETIME (SQLite/MySQL) = Retorna a data e a hora
OBS.:
DATEDIFF(valor_maior, valor_menor)
Ex. correto: 1000 - 999 = 1
Ex. errado: 999 - 1000 = -1
O correto й calcular a data, claro, mas esse exemplo acima й sу pra ficar mais fбcil de compreender o modo correto de calcular a data com o comando DATEDIFF.
Usando de forma errada, como mostrado acima, retorna valor negativo. (Nгo que seja errado, mas nгo й nosso objetivo trabalhar com negativos.)
Para comeзarmos, devemos criar uma coluna em nossa tabela com o tipo TIMESTAMP para armazenarmos o valor de NOW().
Cуdigo SQL utilizado para criar a tabela:
Код:
CREATE TABLE `tabela` (`id` INT(5) NOT NULL PRIMARY KEY AUTO_INCREMENT, `data` TIMESTAMP NOT NULL)
Inserindo informaзхes:
MySQL:
Код:
INSERT INTO `tabela` (`data`) VALUES (NOW())
Код:
INSERT INTO `tabela` (`data`) VALUES (datetime('now', 'localtime'))
Код:
SetTimer("VerificarInativos", (24 * 60 * 1000), true);
Verificaзгo com MySQL:
Код:
forward VerificarInativos(); public VerificarInativos() { mysql_query(con, "DELETE FROM `tabela` WHERE DATEDIFF(NOW(), `data`) > 90", true); return true; }
Код:
forward VerificarInativos(); public VerificarInativos() { db_query(con, "DELETE FROM `tabela` WHERE JULIANDAY('now') - JULIANDAY(`data`) > 90"); return true; }
Com base na primeira explicaзгo + essa segunda alternativa de verificaзгo, acredito que tenha ficado claro a forma de usar.