At first you have to create a new prim to put these two scripts in, then edit Range, Rate, BOT_KEY, BOT_GROUP and MASTER to your needs. Update the size of the Prim and WEAR it at your AV/Bot.
The Bot itself and the MASTER can use the chat commands to control the attachment.
REZ it ↔ WEAR it
Additional Features:
→ Visitor List Maker
→ Sensor-System (adjustable Range/Rate)
→ Spam Protection (only one invite per AV)
→ Automatic List Cleanup (adjustable)
→ Debug-System
list visitor_list; float range = 90.0; // in meters float rate = 30.0; // in seconds // Bot UUID ("status 3" gives you the Bot-Key at the GUI) key BOT_KEY = " >>> HERE <<< "; // The group UUID in which the bot will invite ("mygroups" at the GUI) key BOT_GROUP = " >>> HERE <<< "; // Master UUID (Bot Owner) key MASTER=" >>> HERE <<< "; integer gListener1; // Bot integer gListener2; // Master integer isNameOnList( string name ) { integer len = llGetListLength( visitor_list ); integer i; for( i = 0; i < len; i++ ) { if( llList2String(visitor_list, i) == name ) { if (len > 50) { visitor_list = []; llSay( 0, "List Cleard."); } return TRUE; } } if (len > 50) { visitor_list = []; llSay( 0, "List Cleard."); } return FALSE; } default { state_entry() { llSay(0, "Visitor List Maker started..."); llSay(0, "The owners can say 'help' for instructions."); llSensorRepeat( "", "", AGENT, range, TWO_PI, rate ); gListener1 = llListen(0, "", llGetOwner(), ""); gListener2 = llListen(0, "", (string)MASTER, ""); llMessageLinked(LINK_THIS, 0, (string)BOT_KEY + "|Group UID: " + (string)BOT_GROUP, NULL_KEY); } sensor( integer number_detected ) { integer i; integer len = llGetListLength( visitor_list ); for( i = 0; i < number_detected; i++ ) { if( llDetectedKey( i ) != llGetOwner() ) { string detected_name = llDetectedName( i ); if( isNameOnList( detected_name ) == FALSE ) { visitor_list += detected_name; llMessageLinked(LINK_THIS, 0, (string)BOT_KEY +"|invite " + (string)llDetectedKey(i) + " " + (string)BOT_GROUP, NULL_KEY); llSay( 0, "Invite was send." ); if (len > 50) { visitor_list = []; llSay( 0, "List Cleared."); } } } } } listen( integer channel, string name, key id, string message ) { if( message == "help" ) { llSay( 0, "This object records the names of everyone who" ); llSay( 0, "comes within "+ (string)range + " meters." ); llSay( 0, "The list will be automatically cleared after 50 entries." ); llSay( 0, "Commands the owners can say:" ); llSay( 0, "'help' - Shows these instructions." ); llSay( 0, "'list' - Says the names of all visitors on the list."); llSay( 0, "'reset' - Removes all the names from the list." ); } else if( message == "list" ) { llSay( 0, "Visitor List:" ); integer len = llGetListLength( visitor_list ); integer i; for( i = 0; i < len; i++ ) { llSay( 0, llList2String(visitor_list, i) ); } llSay( 0, "Total = " + (string)len ); } else if( message == "reset" ) { llListenRemove(gListener1); llListenRemove(gListener2); visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list)); gListener1 = llListen(0, "", llGetOwner(), ""); gListener2 = llListen(0, "", (string)MASTER, ""); llSleep(1); llSay( 0, "Done resetting."); } } }
// InstantMessage per llLinkedMessage (API-Interface) integer DEBUG = FALSE; // Debug ON|OFF (true|false) integer isKey(key in) { if (in) return 2; return (in == NULL_KEY); } default { link_message(integer sender_num, integer num, string str, key id) { if (num != 0) { return; } list PARS; PARS = llParseString2List(str, ["|"], []); if (isKey(llList2Key(PARS,0))) { llInstantMessage(llList2Key(PARS,0), llList2String(PARS, 1)); } if ( DEBUG ) { llSay(DEBUG_CHANNEL, "debug => " + llList2String(PARS, 0) + " => " + llList2String(PARS, 1)); llWhisper( 0, "debug => " + llList2String(PARS, 0) + " => " + llList2String(PARS, 1)); } } }