Read Note Card Configuration

From Second Life Wiki
Revision as of 13:35, 24 January 2015 by ObviousAltIsObvious Resident (talk | contribs) (<lsl> tag to <source>)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Learn how to read configuration files with Linden Scripting Language (LSL) in Second Life (SL). After viewing this tutorial, you will be able to:

  • Create a script
  • Read each line of a note card
  • Skip over comments
  • Skip blank lines
  • Notify the owner of the lines with unknown settings
    • Unknown setting name
    • Missing delimiter (equal sign)
  • Notify the owner of missing configuration note card
  • Detect when the notecard has been changed
  • Offer case-insensitive settings
  • Trim white-space from name/value settings
  • Initialize with default values
  • Detect that the name of the configuration file is a notecard
  • Detect that you have reached the end of the file


Dedric Mauriac - Configuration Reading Tutorial.jpg

  1. DOWNLOAD Getvidtut.png How to read configuration information from a notecard
# this is a file to configure your application
# blank lines are ignored as well as lines
# proceeded with a "#" sign.
Name = Dedric Mauriac
Favorite Color = Blue
string configurationNotecardName = "Application.Config";
key notecardQueryId;
integer line;

string AvatarName;
string FavoriteColor;

init()
{
//  reset configuration values to default
    AvatarName = "Unknown";
    FavoriteColor = "None";

//  make sure the file exists and is a notecard
    if(llGetInventoryType(configurationNotecardName) != INVENTORY_NOTECARD)
    {
    //  notify owner of missing file
        llOwnerSay("Missing inventory notecard: " + configurationNotecardName);
    //  don't do anything else
        return;
    }

//  initialize to start reading from first line (which is 0)
    line = 0;
    notecardQueryId = llGetNotecardLine(configurationNotecardName, line);
}

processConfiguration(string data)
{
//  if we are at the end of the file
    if(data == EOF)
    {
    //  notify the owner
        llOwnerSay("We are done reading the configuration");

    //  notify what was read
        llOwnerSay("The avatar name is: " + AvatarName);
        llOwnerSay("The favorite color is: " + FavoriteColor);

    //  do not do anything else
        return;
    }

//  if we are not working with a blank line
    if(data != "")
    {
    //  if the line does not begin with a comment
        if(llSubStringIndex(data, "#") != 0)
        {
        //  find first equal sign
            integer i = llSubStringIndex(data, "=");

        //  if line contains equal sign
            if(i != -1)
            {
            //  get name of name/value pair
                string name = llGetSubString(data, 0, i - 1);

            //  get value of name/value pair
                string value = llGetSubString(data, i + 1, -1);

            //  trim name
                list temp = llParseString2List(name, [" "], []);
                name = llDumpList2String(temp, " ");

            //  make name lowercase (case insensitive)
                name = llToLower(name);

            //  trim value
                temp = llParseString2List(value, [" "], []);
                value = llDumpList2String(temp, " ");

            //  name
                if(name == "name")
                    AvatarName = value;

            //  color
                else if(name == "favorite color")
                    FavoriteColor = value;

            //  unknown name
                else
                    llOwnerSay("Unknown configuration value: " + name + " on line " + (string)line);

            }
        //  line does not contain equal sign
            else
            {
                llOwnerSay("Configuration could not be read on line " + (string)line);
            }
        }
    }

//  read the next line
    notecardQueryId = llGetNotecardLine(configurationNotecardName, ++line);
}

default
{
    on_rez(integer start_param)
    {
        init();
    }

    changed(integer change)
    {
        if(change & (CHANGED_OWNER | CHANGED_INVENTORY))
            init();
    }

    state_entry()
    {
        init();
    }

    dataserver(key request_id, string data)
    {
        if(request_id == notecardQueryId)
            processConfiguration(data);
    }
}