[GDRCD 5.4] - Messaggi stile WA
23/06/2021 16:53:41
haruka ha scritto: Tanto per capire, la query che c'è in index va replicata anche lì?
E poi vanno stampati i messaggi della conversazione?
Si, anche se andrebbe leggermente modificata in modo da avere TUTTI i messaggi. Per fare una cosa del genere, bisogna partire eliminando i RAGGRUPPAMENTI(GROUP BY) e cercando di ottenere un listone ordinato per ´spedito´, dove viene ricavato solo il mittente del messaggio, a prescindere dal destinatario. Questo serve successivamente per dividere la chat, in stile WA.
Poi li stampi come preferisci.
haruka ha scritto: Adesso il read restituisce questo bel messaggio di errore :D
Controlla se $pagebegin e $pageend vengono popolati correttamente. Forse mancano i LIMIT. In alternativa, prova a stampare per intero la query e vediamo cosa va in errore.
Kasa.
23/06/2021 17:19:13
kasa ha scritto: [quote]
Controlla se $pagebegin e $pageend vengono popolati correttamente. Forse mancano i LIMIT. In alternativa, prova a stampare per intero la query e vediamo cosa va in errore.
Kasa.
Sì, il problema era proprio quello.
Però per la query alzo davvero le mani perché non arrivo a tanto.
Attualmente il nuovo read è questo:
<?php
//Determinazione pagina
if(isset($_REQUEST['offset']) === false) {
$pagebegin = 0;
} else {
$pagebegin = (int) $_REQUEST['offset'] * $PARAMETERS['settings']['messages_per_page'];
}
$pageend = $PARAMETERS['settings']['messages_per_page'];
//Conteggio messaggi totali
$record = gdrcd_query("SELECT COUNT(*) FROM messaggi WHERE destinatario = '".$_SESSION['login']."'");
$totaleresults = $record['COUNT(*)'];
//Elenco messaggi paginato
/** * Bugfix: correzione di un bug che permetteva la visualizzazione di messaggi non inviati all'utente
* semplicemente modificando l'id. Viene quindi aggiunta nella clausola where il controllo sulla proprietà
* del messaggio. Nel caso in cui non venga trovato alcun messaggio verrà mostrato un errore.
* @author Rhllor
*/
//$result=gdrcd_query("SELECT * FROM messaggi WHERE personaggio_conversazione = ".gdrcd_filter('num',$_REQUEST['personaggio_conversazione'])." LIMIT 1", 'result');
$result = gdrcd_query("SELECT personaggio_conversazione, testo, letto, MAX(spedito) as spedito
FROM (
(
SELECT mittente as personaggio_conversazione, testo, letto, spedito
FROM messaggi
WHERE 1
AND destinatario = '".$_SESSION['login']."'
AND destinatario_del = 0
AND spedito = (SELECT MAX(mcheck.spedito) from messaggi as mcheck WHERE mcheck.destinatario = messaggi.destinatario AND mcheck.mittente = messaggi.mittente )
GROUP BY mittente
ORDER BY letto, spedito DESC
)
UNION ALL
(
SELECT destinatario as personaggio_conversazione, testo, letto, spedito
FROM messaggi
WHERE 1
AND mittente = '".$_SESSION['login']."'
AND mittente_del = 0
AND spedito = (SELECT MAX(mcheck.spedito) from messaggi as mcheck WHERE mcheck.destinatario = messaggi.destinatario AND mcheck.mittente = messaggi.mittente )
GROUP BY destinatario
ORDER BY letto, spedito DESC
)
) AS conversazioni
GROUP BY personaggio_conversazione
ORDER BY letto, spedito DESC
LIMIT ".$pagebegin.", ".$pageend."", 'result');
if(gdrcd_query($result, 'num_rows') == 0) { ?>
<div class="warning">
Impossibile visualizzare il messaggio richiesto, il messaggio potrebbe non esistere oppure non
disponi delle autorizzazioni necessarie per poterlo visionare
</div>
<?php
} else {
$record = gdrcd_query($result, 'fetch');
gdrcd_query($result, 'free');
//Leggi id messaggio
//Formatta messaggio
//Bottoni Rispondi, Rispondi e allega, cancella
?>
<div class="read_message_box">
<div class="infos">
<span class="title"><?php echo gdrcd_filter('out', $MESSAGE['interface']['messages']['date']).": "; ?></span>
<span class="body">
<?php $quando = explode(' ', $record['spedito']);
echo gdrcd_format_date($quando[0]) ?>
</span>
<span class="title">
<?php echo ' '.gdrcd_filter('out', $MESSAGE['interface']['messages']['time']).' '; ?>
</span>
<span class="body">
<?php echo gdrcd_format_time($quando[1]); ?>
</span>
</div>
<div class="infos">
<span class="title"><?php echo gdrcd_filter('out', $MESSAGE['interface']['messages']['sender']).": "; ?>
</span>
<span class="body"><?php echo gdrcd_filter('out', $record['mittente']); ?></span>
</div>
<?php if(($record['destinatario'] == $_SESSION['login']) && ($record['letto'] == 0)) {
gdrcd_query("UPDATE messaggi SET letto = 1 WHERE personaggio_conversazione = ".gdrcd_filter('num', $_REQUEST['personaggio_conversazione'])." LIMIT 1");
} ?>
<div class="read_message_box_text">
<?php echo nl2br(gdrcd_bbcoder(gdrcd_filter('out', $record['testo']))); ?>
</div>
<div class="read_message_box_forms">
<div class="read_message_box_form">
</div>
<div class="read_message_box_form">
<!-- attach -->
<form action="main.php?page=messages_center"
method="post">
<input type="hidden" name="reply_dest" value="<?php echo $record['mittente']; ?>" />
<input type="hidden" name="testo" value="<?php echo gdrcd_filter('out', $MESSAGE['interface']['messages']['attachment'].$record['testo']); ?>" />
<input type="hidden" name="op" value="attach" />
<input type="image" src="imgs/icons/attach.png" value="submit" alt="<?php echo gdrcd_filter('out', $MESSAGE['interface']['messages']['attach']); ?>"
title="<?php echo gdrcd_filter('out', $MESSAGE['interface']['messages']['attach']); ?>" />
</form>
</div>
<div class="read_message_box_form">
<!-- reply -->
<form action="main.php?page=messages_center" method="post">
<input type="hidden" name="reply_dest" value="<?php echo $record['mittente']; ?>" />
<input type="hidden" name="op" value="reply" />
<input type="image" src="imgs/icons/reply.png" value="submit" alt="<?php echo gdrcd_filter('out', $MESSAGE['interface']['messages']['reply']); ?>"
title="<?php echo gdrcd_filter('out', $MESSAGE['interface']['messages']['reply']); ?>" />
</form>
</div>
</div>
<!-- read_message_box_form -->
</div>
<div class="link_back">
<a href="main.php?page=messages_center&offset=0"><?php echo gdrcd_filter('out', $MESSAGE['interface']['messages']['go_back']); ?></a>
</div>
<?php
} // Chiudo controllo paternità messaggio
Così, se clicco uno dei messaggi nell'index per andarlo a leggere, si apre la visualizzazione dell'ultimo messaggio ricevuto, indifferentemente da quale messaggio apro da index.
Credo che siamo davvero ad un passo, ma per la questione query mi areno.
23/06/2021 18:55:19
Non è vero, ci sono riuscita xD
Scusate se mi gaso per così poco.
<?php
//Determinazione pagina
if(isset($_REQUEST['offset']) === false) {
$pagebegin = 0;
} else {
$pagebegin = (int) $_REQUEST['offset'] * $PARAMETERS['settings']['messages_per_page'];
}
$pageend = $PARAMETERS['settings']['messages_per_page'];
//Conteggio messaggi totali
$record = gdrcd_query("SELECT COUNT(*) FROM messaggi WHERE destinatario = '".$_SESSION['login']."'");
$totaleresults = $record['COUNT(*)'];
//Elenco messaggi paginato
/** * Bugfix: correzione di un bug che permetteva la visualizzazione di messaggi non inviati all'utente
* semplicemente modificando l'id. Viene quindi aggiunta nella clausola where il controllo sulla proprietà
* del messaggio. Nel caso in cui non venga trovato alcun messaggio verrà mostrato un errore.
* @author Rhllor
*/
//$result=gdrcd_query("SELECT * FROM messaggi WHERE personaggio_conversazione = ".gdrcd_filter('num',$_REQUEST['personaggio_conversazione'])." LIMIT 1", 'result');
$result = gdrcd_query("SELECT *
FROM (
(
SELECT mittente as personaggio_conversazione, testo, letto, destinatario, mittente, id, spedito
FROM messaggi
WHERE 1
AND ( destinatario = '".$_SESSION['login']."' AND mittente = '".$_REQUEST['personaggio_conversazione']."') OR ( mittente = '".$_SESSION['login']."'
AND destinatario = '".$_REQUEST['personaggio_conversazione']."')
AND destinatario_del = 0
AND spedito = (SELECT MAX(mcheck.spedito) from messaggi as mcheck WHERE mcheck.destinatario = messaggi.destinatario AND mcheck.mittente = messaggi.mittente )
ORDER BY letto, spedito DESC
)
) AS conversazioni
ORDER BY letto, spedito DESC
LIMIT ".$pagebegin.", ".$pageend."", 'result');
?>
<?php
while($row = gdrcd_query($result, 'fetch')) {
?>
<div style=" border: 1px solid black;">
<tr>
<td class="elementi_elenco_preview">
<div>
Id messaggio: <?php echo $row['id']; ?>
</div>
</td>
<td class="elementi_elenco_preview">
<div>
Destinatario: <?php echo $row['destinatario']; ?>
</div>
</td>
<td class="elementi_elenco_preview">
<div>
Mittente: <?php echo $row['mittente']; ?>
</div>
</td>
<td class="elementi_elenco_preview">
<div>
<?php echo $row['testo']; ?>
</div>
</td>
</tr>
</div>
<?php
}
?>
Ora va tutto messo in grafica, sistemato insomma, aggiunta la possibilità di rispondere e riflettere su come cancellare... E devo capire la paginazione, perché così a occhio mi sembra che non stia impaginando i messaggi...
Work in progress *__*
Kasa, grazie dell'aiuto. Speriamo di riuscire a farne venir fuori un pacchetto decente.
23/06/2021 19:26:20
haruka ha scritto: ...
In questo settore, gasarsi fa bene!
Aiuta a superare il trauma delle ore impegnante nel debug.
A parte tutto, la query andrebbe leggermente sistemata in modo da ordinare per bene i dati ed evitare di prendere solo quelli con la data massima ( a differenza dell index, nel read non serve).
Il punto è stampare la lista totale, ordinata per spedito e, importante, il personaggio che ha inviato il messaggio, così puoi fare la distinzione.
Più tardi vedo di fare una query esempio.
Kasa.
23/06/2021 23:23:30
haruka ha scritto: ...
La query da utilizzare in read.inc.php dovrebbe essere più o meno così:
SELECT mittente, testo, letto, spedito
FROM (
(
SELECT mittente, testo, letto, spedito
FROM messaggi
WHERE 1
AND destinatario = '".$_SESSION['login']."'
AND mittente = '".$_REQUEST['personaggio_conversazione']."'
AND destinatario_del = 0
ORDER BY spedito DESC
)
UNION ALL
(
SELECT mittente, testo, letto, spedito
FROM messaggi
WHERE 1
AND destinatario = '".$_REQUEST['personaggio_conversazione']."'
AND mittente = '".$_SESSION['login']."'
AND mittente_del = 0
ORDER BY spedito DESC
)
) AS conversazione
ORDER BY spedito DESC
Kasa.
24/06/2021 00:33:12
kasa ha scritto: [quote]haruka ha scritto: ...
La query da utilizzare in read.inc.php dovrebbe essere più o meno così:
SELECT mittente, testo, letto, spedito
FROM (
(
SELECT mittente, testo, letto, spedito
FROM messaggi
WHERE 1
AND destinatario = '".$_SESSION['login']."'
AND mittente = '".$_REQUEST['personaggio_conversazione']."'
AND destinatario_del = 0
ORDER BY spedito DESC
)
UNION ALL
(
SELECT mittente, testo, letto, spedito
FROM messaggi
WHERE 1
AND destinatario = '".$_REQUEST['personaggio_conversazione']."'
AND mittente = '".$_SESSION['login']."'
AND mittente_del = 0
ORDER BY spedito DESC
)
) AS conversazione
ORDER BY spedito DESC
Kasa.[/quote]
Sto ragionando anche in termini di css per applicare due diversi stili. Ho continuato ad usare la mia query cercando di capire le tue modifiche. Per ora sono approdata a quetso (che non è male)
<style type="text/css">
.destinatario {width: 80%; float: left; padding:20px; margin: 10px 20px 5px 20px;
}
.mittente {width: 80%; float: right; padding:20px; margin:10px;
}
</style>
<?php
//Determinazione pagina
if(isset($_REQUEST['offset']) === false) {
$pagebegin = 0;
} else {
$pagebegin = (int) $_REQUEST['offset'] * $PARAMETERS['settings']['messages_per_page'];
}
$pageend = $PARAMETERS['settings']['messages_per_page'];
//Conteggio messaggi totali
$record = gdrcd_query("SELECT COUNT(*) FROM messaggi WHERE destinatario = '".$_SESSION['login']."'");
$totaleresults = $record['COUNT(*)'];
//Elenco messaggi paginato
/** * Bugfix: correzione di un bug che permetteva la visualizzazione di messaggi non inviati all'utente
* semplicemente modificando l'id. Viene quindi aggiunta nella clausola where il controllo sulla proprietà
* del messaggio. Nel caso in cui non venga trovato alcun messaggio verrà mostrato un errore.
* @author Rhllor
*/
//$result=gdrcd_query("SELECT * FROM messaggi WHERE personaggio_conversazione = ".gdrcd_filter('num',$_REQUEST['personaggio_conversazione'])." LIMIT 1", 'result');
$result = gdrcd_query("SELECT *
FROM (
(
SELECT mittente as personaggio_conversazione, testo, letto, destinatario, mittente, id, spedito
FROM messaggi
WHERE 1
AND ( destinatario = '".$_SESSION['login']."' AND mittente = '".$_REQUEST['personaggio_conversazione']."') OR ( mittente = '".$_SESSION['login']."'
AND destinatario = '".$_REQUEST['personaggio_conversazione']."')
AND destinatario_del = 0
ORDER BY letto, spedito DESC
)
) AS conversazioni
ORDER BY letto, spedito DESC", 'result');
?>
<h3>Conversazione con: <?php echo $_REQUEST['personaggio_conversazione']; ?> </h3>
<?php
while($row = gdrcd_query($result, 'fetch')) {
?>
<?php
if(($row['destinatario'] == $_SESSION['login']) && ($row['letto'] == 0)) {
gdrcd_query("UPDATE messaggi SET letto = 1 WHERE id = ".gdrcd_filter('num', $row['id'])." LIMIT 1");
}
$cls = $row['destinatario'] == $_SESSION['login'] ? "destinatario" : "mittente";
echo "<div class=\"{$cls}\">"
?>
<tr>
<td class="elementi_elenco_preview">
<div>
Id messaggio: <?php echo $row['id']; ?>
</div>
</td>
<td class="elementi_elenco_preview">
<div>
Data: <?php echo $row['spedito']; ?>
</div>
</td>
<td class="elementi_elenco_preview">
<div>
Destinatario: <?php echo $row['destinatario']; ?>
</div>
</td>
<td class="elementi_elenco_preview">
<div>
Mittente: <?php echo $row['mittente']; ?>
</div>
</td>
<td class="elementi_elenco_preview">
<div>
<?php echo $row['testo']; ?>
</div>
</td>
</tr>
</div>
<div style="clear: both;">
<?php
echo "</div>";
}
?>
24/06/2021 10:06:22
Ti consiglio di utilizzare la query che ti ho indicato, in modo da avere dai messaggi lo stretto ed indispensabile e formattato in una sola chiave leggibile.
Quando andrai poi a stampare il tutto, nell'attributo classe dei box messaggio farai un IF STATEMENT molto semplice:
<... class="<?php if($row['mittente'] == $_SESSION['login']) { echo 'NOME_CLASSE_NOVOLETTA_DESTRA';} else { echo 'NOME_CLASSE_NUVOLETTA_SINISTRA';} ?>" ... >
O, ancora meglio:
<... class="<?php echo $row['mittente'] == $_SESSION['login'] ? 'NOME_CLASSE_NOVOLETTA_DESTRA'} : 'NOME_CLASSE_NUVOLETTA_SINISTRA'; ?>" ... >
Non serve sapere destinatario ed altro, basta mittente, colui che ha inviato il messaggio. Poi ovviamente spedito, per la data, e letto nel caso tu volessi mettere le spunte blu.
In questo modo puoi applicare due stili diversi di CSS senza ammazzarti troppo di controlli.
Kasa.
24/06/2021 10:58:42
kasa ha scritto: Ti consiglio di utilizzare la query che ti ho indicato, in modo da avere dai messaggi lo stretto ed indispensabile e formattato in una sola chiave leggibile.
Grazie Kasa, molto meglio.
L'id del messaggio penso che lo lascerò perché mi serve per piazzarci sopra il link per eliminare il singolo messaggio ;)
E idem per il quote, devo andare a ripescare come funzionano entrambi.
La funzione per segnalare il messaggio come "letto" invece l'avevo già messa ieri sera.
24/06/2021 11:24:35
Scusate se mi intrometto... ma ho seguito questa conversazione col fiato sospeso, tipo lancio dell'Apollo 11! Ahahahahahah
Innanzitutto grazie ad entrambi per aver postato qui i ragionamenti e le meccaniche! **
Se l'intenzione sarebbe di farne un pacchetto, potrei azzardare a chiedere di provare a strutturare la cosa sia per il 5.4 che per il 5.5? Anche solo un txt di spiegazione su come ottenere la stessa cosa sul 5.4... Temo siano molte le land attuali ancora strutturate sul precedente GDRCD e sarebbe carino (e molto utile) andare a coprire entrambe le versioni!
Da quello che ho capito, tutta la parte di GDRCD 5.5 che gestisce i messaggi è stata scomposta e divisa in più pagine. Credete che le modifiche/aggiunte da voi avanzate si possano replicare anche sul 5.4?
24/06/2021 11:35:38
jan90 ha scritto: Scusate se mi intrometto... ma ho seguito questa conversazione col fiato sospeso, tipo lancio dell'Apollo 11! Ahahahahahah
Innanzitutto grazie ad entrambi per aver postato qui i ragionamenti e le meccaniche! **
Se l'intenzione sarebbe di farne un pacchetto, potrei azzardare a chiedere di provare a strutturare la cosa sia per il 5.4 che per il 5.5? Anche solo un txt di spiegazione su come ottenere la stessa cosa sul 5.4... Temo siano molte le land attuali ancora strutturate sul precedente GDRCD e sarebbe carino (e molto utile) andare a coprire entrambe le versioni!
Da quello che ho capito, tutta la parte di GDRCD 5.5 che gestisce i messaggi è stata scomposta e divisa in più pagine. Credete che le modifiche/aggiunte da voi avanzate si possano replicare anche sul 5.4?
La butto lì, purtroppo non avendo la 5.4 non so essere più precisa.
Visto che questo sistema è lasciato alla scelta del giocatore, forse nella 5.4 si può fare lo stesso switch che rimanda ai file di questa versione che saranno quelli della 5.5
Per intenderci, gli utenti che si tengono la versione standard, si interfacceranno al vecchio file dei messaggi che in effetti conteneva tutto (adesso, non ricordo più come si chiama).
Gli utenti che sceglieranno la versione whatsapp, avranno tutto il nuovo pacchetto di file che è quello della 5.5.
Il problema è che ci vuole qualche anima volenterosa che, appena finita questa patch, abbia voglia di testarla anche su 5.4 e vedere se funziona. E c'è da capire se tra 5.4 e 5.5 ci sono state modifiche al database, perché in tal caso non funzionerebbe...
Discussione seguita da
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Raja Dunia ↗
CRSED: F.O.A.D. ↗
Fallen Gods ↗
Exclusive Villa GdR ↗
Neverness to Everness ↗
Project Entropy ↗
Storie di Agarthi ↗
World of Warship ↗