LSL Protocol/Restrained Life Relay/How to Test/Relay Test 03
< LSL Protocol | Restrained Life Relay | How to Test
Jump to navigation
Jump to search
Revision as of 13:24, 25 January 2015 by ObviousAltIsObvious Resident (talk | contribs) (<lsl> tag to <source>)
Objection
Ensure that pending restrictions in ask mode are correctly lifted if they world object releases control before the permission dialog is accepted.
Instructions
Part 1: One line restriction release
- Set relay to ask mode. Note: Some relays don't ask again if the object is owned by the same person who owned the last object
- Touch box
- Accept permission
- Say "hello"
Part 2: Two line restriction release
- Box asks you to not accept permission yet
- Box asks you to accept permission dialog
- Say "hello"
Known Problems in the Test
- Some Relays don't display both permission dialogs because they implicitly trust other objects by the same owner as the last used object.
Code
Root Prim
integer CHANNEL_RELAY = -1812221819; // Relay Channel
integer CHANNEL_PUBLIC = 0;
integer STEP_START = 0;
integer STEP_WAIT_FOR_HELLO = 1;
integer STEP_SECOND_TEST = 2;
integer STEP_WAIT_FOR_SECOND_HELLO = 3;
integer STEP_DONE = 4;
integer step = STEP_START;
// looks for the confirmation of the sendchat restriction
handleRelayResponse(string message)
{
list tokens = llParseString2List(message, [","], []);
string question = llList2String(tokens, 2);
string response = llList2String(tokens, 3);
if (question == "@sendchat=n")
{
if (response == "")
{
return;
}
if (response != "ok")
{
llSay(0, "FAIL: Relay did reject @sendchat command");
return;
}
llSay(0, "Please say \"hello\" on public chat.");
if (step == STEP_START)
{
step = STEP_WAIT_FOR_HELLO;
} else if (step == STEP_SECOND_TEST)
{
step = STEP_WAIT_FOR_SECOND_HELLO;
}
}
}
// handles avatar chat
handleAvatarResponse(string message)
{
if (message == "...")
{
llSay(0, "FAIL: @sendchat restriction should already be lifted.");
}
else if (llToLower(message) == "hello")
{
if (step == STEP_WAIT_FOR_HELLO)
{
llSay(0, "PASS: one line ask mode test");
llMessageLinked(LINK_SET, 1, "send_restrictions", NULL_KEY);
step = STEP_SECOND_TEST;
llSetTimerEvent(10);
}
else if (step == STEP_WAIT_FOR_SECOND_HELLO)
{
llSay(0, "PASS: two line ask mode test.");
step = STEP_DONE;
}
}
}
default
{
state_entry()
{
llListen(CHANNEL_RELAY, "", "", "");
llListen(CHANNEL_PUBLIC, "", "", "");
}
on_rez(integer ignored)
{
llSetText(llGetObjectName(), <1, 1, 1>, 1);
llSay(0, "Set your relay to ask mode and touch me.");
}
listen(integer channel, string name, key id, string message)
{
if ((llGetOwnerKey(id) == id) && (channel == CHANNEL_PUBLIC))
{
handleAvatarResponse(message);
}
if ((llGetOwnerKey(id) == llGetOwner()) && (channel == CHANNEL_RELAY))
{
handleRelayResponse(message);
}
llOwnerSay(name + ": " + message);
}
touch_start(integer ignored)
{
if (llDetectedKey(0) != llGetOwner())
{
llSay(0, "Hey, " + llDetectedName(0) + " don't mess with me!");
return;
}
step = STEP_START;
llSay(CHANNEL_RELAY, "relaytest," + (string) llGetOwner() + ",@sendchat=n|!release");
llSay(0, "Please accept permission.");
}
timer()
{
llSay(0, "Please accept the permission dialog now. If you did not get a second one, the first test failed.");
llSetTimerEvent(0);
}
}
Child Prim
integer CHANNEL_RELAY = -1812221819; // Relay Channel
default
{
link_message(integer sender, integer channel, string message, key id)
{
llSay(0, "Please do not press a button in the permission dialog, yet");
llSay(CHANNEL_RELAY, "relaytest," + (string) llGetOwner() + ",@sendchat=n");
llSay(CHANNEL_RELAY, "relaytest," + (string) llGetOwner() + ",!release");
}
}