Lecture d'une notecard de config PDF Imprimer Envoyer
Technique - Scripts
Écrit par ssm2017   
Vendredi, 27 Février 2009 17:20

Comment Recuperer les parametres de config depuis une notecard

On peut trouver une methode expliquee ici

Cependant, je l'ai jamais testee et je prefere ma methode qui est plus simple. Donc voici la methode que j'ai mis au point pour mon usage personnel. Bien sur, si il y a des ameliorations a faire, n'hesitez pas a me contacter

En gros, je lis les lignes une par une et je convertit le texte en tableau qui separe ce qui se trouve avant et apres le signe egal.
Ensuite, je teste la valeur et je mets a jour la variable.

Dans cet exemple, nous allons recuperer les valeurs de login pour un site ainsi q'une couleur et une variable qui autorise ou pas une chose.

Voici un exemple de notecard :

// entrez votre nom d'utilisateur
username = toto

// entrez votre mot de passe
password = titi

// choisissez une couleur pour le fond ( par exemple : <1,0,0>
color = <1,1,1>

// dites si on a le droit de faire ceci ou cela ( TRUE ou FALSE ou 1 ou 0 )
auth = TRUE
 
// ssm2017 Binder : ssm_notecard_config_reader
// @copyright  Copyright (C) 2009 ssm2017 Binder (S.Massiaux). All rights reserved. 
// @license  GNU/GPL, http://www.gnu.org/licenses/gpl-2.0.html 
// ssm_notecard_config_reader is free software. This version may have been modified pursuant to the 
// GNU General Public License, and as distributed it includes or is derivative 
// of works licensed under the GNU General Public License 
// or other free or open source software licenses.
 
