Sim Restart Logger

Counts region restarts and displays log of last 5 restarts together with region FPS and dilation. 
Updated version: Achieves accurate information about Sim restarts by checking the newly 
introduced CHANGED_REGION_START flag in 'changed' event to log data instead of previous 
version's method of approximating restarts by checking for poor script performance.
Requirements:
* Place this script into a single prim and decorate to taste.
Operation:
* No special instructions. It operates stand alone once installed.
//********************************************************
// This Script was pulled out for you by YadNi Monde from the SL FORUMS at
// http://forums.secondlife.com/forumdisplay.php?f=15, it is intended to stay FREE by it's author(s)
// and all the comments here in ORANGE must NOT be deleted. They include notes on how to use it
// and no help will be provided either by YadNi Monde or it's Author(s).
// IF YOU DO NOT AGREE WITH THIS JUST DONT USE!!!
//********************************************************
/////////////////////////////////////////
// SIM CRASH/REBOOT LOGGER
// by: Kyrah Abattoir
// Updated by: Huney Jewell
// January 2010:
// Fixed: Log display truncated if more than 5 entries due to llSetText length restriction
// Added: Log start date
// Added: Code to easily specify appearance of hovertext
// July 2009:
// Changed: Achieving more accurate information about SIM restarts to log data by checking the newly introduced
// CHANGED_REGION_START flag in 'changed' event instead of approximation by checking for poor script performance
// Added: Last FPS and dilation values to hover text
/////////////////////////////////////////
// GLOBALS
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// User adjustable settings
float timering = 120; // Sets the polling rate. Put the speed you wish, in seconds
vector blue = <0,0,1>;
vector orange = <1,0.5,0>;
vector cyan = <0,1,1>;
vector pink = <1,0.5,0.76>;
vector green = <0,1,0>;
vector red = <1,0,0>;
vector white = <1,1,1>;
vector yellow = <1,1,0.1>;
vector purple = <1,0,1>;
vector black = <0,0,0>;
vector hoverColor = white; // Sets the color the text will show. Use predefined colors or any RGB color vector in float form
float hoverAlpha = 1.0; // Sets the text's transparency, 1.0 being SOLID, while 0 would be clear
// System settings - Do Not Change Anything Below!
string _buffer = "";
list log = [];
string region_name;
integer span;
float fps_avg;
float dilation_avg;
integer restarts = 0;
string startDate;
string date = "";
//2004-08-27T00:56:21.785886Z
// FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
string FormatDecimal(float number, integer precision)
{
 float roundingValue = llPow(10, -precision)*0.5;
 float rounded;
 if (number < 0) rounded = number - roundingValue;
 else rounded = number + roundingValue;
 if (precision < 1) // Rounding integer value
 {
 integer intRounding = (integer)llPow(10, -precision);
 rounded = (integer)rounded/intRounding*intRounding;
 precision = -1; // Don't truncate integer value
 }
 string strNumber = (string)rounded;
 return llGetSubString(strNumber, 0, llSubStringIndex(strNumber, ".") + precision);
}
hoverText()
{
 string _date = llGetDate();
 if(date == _date)
 span++;
 else // daily reset of the average FPS and dilation
 {
 span = 1;
 date = _date;
 fps_avg = 0;
 dilation_avg = 0;
 }
 float fps = llGetRegionFPS();
 fps_avg += fps;
 float dilation = llGetRegionTimeDilation();
 dilation_avg += dilation;
 string buffer = "";
 buffer += region_name + "\nFPS avg: " + FormatDecimal(fps_avg/span, 0)
 + ", last: " + FormatDecimal(fps, 0);
 buffer += "\nDilation avg: " + FormatDecimal(dilation_avg/span, 2)
 + ", last: " + FormatDecimal(dilation, 2);
 buffer += "\nSim restarts (since " + startDate + "): " + (string)restarts
 + "\nLast restarts (UTC): \n" + llDumpList2String(log,"\n");
 if(_buffer != buffer)
 { // display changed hovertext
 llSetText(buffer, hoverColor, hoverAlpha);
 _buffer = buffer;
 }
}
// CODE ENTRY
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
default
{
 state_entry()
 {
 region_name = llGetRegionName();
 startDate = llGetDate();
 hoverText(); // display hover text
 llSetTimerEvent(timering); // starting our timer
 }
 on_rez(integer num)
 {
 llResetScript();
 }
 changed(integer change)
 {
 if (change & CHANGED_REGION_START)
 { // log region restart
 restarts++;
 string timestamp = llGetTimestamp();
 list temp = llParseString2List(timestamp,["T",":","."],[]);
 log += llList2String(temp,0) + " - " + llList2String(temp,1) + ":"
 + llList2String(temp,2) + ":" + llList2String(temp,3);
 if(llGetListLength(log) > 5) // limit log entries to avoid hovertext truncation
 log = llDeleteSubList(log,0,0);
 }
 }
 timer()
 {
 hoverText(); // display hover text
 }
}
--Huney Jewell 12:46, 22 July 2009 (UTC)