Dove eravamo rimasti con DjakaWeb?
All'implementazione della logica facebookosa del click. Ovvero quell'antipatica (ma facebookosa, quindi splendida) meccanica per cui "giocare" significa presentarsi ogni tot ore su un sito e fare un click.
DjakaWeb comprende numerose azioni che si possono fare. Si potrebbe ridurre una "partita" a quindici minuti consentendo all'utente di fare tutte le azioni di seguito, ma noi vogliamo che le azioni abbiano un "prezzo" in senso di tempo (facebookoso) quindi vogliamo concedere solo un click ogni tot ore.
Eventualmente, in un futuro, potrai rompere le scatole ai tuoi amici perché clicchino mentre tu non puoi, per ravvelocizzare la procedura.
Prima di mettere in ghiaccio il progetto avevo già imbastito il sistema per cui il click dell'utente viene salvato su DB. Purtroppo questo mi ha fatto entrare nella terribile palude dei timestamp.
L'ORM di perl (DBIX::Class) ha una sua astrazione dei timestamp (DateTime) che funziona bene, ma naturalmente non è come gestire un semplice numerillo. Fosse per me tutte le data/ora si conterebbero come secondi da epoch, ma in certe circostanze di arriva presto a scoprire che questo modo di pensare è abbastanza poco versatile.
Le cose che quindi ho implementato sono:
- Un check per controllare se l'utente ha a disposizione il click o no.
- Un sistema per misurare quanto manca dalla prossima opportunità di click
- Un Javascript (bhe, l'installazione di questo javascript) per la visualizzazione a frontend del countdown.
Il primo grosso problema contro cui mi sono scontrato è il fatto che recuperare il timestamp salvato su DB da bravo bambino, ovvero chiamando il controller che va su DBIX::Class e poi modificando il medesimo, questo rimaneva modificato in modo imperituro nella sessione apache. Attenzione! Il dato non si aggiornava lato DB, ma lato sistema continuava ad aggiornarsi per ogni add, con ovvi e notevoli effetti fastidiosi.
Sono uscito da questo scoglio solo facendo del timestamp un clone() che ovviamente ha creato un oggetto sganciato dall'informazione in mio possesso, permettendomi di manipolarlo come meglio credo.
Lo scoglio che al momento non ho ancora superato riguarda il fatto che DateTime::Duration è un po' cocciuto quando si tratta di fare conversioni.
Il mio ragionamento è: vediamo quanto tempo manca al prossimo click facendo (TIMESTAMP ULTIMO CLICK + X) - ORA. Dove X è il tempo che voglio l'utente attenda.
Questo, fatto coi DateTime, produce un DateTime::Duration, una hash con il risultato in anni, mesi, giorni, ore, minuti, secondi ecc ecc ecc.
Visto che parliamo di un ordine di grandezza che alla fine sarà in ore e visto che comunque il dettaglio mi va bene in secondi (che è più manipolabile) mi piacerebbe che Duration non mi restituisse una struttura così articolata, ma, appunto, l'ammontare in secondi del tempo che manca.
Peccato che la matematica sottesa a DateTime sia contorta e mostruosa e recuperare questo dato non è affatto semplice.
Se non trovo una soluzione reale dovrò ricorrere a un qualche escamotage.
Musica nelle orecchie: http://www.youtube.com/watch?v=SsB9DMF6gYw