4b5003294e
The new versioning scheme uses a letter instead of the dash. The letter is a p for a work-in-progress/pre-release version, or an r for a release version. For example: 2.2p04 - work in progress for version 2.2r04 2.2r04 - release version (2.2-04 with the previous scheme) The two digit number will be increasing even for minor changes. The last minor changes indicator is dropped.
238 lines
6.7 KiB
Text
238 lines
6.7 KiB
Text
/*
|
|
* [AV]root-security - Specify who can sit and/or use the menu
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* Copyright © the AVsitter Contributors (http://avsitter.github.io)
|
|
* AVsitter™ is a trademark. For trademark use policy see:
|
|
* https://avsitter.github.io/TRADEMARK.mediawiki
|
|
*
|
|
* Please consider supporting continued development of AVsitter and
|
|
* receive automatic updates and other benefits! All details and user
|
|
* instructions can be found at http://avsitter.github.io
|
|
*/
|
|
|
|
string product = "AVsitter™ Security";
|
|
string #version = "2.2p04";
|
|
string script_basename = "[AV]sitA";
|
|
string menucontrol_script = "[AV]root-control";
|
|
string RLV_script = "[AV]root-RLV";
|
|
key active_sitter;
|
|
integer active_prim;
|
|
integer active_script_channel;
|
|
integer menu_channel;
|
|
integer menu_handle;
|
|
list SIT_TYPES = ["ALL", "OWNER", "GROUP"];
|
|
integer SIT_INDEX;
|
|
integer MENU_INDEX;
|
|
string lastmenu;
|
|
list MENU_TYPES = [lastmenu]; //OSS::list MENU_TYPES; // Force error in LSO
|
|
|
|
integer pass_security(key id, string context)
|
|
{
|
|
integer ALLOWED = FALSE;
|
|
string TYPE = llList2String(SIT_TYPES, SIT_INDEX);
|
|
if (context == "MENU")
|
|
{
|
|
TYPE = llList2String(MENU_TYPES, MENU_INDEX);
|
|
}
|
|
if (TYPE == "GROUP")
|
|
{
|
|
if (llSameGroup(id) == TRUE)
|
|
{
|
|
ALLOWED = TRUE;
|
|
}
|
|
}
|
|
else if (id == llGetOwner() || TYPE == "ALL")
|
|
{
|
|
ALLOWED = TRUE;
|
|
}
|
|
return ALLOWED;
|
|
}
|
|
|
|
check_sitters()
|
|
{
|
|
integer i = llGetNumberOfPrims();
|
|
while (llGetAgentSize(llGetLinkKey(i)) != ZERO_VECTOR)
|
|
{
|
|
key av = llGetLinkKey(i);
|
|
if (pass_security(av, "SIT") == FALSE)
|
|
{
|
|
llUnSit(av);
|
|
llDialog(av, product + " " + version + "\n\nSorry, Sit access is set to: " + llList2String(SIT_TYPES, SIT_INDEX), ["OK"], -164289491);
|
|
}
|
|
i--;
|
|
}
|
|
}
|
|
|
|
back_to_adjust(integer SCRIPT_CHANNEL, key sitter)
|
|
{
|
|
llMessageLinked(LINK_SET, 90101, (string)SCRIPT_CHANNEL + "|[ADJUST]|", sitter);
|
|
}
|
|
|
|
list order_buttons(list menu_items)
|
|
{
|
|
return llList2List(menu_items, -3, -1) + llList2List(menu_items, -6, -4) + llList2List(menu_items, -9, -7) + llList2List(menu_items, -12, -10);
|
|
}
|
|
|
|
register_touch(key id, integer animation_menu_function, integer active_prim, integer giveFailedMessage)
|
|
{
|
|
if (pass_security(id, "MENU"))
|
|
{
|
|
if (llGetInventoryType(menucontrol_script) == INVENTORY_SCRIPT)
|
|
{
|
|
if (check_for_RLV())
|
|
{
|
|
llMessageLinked(LINK_THIS, 90012, (string)active_prim, id);
|
|
}
|
|
else
|
|
{
|
|
llMessageLinked(LINK_THIS, 90007, "", id);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
llMessageLinked(LINK_SET, 90005, (string)animation_menu_function, id);
|
|
}
|
|
}
|
|
else if (giveFailedMessage)
|
|
{
|
|
llDialog(id, product + " " + version + "\n\nSorry, Menu access is set to: " + llList2String(MENU_TYPES, MENU_INDEX), ["OK"], -164289491);
|
|
}
|
|
}
|
|
|
|
main_menu()
|
|
{
|
|
list buttons = (list)"Sit" + "Menu";
|
|
if (active_sitter) // OSS::if (osIsUUID(active_sitter) && active_sitter != NULL_KEY)
|
|
{
|
|
buttons = "[BACK]" + buttons;
|
|
}
|
|
dialog("Sit access: " + llList2String(SIT_TYPES, SIT_INDEX) + "\nMenu access: " + llList2String(MENU_TYPES, MENU_INDEX) + "\n\nChange security settings:", buttons);
|
|
lastmenu = "";
|
|
}
|
|
|
|
dialog(string text, list menu_items)
|
|
{
|
|
llListenRemove(menu_handle);
|
|
menu_handle = llListen((menu_channel = ((integer)llFrand(0x7FFFFF80) + 1) * -1), "", llGetOwner(), ""); // 7FFFFF80 = max float < 2^31
|
|
llDialog(llGetOwner(), product + " " + version + "\n\n" + text, order_buttons(menu_items), menu_channel);
|
|
llSetTimerEvent(600);
|
|
}
|
|
|
|
integer check_for_RLV()
|
|
{
|
|
if (llGetInventoryType(RLV_script) == INVENTORY_SCRIPT)
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
default
|
|
{
|
|
state_entry()
|
|
{
|
|
MENU_TYPES = SIT_TYPES;
|
|
llMessageLinked(LINK_SET, 90202, (string)check_for_RLV(), "");
|
|
}
|
|
|
|
timer()
|
|
{
|
|
llSetTimerEvent(0);
|
|
llListenRemove(menu_handle);
|
|
}
|
|
|
|
link_message(integer sender, integer num, string msg, key id)
|
|
{
|
|
if (num == 90201)
|
|
{
|
|
llMessageLinked(LINK_SET, 90202, (string)check_for_RLV(), "");
|
|
}
|
|
else if (num == 90006)
|
|
{
|
|
if (llGetInventoryType(menucontrol_script) != INVENTORY_SCRIPT)
|
|
{
|
|
register_touch(id, (integer)msg, sender, FALSE);
|
|
}
|
|
}
|
|
else if (num == 90100)
|
|
{
|
|
list data = llParseString2List(msg, ["|"], []);
|
|
if (llList2String(data, 1) == "[SECURITY]")
|
|
{
|
|
if (id == llGetOwner())
|
|
{
|
|
active_prim = sender;
|
|
active_script_channel = llList2Integer(data, 0);
|
|
active_sitter = llList2Key(data, 2);
|
|
main_menu();
|
|
}
|
|
else
|
|
{
|
|
llRegionSayTo(id, 0, "Sorry, only the owner can change security settings.");
|
|
llMessageLinked(sender, 90101, llList2String(data, 0) + "|[ADJUST]|" + (string)id, llList2Key(data, 2));
|
|
}
|
|
}
|
|
}
|
|
else if (num == 90033)
|
|
{
|
|
llListenRemove(menu_handle);
|
|
}
|
|
}
|
|
|
|
listen(integer listen_channel, string name, key id, string msg)
|
|
{
|
|
if (msg == "Sit")
|
|
{
|
|
dialog("Sit security:", SIT_TYPES);
|
|
lastmenu = msg;
|
|
return;
|
|
}
|
|
else if (msg == "Menu")
|
|
{
|
|
dialog("Menu security:", MENU_TYPES);
|
|
lastmenu = msg;
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if (msg == "[BACK]")
|
|
{
|
|
llMessageLinked(LINK_SET, 90101, (string)active_script_channel + "|[ADJUST]|" + (string)id, active_sitter);
|
|
}
|
|
else if (lastmenu == "Sit")
|
|
{
|
|
SIT_INDEX = llListFindList(SIT_TYPES, [msg]);
|
|
main_menu();
|
|
check_sitters();
|
|
return;
|
|
}
|
|
else if (lastmenu == "Menu")
|
|
{
|
|
MENU_INDEX = llListFindList(MENU_TYPES, [msg]);
|
|
main_menu();
|
|
return;
|
|
}
|
|
}
|
|
llListenRemove(menu_handle);
|
|
}
|
|
|
|
changed(integer change)
|
|
{
|
|
if (change & CHANGED_LINK)
|
|
{
|
|
check_sitters();
|
|
}
|
|
}
|
|
|
|
touch_end(integer touched)
|
|
{
|
|
if (check_for_RLV() || llGetAgentSize(llGetLinkKey(llGetNumberOfPrims())) != ZERO_VECTOR)
|
|
{
|
|
register_touch(llDetectedKey(0), 0, llDetectedLinkNumber(0), TRUE);
|
|
}
|
|
}
|
|
}
|