User:Opensource Obscure/http/snurl-sample

From Second Life Wiki
Jump to navigation Jump to search

I use Snurl.com APIs to maintain persistent URLs for my LSL scripts. Here's an example.
Disclaimer: I'm not a real programmer and your comments and suggestions are welcome.

The main script below receives data from a web page, where you can choose three colors through a form. The script then parses those data and does some things with them - it rezzes an object (or not) and it relays the parsed data via chat channels to other objects - see below:

Rossoverde.jpg

This building changes its colors according to this panel control: http://open.myartsonline.com/http-in/control.php
Feel free to visit, change the colors and warn me if it doesn't work! SLURL

Here are the LSL scripts. For the HTML, look the web page source


first script - it manages HTTP calls and talks to snurl.com in order to keep stable its snurl.com short url

<lsl>

// first, create a short URL via snurl.com website // any web address will work // your short URL will be like this: http://snurl.com/WHATEVER string snurlnick = "WHATEVER"; // change this!

key mykey = "YOUR-SL-UUID"; // YOUR SL UUID

string user = "YOUR-SNURL-USERNAME"; string api_key = "YOUR-SNURL-API-KEY";

// be aware there may be some old unused variables and functions here

// this script sends a chat message to 3 private channels // here are 3 channels integer chan1 = -20241; integer chan2 = -20242; integer chan3 = -20243;

string url; string query; string nome; string baseurl = "http://snipr.com/site/getsnip"; string t1 = "my address is "; key requestid; integer status = FALSE; list requests; vector pos_orig;


// ask a new URL setup() {

   url = "";
   llRequestURL();

}


// HTTP response send_response(key id, string body) {

   llHTTPResponse(id, 200, body);

}


// NOT USED, PROBABLY BROKEN. but it would be cool it worked generate_snurl(string testo) {

   query = "sniplink=" + llEscapeURL(testo)
       + "&snipuser=" + user
       + "&snipapi=" + api_key
       + "&snipnick=" + snurlnick;         
       requestid = llHTTPRequest(baseurl,[HTTP_METHOD,"POST", HTTP_MIMETYPE,"application/x-www-form-urlencoded"],query);    

}


// used everytime the script resets // it calls snurl.com APIs and it tells its new long URL. then, I call the short URL + parameters update_snurl(string testo) {

   query = "sniplink=" + llEscapeURL(testo)
       + "&snipuser=" + user
       + "&snipapi=" + api_key
       + "&snipaction=UPDATE"
       + "&snipcurrentnick=" + snurlnick
       + "&snipresetcount="; 
       requestid = llHTTPRequest(baseurl,[HTTP_METHOD,"POST", HTTP_MIMETYPE,"application/x-www-form-urlencoded"],query);    

}


// do something fa(key id, string asd) {

   string a = llUnescapeURL(asd);
   send_response(id, a);    
   list variabili = llParseString2List(asd, ["color1=", "&color2=","&color3=", "&rez=", "&a="], [""]);
   string color1 = llUnescapeURL(llList2String(variabili, 0));
   string color2 = llUnescapeURL(llList2String(variabili, 1));    
   string color3 = llUnescapeURL(llList2String(variabili, 2));        
   integer rez = (integer)llUnescapeURL(llList2String(variabili, 3));
   string messaggio = llUnescapeURL(llList2String(variabili, 4));
   llSay(chan1, (string)sbColorConvert(color1));
   llSay(chan2, (string)sbColorConvert(color2));    
   llSay(chan3, (string)sbColorConvert(color3));        
   llSetPrimitiveParams([
   PRIM_COLOR, ALL_SIDES, (vector)color1, 1.0
   ]);
   altro(rez);
   if(messaggio)
   {
       llSay(0, messaggio);
   }

}


// do something else altro(integer value) {

   if(value)
   {
       string a = llGetInventoryName(INVENTORY_OBJECT,0);
       llSay(0, "rezzo " + a);
       llRezObject(a, pos_orig + <0,0,1>, <0,0,0>, <0,0,0,0>, 1);
   }

}


// we could probably get rid of this

