Files
lsl-shell/repository.lsl
2020-04-19 16:11:58 +02:00

71 lines
1.8 KiB
Plaintext

integer CHANNEL = -54321;
integer pin;
regenerate_pin()
{
/* Generate a pseudo-random number to use as a PIN. */
string md5 = "seed";
integer count = 10;
while(count--)
{
md5 = llMD5String(md5 + (string)llGetUnixTime() + (string)llGetTime(), 0x5EED);
}
pin = (integer)("0x" + llGetSubString(md5, 0, 7));
}
integer module_is_available(string module)
{
list modules;
integer count = llGetInventoryNumber(INVENTORY_SCRIPT);
while(count--)
{
string name = llGetInventoryName(INVENTORY_SCRIPT, count);
if(name != llGetScriptName())
{
string extension = llGetSubString(name, -4, -1);
if(extension == ".lsl")
{
modules += [name];
}
}
}
if(llListFindList(modules, [module]) == -1) return FALSE;
else return TRUE;
}
default
{
state_entry()
{
llListen(CHANNEL, "", "", "");
}
listen(integer channel, string name, key id, string data)
{
// TODO Handle invalid data
string command = llJsonGetValue(data, ["command"]);
string module = llJsonGetValue(data, ["module"]);
if(command == "request")
{
string response = llList2Json(JSON_OBJECT, ["available", FALSE]);
if(module_is_available(module))
{
regenerate_pin();
response = llList2Json(JSON_OBJECT, ["available", TRUE, "pin", pin]);
}
llRegionSayTo(id, channel, response);
return;
}
else if(command == "send")
{
llRemoteLoadScriptPin(id, module, pin, TRUE, 0xDEADBEEF);
return;
}
string response = llList2Json(JSON_OBJECT, ["error", "Invalid command."]);
llRegionSayTo(id, channel, response);
}
}