User:Opensource Obscure/Chromutate
Chromutate is only a cool portmanteau for a simple idea: fill in a web form and make things happen in Second Life.
It's also a building/installation I'm working on (but I'm not pretending I'm doing art here), and an excuse to play around with the new HTTP-in LSL features.
I use Gridurl to maintain persistent URLs for my LSL scripts. See the code below.
Disclaimer: I'm not a real programmer and your comments and suggestions are welcome.
Feel free to visit, change the colors and warn me if it doesn't work! SLURL
For the HTML, look the web page source. Here are the LSL scripts.
The main script below receives data from the web page, where you can choose colors and something else 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.
first script - it manages HTTP calls and talks to Gridurl
<lsl>
key mykey = "eb42408b-5888-42b7-80d6-b00ca2eb9781"; // SL UUID
string gridurl_key="7d183313-a033-4b21-b5d7-1280d0461ee0"; string baseurl = "http://gridurl.appspot.com/reg?service=";
integer chan1 = -20241; integer chan2 = -20242; integer chan3 = -20243;
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
}
string url; string query; string nome; string t1 = "il mio indirizzo e' "; key requestid; integer status = FALSE; list requests; vector pos_orig;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// richiedo un nuovo URL per lo script setup() {
url = ""; llRequestURL();
}
// risponde via HTTP
send_response(key id, string body)
{
llHTTPResponse(id, 200, body);
}
// http://gridurl.appspot.com/ update_gridurl(string testo) {
query = gridurl_key + "&url=" + llEscapeURL(testo) + "/"; requestid = llHTTPRequest(baseurl + query,[HTTP_METHOD,"GET", HTTP_MIMETYPE,"application/x-www-form-urlencoded"], "");
}
// fa qualcosa fa(key id, string asd) {
llSay(0, 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); }
}
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); }
}
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(); } }
// scatta in risposta a setup() cioe' alla richiesta di un nuovo URL
http_request(key id, string method, string body) { // ci e' stato correttamente assegnato un nuovo URL if (method == URL_REQUEST_GRANTED) { llSay(0, " nuovo url = " + body); update_gridurl(body); } else if (method == URL_REQUEST_DENIED) { llInstantMessage(mykey, "Something went wrong, no url. " + body); } // lo script e' stato richiamato (da un browser, cliccando su un link...) // fa qualcosa else if (method == "GET") { string asd = llGetHTTPHeader(id, "x-query-string"); llSay(0, " query = " + asd); fa(id,asd); } else { llHTTPResponse(id,405,"Unsupported method."); } }
// comunico gli URL dello script
touch_start(integer total_number) { llInstantMessage(mykey, "Il mio indirizzo attualmente e' " + url + " - il link permanente per utilizzarmi e' " + nome); }
// se tutto va bene, l'indirizzo breve ora punta correttamente
// al nuovo indirizzo lungo dello script.
http_response(key request_id, integer status, list metadata, string body) { integer i; if (request_id == requestid) { llInstantMessage(mykey, "body: " + body); // 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