#include "Common.lsl" string API_SERVER; integer g_iActive = 1; integer g_iRegistered=0; integer g_iError=0; string g_kPayload; string g_sItem; string g_sURL; key g_kCallback; integer g_iFallback = 0; key g_kScriptRequest; default { state_entry() { llSay(0, "Server '" + llGetObjectDesc() + "' is starting up..."); llMessageLinked(LINK_SET, 2, "", ""); llMessageLinked(LINK_SET, -1, "", ""); XteaKey(PSK); } link_message(integer s,integer n,string m,key i) { if(n == 0x004f) { API_SERVER = DecipherService(m, "api"); if(g_iRegistered)return; // Register the server object ID g_kScriptRequest = llHTTPRequest(API_SERVER + "/zni/Put_Server_ID.php?NAME=" + llEscapeURL(llGetObjectDesc()) + "&PSK=" + llEscapeURL(SERVER_PSK), [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/json"], llList2Json(JSON_OBJECT, ["id", llGetKey()])); llMessageLinked(LINK_SET, 1, "", ""); } } changed(integer iChange) { if(iChange & CHANGED_REGION_START) { llResetScript(); } } http_request(key kID, string sMethod, string sBody) { if(sMethod == URL_REQUEST_GRANTED) { g_sURL = sBody; g_kScriptRequest = llHTTPRequest(API_SERVER + "/zni/Put_Server_URL.php", [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"], "NAME=" + llEscapeURL(llGetObjectDesc()) + "&KEYID=" + llEscapeURL(g_sURL)); llSay(0, "> Registered both Server ID for email, and server URL"); } else if(sMethod == URL_REQUEST_DENIED) { llSay(0, "/!\\ FATAL /!\\ \n\nSecond Life rejected the request for a new LSL URL. The sim is likely overloaded\n\n> Forwarding report to Red Queen"); llInstantMessage(llGetOwner(), "/!\\ URGENT /!\\ \n\nThe server could not obtain a URL!"); } else if(sMethod == "POST") { if(kID == g_kScriptRequest) return; // Alternative method for request g_iFallback = 1; string sPayload = xtea_decrypt_string(sBody); // Check what object is being requested and by who string sRequest = llJsonGetValue(sPayload, ["item"]); string sID = llJsonGetValue(sPayload, ["id"]); // Forbid giving scripts if(llGetInventoryType(sRequest) == INVENTORY_SCRIPT) return; // Deliver if we have the item if(llGetInventoryType(sRequest) != INVENTORY_NONE) { llGiveInventory(sID, sRequest); g_iError=0; } else { // Log this as an error in delivery g_iError=1; } g_sItem = sRequest; g_iFallback = 0; g_kPayload = llRequestUsername(sID); llSleep(0.25); llMessageLinked(LINK_SET, 0, "", ""); } } http_response(key k, integer s, list m, string b) { if(k != g_kScriptRequest) return; //llSay(0, "HTTP RESPONSE: " + llDumpList2String([s,b], " ~ ")); if(k == g_kCallback) return; if(s == 200) { llMessageLinked(LINK_SET, 0, "", ""); llSay(0, "Server '" + llGetObjectDesc() +"' is now ready"); if(g_sURL == "") { // Register the server URL g_kScriptRequest = llRequestURL(); } g_iRegistered=TRUE; llSetTimerEvent(1); } } touch_start(integer t) { if(llDetectedKey(0) == llGetOwner()) { g_iActive = 1-g_iActive; if(g_iActive) { llSay(0, "Server '" + llGetObjectDesc() + "' reactivating..."); llResetScript(); } else { llMessageLinked(LINK_SET, 2, "", ""); llSay(0, "Server '" + llGetObjectDesc() + "' has been taken offline for maintenance. Any pending requests will still be processed, but any new ones will be blocked"); g_kScriptRequest = llHTTPRequest(API_SERVER + "/zni/Del_Server_ID.php?NAME=" + llEscapeURL(llGetObjectDesc()) + "&PSK=" + llEscapeURL(SERVER_PSK), [], ""); } } } timer() { llGetNextEmail("", ""); } on_rez(integer t) { llResetScript(); } email(string time, string address, string subject, string body, integer num_remain) { if(subject == "RequestProductDelivery") { //llSay(0, "EMAIL : " + body); llMessageLinked(LINK_SET, 1, "", ""); list lPar = llParseString2List(body, [";;"], []); string sPayload = xtea_decrypt_string(llList2String(lPar,1)); // Check what object is being requested and by who string sRequest = llJsonGetValue(sPayload, ["item"]); string sID = llJsonGetValue(sPayload, ["id"]); string sCallback = llJsonGetValue(sPayload, ["callback"]); // URL to callback on receipt llSleep(20); if(~llSubStringIndex(sCallback, "http://")) g_kCallback=llHTTPRequest(sCallback, [], ""); // Forbid giving scripts if(llGetInventoryType(sRequest) == INVENTORY_SCRIPT) return; // Deliver if we have the item if(llGetInventoryType(sRequest) != INVENTORY_NONE) { llGiveInventory(sID, sRequest); g_iError=0; } else { // Log this as an error in delivery g_iError=1; } g_sItem = sRequest; g_iFallback = 0; g_kPayload = llRequestUsername(sID); llSleep(0.25); llMessageLinked(LINK_SET, 0, "", ""); } } dataserver(key kID, string sData) { if(kID == g_kPayload) { if(!g_iFallback) llSay(0x9CB9, llList2Json(JSON_OBJECT, [ "user", sData, "msg", "Delivery of item '" + g_sItem + "'", "author", "Relay", "title", "Farm Delivery Server" ])); else llSay(0x9CB9, llList2Json(JSON_OBJECT, [ "user", sData, "msg", "Fallback delivery of item '" + g_sItem + "'", "author", "Relay HTTP", "title", "Farm Delivery Server" ])); } } }