User:Antony Fairport/Scripts/Simple Security System
<lsl> ////////////////////////////////////////////////////////////////////// // Simple security system. // By Antony Fairport. // // Revision history. // ================= // // 2011-06-27 // Initial version.
////////////////////////////////////////////////////////////////////// // Constants. string CONFIG_FILE = "Security";
////////////////////////////////////////////////////////////////////// // Global configuration. float g_nRange; // Range to scan. float g_nFrequency; // Frequency of checks. list g_lOwners; // Owner list. list g_lAccess; // Access list.
////////////////////////////////////////////////////////////////////// // Config reading globals. key g_keyConfig; integer g_iConfig;
////////////////////////////////////////////////////////////////////// // Is the given avatar on the given list? integer AvatarInList( string sAvatar, list l ) {
return ~llListFindList( l, [ sAvatar ] );
}
////////////////////////////////////////////////////////////////////// // Is the given avatar an owner? integer IsOwner( string sName ) {
return AvatarInList( sName, g_lOwners );
}
////////////////////////////////////////////////////////////////////// // Does the given avatar have access? integer HasAccess( string sName ) {
return AvatarInList( sName, g_lAccess );
}
////////////////////////////////////////////////////////////////////// // Eject the intruder. Eject( key keyIntruder ) {
// Tell the intruder what we're doing to them. llInstantMessage( keyIntruder, "You do not have access to this location. Sending you home." ); // And send them home. llTeleportAgentHome( keyIntruder );
}
////////////////////////////////////////////////////////////////////// // Default state. default {
//////////////////////////////////////////////////////////////////
// State entry.
state_entry()
{
// Read the configuration.
state Configure;
}
}
////////////////////////////////////////////////////////////////////// // Configuration state. state Configure {
//////////////////////////////////////////////////////////////////
// State entry.
state_entry()
{
// Let the user know what's happening.
llWhisper( 0, "Reading configuration." );
// Clear out the config.
g_nRange = 96.0;
g_nFrequency = 5.0;
g_lOwners = [];
g_lAccess = [];
// If it looks like we've got config...
if ( llGetInventoryType( CONFIG_FILE ) == INVENTORY_NOTECARD )
{
// ...start reading it.
g_keyConfig = llGetNotecardLine( CONFIG_FILE, g_iConfig = 0 );
}
else
{
// Tell the user things aren't good.
llWhisper( 0, "No security configuration found. Turning off." );
}
}
//////////////////////////////////////////////////////////////////
// Handle data server responses.
dataserver( key queryid, string data )
{
// If this is our query...
if ( queryid == g_keyConfig )
{
// If this isn't the end of the file...
if ( data != EOF )
{
// If the line doesn't look like it's a comment, and it isn't empty...
if ( ( llGetSubString( data, 0, 0 ) != "#" ) && ( llStringTrim( data, STRING_TRIM ) != "" ) )
{
// Split the line into a list.
list sLineData = llParseString2List( data, [ "=" ], [] );
// Pull out the setting name.
string sSetting = llToLower( llStringTrim( llList2String( sLineData, 0 ), STRING_TRIM ) );
// Pull out the setting value.
string sValue = llStringTrim( llList2String( sLineData, 1 ), STRING_TRIM );
// Owner?
if ( sSetting == "owner" )
{
g_lOwners += [ sValue ];
g_lAccess += [ sValue ];
llWhisper( 0, "Owner: " + sValue );
}
// Access list?
else if ( sSetting == "access" )
{
g_lAccess += [ sValue ];
llWhisper( 0, "Access: " + sValue );
}
// Range?
else if ( sSetting == "range" )
{
g_nRange = (float) sValue;
llWhisper( 0, "Range: " + sValue );
}
// Frequency?
else if ( sSetting == "frequency" )
{
g_nFrequency = (float) sValue;
llWhisper( 0, "Frequency: " + sValue );
}
}
// Read the next line.
g_keyConfig = llGetNotecardLine( CONFIG_FILE, ++g_iConfig );
}
else
{
// Config read. Get protecting.
state Protect;
}
}
}
}
////////////////////////////////////////////////////////////////////// // Paused state -- does nother but waits to be activated again. state Paused {
//////////////////////////////////////////////////////////////////
// State entry.
state_entry()
{
// Tell the user we're paused.
llWhisper( 0, "Security protection is paused." );
// And add some hover text too.
llSetText( "Security system paused.", < 1.0, 0.0, 0.0 >, 1.0 );
}
//////////////////////////////////////////////////////////////////
// Handle a touch.
touch_end( integer num_detected )
{
// If it's an owner who touched us...
if ( IsOwner( llDetectedName( 0 ) ) )
{
// Jump back to the protect state.
state Protect;
}
}
//////////////////////////////////////////////////////////////////
// Detect change.
changed( integer change )
{
// If the inventory has changed...
if ( change & CHANGED_INVENTORY )
{
// ...start over.
state Configure;
}
}
}
////////////////////////////////////////////////////////////////////// // Protect state -- does the scanning and ejecting. state Protect {
//////////////////////////////////////////////////////////////////
// State entry.
state_entry()
{
// Let the user know what's happening.
llWhisper( 0, "Security protection is enabled." );
// Remove any hover text.
llSetText( "", < 1.0, 1.0, 1.0 >, 0.0 );
// Start the sensor.
llSensorRepeat( "", "", AGENT_BY_LEGACY_NAME, g_nRange, PI, g_nFrequency );
}
//////////////////////////////////////////////////////////////////
// State exit.
state_exit()
{
// Make sure the sensor is removed.
llSensorRemove();
}
//////////////////////////////////////////////////////////////////
// Handle the sensor result.
sensor( integer num_detected )
{
integer i;
// For each detected avatar...
for ( i = 0; i < num_detected; i++ )
{
// If they are over our land...
if ( llOverMyLand( llDetectedKey( i ) ) )
{
// If they're not on the access list...
if ( !HasAccess( llDetectedName( i ) ) )
{
// Eject them.
Eject( llDetectedKey( i ) );
}
}
}
}
//////////////////////////////////////////////////////////////////
// Handle a touch.
touch_end( integer num_detected )
{
// If it's an owner who touched us...
if ( IsOwner( llDetectedName( 0 ) ) )
{
// Jump to the paused state.
state Paused;
}
}
//////////////////////////////////////////////////////////////////
// Detect change.
changed( integer change )
{
// If the inventory has changed...
if ( change & CHANGED_INVENTORY )
{
// ...start over.
state Configure;
}
}
} </lsl>