Difference between revisions of "Online Indicator"

From Second Life Wiki
Jump to: navigation, search
m (<lsl> tag to <source>)
 
(12 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
{{LSL Header}}__TOC__
 
{{LSL Header}}__TOC__
 +
 +
{{World.secondlife.com changes}}
  
 
{{box|Copying Permission|
 
{{box|Copying Permission|
Line 25: Line 27:
 
click on the result and you'll find the UUID in the URL of the page. ("secondlife:/app/agent/User_key/about" or "http://world.secondlife.com/resident/User_key")
 
click on the result and you'll find the UUID in the URL of the page. ("secondlife:/app/agent/User_key/about" or "http://world.secondlife.com/resident/User_key")
  
<lsl>////////////////////////////////////////////////////////////////////////////////////////////////
+
<source lang="lsl2">
 +
////////////////////////////////////////////////////////////////////////////////////////////////
 
//    Copyright (c) 2008 by Kristy Fanshaw                                                    //
 
//    Copyright (c) 2008 by Kristy Fanshaw                                                    //
 
////////////////////////////////////////////////////////////////////////////////////////////////
 
////////////////////////////////////////////////////////////////////////////////////////////////
Line 33: Line 36:
 
//    (at your option) any later version.                                                    //
 
//    (at your option) any later version.                                                    //
 
//                                                                                            //
 
//                                                                                            //
//    Vendor System is distributed in the hope that it will be useful,                       //
+
//    Online Indicator is distributed in the hope that it will be useful,                     //
 
//    but WITHOUT ANY WARRANTY; without even the implied warranty of                          //
 
//    but WITHOUT ANY WARRANTY; without even the implied warranty of                          //
 
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                          //
 
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                          //
Line 40: Line 43:
 
//    To get a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.    //
 
//    To get a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.    //
 
////////////////////////////////////////////////////////////////////////////////////////////////
 
////////////////////////////////////////////////////////////////////////////////////////////////
 
+
 
key user_key = "00000000-0000-0000-0000-000000000000";      // must be agent UUID whose status it will indicate
 
key user_key = "00000000-0000-0000-0000-000000000000";      // must be agent UUID whose status it will indicate
 
integer time = 30;                                          // time within the message should be written.
 
integer time = 30;                                          // time within the message should be written.
 
string url = "http://world.secondlife.com/resident/";
 
string url = "http://world.secondlife.com/resident/";
key blank = "5748decc-f629-461c-9a36-a35a221fe21f";
+
key blank = TEXTURE_BLANK;
 
string name;
 
string name;
 
key toucher;
 
key toucher;
 
string status;
 
string status;
 +
 +
// VD 2009-11-24 workaround for WEB-1383, use <meta> instead of <img>
 +
// VD 2009-11-25 try <img> if meta tag gets removed in the future
 +
string profile_key_prefix = "<meta name=\"imageid\" content=\"";
 +
string profile_img_prefix = "<img alt=\"profile image\" src=\"http://secondlife.com/app/image/";
 +
integer profile_key_prefix_length; // calculated from profile_key_prefix in state_entry()
 +
integer profile_img_prefix_length; // calculated from profile_img_prefix in state_entry()
 +
 +
//string profile_key_prefix = "<meta name=\"imageid\" content=\"";
 +
//integer s1l;
 
   
 
   
 
default
 
default
Line 53: Line 66:
 
     state_entry()
 
     state_entry()
 
     {
 
     {
 +
        profile_key_prefix_length = llStringLength(profile_key_prefix);
 +
        profile_img_prefix_length = llStringLength(profile_img_prefix);
 
         llSetText("", <1,0,0>, 1.0);
 
         llSetText("", <1,0,0>, 1.0);
 
         llSetTexture(blank, ALL_SIDES);
 
         llSetTexture(blank, ALL_SIDES);
Line 81: Line 96:
 
     }  
 
     }  
 
     http_response(key request_id,integer status, list metadata, string body)
 
     http_response(key request_id,integer status, list metadata, string body)
     {  
+
     {
         if (llSubStringIndex(body, "parcelimg") == 1)
+
         string profile_pic;
         {
+
        integer s1 = llSubStringIndex(body, profile_key_prefix);
            if (llSubStringIndex(body, "blank.jpg") == -1)
+
        integer s1l = profile_key_prefix_length;
                {
+
         if(s1 == -1)
                        integer start_UUID = llSubStringIndex(body,"<img alt=\"profile image\" src=\"http://secondlife.com/app/image/") + llStringLength("<img alt=\"profile image\" src=\"http://secondlife.com/app/image/");
+
        { // second try
                        integer end_UUID = llSubStringIndex(body,"\" class=\"parcelimg\" />") - 3;
+
            s1 = llSubStringIndex(body, profile_img_prefix);
                        string profile_pic = llGetSubString(body, start_UUID, end_UUID);
+
            s1l = profile_img_prefix_length;
                        llSetTexture((key)profile_pic, ALL_SIDES);
+
        }
                }
+
 
        }
+
        if (s1 == -1)
 +
        { // still no match?
 +
            profile_pic = blank;
 +
        }
 
         else
 
         else
 
         {
 
         {
             llSetTexture(blank, ALL_SIDES);
+
             profile_pic = llGetSubString(body,s1 + s1l, s1 + s1l + 35);
 +
            if (profile_pic == (string)NULL_KEY)
 +
            {
 +
                profile_pic = blank;
 +
            }
 
         }
 
         }
 +
        llSetTexture(profile_pic, ALL_SIDES);
 
     }
 
     }
 
     dataserver(key queryid, string data)
 
     dataserver(key queryid, string data)
Line 121: Line 144:
 
state msg
 
state msg
 
{
 
{
    state_entry()
+
    state_entry()
 
     {
 
     {
 
         llListen(0,"",toucher,"");
 
         llListen(0,"",toucher,"");
Line 141: Line 164:
 
         state show;
 
         state show;
 
     }
 
     }
}</lsl>}}
+
}
 +
</source>}}
  
 
{{LSLC|Examples}}
 
{{LSLC|Examples}}
 
{{LSLC|Library}}
 
{{LSLC|Library}}

Latest revision as of 17:33, 24 January 2015

KBcaution.png Important: This script relies on data scraped from world.secondlife.com. That site, and the page format it currently serves, will probably be replaced by my.secondlife.com pages in the coming months. The new pages use a different format and have different access controls, so expect this script to stop working if and when the change is made. See WEB-3510 for details.

Copying Permission

Copyright © 2008 by Kristy Fanshaw

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

To get a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.

Online Indicator

Place this script in a box you've created.

What it does:

  1. This script will create hover text with resident name and online status.
  2. Will show resident profile picture on the object if it's avaliable in search
  3. On touch the toucher can send IM to the resident by typing the message into main chat.
  4. Offers a link in main chat to open resident profile.
  5. finding a user key visit http://search.secondlife.com/search.php. Type the name in search and press "go". In results you see either only "Resident profile: name" or "Resident profile: name" and other results.

click on the result and you'll find the UUID in the URL of the page. ("secondlife:/app/agent/User_key/about" or "http://world.secondlife.com/resident/User_key")

////////////////////////////////////////////////////////////////////////////////////////////////
//    Copyright (c) 2008 by Kristy Fanshaw                                                    //
////////////////////////////////////////////////////////////////////////////////////////////////
//   This program is free software: you can redistribute it and/or modify                     //
//    it under the terms of the GNU General Public License as published by                    //
//    the Free Software Foundation, either version 3 of the License, or                       //
//    (at your option) any later version.                                                     //
//                                                                                            //
//    Online Indicator is distributed in the hope that it will be useful,                     //
//    but WITHOUT ANY WARRANTY; without even the implied warranty of                          //
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                           //
//    GNU General Public License for more details.                                            //
//                                                                                            //
//    To get a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.    //
////////////////////////////////////////////////////////////////////////////////////////////////
 
key user_key = "00000000-0000-0000-0000-000000000000";       // must be agent UUID whose status it will indicate
integer time = 30;                                           // time within the message should be written.
string url = "http://world.secondlife.com/resident/";
key blank = TEXTURE_BLANK;
string name;
key toucher;
string status;
 
// VD 2009-11-24 workaround for WEB-1383, use <meta> instead of <img>
// VD 2009-11-25 try <img> if meta tag gets removed in the future
string profile_key_prefix = "<meta name=\"imageid\" content=\"";
string profile_img_prefix = "<img alt=\"profile image\" src=\"http://secondlife.com/app/image/";
integer profile_key_prefix_length; // calculated from profile_key_prefix in state_entry()
integer profile_img_prefix_length; // calculated from profile_img_prefix in state_entry()
 
//string profile_key_prefix = "<meta name=\"imageid\" content=\"";
//integer s1l;
 
default
{
    state_entry()
    {
        profile_key_prefix_length = llStringLength(profile_key_prefix);
        profile_img_prefix_length = llStringLength(profile_img_prefix);
        llSetText("", <1,0,0>, 1.0);
        llSetTexture(blank, ALL_SIDES);
        llRequestAgentData( user_key, DATA_NAME);   
    }
    dataserver(key queryid, string data)
    {
        name = data;
        llSetObjectName(name + "'s Online Detector");
        state show;
    }
}
state show
{   
    state_entry()
    {
        llSetTimerEvent(10);
    } 
    timer()
    {
        llHTTPRequest( url + (string)user_key,[HTTP_METHOD,"GET"],"");
        llRequestAgentData( user_key, DATA_ONLINE);   
    } 
    on_rez(integer start_param)
    {
        llSetText("", <1,0,0>, 1.0);
        llSetTexture(blank, ALL_SIDES);
    } 
    http_response(key request_id,integer status, list metadata, string body)
    {
        string profile_pic;
        integer s1 = llSubStringIndex(body, profile_key_prefix);
        integer s1l = profile_key_prefix_length;
        if(s1 == -1)
        { // second try
            s1 = llSubStringIndex(body, profile_img_prefix);
            s1l = profile_img_prefix_length;
        }
 
        if (s1 == -1)
        { // still no match?
            profile_pic = blank;
        }
        else
        {
            profile_pic = llGetSubString(body,s1 + s1l, s1 + s1l + 35);
            if (profile_pic == (string)NULL_KEY)
            {
                profile_pic = blank;
            }
        }
        llSetTexture(profile_pic, ALL_SIDES);
    }
    dataserver(key queryid, string data)
    {
        if ( data == "1" ) 
        {
            status = " is online";
 
            llSetText(name + status, <0,1,0>, 1.0);
        }
        else if (data == "0")
        {
            status = " is offline";
 
            llSetText(name + status, <1,0,0>, 1.0);
        }
 
    }
    touch_start(integer num_detected)
    {
        toucher = llDetectedKey(0);
        state msg;
    }
}
state msg
{
    state_entry()
    {
        llListen(0,"",toucher,"");
        llInstantMessage(toucher, "write your message to " + name +" - you have " +(string)time + " seconds");
        llInstantMessage(toucher, "to see " + name +"'s profile, click this link here: secondlife:///app/agent/" + (string)user_key + "/about");
        llSetTimerEvent(time);   
    }
    listen(integer ch, string name, key id, string msg)
    {
        llInstantMessage(user_key, llKey2Name(toucher) + " sent you a message from " + llGetRegionName() + ": " + msg);
        llInstantMessage(toucher, "message is sent.");
        llListenRemove(0);
        state show;
    }
    timer()
    {
        llInstantMessage(toucher, "time is up - touch again to write a message");
        llListenRemove(0); 
        state show;
    }
}