list lstHTML = [

       "aliceblue",            0xf0f8ff, "antiquewhite",    0xfaebd7, "aqua",            0x00ffff,
       "aquamarine",           0x7fffd4, "azure",           0xf0ffff, "beige",           0xf5f5dc,
       "bisque",               0xffe4c4, "black",           0x000000, "blanchedalmond",  0xffebcd,
       "blue",                 0x0000ff, "blueviolet",      0x8a2be2, "brown",           0xa52a2a,
       "burlywood",            0xdeb887, "cadetblue",       0x5f9ea0, "chartreuse",      0x7fff00,
       "chocolate",            0xd2691e, "coral",           0xff7f50, "cornflowerblue",  0x6495ed,
       "cornsilk",             0xfff8dc, "crimson",         0xdc143c, "cyan",            0x00ffff,
       "darkblue",             0x00008b, "darkcyan",        0x008b8b, "darkgoldenrod",   0xb8860b,
       "darkgray",             0xa9a9a9, "darkgreen",       0x006400, "darkkhaki",       0xbdb76b,
       "darkmagenta",          0x8b008b, "darkolivegreen",  0x556b2f, "darkorange",      0xff8c00,
       "darkorchid",           0x9932cc, "darkred",         0x8b0000, "darksalmon",      0xe9967a,
       "darkseagreen",         0x8fbc8f, "darkslateblue",   0x483d8b, "darkslategray",   0x2f4f4f,
       "darkturquoise",        0x00ced1, "darkviolet",      0x9400d3, "deeppink",        0xff1493,
       "deepskyblue",          0x00bfff, "dimgray",         0x696969, "dodgerblue",      0x1e90ff,
       "firebrick",            0xb22222, "floralwhite",     0xfffaf0, "forestgreen",     0x228b22,
       "fuchsia",              0xff00ff, "gainsboro",       0xdcdcdc, "ghostwhite",      0xf8f8ff,
       "gold",                 0xffd700, "goldenrod",       0xdaa520, "gray",            0x808080,
       "green",                0x008000, "greenyellow",     0xadff2f, "honeydew",        0xf0fff0,
       "hotpink",              0xff69b4, "indianred",       0xcd5c5c, "indigo",          0x4b0082,
       "ivory",                0xfffff0, "khaki",           0xf0e68c, "lavender",        0xe6e6fa,
       "lavenderblush",        0xfff0f5, "lawngreen",       0x7cfc00, "lemonchiffon",    0xfffacd,
       "lightblue",            0xadd8e6, "lightcoral",      0xf08080, "lightcyan",       0xe0ffff,
       "lightgoldenrodyellow", 0xfafad2, "lightgrey",       0xd3d3d3, "lightgreen",      0x90ee90,
       "lightpink",            0xffb6c1, "lightsalmon",     0xffa07a, "lightseagreen",   0x20b2aa,
       "lightskyblue",         0x87cefa, "lightslategray",  0x778899, "lightsteelblue",  0xb0c4de,
       "lightyellow",          0xffffe0, "lime",            0x00ff00, "limegreen",       0x32cd32,
       "linen",                0xfaf0e6, "magenta",         0xff00ff, "maroon",          0x800000,
       "mediumaquamarine",     0x66cdaa, "mediumblue",      0x0000cd, "mediumorchid",    0xba55d3,
       "mediumpurple",         0x9370d8, "mediumseagreen",  0x3cb371, "mediumslateblue", 0x7b68ee,
       "mediumspringgreen",    0x00fa9a, "mediumturquoise", 0x48d1cc, "mediumvioletred", 0xc71585,
       "midnightblue",         0x191970, "mintcream",       0xf5fffa, "mistyrose",       0xffe4e1,
       "moccasin",             0xffe4b5, "navajowhite",     0xffdead, "navy",            0x000080,
       "oldlace",              0xfdf5e6, "olive",           0x808000, "olivedrab",       0x6b8e23,
       "orange",               0xffa500, "orangered",       0xff4500, "orchid",          0xda70d6,
       "palegoldenrod",        0xeee8aa, "palegreen",       0x98fb98, "paleturquoise",   0xafeeee,
       "palevioletred",        0xd87093, "papayawhip",      0xffefd5, "peachpuff",       0xffdab9,
       "peru",                 0xcd853f, "pink",            0xffc0cb, "plum",            0xdda0dd,
       "powderblue",           0xb0e0e6, "purple",          0x800080, "red",             0xff0000,
       "rosybrown",            0xbc8f8f, "royalblue",       0x4169e1, "saddlebrown",     0x8b4513,
       "salmon",               0xfa8072, "sandybrown",      0xf4a460, "seagreen",        0x2e8b57,
       "seashell",             0xfff5ee, "sienna",          0xa0522d, "silver",          0xc0c0c0,
       "skyblue",              0x87ceeb, "slateblue",       0x6a5acd, "slategray",       0x708090,
       "snow",                 0xfffafa, "springgreen",     0x00ff7f, "steelblue",       0x4682b4,
       "tan",                  0xd2b48c, "teal",            0x008080, "thistle",         0xd8bfd8,
       "tomato",               0xff6347, "turquoise",       0x40e0d0, "violet",          0xee82ee,
       "wheat",                0xf5deb3, "white",           0xffffff, "whitesmoke",      0xf5f5f5,
       "yellow",               0xffff00, "yellowgreen",     0x9acd32
   ];