// =============== //
//   phrases pour la traduction       //
// =============== //
// commun
string _SCRIPT_WILL_STOP = "Le script va s'arreter";
// config notecard
string _START_READING_CONFIG_NOTECARD = "Debut de la lecture de la notecard de config";
string _CONFIG_NOTECARD_IS_MISSING = "Il manque la notecard de config";
string _CONFIG_NOTECARD_READ = "La notecard de config a ete lue";
string _CHECKING_VALUES = "Verification des valeurs";
string _URL_MISSING = "Il manque l'url";
string _USERNAME_MISSING = "Il manque le nom d'utilisateur";
string _PASSWORD_MISSING = "Il manque le mot de passe";
string _CHECK_FAILED = "La verification a echoue";
string _MINIMUM_VALUES = "Les valeurs minimales sont : url / username / password";
string _CONFIG_SET_TO = "La config a ete reglee sur";
// menu
string _CHOOSE_AN_OPTION = "Choisissez une option";
string _RESET = "Reset";
// *********************************************** //
//    RIEN NE DEVRAIT ETRE CHANGE APRES CETTE LIGNE     //
// *********************************************** //
// definition des variables qui seront dans la notecard
string url;
string username;
string password;
vector color;
string auth;
// variables pour le menu
integer menu_listener;
integer menu_channel;
key owner;
// lecture de la config
read_config(string data) {
    // recuperation des valeurs avant et apres le signe egal
    list parsed = llParseString2List( data, [ "=" ], [] );
    // passage de la valeur a gauche du signe egal en minuscules, puis retrait des espaces avant et apres le texte
    string param = llToLower(llStringTrim(llList2String( parsed, 0 ), STRING_TRIM));
    // retrait des espaces avant et apres le texte pour la valeur se trouvant a droite du signe egal
    string value = llStringTrim(llList2String( parsed, 1 ), STRING_TRIM);
    // maintenant, on teste une par une les variables
    if (param != "") {
        if (param == "url") {
            url = value;
        }
        else if (param == "username") {
            username = value;
        }
        else if (param == "password") {
            password = value;
        }
        else if (param == "color") {
            // ici, on convertit la valeur au format vector
            color = (vector)value;
        }
        else if (param == "auth") {
            // ici, on convertit la valeur au format entier
            auth = (integer)value;
        }
        // etc...
    }
}
// ***************************************
//      LECTURE DE LA NOTECARD DE CONFIG
// ***************************************
// variables qui vont nous servir
key config_notecard; // clef qui servira a reconnaitre la requete au dataserveur
string config_notecard_name = "config"; // on definit ici le nom de la notecard pour question pratique
integer i_line; // la variable qui dira sur quelle ligne on se trouve
default
{
    on_rez(integer change)
    {
        // on resette le script si on rezze l'objet ( optionnel )
        llResetScript();
    }
    state_entry()
    {
        // on definit quelques variables de base qui nous serviront plus tard
        owner = llGetOwner(); // recuperation du owner de l'objet
        menu_channel = llFloor(llFrand(100000.0)) + 1000; // generation aleatoire d'un canal pour le menu
        i_line = 0; // initialisation du numero de ligne
        // on verifie si la notecard de config existe
        if ( llGetInventoryType(config_notecard_name) != INVENTORY_NONE )
        {
            // elle existe alors on lit la premiere ligne
            config_notecard = llGetNotecardLine(config_notecard_name, i_line);
            // et on en avertit le owner
            llOwnerSay(_START_READING_CONFIG_NOTECARD);
        }
        else
        {
            // elle n'existe pas alors on avertit le owner
            llOwnerSay(_CONFIG_NOTECARD_IS_MISSING);
        }
    }
    touch_start(integer total_number)
    {
        // si le owner touche l'objet
        if ( llDetectedKey(0) == owner )
        {
            // on genere un listener qui ecoutera le menu
            menu_listener = llListen(menu_channel,"", owner,"");
            // et on lui envoie le menu ( pas trop fort car ca fait mal )
            llDialog(owner, _CHOOSE_AN_OPTION+ " : ", [_RESET], menu_channel);
        }
    }
    listen(integer channel, string name, key id, string message)
    {
        // on verifie si c'est bien le menu qui parle ( optionnel )
        if ( channel == menu_channel )
        {
            // bon, allez devinez ce qu'il se passe si on appuie sur le bouton reset
            if ( message == _RESET )
            {
                llResetScript();
            }
            // on enleve le listener du menu pour reduire le lag
            llListenRemove(menu_listener);
        }
    }
    dataserver(key queryId, string data)
    {
        // on verifie si c'est bien la bonne requete
        if ( queryId == config_notecard )
        {
            // si on est pas a la fin du fichier
            if(data != EOF)
            {
                // si la ligne ne commence pas par // ( ca permet de pouvoir mettre des commentaires dans la notecard qui commencent par // )
                if ( llGetSubString( data, 0, 1) != "//" )
                {
                    // si la ligne n'est pas vide
                    if ( data != "" )
                    {
                        // on appelle la fonction de tout a l'heure qui verifie les valeurs ( voir plus haut )
                        read_config(data);
                    }
                }
                // on recommence en incrementant le compteur de ligne de 1
                config_notecard = llGetNotecardLine(config_notecard_name,++i_line);
            }
            else // on est donc maintenant a la fin du fichier
            {
                // on informe le owner que la lecture de la notecard est terminee
                llOwnerSay(_CONFIG_NOTECARD_READ+" ...");
                // et qu'on commence a verifier les valeurs ( attention ca va faire mal )
                llOwnerSay(_CHECKING_VALUES);
                // on initialise une variable qui nous permettra de verifier si les valeurs ont bien ete validees
                integer check = TRUE;
                // c'est parti pour la premiere valeur
                if (url == "")
                {
                    // la valeur est vide alors on avertit le owner
                    llOwnerSay(_URL_MISSING);
                    // on dit a la variable que ca va pas
                    check = FALSE;
                }
                // et on continue pour toutes les autres variables
                // par contre dans ce cas on verifie pas la couleur et la valeur de auth car pas utiles 
                // les valeurs par defaut d'un integer est 0 et la valeur d'un vector est <0,0,0>
                // donc si la personne a pas rempli ces valeurs la couleur sera noire et l'autorisation sera sur 0
                if (username == "")
                {
                    llOwnerSay(_USERNAME_MISSING);
                    check = FALSE;
                }
                if (password == "")
                {
                    llOwnerSay(_PASSWORD_MISSING);
                    check = FALSE;
                }
                // si il y a eu une erreur lors de la verification
                if (!check)
                {
                    // on avertit le owner
                    llOwnerSay(_CHECK_FAILED);
                    llOwnerSay(_MINIMUM_VALUES);
                    llOwnerSay(_SCRIPT_WILL_STOP);
                    // et on arrete le script
                    return;
                }
                else
                {
                    // sinon, on lui donne la liste des valeurs
                    llOwnerSay(_CONFIG_SET_TO+" : \n"
                                +"Url : "+url+" \n"
                                +"Username : "+username+" \n"
                                +"Password : "+password);
                    // on change d'etat
                    state run;
                }
            }
        }
    }
}
// on change d'etat
state run
{
    state_entry()
    {
        llOwnerSay("Voila, c'est fini");
    }
}