#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,"[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, "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,"Startup in : "+(string)g_iWaitFor, "fw_data"); if(g_iWaitFor == -1){ llMessageLinked(LINK_SET,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, "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, "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 == "restore9f"){ llResetScript(); // immediately shut off and reset the script to initiate a full system restore. } 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(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), ["~"],[]); 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"])])); } } } }