vector sbColorConvert(string strData) {

   integer mode = llListFindList(lstHTML, [llToLower(strData)]);
   integer intColor = 0;

   if (~mode) {
       intColor = llList2Integer(lstHTML, mode | 1);
       mode = 8;
   }
   else {
       string strStart = llGetSubString(strData, 0, 1);
       if (strStart != "0x") {
           if (llGetSubString(strStart, 0, 0) == "#") {
               strData = "0x" + llDeleteSubString(strData, 0, 0);
           }
           else {
               vector vecColor = (vector)("<"+strData+">");
               if (vecColor) {
                   return (vector)("<"+strData+">") / 255;
               }
               strData = "0x" + strData;
           }
       }
       intColor = (integer)strData;
       mode = llStringLength(strData);
   }
   if (mode == 8) {//RRGGBB
       return <(intColor >> 16) & 0xFF, (intColor >> 8) & 0xFF, (intColor & 0xFF)> / 0xFF;
   }
   else if (mode == 5) {//RGB (an HTML color format)
       return <(intColor >> 8) & 0xF, (intColor >> 4) & 0xF, (intColor & 0xF)> / 0xF;
   }
   return ZERO_VECTOR;//black

}


default {

   state_entry()
   {
       setup();
       pos_orig = llGetPos();
   }
   
   on_rez(integer n) 
   {
       setup(); 
   }
   changed(integer c)
   {
       if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )
       {
           setup();
       }
   }


// this happens after setup()

   http_request(key id, string method, string body)
   {
       // we got a new URL
       if (method == URL_REQUEST_GRANTED)
       {
           url = body;  
           //generate_snurl(url); // not used
           update_snurl(url);            
       }
       
       else if (method == URL_REQUEST_DENIED)
       {
           llInstantMessage(mykey, "Something went wrong, no url. " + body);
       }
       // script gets called - e.g. link pressed on a web page
       // do something (apologize for funny var and function names)
       else if (method == "GET")
       {
               string asd = llGetHTTPHeader(id, "x-query-string");          
               fa(id,asd);
       }
       else
       {
           llHTTPResponse(id,405,"Unsupported method.");
       }
   }


// comunico gli URL dello script

   touch_start(integer total_number)
   {
           llInstantMessage(mykey, "my url is " + url + "  - that is " + nome); 
   }    


// tell some info

   http_response(key request_id, integer status, list metadata, string body)
   {
       integer i;
       if (request_id == requestid)
       {
           integer i = llSubStringIndex(body,"<id>");
           integer j = llSubStringIndex(body,"</id>");
           integer length = j - i;            
           if ( i != -1 )
           {
               // llWhisper(0, "... " + (string)length); // debug length
               nome = llGetSubString(body,i+4,i+llStringLength("<id>")+21);    
               llInstantMessage(mykey, "i'm " + url + " - that is " + nome); // debug
           }
       } else
           llInstantMessage(mykey, (string)status+" error");
   }        

}


</lsl>

second script - it listens to the first script and it changes the prim color

<lsl> default {

   state_entry()
   {
       llListen(-20241, "", "", "");   
   }
   listen(integer chan, string name, key id, string msg)  
   {
       llSetLinkColor(-1, (vector)msg, ALL_SIDES);
   }

} </lsl>

third and fourth script - see second script and change chat channel to 20242 and 20243