Problema con l'exp che carica ogni tot di caratteri inviati
Problema con l'exp che carica ogni tot di caratteri inviati postato il 12/01/2023 21:54:17 nel forum programmazione, open source e hosting
ciao a tutti! Spiego subito qual è il problema:
Ogni volta che un utente manda un messaggio in chat, anche con una sola lettera, si prendono i punti exp, invece di arrivare a 1000 caratteri [che è il tot di caratteri impostato da raggiungere per ottenere exp].
Di regola si modifica dal file config ma non si riesce a capire come mai anche quando si lascia un dado da l'exp, sapreste aiutarci?
Pagine → 1
12/01/2023 23:05:46
Non uso quel sistema, quindi prendi il tutto con le dovute distanze, però a naso dovresti fare una cosa che escluda il dado, dunque in ref_header una cosa tipo
if($PARAMETERS['mode']['exp_by_chat']=='ON' && $m_type !='C')
13/01/2023 19:45:23
crystaltokyo ha scritto: Non uso quel sistema, quindi prendi il tutto con le dovute distanze, però a naso dovresti fare una cosa che escluda il dado, dunque in ref_header una cosa tipo
if($PARAMETERS['mode']['exp_by_chat']=='ON' && $m_type !='C')
Ti ringrazio! provo e faccio sapere!
14/01/2023 00:47:29
Penso di capire che usi il GDRCD. Giusto?
Che versione è? Così possiamo darti una mano più precisamente
25/01/2023 18:53:50 e modificato da jacktrust il 25/01/2023 18:55:04
playergdr ha scritto: Penso di capire che usi il GDRCD. Giusto?
Che versione è? Così possiamo darti una mano più precisamente
scusate la lentezza nel rispondere ma il periodo è quello che è, uso l'ultima versione di gdrcd, quella aggiornata (5.6, ma non vorrei dire cavolate)
26/01/2023 23:39:45
Il motivo per il quale ti si presenta questa anomalia è legato al fatto che hai aggiunto un valore diverso da 0 al parametro $PARAMETERS['settings']['exp_by_chat']['value'] in config.inc.php , oltre ad aver chiaramente abilitato l'incremento dell'esperienza tramite caratteri scritti sempre nello stesso file.
Aggiungendo un qualsiasi valore diverso da 0, quando in ref_header.inc.php si scatena il processo di assegnazione dell'esperienza non viene minimamente presa in considerazione la quantità minima di caratteri necessaria, ma si procede direttamente con l'incremento.
Qui puoi vedere il dettaglio:
if($PARAMETERS['mode']['exp_by_chat'] == 'ON') {
$msg_length = strlen($chat_message);
$char_needed = gdrcd_filter('num', $PARAMETERS['settings']['exp_by_chat']['number']);
$exp_bonus = ($PARAMETERS['settings']['exp_by_chat']['value'] == '0') ? $msg_length / $char_needed : gdrcd_filter_num($PARAMETERS['settings']['exp_by_chat']['value']);
}
Il fatto che il valore 0 sia una sorta di jolly permette di avere a disposizione metodi diversi di assegnazione dell'esperienza, tuttavia non viene minimamente contemplata la possibilità di avere una assegnazione di esperienza personalizzata per raggiungimento di caratteri.
Mi sembra, in ogni caso, che possa essere utile per tutti avere questa possibilità, quindi ecco come l'ho risolta io:
// Se è stata settata l'esperienza per azione, allora avvio la procedura per il calcolo dell'esperienza
if($PARAMETERS['mode']['exp_by_chat'] == 'ON') {
// Ottengo la lunghezza del messaggio inviato
$msg_length = strlen($chat_message);
// Determino il numero di caratteri necessari per ottenere un bonus
$char_needed = gdrcd_filter('num', $PARAMETERS['settings']['exp_by_chat']['number']);
// Determino il bonus da assegnare
$exp_assign = gdrcd_filter('num', $PARAMETERS['settings']['exp_by_chat']['value']);
// Se il numero di caratteri necessari è maggiore di 0, allora il bonus viene dato se il messaggio è lungo almeno quanto il numero di caratteri necessari
if ($char_needed > 0) {
$exp_bonus = ($exp_assign <= 0) ? $msg_length / $char_needed : ( $msg_length >= $char_needed ? $exp_assign : 0);
}
// Altrimenti il bonus viene assegnato sempre
else {
$exp_bonus = $exp_assign;
}
}
Tutto questo pezzo di codice si sostituisce a quello esposto in precedenza. Ho aggiunto diversi commenti qua e là per spiegare come funziona il tutto.
Se non ti dovesse essere chiaro qualcosa, non farti scrupoli a domandare.
Questa modifica la sto proponendo anche per la versione 5.6.0.6, qui la pull request con tutto il necessario per la correzione.
https://github.com/GDRCD/GDRCD/pull/322 ↗
Kasa.
02/02/2023 09:36:04
kasa ha scritto: Il motivo per il quale ti si presenta questa anomalia è legato al fatto che hai aggiunto un valore diverso da 0 al parametro $PARAMETERS['settings']['exp_by_chat']['value'] in config.inc.php , oltre ad aver chiaramente abilitato l'incremento dell'esperienza tramite caratteri scritti sempre nello stesso file.
Aggiungendo un qualsiasi valore diverso da 0, quando in ref_header.inc.php si scatena il processo di assegnazione dell'esperienza non viene minimamente presa in considerazione la quantità minima di caratteri necessaria, ma si procede direttamente con l'incremento.
Qui puoi vedere il dettaglio:
if($PARAMETERS['mode']['exp_by_chat'] == 'ON') {
$msg_length = strlen($chat_message);
$char_needed = gdrcd_filter('num', $PARAMETERS['settings']['exp_by_chat']['number']);
$exp_bonus = ($PARAMETERS['settings']['exp_by_chat']['value'] == '0') ? $msg_length / $char_needed : gdrcd_filter_num($PARAMETERS['settings']['exp_by_chat']['value']);
}
Il fatto che il valore 0 sia una sorta di jolly permette di avere a disposizione metodi diversi di assegnazione dell'esperienza, tuttavia non viene minimamente contemplata la possibilità di avere una assegnazione di esperienza personalizzata per raggiungimento di caratteri.
Mi sembra, in ogni caso, che possa essere utile per tutti avere questa possibilità, quindi ecco come l'ho risolta io:
// Se è stata settata l'esperienza per azione, allora avvio la procedura per il calcolo dell'esperienza
if($PARAMETERS['mode']['exp_by_chat'] == 'ON') {
// Ottengo la lunghezza del messaggio inviato
$msg_length = strlen($chat_message);
// Determino il numero di caratteri necessari per ottenere un bonus
$char_needed = gdrcd_filter('num', $PARAMETERS['settings']['exp_by_chat']['number']);
// Determino il bonus da assegnare
$exp_assign = gdrcd_filter('num', $PARAMETERS['settings']['exp_by_chat']['value']);
// Se il numero di caratteri necessari è maggiore di 0, allora il bonus viene dato se il messaggio è lungo almeno quanto il numero di caratteri necessari
if ($char_needed > 0) {
$exp_bonus = ($exp_assign <= 0) ? $msg_length / $char_needed : ( $msg_length >= $char_needed ? $exp_assign : 0);
}
// Altrimenti il bonus viene assegnato sempre
else {
$exp_bonus = $exp_assign;
}
}
Tutto questo pezzo di codice si sostituisce a quello esposto in precedenza. Ho aggiunto diversi commenti qua e là per spiegare come funziona il tutto.
Se non ti dovesse essere chiaro qualcosa, non farti scrupoli a domandare.
Questa modifica la sto proponendo anche per la versione 5.6.0.6, qui la pull request con tutto il necessario per la correzione.
https://github.com/GDRCD/GDRCD/pull/322 ↗
Kasa.
Ti rongrazio! modifico appena riesco! spero funzioni, sono settimane che mi scervello ahahaha grazie mille sempre il top!
03/02/2023 17:56:29 e modificato da crystaltokyo il 03/02/2023 23:13:19
kasa ha scritto:
...
Invece kasa, io ti faccio una domanda più tecnica dato che il codice l'hai fatta tu (da quello che mi è parso di capire).
Se io volessi estrarre, ad esempio, gli ultimi 4 record della tabella chat fatti da login in una specifica chat, e vedere se ogni record ha almeno 100 caratteri, come mi consigli di agire?
Useresti LENGTH(testo) > 100 nella query select?
04/02/2023 13:09:48
crystaltokyo ha scritto: ...
Non sono proprio colui che lo ha scritto, diciamo che ho per lo più applicato pezze qua e là, in base agli errori riportati.
😁
In ogni caso, io andrei ad estrarre a prescindere gli ultimi quattro messaggi inviati dall'utente nella specifica chat, senza inserire controlli nella query, e poi andrei a verificare quanti di questi hanno effettivamente più di 100 caratteri tramite funzionalità di PHP.
Il motivo è legato al fatto che il LENGTH non sempre è proprio efficiente nella determinazione di quanti caratteri reali ci sono e potrebbe capitare che, in base anche a come tu salvi il dato a DB, potrebbe conteggiare anche gli eventuali stili applicati sopra nel totale.
Per come sono fatto io (quindi ci tengo a prescisare che è una mia preferenza), dalle Query cerco sempre di ottenere dati statici e prodotti di operazioni (al massimo degli IF o dei SUM quando proprio servono e sono fatti banalmente) e poi il resto delle logiche le faccio al di fuori.
Kasa.
05/02/2023 19:42:01 e modificato da renor il 05/02/2023 19:50:36
Aggiungo che utilizzando la modifica, ho provato poco fa, permette anche di sistemare la non-riassegnazione di exp ogni volta che si raggiunge il CAP di caratteri impostati :)
16/02/2023 08:50:01
vi ringrazio tantissimo per le risposte e la disponibilità! le modifiche funzionano alla perfezione senza errori (sono settimane che non ci saltavo fuori), e scusate le risposte tardive ma il tempo e la stanchezza sono quelle che sono ahahaha, comunque direi che la questione è risolta e il post può essere chiuso, grazie ancora!
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 ↗
State of Survival ↗
Storie di Agarthi ↗
New Orleans ↗
Seconda Era ↗
Raja Dunia ↗
Enlisted ↗
Exclusive Villa GdR ↗
Cafuné ↗