Failsafename2key

From Second Life Wiki
Jump to: navigation, search

This script is a example for a failsafe name2key lookup. The script will return results also when some of the given providers are unavailable.

Main Script: <lsl> list Servers = ["http://kubwa.de/_slworld/name2key.php?name=",

               "http://w-hat.com/name2key?terse=1&name=",
               "https://n2k.danardlabs.com/n2k_io.php?action=getkey&verbose=0&username=",
               "http://kdc.ethernia.net/sys/name2key.php?name="];
               

list LookUpQueue; default {

   link_message(integer Sender, integer Num, string Str, key ID)
   {
       if (ID == "Name2Key.Lookup")
       {
           LookUpQueue = LookUpQueue + [llHTTPRequest(llList2String(Servers, 0) + llEscapeURL(Str),
                                                      [HTTP_METHOD, "GET", HTTP_VERIFY_CERT, FALSE],
                                                      ""), 0, Str, Num, Sender];
       }
   }
   http_response(key Request, integer Status, list Meta, string Data)
   {
       integer Found = llListFindList(LookUpQueue, [Request]);
       if (Found > -1)
       {
           list Temp = llParseString2List(Data, [",", ";", " ", ":", "\n", "|"], []);
           integer i;
           integer LoopFound = -1;
           for (i = 0; i < llGetListLength(Temp); ++i)
           {
               if (llStringLength(llList2String(Temp, i)) == 36 && llList2Key(Temp, i) != NULL_KEY)
                {LoopFound = i;}
           }
           if (LoopFound > -1)
           {
               llMessageLinked(llList2Integer(LookUpQueue, Found + 4), llList2Integer(LookUpQueue, Found + 3),
                               "Found", llList2Key(Temp, LoopFound));
               LookUpQueue = llDeleteSubList(LookUpQueue, Found, Found + 4);
           }
           else
           {
               if (llList2Integer(LookUpQueue, Found + 1) + 1 < llGetListLength(LookUpQueue) - 1)
               {
                   LookUpQueue = llListReplaceList(LookUpQueue, [llHTTPRequest(llList2String(Servers,
                                                                                             llList2Integer(LookUpQueue,
                                                                                                            Found + 1) + 1) +
                                                                               llEscapeURL(llList2String(LookUpQueue, Found + 2)),
                                                                               [HTTP_METHOD, "GET", HTTP_VERIFY_CERT, FALSE],
                                                                               ""), llList2Integer(LookUpQueue, Found + 1) + 1],
                                                   Found, Found + 1);
               }
               else
               {
                   llMessageLinked(llList2Integer(LookUpQueue, Found + 4), llList2Integer(LookUpQueue, Found + 3),
                                   "Not-Found", NULL_KEY);
                   LookUpQueue = llDeleteSubList(LookUpQueue, Found, Found + 4);
               }
           }
       }
   }

} </lsl>

Example usage: <lsl> default {

   state_entry()
   {
       llListen(1, "", "", "");
   }
   listen(integer chan, string name, key id, string msg)
   {
       llMessageLinked(LINK_THIS, llRound(llFrand(9999)), msg, "Name2Key.Lookup");
   }
   link_message(integer Sender, integer Num, string Str, key ID)
   {
       llOwnerSay((string)Sender + " => " + (string)Num + "> " + Str + ": " + (string)ID);
   }

} </lsl>

For questions please ask Simba Fuhr in Second Life.