02-18-2013, 02:23 AM
PHP Code:
key owner_id; // Use to store the UUID of the owner to save having to keep asking.
string owner_name; // Use to store the name of the owner to save having to keep asking.
// This a UUID of a texture I created to show either the word "ONLINE" or "OFFLINE".
key ON_OFF_line = "124cfcec-6b8d-552c-42b8-6a1179884e74";
// This is added to the owner UUID to make an HTTP request for the owners profile image UUID.
string profile_url = "http://world.secondlife.com/resident/";
key name_id; // This key is used to recognize the dataserver request if it is for the name of the owner.
key online_id; // This key is used to recognize the dataserver request if it is made automatically.
key touch_request_id; // This key is used to recognize the dataserver request if it is made by a user.
key update_id; // Used to verify that the HTTP request is for an update of the profile texture.
integer lis; // This is used to store the value of a listen and to remove it when not needed.
integer channel; // This is used to store the value of the listen channel.
key requester; // This is used to store the name of a user who asks to page the owner.
string date; // Used to store the date (just in case you couldn't guess).
OnlineStatus(integer ol, integer tr) // This function carries two integer type pieces of info.
{ // integer ol is the the boolean online data. 1 for online and zero for offline.
// integer tr is also boolean. It carries whether the function is being called by a user or automatically.
list ol_params = []; // This is a local list creation.
if(ol) // If the owner is online...
ol_params = [17, 5, ON_OFF_line, <1.4,0.25,0.0>, <0.0,0.375,0.0>, (90*DEG_TO_RAD), // ..list the object parameters for displaying ONLINE.
18, 5, <0.0,1.0,0.0>, 1.0,
18, 6, <1.0,1.0,1.0>, 1.0];
else // If not...
ol_params = [17, 5, ON_OFF_line, <1.4,0.25,0.0>, <0.0,0.625,0.0>, (90*DEG_TO_RAD), // ..list the object parameters for displaying OFFLINE.
18, 5, <1.0,0.0,0.0>, 1.0,
18, 6, <0.5,0.5,0.5>, 1.0];
llSetPrimitiveParams(ol_params); // Set the object parameters to show whatever the list is.
if(tr) // If this was a touch request...
{
llSetTimerEvent(30.0); // Prepare to be ignored (we need to switch the listen off if we are ignored).
if(ol) // If the owner is online...
{
lis = llListen(channel, "", requester, ""); // Open a listen for the user who made the request.
llDialog(requester, ("\nWould you like to page " + owner_name + "?"), ["YES", "NO"], channel); // Send them a dialog.
}
else // If not...
llInstantMessage(requester, (owner_name + " is currently offline.")); // Send a message explaining that the owner is offline.
}
}
default // Create an area for the events to play in. This is called a "state".
{
state_entry() // On state entry...
{
owner_id = llGetOwner(); // Get the owner UUID (key) and store it.
name_id = llRequestAgentData(owner_id, DATA_NAME); // Make a request for the owners name.
channel = -5647; // Set a channel to use for the dialog.
}
dataserver(key q, string data) // Triggered when a reply to a data request is recieved.
{
if(q == name_id) // Check the id of the request.
{
owner_name = data; // Store the result.
llSetObjectName(owner_name + "'s Online Status"); // Set the name of the object to the owner name + "'s Online Status".
llHTTPRequest((profile_url + ((string)owner_id)), [], ""); // Request the UUID of the owners profile.
}
else if(q == online_id) // Check the id of the request.
OnlineStatus(((integer)data), FALSE); // Call the OnlineStatus function for an automatic return.
else if(q == touch_request_id) // Check the id of the request.
OnlineStatus(((integer)data), TRUE); // Call the OnlineStatus function for a touch-by-user return.
}
http_response(key q, integer status, list metadata, string body) // Triggered when a response for an HTTP request is recieved.
{
integer tex_key_start = (llSubStringIndex(body, "imageid") + 18); // Establish the point where the image UUID is written in the page.
integer tex_key_end = (tex_key_start + 35); // Establish the point where the image UUID ends.
key profile_image = ((key)llGetSubString(body, tex_key_start, tex_key_end)); // Store the the profile image UUID found.
if(q != update_id) // Check the source of the request.
{
llSetPrimitiveParams([9, 0, 0, <0.6,0.875,0.0>, 0.02, ZERO_VECTOR, <1.0,1.0,0.0>, ZERO_VECTOR, // Shape the object...
8, llEuler2Rot(<0.0,90.0,0.0>*DEG_TO_RAD),
7, <0.85,0.01,0.6>,
17, -1, TEXTURE_BLANK, <1.0,1.0,0.0>, ZERO_VECTOR, 0.0,
18, -1, ZERO_VECTOR, 1.0]); // ...and texture it with the owners profile image and...
llSetPrimitiveParams([17, 6, profile_image, <1.0,1.0,0.0>, ZERO_VECTOR, (90*DEG_TO_RAD),
17, 5, ON_OFF_line, <1.4,0.25,0.0>, <0.0,0.375,0.0>, (90*DEG_TO_RAD), // the ON/OFFline texture.
19, 5, 0, 1,
18, 6, <1.0,1.0,1.0>, 1.0,
18, 5, <0.0,1.0,0.0>, 1.0,
20, 5, 1,
20, 6, 1]);
llSetTimerEvent(0.1); // Move to the timer quickly to run the first OnlineStatus check.
}
else
llSetPrimitiveParams([17, 6, profile_image, <1.0,1.0,0.0>, ZERO_VECTOR, (90*DEG_TO_RAD)]); // Apply the updated profile texture.
}
timer() // Triggered if a timer event is set to a non zero amount.
{
llSetTimerEvent(10.0); // Reset the timer event to trigger every 10 seconds.
llListenRemove(lis); // Always remove any listen we have open.
online_id = llRequestAgentData(owner_id, DATA_ONLINE); // So every 10 seconds we check if the owner is online.
string t_date = llGetDate(); // Find out what the date is.
if(t_date != date) // Check if the date has changed. If it has...
{
date = t_date; // ...store the date so the next check to return true will be roughly 24 hours later.
update_id = llHTTPRequest((profile_url + ((string)owner_id)), [], ""); // Request an update of the UUID of the owners profile.
}
}
touch_start(integer nd) // Triggered on clicking the object that contains the script.
{
llSetTimerEvent(0.0); // Stop the timer.
requester = llDetectedKey(0); // Store the UUID of the person who touched us.
touch_request_id = llRequestAgentData(owner_id, DATA_ONLINE); // Request the online status of the owner before issuing any dialogs.
} // We do this becuse if the owner went offline 9 seconds ago we wouldn't know.
listen(integer chan, string name, key id, string msg) // Triggered when all the specified info is recieved by the script if it has a listen open.
{
llListenRemove(lis); // Remove the listen.
llSetTimerEvent(10.0); // Set the timer to run automatically.
if(msg == "YES") // If the toucher wants to page the owner (the owner must be online)...
{ // Instant message the owner with a link that when clicked will bring up the touchers profile. This saves searching for the touchers profile.
llInstantMessage(owner_id, ("secondlife:///app/agent/" + ((string)requester) + "/about has requested to message you."));
llInstantMessage(requester, owner_name + " has been paged."); // Inform the toucher that the owner has been paged.
}
}
}