Difference between revisions of "Name2Key in LSL"

From Second Life Wiki
Jump to navigation Jump to search
m (Added Caveats and included in category Examples)
(Library code modified to check for wrong profile in LL search result)
Line 8: Line 8:
I put a kind of "library" and a sample of usage for your convenience
I put a kind of "library" and a sample of usage for your convenience


=== Library ===
 
<div id="box">
== Library ==
 
<lsl>
<lsl>
integer SERVICE_NAME2KEY       = 19790;
integer SERVICE_NAME2KEY     = 19790;
integer SERVICE_NAME2KEY_RET   = 19791;
integer SERVICE_NAME2KEY_RET = 19791;
 
string proxy                   = "http://66.196.80.202/babelfish/translate_url_content?&intl=us&lp=fr_en&trurl=";
string proxy     = "http://66.196.80.202/babelfish/translate_url_content?&intl=us&lp=fr_en&trurl=";
string search                 = "http://search.secondlife.com/client_search.php?session=00000000-0000-0000-0000-000000000000&q=";
string search   = "http://search.secondlife.com/client_search.php?session=00000000-0000-0000-0000-000000000000&q=";
string result                 = "secondlife:///app/agent/";
string result   = "secondlife:///app/agent/";
string  notfound                = "There were no matches for ";
string profile  = "Resident profiles";
string notfound = "There were no matches for ";
 
list    requests;
list    requests;
 
default
default
{
{
     on_rez(integer i) { llResetScript(); }
     on_rez(integer i) { llResetScript(); }
 
     state_entry()
     state_entry()
     {
     {
         requests = [];
         requests = [];
     }
     }
 
     link_message(integer s, integer n, string m, key i)
     link_message(integer s, integer n, string m, key i)
     {
     {
Line 34: Line 38:
             if(llListFindList(requests,[m]) == -1) {
             if(llListFindList(requests,[m]) == -1) {
                 list Args=llParseString2List(m, [" "], []);
                 list Args=llParseString2List(m, [" "], []);
           
 
                 string FirstName = llList2String(Args, 0);
                 string FirstName = llList2String(Args, 0);
                 string LastName = llList2String(Args, 1);
                 string LastName = llList2String(Args, 1);
               
 
                 string url = proxy+llEscapeURL(search)+FirstName+"%2520"+LastName;;
                 string url = proxy+llEscapeURL(search)+FirstName+"%2520"+LastName;;
                 key id = llHTTPRequest(url, [], "");
                 key id = llHTTPRequest(url, [], "");
Line 44: Line 48:
         }
         }
     }
     }
 
     http_response(key request_id, integer status, list metadata, string body)
     http_response(key request_id, integer status, list metadata, string body)
     {
     {
         integer p = llListFindList(requests,[(string)request_id]);
         integer p = llListFindList(requests,[(string)request_id]);
         if (p != -1) {
         if (p != -1) {
             string n = llList2String(requests,p+1);
             string name = llList2String(requests,p+1);
             integer f = llSubStringIndex(body,result);
             integer find = llSubStringIndex(body,result);
             if(f == -1) {
             if(find == -1) {
                 f = llSubStringIndex(body,notfound);
                 find = llSubStringIndex(body,notfound);
                 if(f == -1)
                 if(find == -1)
                     llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,"Error with lookup!",NULL_KEY);
                     llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,"Error with lookup!",NULL_KEY);
                 else
                 else
                     llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,n+" not found.",NULL_KEY);
                     llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,name+" not found.",NULL_KEY);
             } else {
             }
                 f += llStringLength(result);
            else
                 string a = llGetSubString(body,f,f+35);
            {
                 find += llStringLength(result);
                 llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,n,(key)a);
                 string avKey = llGetSubString(body,find,find+35);
                integer namePos = llSubStringIndex(body,profile)+18;
                string foundName = llGetSubString(body, namePos+1,
                    namePos + llSubStringIndex(llGetSubString(body,namePos+1, llStringLength(body)-1),"<"));
                 if(llToLower(name) == llToLower(foundName))
                    llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,foundName,(key)avKey);
                else
                    llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,name+" failed: Wrong found.",NULL_KEY);
             }
             }
             requests = llDeleteSubList(requests,p,p+1);
             requests = llDeleteSubList(requests,p,p+1);
         }
         }
     }  
     }
}
}
</lsl>
</lsl>
</div>


<div id="box">  
<div id="box">  
Line 101: Line 113:
}
}
</lsl></div>
</lsl></div>
<div id="box">
== Caveats ==
<div style="padding: 0.5em;">
LL Search engine sometimes returns wrong profile, hence lookup may fail.
This error is not treated here.
</div></div>


<div id="box">  
<div id="box">  

Revision as of 20:58, 26 July 2009

