/source/scheduled-group-notices/scheduled-group-notices.lsl |
@@ -0,0 +1,188 @@ |
/////////////////////////////////////////////////////////////////////////// |
// Copyright (C) Wizardry and Steamworks 2014 - License: GNU GPLv3 // |
// Please see: http://www.gnu.org/licenses/gpl.html for legal details, // |
// rights of fair usage, the disclaimer and warranty conditions. // |
/////////////////////////////////////////////////////////////////////////// |
|
/////////////////////////////////////////////////////////////////////////// |
// CONFIGURATION // |
/////////////////////////////////////////////////////////////////////////// |
// The UUID / Key of the scripted agent. |
string CORRADE = "63c44c23-9f46-4f0d-b00a-5b0e3180a015"; |
// The name of the group to invite to. |
string GROUP = "My Group"; |
// The password for that group in Corrade.ini. |
string PASSWORD = "mypassword"; |
|
/////////////////////////////////////////////////////////////////////////// |
// END CONFIGURATION // |
/////////////////////////////////////////////////////////////////////////// |
|
/////////////////////////////////////////////////////////////////////////// |
// Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 // |
/////////////////////////////////////////////////////////////////////////// |
string wasKeyValueGet(string k, string data) { |
if(llStringLength(data) == 0) return ""; |
if(llStringLength(k) == 0) return ""; |
list a = llParseString2List(data, ["&", "="], []); |
integer i = llListFindList(llList2ListStrided(a, 0, -1, 2), [ k ]); |
if(i != -1) return llList2String(a, 2*i+1); |
return ""; |
} |
|
/////////////////////////////////////////////////////////////////////////// |
// Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3 // |
/////////////////////////////////////////////////////////////////////////// |
string wasKeyValueSet(string k, string v, string data) { |
if(llStringLength(k) == 0) return ""; |
if(llStringLength(v) == 0) return ""; |
if(llStringLength(data) == 0) return k + "=" + v; |
integer i = llListFindList( |
llList2ListStrided( |
llParseString2List(data, ["&", "="], []), |
0, -1, 2 |
), |
[ k ]); |
if(i != -1) return llDumpList2String( |
llListReplaceList( |
llParseString2List(data, ["&"], []), |
[ k + "=" + v ], |
i, i), |
"&"); |
return data + "&" + k + "=" + v; |
} |
|
/////////////////////////////////////////////////////////////////////////// |
// Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3 // |
/////////////////////////////////////////////////////////////////////////// |
string wasKeyValueEncode(list data) { |
list k = llList2ListStrided(data, 0, -1, 2); |
list v = llList2ListStrided(llDeleteSubList(data, 0, 0), 0, -1, 2); |
data = []; |
do { |
data += llList2String(k, 0) + "=" + llList2String(v, 0); |
k = llDeleteSubList(k, 0, 0); |
v = llDeleteSubList(v, 0, 0); |
} while(llGetListLength(k) != 0); |
return llDumpList2String(data, "&"); |
} |
|
/////////////////////////////////////////////////////////////////////////// |
// Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 // |
/////////////////////////////////////////////////////////////////////////// |
// escapes a string in conformance with RFC1738 |
string wasURLEscape(string i) { |
string o = ""; |
do { |
string c = llGetSubString(i, 0, 0); |
i = llDeleteSubString(i, 0, 0); |
if(c == "") jump continue; |
if(c == " ") { |
o += "+"; |
jump continue; |
} |
if(c == "\n") { |
o += "%0D" + llEscapeURL(c); |
jump continue; |
} |
o += llEscapeURL(c); |
@continue; |
} while(i != ""); |
return o; |
} |
|
/////////////////////////////////////////////////////////////////////////// |
// Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 // |
/////////////////////////////////////////////////////////////////////////// |
// unescapes a string in conformance with RFC1738 |
string wasURLUnescape(string i) { |
return llUnescapeURL( |
llDumpList2String( |
llParseString2List( |
llDumpList2String( |
llParseString2List( |
i, |
["+"], |
[] |
), |
" " |
), |
["%0D%0A"], |
[] |
), |
"\n" |
) |
); |
} |
|
// Store the URL for the callback. |
string callback = ""; |
|
default { |
state_entry() { |
// DEBUG |
llOwnerSay("Requesting URL..."); |
llRequestURL(); |
} |
http_request(key id, string method, string body) { |
if(method != URL_REQUEST_GRANTED) return; |
callback = body; |
// DEBUG |
llOwnerSay("Got URL..."); |
state sleep; |
} |
on_rez(integer num) { |
llResetScript(); |
} |
changed(integer change) { |
if(change & CHANGED_REGION_START) { |
llResetScript(); |
} |
} |
} |
|
state sleep { |
state_entry() { |
// DEBUG |
llOwnerSay("Waiting for linked-message..."); |
} |
link_message(integer sender, integer num, string message, key id) { |
list data = llCSV2List(message); |
// Build a partial key-value pair string with the data we know. |
string kvp = wasKeyValueEncode( |
[ |
"command", "notice", |
"group", wasURLEscape(GROUP), |
"password", wasURLEscape(PASSWORD), |
"callback", wasURLEscape(callback) |
] |
); |
// Add the subject if there is one. |
string subject = llList2String(data, 0); |
if(subject != "") kvp = wasKeyValueSet("subject", wasURLEscape(subject), kvp); |
// Add the message if there is one. |
message = llList2String(data, 1); |
if(message != "") kvp = wasKeyValueSet("message", wasURLEscape(message), kvp); |
// Add the attachment if there is one. |
string item = llList2String(data, 2); |
if(item != "") kvp = wasKeyValueSet("item", wasURLEscape(item), kvp); |
// Send off the notice to Corrade. |
llInstantMessage(CORRADE, kvp); |
} |
http_request(key id, string method, string body) { |
llHTTPResponse(id, 200, "OK"); |
// If sending the notice succeeded, do not complain... |
if(wasKeyValueGet("command", body) == "notice" && |
wasKeyValueGet("success", body) == "True") return; |
// Announce the owner that sending the notice failed |
llInstantMessage(llGetOwner(), "Failed to send the notice: " + wasURLUnescape(wasKeyValueGet("error", body))); |
} |
on_rez(integer num) { |
llResetScript(); |
} |
changed(integer change) { |
if(change & CHANGED_REGION_START) { |
llResetScript(); |
} |
} |
} |