User:Lum Pfohl/LSL Goodies/HI-WA Occupancy Counter System/Collection Server 1.05
Jump to navigation
Jump to search
<lsl>
// _ ______ __ _ _
// | | | ___ \/ _| | | | |
// | | _ _ _ __ ___ | |_/ / |_ ___ | |__ | |
// | | | | | | '_ ` _ \ | __/| _/ _ \| '_ \| |
// | |___| |_| | | | | | | | | | || (_) | | | | |
// \_____/\__,_|_| |_| |_| \_| |_| \___/|_| |_|_|
//
// Lum's Collection Server Script
//
// Written by Lum Pfohl June 17, 2008
//
//
// Version
string __versionID = "01.50";
// Beware of llOwnerSay spam if you turn debug on...
integer __debug=FALSE;
// interval at which we would check emails when there are none
float checkInterval = 2.5;
float checkFastInterval = 0.25;
integer checkCountdown = 0;
// OI Population
list population;
// HI Population
list hiPopulation;
// Infohub / Welcome Area Population
list waPopulation;
list waAreas = ["Ahern", "Ambat", "Anzere", "Bear", "Braunworth", "Calleta", "Clementina", "Hanja", "Hyles", "Iris", "Isabel", "Mahulu", "Mauve", "Miramare", "OIP", "Periwinkle", "Ross", "Violet", "Warmouth", "Waterhead", "Wengen", "Korea"];
integer numEmailScripts = 16;
integer curEmailScript = 0;
// replacement routine for llEmail(), designed to intercept
// the email request and dispatch it to one of several slave email scripts
sendMessage(string toAddress, string subject, string messageBody) {
// marshall the email parameters to pass to the slave email scripts
string messageToSend = toAddress + "|" + subject + "|" + messageBody;
if (__debug)
llOwnerSay("linking: " + (string)curEmailScript + messageToSend);
// contact the slave script (by number - curEmailScript) and pass the marshalled message
llMessageLinked(LINK_THIS, curEmailScript, messageToSend, NULL_KEY);
// increment currentEmail script pointer, resetting to zero as needed
curEmailScript = (curEmailScript + 1) % numEmailScripts;
}
default
{
//------------------------------------------------------------------------------------
// On startup the server states it's key. This key is required for resident counters
// to send notification emails.
//------------------------------------------------------------------------------------
state_entry() {
llOwnerSay("Server Key is " + (string)llGetKey());
llSetTimerEvent(checkInterval); // Poll for emails.
llOwnerSay("Email check interval set to " + (string)checkInterval + " seconds.");
// Create a 100 element list of populations, corresponding to OI 1 thru 99
// We recognize that there are not 100 OI's, and there is an anomalous "OI 22b"
// which we will progammatically overcome.
//
// A value of "0" would indivate "uninitialized" and any other value
// such as "0.0" would mean "zero residents, zero mentors"
population = ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
population = population + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
population = population + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
population = population + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
population = population + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
population = population + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
population = population + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
population = population + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
population = population + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
population = population + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
// We setup 20 HI slots (HI - HI 16, HIP, HIP2, stored in that order).
hiPopulation = ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
hiPopulation = hiPopulation + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
// We setup slots for HI 210 - 260
hiPopulation = hiPopulation + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
hiPopulation = hiPopulation + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
hiPopulation = hiPopulation + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
hiPopulation = hiPopulation + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
hiPopulation = hiPopulation + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
hiPopulation = hiPopulation + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
// We setup slots for 30 Infohubs and Welcome areas
waPopulation = ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
waPopulation = waPopulation + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
waPopulation = waPopulation + ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0"];
}
//------------------------------------------------------------------------------------
// Every time the timer expires, check for emails
//------------------------------------------------------------------------------------
timer() {
llGetNextEmail("", ""); // Check for email with any sender address and subject.
if (checkCountdown != 0) {
if (checkCountdown-- == 1) {
llSetTimerEvent(checkInterval);
}
}
}
//------------------------------------------------------------------------------------
// If we get an email, check for notifications, and update the population list
//------------------------------------------------------------------------------------
email(string time, string address, string subj, string message, integer num_left) {
// Remove the header
message = llDeleteSubString(message, 0, llSubStringIndex(message, "\n\n") + 1);
// Break of the message
list notificationMessage = llParseString2List(message,["~",","],[]);
string method = llList2String(notificationMessage, 0);
if (method == "NOTIFY") {
// Decompose the notification message string.
string regionName = llList2String(notificationMessage, 1);
integer residents = llList2Integer(notificationMessage, 2);
integer mentors = llList2Integer(notificationMessage, 3);
if (__debug) {
llOwnerSay(regionName + ": " + (string)residents + " residents, " + (string)mentors + " mentors.");
}
if (llGetSubString(regionName, 0, 1) == "OI") {
// Handle the case of the anomalous OI 22b - treat it as OI 19 (for storage purposes)
// since there is no OI 19.
integer oiNumber = 0;
if (regionName == "OI 22b") {
oiNumber = 19;
} else if (regionName == "OIP") {
// OI2 is a nonexistent OI, so we'll use that as OIP
oiNumber = 2;
waPopulation = llListReplaceList(waPopulation, [(string)residents + "~" + (string)mentors], 14, 14);
} else {
oiNumber = (integer)llGetSubString(regionName, 2, -1);
}
// Replace the value at the appropriate OI number with the value
// reported by the in-field ResCtr object. The format stored will be
// "<numResidents> ~ <numMentors>" E.g.: "2~1" indicates two residents,
// and one mentor.
population = llListReplaceList(population, [(string)residents + "~" + (string)mentors], oiNumber-1, oiNumber-1);
} else if (llGetSubString(regionName, 0, 1) == "HI") {
// Handle the special cases of HI, HIP and HIP2, treating them as
// HI 1, HI 17 and HI 18 respectively
integer hiNumber = 0;
if (regionName == "HI") {
hiNumber = 1;
} else if (regionName == "HIP") {
hiNumber = 17;
} else if (regionName == "HIP2") {
hiNumber = 18;
} else {
hiNumber = (integer)llGetSubString(regionName, 2, -1);
}
// Make adjustments for the new HI 201 - HI 210 - We will store them
// in slots 21 - 30
if (hiNumber >= 201 && hiNumber <= 260) {
hiNumber = hiNumber - 180;
}
// Replace the value at the appropriate HI number with the value
// reported by the in-field ResCtr object. The format stored will be
// "<numResidents> ~ <numMentors>" E.g.: "2~1" indicates two residents,
// and one mentor.
if (hiNumber < 80) {
hiPopulation = llListReplaceList(hiPopulation, [(string)residents + "~" + (string)mentors], hiNumber-1, hiNumber-1);
} else {
llOwnerSay("Received an unknown HI " + (string)hiNumber);
}
}
} else if (method == "NOTIFY WA") {
// Decompose the notification message string.
string regionName = llList2String(notificationMessage, 1);
integer residents = llList2Integer(notificationMessage, 2);
integer mentors = llList2Integer(notificationMessage, 3);
if (__debug) {
llOwnerSay(regionName + ": " + (string)residents + " residents, " + (string)mentors + " mentors.");
}
integer count = 0;
;
for (count = 0; count < llGetListLength(waAreas); count++) {
if (llList2String(waAreas, count) == regionName) {
waPopulation = llListReplaceList(waPopulation, [(string)residents + "~" + (string)mentors], count, count);
count = 30;
}
}
} else if (method == "QUERY") {
// Decompose the return address (HUD UUID) from the message
string returnAddress = llList2String(notificationMessage, 1);
if (__debug) {
llOwnerSay("QUERY (OI only) returnAddress = " + returnAddress);
}
// Send that object, the current OI population
sendMessage(returnAddress + "@lsl.secondlife.com", "Query Response", llList2CSV(population));
} else if (method == "QUERY HI") {
// Decompose the return address (HUD UUID) from the message
string returnAddress = llList2String(notificationMessage, 1);
if (__debug) {
llOwnerSay("QUERY (HI only) returnAddress = " + returnAddress);
}
// Send that object, the current OI population
sendMessage(returnAddress + "@lsl.secondlife.com", "Query Response", llList2CSV(llDeleteSubList(hiPopulation, 30, 79)));
} else if (method == "QUERY HI EXT") {
// Decompose the return address (HUD UUID) from the message
string returnAddress = llList2String(notificationMessage, 1);
if (__debug) {
llOwnerSay("QUERY (HI EXI) returnAddress = " + returnAddress);
}
// Send that object, the current OI population
sendMessage(returnAddress + "@lsl.secondlife.com", "Query Response", llList2CSV(hiPopulation));
} else if (method == "QUERY ALL") {
// Decompose the return address (HUD UUID) from the message
string returnAddress = llList2String(notificationMessage, 1);
if (__debug) {
llOwnerSay("QUERY (ALL) returnAddress = " + returnAddress);
}
// Send that object, the current OI population
// llOwnerSay((string)llGetListLength(population) + " " + (string)llGetListLength(hiPopulation));
sendMessage(returnAddress + "@lsl.secondlife.com", "Query Response", llList2CSV(population) + "," + llList2CSV(llDeleteSubList(hiPopulation, 30, llGetListLength(hiPopulation)-1)));
} else if (method == "QUERY ALL EXT") {
// Decompose the return address (HUD UUID) from the message
string returnAddress = llList2String(notificationMessage, 1);
if (__debug) {
llOwnerSay("QUERY (ALL EXT) returnAddress = " + returnAddress);
}
// Send that object, the current OI population
// llOwnerSay((string)llGetListLength(population) + " " + (string)llGetListLength(hiPopulation));
sendMessage(returnAddress + "@lsl.secondlife.com", "Query Response", llList2CSV(population) + "!" + llList2CSV(hiPopulation) + "!" + llList2CSV(waPopulation));
}
// If we have received an email, switch to fast polling to see if there are other mail
// trickling in. Once a period of 10 checks goes by we can swtich batch to normal polling
if (checkCountdown < 1) {
llSetTimerEvent(checkFastInterval);
}
checkCountdown = 10;
}
touch_start(integer num) {
llWhisper(0,llList2CSV(population));
llWhisper(0," ");
llWhisper(0,llList2CSV(hiPopulation));
llWhisper(0," ");
llWhisper(0,llList2CSV(waPopulation));
if (__debug) {
__debug = FALSE;
llOwnerSay("Debug is off.");
} else {
__deubg = TRUE;
llOwnerSay("Debug is on.");
}
}
}
</lsl>