slupdator
Animado por Eva Nowicka, me dispongo a anunciar slupdator v0.1 X-DD.
No es que sea un programa que digas tú «¡joer que tochazo de código!», pero bueno, no es algo que haya encontrado por ningún otro sitio y lo he tenido que hacer. Es mi primer (¡cortísimo!) script serio en LSL.
Nota: un usuario sin conocimientos de programación (ni hosting web) no podrá hacer funcionar todo, es por ésto que no me explayaré explicando la forma de hacer que todo funcione correctamente.
Descripción
El objetivo es indicar en una página web un enlace de tipo secondlife:// hacia la posición actual (bueno, en realidad con una tolerancia de 60 segundos, al menos idealmente) de nuestro avatar en el metaverso de Second Life.
El lado Linden
Simplemente tendremos que crear un objeto HUD (por ejemplo un cubo y adjuntarlo a la parte inferior derecha de la interfaz del visor) con el siguiente script incluído en el objeto (llamémosle al script Status Publisher, por ejemplo):
default
{
state_entry()
{
llSetTimerEvent(60);
}
timer()
{
llHTTPRequest("http://www.xiterrex.net/slupdator.php",
[HTTP_METHOD, "GET"], "");
}
http_response(key request_id, integer status, list metadata, string body)
{
if(status == 200)
{
if(llGetColor(ALL_SIDES) == <1, 1, 1>)
{
llSetColor(<0, 0, 0>, ALL_SIDES);
}
else
{
llSetColor(<1, 1, 1>, ALL_SIDES);
}
}
else
{
llSetColor(<1, 0, 0>, ALL_SIDES);
}
}
}
En la última versión he puesto que en cada intervalo de tiempo se intercambien alternativametne los colores negro y blanco en las caras del cubo. Si existe algún problema, el color se pondrá rojo. 60 segundos es un tiempo razonable, en mi opinión; pero se puede modificar.
El otro lado
En mi caso el otro lado está formado por el programa en php que describiré.
Según leemos en la definición de la función llHTTPRequest() recibiremos una serie de cabeceras especiales, siendo las interesantes las siguientes:
X-SecondLife-Owner-NameX-SecondLife-RegionX-SecondLife-Local-Position
Pues bien, junto a la hora actual, vamos a guardarlas (creando previamente el archivo vacío slupdator_info.php y dándole permiso de escritura para el usuario que ejecute el apache/php):
<?php //FILE: slupdator.php
include_once("slupdator_info.php");
$headers = getallheaders();
if (array_key_exists('X-SecondLife-Owner-Name', $headers)) {
$location[$headers['X-SecondLife-Owner-Name']] =
$headers['X-SecondLife-Region'] . ";" .
$headers['X-SecondLife-Local-Position'] . ";" .
date("U"). ";";
$file = fopen("slupdator_info.php", "w");
fwrite($file, "<"."?php\n");
foreach($location as $key => $value)
fwrite($file, "\$location['$key'] = '$value';\n");
fwrite($file, "?".">\n");
fclose($file);
} else {
header("Location: /404");
}
?>
Y para hacer uso de ésto, se me han ocurrido 2 versiones: una de ellas la empleo en la página de Contacto mientras que la otra es el icono que aparece y desaparece a la izquierda de las pestañas de mi página.
Usando la última posición registrada, tenga la antigüedad que tenga
<?php //FILE: slupdator2url.php
include_once("slupdator_info.php");
function slupdator2url($name)
{
global $location;
if(!array_key_exists($name, $location))
return("secondlife://La%20Isla/47/131/27");
$info = explode(";", $location[$name]);
$region = urlencode(ereg_replace(" \(.*", "", $info[0]));
$coordinates = explode(",", ereg_replace(" ", "", ereg_replace("\(", "",
ereg_replace("\)", "", $info[1]))));
$time = $info[2];
return "secondlife://" .
$region . "/" .
round($coordinates[0]) . "/" .
round($coordinates[1]) . "/" .
round($coordinates[2]);
}
?>
Imprimiendo sólo la ubicación si es actual
De esta forma detectaremos cuándo estamos desconectados, con lo que la función no devolverá nada (supondremos desconectado/caído si no hemos recibido actualización en el doble de tiempo del intervalo del script lsl):
<?php //FILE: slupdatoricon.php
include_once("slupdator_info.php");
function slupdatoricon()
{
global $location;
if(!array_key_exists("Terrex Vieria", $location)) {
$url = "secondlife://La%20Isla/47/131/27";
echo "<a class=\"link secondlife notab\" href=\"$url\"></a>";
} else {
$info = explode(";", $location["Terrex Vieria"]);
$region = urlencode(ereg_replace(" \(.*", "", $info[0]));
$coordinates = explode(",", ereg_replace(" ", "", ereg_replace("\(", "",
ereg_replace("\)", "", $info[1]))));
$coordinates[0] = round($coordinates[0]);
$coordinates[1] = round($coordinates[1]);
$coordinates[2] = round($coordinates[2]);
$time = $info[2];
$url = "secondlife://" .
$region . "/" .
$coordinates[0] . "/" .
$coordinates[1] . "/" .
$coordinates[2];
if(date("U") - $time <= 120)
echo "<a class=\"link secondlife notab\" title=\"$region (" .
$coordinates[0] . ", " .
$coordinates[1] . ", " .
$coordinates[2] .
") @ " .
strftime("%e/%m/%Y %H:%M CEST", $time) .
"\" href=\"$url\"></a>";
}
}
?>
Problemas conocidos
-
Bueno, el tinglado no funciona si estamos en una región «No-Scripts», puesto que no corren los temporizadores externos en estas zonas.
De momento no tiene solución, pero se podría parchear el visor para que tanto éste como otros scripts huds se ejecuten de forma local. Esto es posible porque no se pediría al sim que ejecute el script, sino localmente a nuestro visor; esto no puede ocurrir con los scripts de objetos atacheados al cuerpo o sueltos en el mundo, de los cuáles el sim debe tener conocimiento.
-
«El otro lado» no es seguro, puesto que cualquiera puede generar una petición HTTP falseada haciéndose pasar por el script de nuestro visor. Se soluciona prohibiendo a otros acceder al url que consulta el script: «
Deny From All, Allow From localhost».
Licencia de uso
El código mostrado tiene licencia GPL versión 2.0.
Créditos:
Guillermo Gutiérrez Herrera aka Terrex Vieria
terrex@xiterrex.net
http://www.xiterrex.net/
Si tiene problemas
Si no consigue hacerlo funcionar y le gustaría, contáctame in-world y le envío un objeto HUD preparado, más instrucciones sobre como usarlo desde su web sin necesidad de php (sí javascript).




