Due to the powerful directorysearch
command, Corrade is able to resolve all kinds of names to their UUID
s. This is valid for:
Each of these searches return a CSV
list of fields or properties mapped to values as per the directorysearch API command which can be filtered using the optional data
parameter.
Here is a full example of how to resolve the agent key for an avatar called Bobby Resident
when an avatar touches the primitive:
/////////////////////////////////////////////////////////////////////////// // Copyright (C) Wizardry and Steamworks 2014 - License: CC BY 2.0 // /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// // CONFIGURATION // /////////////////////////////////////////////////////////////////////////// // The UUID / Key of the scripted agent. string CORRADE = "82e9ec7b-123b-41d0-8d94-2b26c75872c3"; // The name of the group to invite to. string GROUP = "MyGroup"; // The password for that group in Corrade.ini. string PASSWORD = "mypassword"; /////////////////////////////////////////////////////////////////////////// // END CONFIGURATION // /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2013 Wizardry and Steamworks - License: CC BY 2.0 // /////////////////////////////////////////////////////////////////////////// string wasKeyValueEncode(list data) { list k = llList2ListStrided(data, 0, -1, 2); list v = llList2ListStrided(llDeleteSubList(data, 0, 0), 0, -1, 2); data = []; do { data += llList2String(k, 0) + "=" + llList2String(v, 0); k = llDeleteSubList(k, 0, 0); v = llDeleteSubList(v, 0, 0); } while(llGetListLength(k) != 0); return llDumpList2String(data, "&"); } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 // /////////////////////////////////////////////////////////////////////////// string wasKeyValueGet(string k, string data) { if(llStringLength(data) == 0) return ""; if(llStringLength(k) == 0) return ""; list a = llParseStringKeepNulls(data, ["&", "="], []); integer i = llListFindList(llList2ListStrided(a, 0, -1, 2), [ k ]); if(i != -1) return llList2String(a, 2*i+1); return ""; } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 // /////////////////////////////////////////////////////////////////////////// // escapes a string in conformance with RFC1738 string wasURLEscape(string i) { string o = ""; do { string c = llGetSubString(i, 0, 0); i = llDeleteSubString(i, 0, 0); if(c == "") jump continue; if(c == " ") { o += "+"; jump continue; } if(c == "\n") { o += "%0D" + llEscapeURL(c); jump continue; } o += llEscapeURL(c); @continue; } while(i != ""); return o; } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 // /////////////////////////////////////////////////////////////////////////// // unescapes a string in conformance with RFC1738 string wasURLUnescape(string i) { return llUnescapeURL( llDumpList2String( llParseString2List( llDumpList2String( llParseString2List( i, ["+"], [] ), " " ), ["%0D%0A"], [] ), "\n" ) ); } // store the key of the toucher key touche = NULL_KEY; // store the URL for the callback string URL = ""; // the default state just grabs default { state_entry() { llSetTimerEvent(1); } timer() { llRequestURL(); // retry in 60s llSetTimerEvent(60); } http_request(key id, string method, string body) { // could not grab an URL so just bail and // wait for the next pass of timer if(method != URL_REQUEST_GRANTED) return; // we got an URL so stop the timer llSetTimerEvent(0); // store the URL URL = body; // and switch to main state main; } } state main { touch_start(integer num) { // first get the key of the toucher to // send the result of the query to touche = llDetectedKey(0); // now send the message to Corrade to // resolve the agent name Bobby Resident llInstantMessage(CORRADE, wasKeyValueEncode( [ "command", "directorysearch", "group", GROUP, "password", PASSWORD, "type", "people", "name", "Bobby Resident", "timeout", 10000, "callback", wasURLEscape(URL) ] ) ); } http_request(key id, string method, string body) { // always confirm to Corrade that the message // has been properly received by the callback llHTTPResponse(id, 200, "Ok"); // grab the "data" key, then unescape it // and serialise the result to a list list data = wasCSVToList( wasURLUnescape( wasKeyValueGet( "data", body ) ) ); // we are looking for the key after AgentID key agentID = llList2Key( data, llListFindList( data, ["AgentID"] ) +1 ); // in case the agent does not exist if(agentID == NULL_KEY) { llInstantMessage(touche, "agent does not exist"); return; } llInstantMessage(touche, (string)agentID); } changed(integer change) { // if the region has just started, then the URL // has most likely been invalidated, so reset if(change & CHANGED_REGION_START) llResetScript(); } }