/* Script ©Kubwa | https://kubwa.de Creator: Kubwa.Kiume @Kubwa.de:9000 This header must be kept intact in any case! The following script is free and for anyone to use. There is no guaranteed suport for external ressources. The script is on a as-is base. */ string PaymentURL = "paypal.kubwa.de/"; integer UseHTTPS = TRUE; string ScriptURL; integer RequestNewURL; key HTTPKey; string GlobScriptKey; integer IDTimeout; integer PAYPAL_RESPONSE = 450003; integer PAYPAL_PREPARED = 450002; integer PAYPAL_PREPARE = 450001; key DoHTTPRequest(string Cmd, list Data) { string Protocol = "http://"; if (UseHTTPS) {Protocol = "https://";} list PostData; integer i; for (i = 0; i < llGetListLength(Data); i = i + 2) {PostData = PostData + [llList2String(Data, i) + "=" + llEscapeURL(llList2String(Data, i + 1))];} string PostDataStr; if (llGetListLength(PostData) > 0) {PostDataStr = "&" + llDumpList2String(PostData, "&");} return llHTTPRequest(Protocol + PaymentURL, [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"], "cmd=" + llEscapeURL(Cmd) + PostDataStr); } string GetValue(string Name, list Data) { integer i; for (i = 0; i < llGetListLength(Data); ++i) { list Temp = llParseString2List(llList2String(Data, i), ["="], []); if (llToLower(llList2String(Temp, 0)) == llToLower(Name)) {return llList2String(Temp, 1);} } return ""; } list SetValue(string Name, string Value, list Data) { integer i; for (i = 0; i < llGetListLength(Data); ++i) { list Temp = llParseString2List(llList2String(Data, i), ["="], []); if (llToLower(llList2String(Temp, 0)) == llToLower(Value)) { Temp = llListReplaceList(Temp, [Value], 1, 1); Data = llListReplaceList(Data, [llDumpList2String(Temp, "=")], i, i); return Data; } } Data = Data + [llDumpList2String([llToLower(Name), Value], "=")]; return Data; } RequestNewScriptURL() { RequestNewURL = llGetUnixTime(); if (ScriptURL != "") {llReleaseURL(ScriptURL);} llRequestURL(); } HandleOnRez() { vector SitPos = ; rotation SitRot = llEuler2Rot( * DEG_TO_RAD); llSitTarget(SitPos, SitRot); llResetScript(); } string GetUniqueID() { list ObjDetails = llGetPrimitiveParams([PRIM_SIT_TARGET]); vector Pos = llList2Vector(ObjDetails, 0); return llMD5String(llList2CSV(ObjDetails), llRound(Pos.x)); } string HandlePayPalRequest(list Data) { string Cmd = GetValue("com", Data); string Msg = GetValue("msg", Data); string Action = GetValue("action", Data); string Custom = GetValue("custom", Data); string ID = GetValue("paymentid", Data); if (Cmd == "error") {llMessageLinked(LINK_THIS, PAYPAL_RESPONSE, Msg, "error");} if (Cmd == "paypal") {llMessageLinked(LINK_THIS, PAYPAL_RESPONSE, llBase64ToString(llUnescapeURL(Custom)), Action);} if (Cmd == "prepare") { list Temp = llCSV2List(llBase64ToString(llUnescapeURL(Custom))); llMessageLinked(LINK_THIS, PAYPAL_PREPARED, "https://" + PaymentURL + "?cmd=web&id=" + ID, llList2Key(Temp, 0)); } return "OK"; } default { on_rez(integer Dummy) {HandleOnRez();} changed(integer Was) { if (Was & CHANGED_INVENTORY) {llResetScript();} } state_entry() { llOwnerSay("Checking availability of Server..."); HTTPKey = DoHTTPRequest("ping", []); } http_response(key ID, integer Status, list Meta, string Data) { if (ID != HTTPKey) {return;} list Temp = llParseString2List(Data, ["\n"], []); if (Status != 200 || GetValue("com", Temp) != "ping" || GetValue("msg", Temp) != "hello") { if (UseHTTPS) { UseHTTPS = FALSE; llOwnerSay("WARNING: SSL/TLS is not available on your server due to a wrong configuration. Payment data will be transferred UNENCRYPTED!"); HTTPKey = DoHTTPRequest("ping", []); } else { llOwnerSay("ERROR: Communication to server could not be established. PayPal API does not work! - The script stopped working until you reset it!"); state WaitForReboot; } } else {state ScriptID;} } } state ScriptID { on_rez(integer Dummy) {HandleOnRez();} state_entry() { GlobScriptKey = GetUniqueID(); llOwnerSay("Checking for other API Script Key..."); IDTimeout = llGetUnixTime(); llListen(-4400062, "", "", ""); llSetTimerEvent(1); llRegionSay(-4400062, llList2CSV(["WHO_IS", GlobScriptKey])); } timer() { if (IDTimeout + 5 < llGetUnixTime()) {state Done;} } listen(integer Chan, string Name, key ID, string Msg) { if (Msg == "ME") { llOwnerSay("Another Script has the same API Script Key! - Resetting..."); HandleOnRez(); } } } state Done { on_rez(integer Dummy) {HandleOnRez();} state_entry() { llListen(-4400062, "", "", ""); llOwnerSay("PayPal API is ready!"); RequestNewScriptURL(); llSetTimerEvent(5); } listen(integer Chan, string Name, key ID, string Msg) { list Tmp = llCSV2List(Msg); if (GlobScriptKey != "" && llList2String(Tmp, 0) == "WHO_IS" && llList2String(Tmp, 1) == GlobScriptKey) {llRegionSay(-4400062, "ME");} } changed(integer Was) { if (Was & CHANGED_REGION_START) {RequestNewScriptURL();} } timer() { if (RequestNewURL + 1800 < llGetUnixTime()) { RequestNewURL = llGetUnixTime(); RequestNewScriptURL(); } } http_request(key ID, string Method, string Body) { if (Method == URL_REQUEST_GRANTED) { ScriptURL = Body; if (llList2String(llParseString2List(ScriptURL, ["://", ":", "/"], []), 1) == "127.0.0.1") { llOwnerSay("Your \"OpenSim.ini\" file is misconfigured! Please change the value \"ExternalHostNameForLSL\" to your servers hostname! - " + "The script stopped working until you reset it!"); state WaitForReboot; } HTTPKey = DoHTTPRequest("register", ["scriptid", GlobScriptKey, "scripturl", ScriptURL]); RequestNewURL = llGetUnixTime(); } else if (Method == "POST") {llHTTPResponse(ID, 200, HandlePayPalRequest(llParseString2List(Body, ["\n"], [])));} else if (Method == "GET") {llHTTPResponse(ID, 200, "OK");} } http_response(key ID, integer Status, list Meta, string Data) { if (ID == HTTPKey) {HandlePayPalRequest(llParseString2List(Data, ["\n"], []));} } link_message(integer Sender, integer Num, string Str, key Ava) { if (Num == PAYPAL_PREPARE) { list Temp = llCSV2List(Str); HTTPKey = DoHTTPRequest("prepare", ["scriptid", GlobScriptKey, "receiver", llList2String(Temp, 0), "price", llList2Float(Temp, 1), "currency", llList2String(Temp, 2), "custom", llEscapeURL(llStringToBase64(llList2CSV([Ava, llList2String(Temp, 5)]))), "article", llList2String(Temp, 3), "imageurl", llList2String(Temp, 4)]); } } } state WaitForReboot { on_rez(integer Dummy) {HandleOnRez();} changed(integer What) { if (What & CHANGED_REGION_START) {llResetScript();} } }