GDRCD 5.2 - No PX per doppio-spam ravvicinato!
GDRCD 5.2 - No PX per doppio-spam ravvicinato! postato il 26/09/2021 12:07:50 nel forum programmazione, open source e hosting
Buongiorno, ho provato assieme a creare con l'aiuto di un altro gestore un sistema che non permetta la salita dei punti esperienza quando si mandano in chat due azioni consecutive nel range di 3 minuti.
Questo eviterebbe che, quando per caso il sistema stampa varie azioni anche avendo cliccato invio una sola volta on chat, il sistema non dia tanti px ma ne dia solo quanti darebbe con una singola azione.
Vi copio la sua gentile guida che però non mi funziona.
In ref-header.inc.php questo pezzo di codice qui:
/*calcolo il tempo per il blocco dello spam*/
$time = gdrcd_query("SELECT ora FROM chat WHERE mittente = '".$_SESSION['login']."' AND tipo = 'A' order by ora desc LIMIT 1");
$last_action = $time[0];
$date_control = new DateTime(".$last_action.");
va inserito PRIMA della stringa che permette di inserire l'azione in chat (nella versione base di GDRCD è alla linea 241, ovvero prima di questa:
/*Inserisco il messaggio in chat*/
gdrcd_query("INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo ) VALUES (".$_SESSION['luogo'].", '".$_SESSION['sesso'].";".$_SESSION['img_razza']."', '".$_SESSION['login']."', '".gdrcd_capital_letter(gdrcd_filter('in', $tag_n_beyond))."', NOW(), '".$m_type."', '".$chat_message."')");
Poi trasformare questo pezzo:
if ($m_type == 'A' || $m_type == 'P' || $m_type == 'M')
{
gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ".$exp_bonus." WHERE nome = '".$_SESSION['login']."' LIMIT 1");
}
in questo:
if ($m_type == 'A' || $m_type == 'M')
{
//Controllo che siano trascorsi 2 minuti dall'ultima azione
$timestamp = date("Y-m-d H:i:s");
$date_timestamp = new DateTime($timestamp);
$difference=date_diff($date_timestamp,$date_control);
$minutes = ($difference->days * 24 * 60) +
($difference->h * 60) + $difference->i;
if ($minutes > 3) {
gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ".$exp_bonus.", soldi = soldi + ".$money." WHERE nome = '".$_SESSION['login']."' LIMIT 1");
}
}
Riassunto della modifica come funziona:
- Prende il tempo della penultima azione
- Inserisce la nuova azione in chat
- Fa il controllo che tra la nuova azione e la vecchia siano trascorsi almeno 3 minuti (va bene anche 3 minuti e 1 secondo)
- Se sono trascorsi, inerisce i PX, altrimenti nulla
Questo impedisce gli spammer due volte, perché se uno si mette lì a provare a "spammare" le azioni, ma non sono trascorsi 3 minuti, il sistema si resetta e deve aspettare altri 3 minuti.
Potete aiutarmi? Inserisco un link con il codice della mia pagina ref-header.inc.php onde evitare un post lunghissimo: http://danimeanddragons.altervista.org/0.prove/ref-header.txt ↗
Ringrazio anticipatamente <3
Pagine → 1
30/09/2021 23:28:35
Qualche dritta almeno? ç_ç
02/01/2022 23:21:47
Gentile utente,
da un punto di vista logico il ragionamento non fa una piega.
Che errore ti restituisce il sistema?
03/01/2022 16:42:42
Buonasera a te! ^^
Nulla ormai ho abbandonato a provarci, ho avuto solo bug su bug ma avere una funzione così aiuterebbe davvero tutti. Purtroppo non ho le competenze per riuscirci da me e non ricordo ormai che errore dava con il codice sopra >.<
03/01/2022 17:15:15
Se pensi che sia una funzione utile, se la desideri soprattutto, non vedo perché cedere ad una frustrazione!
Se vuoi lasciar perdere ok, se vuoi riprovarci possiamo farlo passo passo.
Pillola rossa o pillola azzurra? 😏
04/01/2022 22:21:05
Onde evitare altro spam (diciamo) appena ho un attimo ci riprovo e posto allora così se ci riusciamo è utile a tutti :)
04/01/2022 23:49:52
Un mio primo consiglio se volete una funzionalità simile che vale un po' per tutto, ma che in questo caso trattandosi di mettere mano al ref_header è doppiamente valida.
Il ref_feader è uno dei file più, se non il più disastrato del gdrcd, io consiglierei di fare una funzione a parte e poi richiamarla nel ref_header.
Inserire del tipo questa funzione in functions.inc.php
function antiflood(
$mittente,
$stanza,
$interval = '2 MINUTE')
{
$query = "SELECT
id
FROM chat
WHERE
mittente = '" . gdrcd_filter_in($mittente) . "'
AND stanza = '" . gdrcd_filter_num($stanza) . "'
AND DATE_ADD(ora, INTERVAL " . gdrcd_filter_in($interval) . ") > NOW()
ORDER BY
id DESC
LIMIT 0,1";
$result = gdrcd_query($query,'result');
if(gdrcd_query($result,'num_rows') == 0) {
$flood = false;
} else {
$flood = true;
}
return $flood;
}
e rischiamarla all'inizio del ref header:
$flood = \chat\antiflood(
$_SESSION['login'],
$_SESSION['luogo']);
$flood sarà uguale a true nel caso il pg abbia postato d ameno di nddue minuti, false se ha postato da più di due minuti.
A quel punto è facile mettere quel $flood in un if che dia i px solo se è uguale a false.
07/01/2022 21:38:45 e modificato da animeanddragons il 07/01/2022 21:41:25
Non ho provato il metodo di exv_staff (proverò), ma provo a rispondere a player-gdr.
Questo è come ho modificato il mio file: non mi da errore ma non mi fa neppure salire i px.
Se invece cambio in simbolo > con < me li fa salire, ma non funge l'antispam
{ /*Parlato*/
if ($actual_healt['salute']>0)
{
$m_type='P';
$_SESSION['tag']=$tag_n_beyond;
}
else
{
$m_type='S';
$tag_n_beyond=$_SESSION['login'];
$chat_message=gdrcd_filter('in',$MESSAGE['status_pg']['exausted']);
}
} //elseif
/*calcolo il tempo per il blocco dello spam*/
$time = gdrcd_query("SELECT ora FROM chat WHERE mittente = '".$_SESSION['login']."' AND tipo = 'A' order by ora desc LIMIT 1");
$last_action = $time[0];
$date_control = new DateTime(".$last_action.");
/*Inserisco il messaggio*/
gdrcd_query("INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo ) VALUES (".$_SESSION['luogo'].", '".$_SESSION['sesso'].";".$_SESSION['img_razza']."', '".$_SESSION['login']."', '".gdrcd_capital_letter(gdrcd_filter('in', $tag_n_beyond))."', NOW(), '".$m_type."', '".$chat_message."')");
if($PARAMETERS['mode']['exp_by_chat']=='ON')
{
if (($m_type == 'A' || $m_type == 'P' || $m_type == 'M') && ($msg_length>=$char_needed))
{
//Controllo che siano trascorsi 2 minuti dall'ultima azione
$timestamp = date("Y-m-d H:i:s");
$date_timestamp = new DateTime($timestamp);
$difference=date_diff($date_timestamp,$date_control);
$minutes = ($difference->days * 24 * 60) +
($difference->h * 60) + $difference->i;
$chat_id = gdrcd_query("SELECT * FROM mappa where id = '".$_SESSION['luogo']."'" );
if ($chat_id['privata']==1) {} else {
if ($minutes > 3) {
gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ".$PARAMETERS['settings']['exp_by_chat']['number_increment_xp']." WHERE nome = '".$_SESSION['login']."' LIMIT 1"); /*$PARAMETERS['settings']['exp_by_chat']['number_increment_xp'] /// gdrcd_filter('num', $PARAMETERS['settings']['exp_by_chat']['number'])*/
gdrcd_query("UPDATE personaggio SET maturazionexp = maturazionexp + ".$PARAMETERS['settings']['exp_by_chat']['number_increment_xp']." WHERE nome = '".$_SESSION['login']."' LIMIT 1");
} /*$PARAMETERS['settings']['exp_by_chat']['number_increment_xp'] $PARAMETERS['settings']['exp_by_chat']['max24h']*/
}
}
}
07/01/2022 21:58:09 e modificato da animeanddragons il 07/01/2022 21:58:29
Ho provato anche il metodo di exv_staff ma niente sono un incompetente proprio :(
30/03/2022 09:26:55 e modificato da staff shadowland il 30/03/2022 09:27:39
Ad occhio leggo questa parte che mi pare stonare con il resto (a meno che tu non abbia creato un sistema di incremento denaro apposito):
if ($minutes > 3) {
gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ".$exp_bonus.", soldi = soldi + ".$money." WHERE nome = '".$_SESSION['login']."' LIMIT 1");
}
Prova a togliere quello che ti ho evidenziato e testa il tutto.
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
World of Warship ↗
Enlisted ↗
Tiles Survive ↗
Fallen Gods ↗
CRSED: F.O.A.D. ↗
War Thunder ↗
Exclusive Villa GdR ↗
Cafuné ↗