557 lines
No EOL
18 KiB
Text
Executable file
557 lines
No EOL
18 KiB
Text
Executable file
#include "variables.lsl"
|
|
#include "functions.lsl"
|
|
|
|
default
|
|
{
|
|
state_entry()
|
|
{
|
|
if(llGetObjectDesc() == "" || llGetObjectDesc() == "(No Description)")
|
|
{
|
|
llSetObjectDesc((string)llGenerateKey());
|
|
RESET();
|
|
llSay(0, "First boot completed");
|
|
llResetScript();
|
|
}
|
|
|
|
llMessageLinked(LINK_SET,0,"","fw_reset");
|
|
llListen (SERVER_CHANNEL, "", "", "");
|
|
g_lAdminTag = [];
|
|
g_lManagerTag = [];
|
|
CIRCLE_LOGO = "";
|
|
OFFLINE_TEXTURE = "";
|
|
ONLINE_TEXTURE = "";
|
|
AVAILABLE = "";
|
|
NO_TEXTURE = "";
|
|
}
|
|
|
|
|
|
listen(integer c,string n,key i,string m)
|
|
{
|
|
//llSay(0, m);
|
|
if(llJsonGetValue(m,["op"]) == "set_admins")
|
|
{
|
|
g_lAdminTag = llJson2List(llJsonGetValue(m,["adm"]));
|
|
llRegionSayTo(i,c,llList2Json(JSON_OBJECT, ["op", "get_managers"]));
|
|
}else if(llJsonGetValue(m,["op"]) == "set_managers")
|
|
{
|
|
g_lManagerTag = llJson2List(llJsonGetValue(m,["mgr"]));
|
|
llRegionSayTo(i,c, llList2Json(JSON_OBJECT, ["op", "get_flags"]));
|
|
} else if(llJsonGetValue(m,["op"]) == "set_flags")
|
|
{
|
|
g_iFlags = (integer)llJsonGetValue(m,["flag"]);
|
|
if(g_iFlags&4)llMessageLinked(LINK_SET,0x3E,llList2Json(JSON_OBJECT,["op","money_enabled"]), "");
|
|
g_iPricePerDay = (integer)llJsonGetValue(m,["ppd"]);
|
|
llRegionSayTo(i,c,llList2Json(JSON_OBJECT, ["op", "get_textures"]));
|
|
}else if(llJsonGetValue(m,["op"]) == "set_textures")
|
|
{
|
|
string sTmp = llJsonGetValue(m,["txt"]);
|
|
CIRCLE_LOGO = llJsonGetValue(sTmp, ["logo"]);
|
|
OFFLINE_TEXTURE = llJsonGetValue(sTmp, ["offline"]);
|
|
ONLINE_TEXTURE = llJsonGetValue(sTmp, ["online"]);
|
|
AVAILABLE = llJsonGetValue(sTmp, ["available"]);
|
|
NO_TEXTURE = llJsonGetValue(sTmp, ["none"]);
|
|
|
|
llMessageLinked(LINK_SET,0,"<!c=0,0.5,0>[SYNCDONE] Admins", "fw_data");
|
|
llSleep(1);
|
|
llSetTimerEvent(1);
|
|
//llSay(0, "Administrative server synchronized");
|
|
g_iBoot=1;
|
|
}
|
|
}
|
|
|
|
link_message(integer s,integer n,string m,key i){
|
|
if(i == "fw_ready")
|
|
{
|
|
llRegionSay(SERVER_CHANNEL, llList2Json(JSON_OBJECT, ["op", "get_admins"]));
|
|
llMessageLinked(LINK_SET, 0, "<!c=1,0,1>Sync Admin Server...", "fw_data");
|
|
llSetLinkTexture(LINK_ROOT, TEXTURE_BLANK, 3);
|
|
llSetLinkTexture(LINK_ROOT, TEXTURE_BLANK, 4);
|
|
llSetLinkTexture(LINK_ROOT, TEXTURE_TRANSPARENT, 2);
|
|
llSetLinkColor(LINK_ROOT, ZERO_VECTOR, 3);
|
|
llSetLinkColor(LINK_ROOT, ZERO_VECTOR, 4);
|
|
llSetLinkColor(LINK_ROOT, ZERO_VECTOR, 2);
|
|
llSetLinkColor(LINK_ROOT, ZERO_VECTOR, 0);
|
|
llMessageLinked(LINK_SET, 0, "c="+GetColorStr(FALSE)+"; f=03812794-535b-f546-6171-6bec5bf399be", "fw_conf");
|
|
#if DEVELOPER == 1
|
|
g_iWaitFor=llRound(llFrand(20))+4;
|
|
#else
|
|
g_iWaitFor = llRound(llFrand(120))+4;
|
|
#endif
|
|
//llSetTimerEvent(1);
|
|
}
|
|
if(n == 0x004f) {
|
|
API_SERVER = DecipherService(m,"api");
|
|
}
|
|
}
|
|
|
|
|
|
timer()
|
|
{
|
|
if(g_iState & STATE_REBOOT_FAST)
|
|
{
|
|
g_iState=mask(UNSET, g_iState, STATE_REBOOT_FAST);
|
|
|
|
state boot;
|
|
}
|
|
g_iWaitFor--;
|
|
|
|
llMessageLinked(LINK_SET,0,"<!c=1,0,1>Startup in : "+(string)g_iWaitFor, "fw_data");
|
|
if(g_iWaitFor == -1){
|
|
llMessageLinked(LINK_SET,0,"<!c=0,0.5,0>Starting up", "fw_data");
|
|
llSetTimerEvent(0);
|
|
state boot;
|
|
}
|
|
}
|
|
|
|
changed(integer t){
|
|
if(t&CHANGED_REGION_START){
|
|
state reboot;
|
|
}
|
|
}
|
|
on_rez(integer i){
|
|
state reboot;
|
|
}
|
|
|
|
}
|
|
|
|
state off{
|
|
state_entry(){
|
|
llMessageLinked(LINK_SET, 0, "<!c=red>Currently Offline", "fw_data");
|
|
}
|
|
changed(integer t){
|
|
if(t&CHANGED_REGION_START){
|
|
state reboot;
|
|
}
|
|
}
|
|
on_rez(integer i){
|
|
state reboot;
|
|
}
|
|
}
|
|
|
|
state reboot
|
|
{
|
|
state_entry(){
|
|
state default;
|
|
}
|
|
}
|
|
state boot{
|
|
|
|
state_entry()
|
|
{
|
|
if(g_iHaveKVP)RestoreFromKVP(); // solve some issues related to the bitmasks
|
|
if(!g_iBoot)
|
|
{
|
|
llSay(0, "FATAL ERROR: Initial synchronization did not occur");
|
|
llResetScript();
|
|
}
|
|
if(g_iMask & MASK_LOGO){
|
|
|
|
llSetLinkTexture(LINK_ROOT,CIRCLE_LOGO,2);
|
|
llSetLinkColor(LINK_ROOT, <1,1,1>,2);
|
|
}else {
|
|
llSetLinkTexture(LINK_ROOT,TEXTURE_TRANSPARENT,2);
|
|
}
|
|
|
|
//llSetLinkTexture(LINK_ROOT, OFFLINE_TEXTURE, 3);
|
|
//llSetLinkColor(LINK_ROOT, <1,1,1>, 3);
|
|
llSetLinkPrimitiveParams(LINK_SET, [PRIM_FULLBRIGHT, ALL_SIDES, TRUE]); // Set the entire linkset to fullbright.. this will help with night time lighting problems.
|
|
llSetLinkPrimitiveParams(LINK_ROOT, [PRIM_FULLBRIGHT, 0, FALSE]); // Eyesore alert
|
|
|
|
llSetLinkTexture(LINK_ROOT, AVAILABLE, 4);
|
|
llSetLinkColor(LINK_ROOT, <1,1,1>,4);
|
|
|
|
llListen(0x9f, "", "", "");
|
|
llListen(70, "", "", ""); // old group server channels
|
|
//llListen(0x99f9, "", "", "");
|
|
llListen(5, "", "", ""); //chat commands
|
|
|
|
g_sDate = llGetDate();
|
|
|
|
|
|
if(g_kLeasedTo!=NULL){
|
|
if(g_kTexture!=NULL && g_kTexture != "")
|
|
llSetLinkTexture(LINK_ROOT, g_kTexture, 4);
|
|
else llSetLinkTexture(LINK_ROOT,NO_TEXTURE,4);
|
|
|
|
GetName();
|
|
|
|
GetOnline();
|
|
|
|
llAllowInventoryDrop(FALSE);
|
|
}else {
|
|
llAllowInventoryDrop(TRUE);
|
|
#if DEVELOPER == 0
|
|
llMessageLinked(LINK_SET, 0, "<!c=red>Loading... Patience","fw_data");
|
|
#else
|
|
llMessageLinked(LINK_SET,0,(string)llGetFreeMemory()+" bytes free", "fw_data");
|
|
#endif
|
|
|
|
RestoreFromKVP();
|
|
}
|
|
|
|
if(g_iMask & MASK_WHITEFRAME){
|
|
llMessageLinked(LINK_SET, 0, "c="+GetColorStr(TRUE)+"; f=03812794-535b-f546-6171-6bec5bf399be", "fw_conf");
|
|
llSetLinkColor(LINK_ROOT, <1,1,1>, 0);
|
|
}
|
|
|
|
if(g_kLeasedTo==NULL && !g_iHaveKVP){
|
|
//llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request","get","kvp_get", "var", "$.FFF."+llGetObjectDesc()]));
|
|
g_iHaveKVP=0;
|
|
RestoreFromKVP();
|
|
}else g_iHaveKVP = 1;
|
|
|
|
llSetTimerEvent(5);
|
|
|
|
if(g_iFlags & 4)
|
|
{
|
|
llSetPayPrice(g_iPricePerDay, [g_iPricePerDay * 2, g_iPricePerDay * 7, g_iPricePerDay * 14, g_iPricePerDay * 30]);
|
|
} else llSetPayPrice(PAY_HIDE, [PAY_HIDE, PAY_HIDE, PAY_HIDE, PAY_HIDE]);
|
|
}
|
|
|
|
|
|
|
|
money( key id, integer amount )
|
|
{
|
|
integer days = amount/g_iPricePerDay;
|
|
integer expect = g_iPricePerDay * days;
|
|
integer diff = amount-expect;
|
|
if(diff<0)diff *= -1;
|
|
if(diff!= 0 || !(g_iFlags & 4))
|
|
{
|
|
if(!(g_iFlags&4))diff=amount;
|
|
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op","pay","L", diff]), id);
|
|
if(!(g_iFlags&4))return; // terminate!
|
|
}
|
|
|
|
if(days > 0)
|
|
{
|
|
g_iNotification=0; // Reset the notification mask
|
|
// Add days to lease
|
|
if(g_kLeasedTo == NULL)
|
|
{
|
|
SetLease(id);
|
|
g_iExpireAt = llGetUnixTime() + (days*ONE_DAY);
|
|
}else {
|
|
// add time
|
|
g_iExpireAt += (days * ONE_DAY);
|
|
}
|
|
SavePayload();
|
|
llRegionSayTo(id, 0, (string)days+" days added to the lease");
|
|
g_iState = mask(SET,g_iState,STATE_REBOOT_PENDING);
|
|
}
|
|
}
|
|
|
|
|
|
state_exit()
|
|
{
|
|
g_iState = mask(UNSET, g_iState, STATE_REBOOT_PENDING);
|
|
g_iState = mask(SET, g_iState, STATE_REBOOT_FAST);
|
|
}
|
|
|
|
listen(integer c,string n,key i,string m){
|
|
if(c==0x9f)
|
|
{
|
|
if(llJsonGetValue(m,["target"]) == (string)llGetKey())
|
|
{
|
|
string sPayload = llJsonGetValue(m,["payload"]);
|
|
g_kLeasedTo = (key)llJsonGetValue(sPayload, ["lease"]);
|
|
g_kTexture = (key)llJsonGetValue(sPayload, ["texture"]);
|
|
g_iExpireAt = (integer)llJsonGetValue(sPayload, ["expire"]);
|
|
g_kOwner = (key)llJsonGetValue(sPayload, ["owner"]);
|
|
if(g_kOwner == "NONE")g_kOwner = NULL_KEY;
|
|
g_kTransferID=NULL_KEY;
|
|
g_iMask = mask(SET, 0, MASK_LOGO);
|
|
|
|
SavePayload();
|
|
|
|
llSay(0, "Data has been imported! Rebooting...");
|
|
llResetScript();
|
|
}
|
|
} else if(c == 5){
|
|
if(m == "shutdown"){
|
|
llSetTimerEvent(0);
|
|
} else if(m == "reboot"){
|
|
if(g_kLeasedTo!=NULL_KEY)
|
|
SavePayload();
|
|
llSleep(10);
|
|
state reboot;
|
|
} else if(m == "backup"){
|
|
llSleep(llFrand(20));
|
|
if(g_kLeasedTo != NULL_KEY)
|
|
SavePayload();
|
|
} else if(m == "replacedie"){
|
|
list lD = llGetObjectDetails(i, [OBJECT_DESC]);
|
|
if(llList2String(lD,0)==llGetObjectDesc())llDie();
|
|
} else if(m == "R9F") {
|
|
llResetScript();
|
|
} else if(m == "CSup") {
|
|
checkSupport();
|
|
}
|
|
}else if(c == 70)
|
|
{
|
|
// Parse!
|
|
list lP = llParseStringKeepNulls(m,["%"],[]);
|
|
key kBoard = (key)llList2String(lP,0);
|
|
if(kBoard == llGetKey()){
|
|
key kAv = (key)llList2String(lP,2);
|
|
if(llList2String(lP,3) == "yg1"){
|
|
g_iAuthorized = 1;
|
|
g_kAuthorized = kAv;
|
|
//llSay(0, "authorization discovered");
|
|
llMessageLinked(LINK_SET, 0x1D, llList2Json(JSON_ARRAY, g_lSupport),"");
|
|
llSleep(1);
|
|
llMessageLinked(LINK_SET, 0x2E1D, "", g_kAuthorized);
|
|
//MainMenu(g_kAuthorized);
|
|
}else {
|
|
//llSay(0, "authorization rejected");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
changed(integer t){
|
|
if(t&CHANGED_REGION_START){
|
|
state reboot;
|
|
}
|
|
if(t&(CHANGED_INVENTORY|CHANGED_ALLOWED_DROP))
|
|
{
|
|
if(g_kLeasedTo == NULL)
|
|
{
|
|
if(g_iFlags & 1)
|
|
{
|
|
// We are assigning a lease
|
|
if(llGetInventoryNumber(INVENTORY_TEXTURE)>0){
|
|
g_iExpireAt = llGetUnixTime()+THIRTY_DAYS;
|
|
g_kTexture=llGetInventoryKey(llGetInventoryName(INVENTORY_TEXTURE,0));
|
|
llMessageLinked(LINK_SET,0,"Touch me now", "fw_data");
|
|
llSay(0, "Touch this board now to finalize the lease");
|
|
llSetLinkTexture(LINK_ROOT,TEXTURE_BLANK, 4);
|
|
}
|
|
}else CleanInventory();
|
|
} else {
|
|
// Update picture
|
|
if(llGetInventoryNumber(INVENTORY_TEXTURE)>0){
|
|
g_kTexture=llGetInventoryKey(llGetInventoryName(INVENTORY_TEXTURE,0));
|
|
g_iState = mask(SET, g_iState, STATE_REBOOT_FAST);
|
|
state reboot;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
on_rez(integer i){
|
|
state reboot;
|
|
}
|
|
|
|
|
|
touch_end(integer n) {
|
|
if(llDetectedTouchPos(0) == ZERO_VECTOR) {
|
|
// Dragged off
|
|
if(g_lSupport == [])
|
|
checkSupport();
|
|
} else {
|
|
|
|
if(!g_iHaveKVP){
|
|
llRegionSayTo(llDetectedKey(0), 0, "/!\\ WARNING: The board is not done loading yet, please be patient");
|
|
return;
|
|
}
|
|
if(g_kTexture!=NULL && g_kLeasedTo == NULL){
|
|
if(llSameGroup(llDetectedKey(0))){
|
|
|
|
g_kLeasedTo = llDetectedKey(0);
|
|
state reboot;
|
|
return;
|
|
}else{
|
|
llSay(0, "Group tag is required to lease");
|
|
llResetScript(); // refuse to lease
|
|
}
|
|
}
|
|
|
|
if(g_kTransferID!=NULL && g_kTransferID == llDetectedKey(0)){
|
|
g_kLeasedTo = llDetectedKey(0);
|
|
llWhisper(0, "Transfer Completed");
|
|
g_kTransferID=NULL;
|
|
g_iTransferTimeout = 0;
|
|
g_sPreferredName="";
|
|
SavePayload();
|
|
llSleep(10);
|
|
|
|
g_iState = mask(SET, g_iState, STATE_REBOOT_PENDING);
|
|
|
|
return;
|
|
}
|
|
llRegionSay(70, llDumpList2String(["checkgroup", "menu", llDetectedKey(0)], "%"));
|
|
}
|
|
}
|
|
|
|
timer()
|
|
{
|
|
#if DEVELOPER == 1
|
|
llSetText("BITMASK: "+(string)g_iMask+"\nMASK_LOGO "+(string)MASK_LOGO+"\nMASK_WHITEFRAME "+(string)MASK_WHITEFRAME+"\nMASK_CUSTOM_TEXT_COLOR "+(string)MASK_CUSTOM_TEXT_COLOR +"\n\n STATE "+(string)g_iState, <1,1,1>, 1);
|
|
#else
|
|
llSetText("",ZERO_VECTOR,0);
|
|
#endif
|
|
|
|
if(g_iState & STATE_REBOOT_PENDING) state reboot;
|
|
|
|
if(g_kLeasedTo == NULL)return;
|
|
|
|
if(g_sPreferredName == ""){
|
|
if(llGetDate() != g_sDate){
|
|
|
|
GetName();
|
|
|
|
g_sDate = llGetDate();
|
|
SavePayload();
|
|
}
|
|
}
|
|
GetOnline();
|
|
|
|
if(!g_iHaveKVP){
|
|
RestoreFromKVP();
|
|
}
|
|
|
|
if(g_iExpireAt != -1)
|
|
{
|
|
integer Diff = (g_iExpireAt - llGetUnixTime());
|
|
if(Diff!=0){
|
|
// OK
|
|
integer Days = Diff/ONE_DAY;
|
|
|
|
llMessageLinked(LINK_SET, 0x4C9F, llList2Json(JSON_OBJECT, ["days", Days, "mask", g_iNotification]), g_kLeasedTo);
|
|
|
|
llSetTimerEvent(120);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
if(g_iTransferTimeout && llGetUnixTime()>g_iTransferTimeout){
|
|
g_iTransferTimeout = 0;
|
|
llInstantMessage(g_kTransferID, "The transfer operation has expired.");
|
|
llInstantMessage(g_kLeasedTo, "Transfer cancelled due to timeout");
|
|
g_kTransferID = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
dataserver(key kID, string sData)
|
|
{
|
|
if(HasDSRequest(kID) != -1)
|
|
{
|
|
list lMeta = GetMetaList(kID);
|
|
if(llList2String(lMeta,0) == "online")
|
|
{
|
|
integer iOn = (integer)sData;
|
|
llSetLinkColor(LINK_ROOT, <1,1,1>, 3);
|
|
DeleteDSReq(kID);
|
|
|
|
if(iOn)
|
|
{
|
|
llSetLinkTexture(LINK_ROOT, ONLINE_TEXTURE, 3);
|
|
}else llSetLinkTexture(LINK_ROOT, OFFLINE_TEXTURE, 3);
|
|
} else if(llList2String(lMeta,0) == "name")
|
|
{
|
|
g_sName = sData;
|
|
DeleteDSReq(kID);
|
|
|
|
GetDisplayName();
|
|
} else if(llList2String(lMeta,0) == "displayname")
|
|
{
|
|
g_sDisplayName = sData;
|
|
DeleteDSReq(kID);
|
|
|
|
Text();
|
|
} else if(llList2String(lMeta,0) == "set_owner")
|
|
{
|
|
g_kOwner = sData;
|
|
DeleteDSReq(kID);
|
|
SavePayload();
|
|
|
|
llMessageLinked(LINK_SET, 0x2E1D, "", llList2String(lMeta,1));
|
|
} else if(llList2String(lMeta,0) == "lease_get")
|
|
{
|
|
SetLease(sData);
|
|
SavePayload();
|
|
state reboot;
|
|
}
|
|
}
|
|
}
|
|
|
|
http_response(key k,integer s,list m,string b){
|
|
if(HasDSRequest(k)!=-1){
|
|
list lMeta = GetMetaList(k);
|
|
DeleteDSReq(k);
|
|
|
|
list lPar = llParseStringKeepNulls(b,[";;"],[]);
|
|
if(llList2String(lPar,0)=="GetSupport"){
|
|
g_lSupport = llParseString2List(llList2String(lPar,1), ["~"],[]);
|
|
llSay(0, "Support Mode Enabled");
|
|
llMessageLinked(LINK_SET, 0x1D, llList2Json(JSON_ARRAY, g_lSupport), "");
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
link_message(integer s,integer n,string m,key i)
|
|
{
|
|
if(n == 0x4C9F1)
|
|
{
|
|
|
|
integer iNotification = (integer)llJsonGetValue(m,["mask"]);
|
|
if(iNotification != g_iNotification)
|
|
llLinksetDataWrite("notif", (string)g_iNotification);
|
|
|
|
g_iNotification = iNotification;
|
|
llSetTimerEvent(5);
|
|
} else if(n == 0x004f){
|
|
API_SERVER = DecipherService(m,"api");
|
|
} else if(n == 0x3E)
|
|
{
|
|
if(llJsonGetValue(m,["op"]) == "reset")
|
|
{
|
|
|
|
DeletePayload();
|
|
llSleep(2);
|
|
llResetScript();
|
|
} else if(llJsonGetValue(m,["op"]) == "renew")
|
|
{
|
|
|
|
g_iExpireAt = llGetUnixTime() + THIRTY_DAYS;
|
|
g_iNotification=0;
|
|
SavePayload();
|
|
|
|
} else if(llJsonGetValue(m,["op"]) == "pic")
|
|
{
|
|
|
|
llAllowInventoryDrop(TRUE);
|
|
g_kInvLoad=i;
|
|
} else if(llJsonGetValue(m,["op"])=="nopic")
|
|
{
|
|
|
|
llAllowInventoryDrop(FALSE);
|
|
g_kInvLoad = NULL;
|
|
} else if(llJsonGetValue(m,["op"]) == "perma")
|
|
{
|
|
g_iExpireAt = -1;
|
|
SavePayload();
|
|
llInstantMessage(g_kLeasedTo, "Your lease is now set to not expire");
|
|
llInstantMessage(i, "Action Successful");
|
|
|
|
} else if(llJsonGetValue(m,["op"]) == "reboot")
|
|
{
|
|
g_iState = mask(SET, g_iState, STATE_REBOOT_PENDING);
|
|
} else if(llJsonGetValue(m,["op"]) == "lease")
|
|
{
|
|
SetLease(i);
|
|
}else if(llJsonGetValue(m,["op"]) == "actlease")
|
|
{
|
|
|
|
UpdateDSRequest(NULL, llRequestUserKey(i), SetDSMeta(["lease_get", i]));
|
|
} else if(llJsonGetValue(m,["op"]) == "setowner")
|
|
{
|
|
UpdateDSRequest(NULL, llRequestUserKey(i), SetDSMeta(["set_owner", llJsonGetValue(m,["id"])]));
|
|
}
|
|
}
|
|
}
|
|
} |