<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MUD.it &#187; Programmazione</title>
	<atom:link href="http://www.mud.it/category/generale/programmazione/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mud.it</link>
	<description>Tutto sui MUD</description>
	<lastBuildDate>Thu, 02 Feb 2012 13:37:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Utenti Online?</title>
		<link>http://www.mud.it/16-03-2010/utenti-online/</link>
		<comments>http://www.mud.it/16-03-2010/utenti-online/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 13:12:20 +0000</pubDate>
		<dc:creator>Matteo</dc:creator>
				<category><![CDATA[Programmazione]]></category>

		<guid isPermaLink="false">http://www.mud.it/?p=9</guid>
		<description><![CDATA[Qualche tempo fa un vecchio giocatore di MUD ora in pensione (Arthedain) parlando su ICQ mi raccontava che una features che gli sarebbe sempre piaciuto trovare sul sito di questo o quel mud era la visualizzare via web degli utenti correntemente connessi al gioco.


Personalmente trovo la cosa abbastanza futile, tuttavia appena ho avuto occasione ho... [<a href="http://www.mud.it/16-03-2010/utenti-online/" title="Leggi il resto dell'articolo">Continua</a>]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Qualche tempo fa un vecchio giocatore di MUD ora in pensione (Arthedain) parlando su ICQ mi raccontava che una features che gli sarebbe sempre piaciuto trovare sul sito di questo o quel mud era la visualizzare via web degli utenti correntemente connessi al gioco.</p>
<p><span id="more-9"></span></p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid whitesmoke;" src="http://www.mud.it/wp-content/uploads/2010/03/rda_webwho.gif" alt="Esempio di webwho" /></p>
<p style="text-align: justify;">Personalmente trovo la cosa abbastanza futile, tuttavia appena ho avuto occasione ho voluto provare a realizzare tale funzionalità a scopo puramente ricreativo avvalendomi  della linea guida suggeritami dallo stesso Arthedain:</p>
<p style="padding-left: 30px; text-align: justify;"><span style="color: #ff0000;">Arthedain</span>, 09/02/2010:<br />
<em>…quello che dico io e&#8217; semplicemente: Il tuo mud fa&#8217; un chi e salva i dati su un file, poi manda il file al mio server, e abbiamo finito.</em></p>
<p style="text-align: justify;">L&#8217;idea mi pare sensata anche se probabilmente potrebbero essere sviluppate meccaniche più funzionali ed economiche, ad esempio producendo la lista degli utenti connessi solo su richiesta e non magari periodicamente: ciò, nel caso dei mud italiani in cui l&#8217;utenza è  esigua, ridurrebbe senz&#8217;altro il carico di trasmissione dati tra mud-server e web-server. Per contro però l&#8217;utenza web potrebbe influenzare in modo indefinito il carico di richieste verso il mud-server, salvo ricorrere a strategie di controllo che esulano dalla mia competenza di programmatore dilettante.</p>
<p style="text-align: justify;">L&#8217;implementazione che segue è basata sul sorgente smaug 1.4 usato da RDA e operativo su server Linux, ma credo possa essere facilmente adattato ad altri sorgenti o piattaforme. Si tenga conto tra l&#8217;altro che lo smaug a quanto pare aveva abbozzato una simile funzionalità, che potrebbe persino essere stata completata nelle versioni più recenti del codice. Troviamo infatti nella funzione do_who, responsabile della visualizzazione degli utenti connessi mentre si è in gioco, la variabile fShowHomepage che permette la stampa sul file degli utenti connessi.</p>
<h1>Codice C</h1>
<p style="text-align: justify;">La prima cosa da fare quindi è scrivere una funzione che stampi su file la lista degli utenti connessi, e io per comodità ho fatto in modo che il file generato sia già in formato html di modo che possa essere incluso facilmente in qualunque pagina web con la direttiva include o readfile di php. Ecco come potrebbe apparire la funzione di base:</p>
<pre style="padding-left: 30px; line-height: 15px;"><span style="color: #0000ff;">#define</span> WHOWEB_FILE SYSTEM_DIR<span style="color: #993300;"> "whoweb.php"</span>
<span style="color: #0000ff;">void </span>whoweb_check( )
{
  DESCRIPTOR_DATA *d; CHAR_DATA *wch; <span style="color: #0000ff;">int</span> count = 0;
  FILE *fp = fopen( WHOWEB_FILE, <span style="color: #993300;">"w"</span> );
 <span style="color: #0000ff;"> if</span> ( !fp )
  { bug( <span style="color: #993300;">"Impossibile scrivere il file whoweb.php!"</span>, 0 ); <span style="color: #0000ff;">return</span>; }
  fprintf( fp, <span style="color: #993300;">"Utenti connessi...&lt;hr&gt;"</span> );
  <span style="color: #0000ff;">for </span>(d = last_descriptor; d; d = d-&gt;prev)
  {
 <span style="color: #0000ff;">   if </span>( !d ) <span style="color: #0000ff;">continue</span>;
 <span style="color: #0000ff;">   if</span> (d-&gt;connected != CON_PLAYING &amp;&amp; d-&gt;connected != CON_EDITING)
 <span style="color: #0000ff;">   continue</span>;
    wch = (d-&gt;original ? d-&gt;original : d-&gt;character);
 <span style="color: #0000ff;">   if</span> ( IS_NPC(wch) || xIS_SET(wch-&gt;act, PLR_WIZINVIS) )
 <span style="color: #0000ff;">   continue</span>;
    count += 1;
    fprintf( fp, <span style="color: #993300;">"%s&lt;br&gt;"</span>, wch-&gt;name );
  }
  fprintf( fp, <span style="color: #993300;">"%s&lt;hr&gt;Giocatori: %d | %.24s | &lt;a style=\"href=\"#\"
  onclick=\"javascript:window.location.reload(true)\"&gt;Aggiorna&lt;/a&gt;"</span>,
  count ? <span style="color: #993300;">""</span> : <span style="color: #993300;">"Nessuno."</span>, count, ctime(&amp;current_time)  );
  fclose( fp );
 <span style="color: #0000ff;"> return</span>;
}</pre>
<p></p>
<p style="text-align: justify;">Come si può notare, in questo esempio, ho predisposto semplicemente la stampa del nome del giocatore online e, in fondo a seguire, il loro numero complessivo,  il riferimento alla data e ora in cui il listato è stato generato, e un link per il refresh della pagina web. Chiaramente, volendo, si potranno registrare per ciascun utente ben piu&#8217; informazioni del nome. Nel caso di RDA, ad esempio, ho incluso la razza, l&#8217;età, l&#8217;altezza, il peso, la classe d&#8217;appartenenza, il livello, il luogo in cui il pg si trova al momento, etc&#8230; Per fornire tutte queste informazioni in modo compatto mi sono servito dei cosiddetti tooltips multiline in javascript di cui ho inserito la sintassi specifica direttamente nella funzione whoweb_check() (&#8230;nb: il tooltips usato da me è reperibile <a href="http://www.walterzorn.com/tooltip/tooltip_e.htm">QUI</a>).</p>
<p style="text-align: justify;"><strong><span style="color: #ff0000;">ATTENZIONE!</span></strong> Tra le info del pg che potrete stampare su file sconsiglio vivamente d&#8217;inserire: il titolo, la biografia, o in generale elementi che il pg può modificare più o meno a piacere, salvo introdurre funzioni di sicurezza specifiche che blocchino eventuali tag inseriti dal giocatore e che sappiano rielaborare anche eventuali codici colori utilizzati. La ragione è semplice: cosa accadrebbe se un pg scrivesse nel proprio titolo una cosa come &#8220;<span style="color: #999999;">&lt;div&gt;</span>&#8220;?</p>
<p style="text-align: justify;">Ora la domanda è: &#8220;dove inserire nel codice la chiamata alla nostra funzione whoweb_check()?&#8221;. La mia scelta è stata di farlo ogni due tick, generando dunque indicativamente un aggiornamento del listato ogni due minuti e mezzo. Nulla vieta comunque d&#8217;invocare la funzione con differente frequenza,  ma in ogni caso la zona d&#8217;inserimento della nostra procedura cadrà quasi senz&#8217;altro all&#8217;interno della <strong>update_handler()</strong>, ovvero la funzione che gestisce la maggior parte degli update periodici nello smaug.</p>
<h1>Codice Linux</h1>
<p style="text-align: justify;">Giunti a questo punto, se il web-server coincide col computer sul quale gira il nostro mud la storia si può dire conclusa. Basterà infatti porre in una qualunque pagina web del nostro sito un get_file_content, un include, o un readfile che punti al nostro neonato file whoweb.php. Diversamente dovremmo preoccuparci di inviare il file al nostro web-server ogni tot tempo, che di regola dovrebbe corrispondere all&#8217;intervallo di tempo con cui il listato viene prodotto. Su server linux creeremo dunque un file <strong>whowebloop</strong> a cui attribuiremo permessi d&#8217;esecuzione e nel quale inseriremo uno script di questo tipo:</p>
<pre style="text-align: justify; padding-left: 30px; line-height: 15px;"><span style="color: #993300;">#!/bin/bash</span>
<span style="color: #0000ff;">while</span> :
<span style="color: #0000ff;">do</span>
<span style="color: #008000;">#Aggiornamento ogni 90 secondi</span>
sleep 90 &amp; pid=$!
 curl <span style="color: #993300;">-m 30 --connect-timeout 30 -s -T /directory/mud_server/whoweb.php
 ftp://host.web.server --user nome_utente:password</span>
 wait $pid
<span style="color: #0000ff;">done</span></pre>
<p></p>
<p style="text-align: justify;">Chiaramente <span style="color: #999999;">/directory/mud_server</span> dovrà coincidere col percorso ove è collocato il vostro file <span style="color: #999999;">whoweb.php</span>, l&#8217;<span style="color: #999999;">host.web.server</span> sarà l&#8217;indirizzo di connessione ftp al server in cui risidere il vostro sito e a cui vi autenticherete tramite il vostro <span style="color: #999999;">nome_utente</span> e <span style="color: #999999;">password</span>.</p>
<h1>Codice Web</h1>
<p style="text-align: justify;">Un aspetto ulteriore da tenere in conto è l&#8217;eventualità che un utente acceda alla pagina web contenente il nostro listato mentre questo viene aggiornato. Il mio consiglio in questo caso è di inserire, tramite la whoweb_check(), un tag commento di verifica in coda al file whoweb.php come segue: <span style="color: #888888;">&lt;!-<font face="Courier New, Courier, mono">-</font>WHOWEBEOF-<font face="Courier New, Courier, mono">-</font>&gt;</span> ed effettuare poi il caricamento del file whoweb.php in modo tradizionale invece che tramite include. Ecco come:</p>
<pre style="text-align: justify; padding-left: 30px; line-height: 15px;"><span style="color: #0000ff;">&lt;<span style="color: #ff0000;">?php</span>
  if</span> (<span style="color: #ff0000;">is_file</span>(<span style="color: #993300;">"whoweb.php"</span>))
  { $handle = <span style="color: #ff0000;">fopen</span> (<span style="color: #993300;">"whoweb.php"</span>, <span style="color: #993300;">"r"</span>);
    $whowebtxt = <span style="color: #ff0000;">fread</span>($handle, <span style="color: #ff0000;">filesize</span>(<span style="color: #993300;">"whoweb.php"</span>));
<span style="color: #ff0000;">    fclose</span>($handle);
  }
  $checkEOF=<span style="color: #ff0000;">substr</span>($whowebtxt, -16);
<span style="color: #0000ff;">  if</span> ( $checkEOF == <span style="color: #993300;">"&lt;!--WHOWEBEOF--&gt;"</span> )
  { <span style="color: #ff0000;">echo </span>$whowebtxt; }
<span style="color: #0000ff;">  else </span>
  { <span style="color: #ff0000;">echo</span><span style="color: #993300;"><span style="color: #ff0000;"> </span>"Attendere: la lista dei giocatori sta temporaneamente aggiornandosi."</span>;
<span style="color: #ff0000;">    echo </span><span style="color: #993300;">"&lt;script&gt;var t; t=setTimeout('window.location.reload(true)',7500)
          &lt;/script&gt;"</span>;}
<span style="color: #0000ff;"><span style="color: #ff0000;">?</span>&gt;</span></pre>
<p></p>
<p style="text-align: justify;">Potete vedere <a href="http://www.rdamud.altervista.org/giocatori.php">QUI</a> lo script in azione ed eventualmente studiare la sintassi completa impiegata sul sito di RDA visualizzando l&#8217;origine della pagina. Se non ci sono giocatori connessi &#8211; mannaggia &#8211; entrate voi stessi e ricaricate la pagina dopo 2 minuti circa per vedere il risultato. Gli aggiornamenti da me imposti sono ogni 2,5 minuti per la precisione, valore che ritengo un buon compromesso tra informazioni fornite e &#8220;privacy&#8221; per chi gioca. Per dubbi o commenti: <a href="mailto:rdamud@gmail.com">rdamud@gmail.com</a>.</p>
<p>Un saluto,<br />
Matteo (Alek)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mud.it/16-03-2010/utenti-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

