[size=48]Criando um anti flood simples[/size]
Introdução:
Para este tutorial, devemos entender oque é SPAM e oque é FLOOD. São duas palavras muitos diferentes porém com uma semelhança, vamos ver:
Oque é SPAM?
Code:
Spam é um termo de origem inglesa cujo significado designa uma mensagem eletrônica
recebida mas não solicitada pelo usuário. O conteúdo de um spam é normalmente uma
mensagem publicitária que tem o objetivo de divulgar os serviços ou produtos de alguma
empresa a uma grande massa de usuários de e-mail.
fonte: www.significados.com.br/spam/
Oque é FLOOD?
Code:
“Flood” é um termo em inglês que significa “encher” ou “inundar”, mas na internet ele
usado para designar uma atitude bem irritante. Virtualmente, a palavra virou uma
expressão para definir o ato de postar informações sem sentido ou finalidade nenhuma,
de modo que uma ou mais pessoas sejam prejudicadas.
fonte: http://www.tecmundo.com.br/o-que-e/8...e-e-flood-.htm
A semelhança entre esses dois é que são muitas mensagens em um curto tempo e que muitas vezes podem sobrecarregar o servidor, um exemplo mais prático é um ataque DDoS que é um ataque de floood aonde o hacker envia vários pacotes inválidos para o servidor e quando esses pacotes chegam no servidor eles são negados um pequeno exemplo:
Como você pode notar, no lado esquerdo está a terra representando o cliente e no lado direito o servidor. Quando vários clientes enviam seus pacotes no servidor tudo fica normal, porém quando alguns clientes enviam muito mais de um pacote para um único servidor acarreta e sobrecarrega o servidor. Mas nosso tutorial não é sobre ataque DDoS e sim Antispam/Antiflood.
Precisaremos saber também, oque é timestamp:
Code:
O timestamp do unix corresponde ao número de segundos desde a meia-noite do dia 01/01/1970
no fuso horário UTC sem considerar os segundos bissextos. Para simplificar, vamos denominar
este momento no tempo de ponto zero. Assim, o timestamp do unix é o número de segundos
desde o ponto zero.
fonte http://pt.stackoverflow.com/question...o-do-timestamp
Tutorial:
Agora que sabemos oque é SPAM e oque é FLOOD vamos iniciar nosso tutorial. Primeiramente precisamos de uma variável que armazenará os dados de cada jogador, para ter maior controle sobre o sistema.. Vamos cria-la com o nome Spamming, Essa variável armazenará o timestamp do jogador
PHP Code:
- Código:
new Spamming[MAX_PLAYERS];
Após criar nossa variável, precisamos criar nosso algoritimo em que faz a verificação para saber se o jogador realizou flood ou spam:
PHP Code:
- Código:
if((gettime() - Spamming[playerid]) <= 2 && Spamming[playerid])
{
return SendClientMessage(playerid, -1, "[Erro]: Sistema anti Spam/Flood");
}
Spamming[playerid] = gettime();
É um algorítimo um pouco complexo para novatos mas irei explicar como funciona, quando o player digita algum comando ele verifica na condição se a variável Spamming for diferente de 0 e o timestamp atual subtraído pelo timestamp salvo na variável Spamming for menor ou igual a 2 significa que o jogador está fazendo SPAM. Caso o jogador não estiver fazendo SPAM, ele armazena na variável Spamming o timestamp atual.
PHP Code:
- Código:
/*
Na condição a seguir, é realizado uma verificação para saber se a variável Spamming é diferente de 0
e também para saber se o timestamp atual subtraído pelo timestamp da última vez que ele digitou algum comando
é menor ou igual a 2. Caso for menor ou igual a 2 ele manda a mensagem.
*/
if((gettime() - Spamming[playerid]) <= 2 && Spamming[playerid])
{
// Mensagem informando que o jogador cometeu SPAM:
return SendClientMessage(playerid, -1, "[Erro]: Sistema anti Spam/Flood");
}
/*
Caso fizer mais que 2 segundos que o jogador digitou algum comando, ele apenas armazena o timestamp
na variável Spamming.
*/
Spamming[playerid] = gettime();
Este é um exemplo muito simples, envolve mais questão de lógica do que de funções. Lembrando que você pode utilizar este anti-spam/anti-flood em qualquer parte do seu gamemode:
Caso você use ZCMD ou Y_CMD
PHP Code:
- Código:
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
if((gettime() - Spamming[playerid]) <= 2 && Spamming[playerid])
{
return SendClientMessage(playerid, -1, "[Erro]: Sistema anti Spam/Flood");
}
Spamming[playerid] = gettime();
return 1;
}
Em STRCMP
PHP Code:
- Código:
public OnPlayerCommandText(playerid, cmdtext[])
{
if((gettime() - Spamming[playerid]) <= 2 && Spamming[playerid])
{
return SendClientMessage(playerid, -1, "[Erro]: Sistema anti Spam/Flood");
}
Spamming[playerid] = gettime();
return 1;
}
Créditos:
- zSuYaNw @ 2016