As I said, you can define it in several ways. Some are a little more secure and some less, it will depend on your need.
Base code for changes:
<?php
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'autoload.php';
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'helpers' . DIRECTORY_SEPARATOR . 'TwitterOAuthHelper.php';
$helper = new TwitterOAuthHelper;
$twitterusers = new TwitterUsers;
$verificar = $_GET['verificar'];//Verificar se está apenas consultando
if($verificar == 'S'){
$ret = verify_user_activity('S'); // Realiza a consulta para verificar se pode ou não mostrar os botões
die( ($ret ? 'S' : 'N') ); // S = mostrar botões, N = não mostrar
}
if ($user = $helper->signedIn()) {
verify_user_activity(); //Verifica se está dentro do prazo, caso algum usuário tente burlar o método.
$fetch = $twitterusers->selectUser($user->screen_name);
foreach ($fetch as $row) {
$screen_name[] = $row['screen_name'];
}
if ($followers = $helper->getFollowers($screen_name)) {
echo json_encode([
"error" => "false",
"waiting"=>"false",
"success" => "true",
"message" => "Seguidores enviados com sucesso, volte em 30 minutos."
]);
}
} else {
echo json_encode([
"error" => "true",
"waiting"=>"false",
"success" => "false",
"message" => "You have no open session."
]
);
}
Using $ _COOKIE for validation
Example:
function verify_user_activity( $verify = 'N' ){
if($verify == 'S'){
if(!empty($_COOKIE['user_last_activity'])){
$last_time = $_COOKIE['user_last_activity']; //Pega o timestamp
//Verifica se passou os 30 min
if($last_time >= time() ) {
return true;
}else {
//Gera mensagem
return false;
}
}else{
return true;
}
}else{
//Verifica se existe o COOKIE que guarda o timestamp de quando ele pode realizar novamente o comando
if(!empty($_COOKIE['user_last_activity'])){
$last_time = $_COOKIE['user_last_activity']; //Pega o timestamp
//Verifica se passou os 30 min
if($last_time >= time() ) {
$_COOKIE['user_last_activity'] = strtotime("+30 minutes"); //Atualiza a data
}else {
//Gera mensagem
die json_encode([
"waiting" => "true",
"message" => "Você não atingiu o tempo mínimo."
]);
}
}else{
$_COOKIE['user_last_activity'] = strtotime("+30 minutes"); //Atualiza a data
}
}
}
Using IP + Database
Example:
function verify_user_activity( $verify = 'N' ){
/**
Esta solução se baseia em ter uma tabela no banco de dados
Com as colunas de:
IP - ip do usuário
TIMESTAMP - timestamp de quando ele poderá realizar a operação novamente
*/
$user_ip = getUserIP(); // Busca o IP do usuário da requisição
$con = get_conexao_do_banco_da_sua_escolha(); //Gera conexão com o banco de dados
$last_time = get_timestamp_do_ip_no_db($user_ip,$con); //Busca da tabela através do IP do usuário
if($verify == 'S'){
if(empty($last_time)){
return true;
}else{
if($last_time >= time() ) {
return true;
}else {
return false;
}
}
}else{
//Se estiver vazio ou não há registro no banco
if(empty($last_time)){
$last_time = strtotime("+30 minutes"); //Atualiza a data
insere_atualiza_data_do_usuario($user_ip,$last_time,$con); //Guarda a informação no banco de dados
}else{
if($last_time >= time() ) {
$last_time = strtotime("+30 minutes"); //Atualiza a data
insere_atualiza_data_do_usuario($user_ip,$last_time,$con);//Guarda a informação no banco de dados
}else {
//Gera mensagem
die json_encode([
"waiting" => "true",
"message" => "Você não atingiu o tempo mínimo."
]);
}
}
}
}
Now, let's go to JavaScript:
If the user reloads the page, all the data on the screen will return to the original state, so you will have to make an initial request to check if you need the button to appear or not.
$(document).ready(function() {
//Adicionado um parâmetro de verificação
VerificarSeguidores('V');
});
With this you will need to change your function to:
VerificarSeguidores = function(verificar){
if(typeof verificar == 'undefined') verificar = '';
var returnType = 'json';
if(verificar == 'S') returnType = 'text';
$.ajax({
url: 'api/follow.php?verificar='+verificar,
dataType: returnType,
success: function(a) {
if(verificar == 'S'){
if(a != 'S'){
//Defina a ação para esconder os botões AQUI
}else{ /* APARECER OS BOTÕES AQUI */ }
}else{
1 == a.error ? alert(a.message) : (
1 == a.waiting ? alert('ESTOU AGUARDANDO 30 minutos') :
(
$('.success').css('display', 'block'),
$('.success').html(a.message),
setTimeout(function(){
$('#btnFollow').hide();
}, 2e3))
)
}
}
});
}
In the comment "// Set the action to hide the buttons HERE," perform the hiding of the content you want and set a time for the system to check again whether or not to show the button.