Le LSL de Second Life

Ce site est consacré principalement au langage LSL de Second Life...

« Retour aux scripts


Un formulaire sur une primitive


Pour illustrer un peu les nouvelles possibilités du viewer V2.0 je me suis amusé à faire un petit service qui fait un truc totalement inutile : il se contente d'assurer la saisie de la largeur et la hauteur d'une primitive. Si vous voulez tester ça commencez par créer un cube de base, aplatissez le sur l'axe Y pour le transformer en écran.

Ensuite mettez ce script dans la primitive :

        string URL = "http://sl-creation.org/web_service/";
        string URL_GESTION = "url_gestion.php?";
        string URL_DIM = "post_dim.php?";
        
        float DELAI_SEND_URL = 360.0;
        float DELAI_REQUEST_URL = 60.0;
        
        string memoURL;
        key requestID;
        
        sendURL() {
        requestID = llHTTPRequest(memoURL, [HTTP_METHOD, "GET"], "");
        llOwnerSay("Envoi de l'url : " + memoURL);
        llSetTimerEvent(DELAI_SEND_URL);
        }
        
        
        default
        {
        state_entry() {llRequestURL();}
        
        http_request(key id, string methode, string corps)
        {
        if (methode == URL_REQUEST_GRANTED)    {
        memoURL = URL + URL_GESTION + "clef=" + (string)llGetKey() + "&url=" + corps;
        sendURL();
        }
        else if (methode == URL_REQUEST_DENIED) {
        llOwnerSay("Pas d'URL ! Je redemande dans " + (string)DELAI_REQUEST_URL + " secondes");
        llSleep(DELAI_REQUEST_URL);
        llRequestURL();
        }
        else if (methode == "POST") {
        if(corps == "error")
        llInstantMessage(llGetOwner(), "Une erreur est survenue sur le serveur, désolé");
        else {
        list l = llParseString2List(corps, ["&","="], []);
        float fLargeur = (float)llList2String(l, 1);
        float fHauteur = (float)llList2String(l, 3);
        vector vScale = llGetScale();
        llSetScale();
        llHTTPResponse(id, 200, "Tout s'est bien passé !");
        }
        }
        }
        
        touch_start(integer total_number) {
        if(llDetectedKey(0) == llGetOwner())
        llSetPrimMediaParams
        (1,[
        PRIM_MEDIA_CONTROLS, PRIM_MEDIA_CONTROLS_MINI,
        PRIM_MEDIA_AUTO_PLAY, TRUE,
        PRIM_MEDIA_AUTO_SCALE, TRUE,
        PRIM_MEDIA_HOME_URL, URL + URL_DIM + "clef=" + (string)llGetKey(),
        PRIM_MEDIA_CURRENT_URL, URL + URL_DIM + "clef=" + (string)llGetKey()]);
        
        }
        
        on_rez(integer i) {llRequestURL();}
        
        changed(integer change)    {
        if(change & (CHANGED_REGION | CHANGED_TELEPORT | CHANGED_REGION_START))
        llRequestURL();
        }
        
        http_response(key request_id, integer status, list metadata, string body) {
        if(request_id == requestID && body == "url_ok") {
        llOwnerSay("URL reçue par le serveur");
        llSetTimerEvent(.0);
        }
        }
        
        timer(){
        sendURL();}
        }   
        
              

Le script va solliciter une url et l'envoyer au serveur qui va la mémoriser. Ensuite il suffit de toucher la primitive. La face 1 affiche un formulaire, vous entrez des valeurs et les dimensions de la primitive s'adaptent en conséquence. Voilà une petite vue du truc :

C'est vrai que ça change un peu de la saisie dans le Chat ! Après réflexion on peut faire l'économie du serveur externe pour un simple formulaire et utiliser simplement celui qui est fourni dans la primitive. Entrez le script suivant dans une primitive :



float DELAI_REQUEST_URL = 60.0;

default
{
state_entry() {llRequestURL();}

http_request(key id, string methode, string corps)
{
if (methode == URL_REQUEST_GRANTED) {
string s = "<html>
<body>
<form action=" + corps + " method=post>
<p>
<label>texte :
<input name=test type=text/>
</label>
</p>
<p>
<input type=submit value=Envoyer />
</p>
</form>
</body>
</html>";
llClearPrimMedia(0);
llSetPrimMediaParams(0,[
PRIM_MEDIA_CONTROLS, PRIM_MEDIA_CONTROLS_MINI,
PRIM_MEDIA_AUTO_PLAY,TRUE,
PRIM_MEDIA_CURRENT_URL, "data:text/html;charset=utf-8,<!DOCTYPE html>" + s,
PRIM_MEDIA_AUTO_SCALE, TRUE
]);
}
else if (methode == URL_REQUEST_DENIED) {
llOwnerSay("Pas d'URL ! Je redemande dans " + (string)DELAI_REQUEST_URL + " secondes");
llSleep(DELAI_REQUEST_URL);
llRequestURL();
}
else {
list l =llParseString2List(corps, ["="], []);
llHTTPResponse(id, 200, "Vous avez saisi " + llUnescapeURL(llList2String(l, 1)));
}
}

on_rez(integer i) {llRequestURL();}

changed(integer change) {
if(change & (CHANGED_REGION | CHANGED_TELEPORT | CHANGED_REGION_START))
llRequestURL();
}
}

Le formulaire est créé sur la face 0 de la primitive en mode media et il est envoyé dans le serveur qui ensuite renvoie l'information à afficher.


« Retour aux scripts