Name2Key

Still missing Name2Key functions in your code? Still relying on external databases that are not always up to date with latests SL subscribers?

Well now you can solve this by yourself, within your LSL script! All you have to do is to rely on LL Search engine!

I put a kind of "library" and a sample of usage for your convenience


Library

<lsl> integer SERVICE_NAME2KEY = 19790; integer SERVICE_NAME2KEY_RET = 19791;

string proxy = "http://66.196.80.202/babelfish/translate_url_content?&intl=us&lp=fr_en&trurl="; string search = "http://search.secondlife.com/client_search.php?session=00000000-0000-0000-0000-000000000000&q="; string result = "secondlife:///app/agent/"; string profile = "Resident profiles"; string notfound = "There were no matches for ";

list requests;

default {

   on_rez(integer i) { llResetScript(); }
   state_entry()
   {
       requests = [];
   }
   link_message(integer s, integer n, string m, key i)
   {
       if (n == SERVICE_NAME2KEY) {
           if(llListFindList(requests,[m]) == -1) {
               list Args=llParseString2List(m, [" "], []);
               string FirstName = llList2String(Args, 0);
               string LastName = llList2String(Args, 1);
               string url = proxy+llEscapeURL(search)+FirstName+"%2520"+LastName;;
               key id = llHTTPRequest(url, [], "");
               requests += [(string)id,m];
           }
       }
   }
   http_response(key request_id, integer status, list metadata, string body)
   {
       integer p = llListFindList(requests,[(string)request_id]);
       if (p != -1) {
           string name = llList2String(requests,p+1);
           integer find = llSubStringIndex(body,result);
           if(find == -1) {
               find = llSubStringIndex(body,notfound);
               if(find == -1)
                   llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,"Error with lookup!",NULL_KEY);
               else
                   llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,name+" not found.",NULL_KEY);
           }
           else
           {
               find += llStringLength(result);
               string avKey = llGetSubString(body,find,find+35);
               integer namePos = llSubStringIndex(body,profile)+18;
               string foundName = llGetSubString(body, namePos+1,
                   namePos + llSubStringIndex(llGetSubString(body,namePos+1, llStringLength(body)-1),"<"));
               if(llToLower(name) == llToLower(foundName))
                   llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,foundName,(key)avKey);
               else
                   llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,name+" failed: Wrong found.",NULL_KEY);
           }
           requests = llDeleteSubList(requests,p,p+1);
       }
   }

} </lsl>

Usage sample

<lsl> integer SERVICE_NAME2KEY = 19790; integer SERVICE_NAME2KEY_RET = 19791;

default {

   on_rez(integer i) { llResetScript(); }

   state_entry()
   {
       llListen(1, "", "", "");
   }

   listen(integer c, string n, key i, string m)
   {
       llSay(0,"Requesting key for "+m);
       llMessageLinked(LINK_THIS, SERVICE_NAME2KEY, m, "");
   }

   link_message(integer f, integer n, string s, key i)
   {
       if(n == SERVICE_NAME2KEY_RET) {
           if(i == NULL_KEY)
               llSay(0,"Lookup failed.  Returned: "+s);
           else
               llSay(0,s+": "+(string)i);
       }
   }

}

</lsl>

Comments

Hope this helps ! Maeva Anatine

EDIT : Looks like the Lindens have either broken or blocked this function. It works from my browser, however from LSL I get an error page containing this message "Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect." - Darling Brody.

EDIT : Yes you're right Darling. It seems they've blocked this access from within the world... I still wonder why, especially as there are some workarounds to this... Anyway I discovered there is a JIRA issue for this. Please vote for the unblock ! https://jira.secondlife.com/browse/SVC-3122 - Mae

EDIT : OK after having read this article from LL: http://wiki.secondlife.com/wiki/SearchAPI, it seems proxy usage is allowed. So I modified the upper code in order to go through a proxy machine and it works again :) - Mae

EDIT: After review, it appears the Yahoo Babelfish proxy you are using above does not return the results expected. I rewrote this to allow different proxies by a simple configuration. This now uses Google instead of Babelfish by default. This does not, however, work for any avatars that do not have a Profile filled out (this is due to a limitation of the Googly proxy we're using here). I'm researching this and trying to see if there is a better proxy to use.

This version can handle multiple requests at once. Replies have changed slightly, as the found key is returned in the "key" field instead of the message field. In addition, failure of any kind results in a NULL_KEY being returned, and status information is returned in the message field. - Sensei Schism

EDIT 2009-Mar-08: Sensei, I reused your version here above and took back BabelFish as Google one is unable to retrieve all links (doesn't recognized correctly the secondlife:/// link). In addition, I made some slight changes as LL recently changed their search engine. This version now works properly.

Maeva Anatine