Difference between revisions of "Transaction result"
Jump to navigation
Jump to search
m |
Kireji Haiku (talk | contribs) m (copied example from llTransferLindenDollars to here) |
||
Line 72: | Line 72: | ||
** SERVICE_ERROR - There was an error connecting to the back-end service | ** SERVICE_ERROR - There was an error connecting to the back-end service | ||
|caveats | |caveats | ||
|examples | |examples= | ||
<lsl> | |||
/* | |||
* A simple piggy bank, anyone can pay in money and anyone can click it to get money out. | |||
* | |||
* TO DO: | |||
* - handle different errors differently based upon CSV output | |||
* | |||
* original by Strife Onizuka | |||
* | |||
* modified by Kireji Haiku: | |||
* - because weird things happen in LSL when using more than one state | |||
* - one should say thanks when being payed | |||
* - added 0 L$ payment when bank is empty, to show failed payment notifications | |||
* - added target UUID and L$ amount into transaction history, too | |||
* | |||
* Note from Traven Sachs (VWR-28201): | |||
* In testing this script using an account with no funds - it has been noted that when the INSUFFICIENT FUNDS | |||
* error occurs on Transaction Results that the Display of L$ on the account attempting to transfer funds will | |||
* read as -1 on some viewers, even if the account has funds less than the transaction amount available to it. | |||
* (i.e. if account has 7L and attempts to pay 10L the viewer display will read -1 L until the next L$ transaction | |||
* occurs that is actually valid. Don't know if this is a viewer glitch or back end glitch but felt it should | |||
* be mentioned.) | |||
*/ | |||
integer hasBeenGrantedDebitPerms; | |||
integer amountGivenAwayOnClick; | |||
integer totalLindenDollarsInBank; | |||
list listOfTransactionRecords; | |||
update_floattext() | |||
{ | |||
string floattext = "I have no L$ to give away :("; | |||
if (amountGivenAwayOnClick <= totalLindenDollarsInBank | |||
&& hasBeenGrantedDebitPerms) | |||
{ | |||
floattext = "I have L$ "+ (string)totalLindenDollarsInBank + " to give away!"; | |||
} | |||
llSetText(floattext, <1.0, 1.0, 1.0>, (float)TRUE); | |||
} | |||
default | |||
{ | |||
on_rez(integer start_param) | |||
{ | |||
llResetScript(); | |||
} | |||
changed(integer change) | |||
{ | |||
if (change & CHANGED_OWNER) | |||
llResetScript(); | |||
} | |||
state_entry() | |||
{ | |||
// how much money to give away each time? | |||
amountGivenAwayOnClick = 10; | |||
// how much money do we initially "have" in the bank? | |||
totalLindenDollarsInBank = 50; | |||
update_floattext(); | |||
// request permissions to give away money, otherwise this won't work | |||
key owner = llGetOwner(); | |||
llRequestPermissions(owner, PERMISSION_DEBIT); | |||
} | |||
touch_start(integer num_detected) | |||
{ | |||
// if the script has been granted debit permissions | |||
if (hasBeenGrantedDebitPerms) | |||
{ | |||
key id = llDetectedKey(0); | |||
// if we have at least as much money in the bank as we would be giving away | |||
if (amountGivenAwayOnClick <= totalLindenDollarsInBank) | |||
{ | |||
// we add the transaction ID, the target avatar UUID and the L$ amount to a list | |||
listOfTransactionRecords += [llTransferLindenDollars(id, amountGivenAwayOnClick), id, amountGivenAwayOnClick]; | |||
// we take the money from the bank | |||
totalLindenDollarsInBank -= amountGivenAwayOnClick; | |||
} | |||
else | |||
{ | |||
// will not work, cause paying 0 L$! | |||
// will send a "failed payment" notification! | |||
// only for DEMO purposes, usually you should do something like: | |||
// llSay(PUBLIC_CHANNEL, "Sorry, no money in the bank!"); | |||
// instead !!! | |||
listOfTransactionRecords += [llTransferLindenDollars(id, 0), id, 0]; | |||
} | |||
} | |||
update_floattext(); | |||
} | |||
money(key id, integer amount) | |||
{ | |||
// someone payed the bank! | |||
totalLindenDollarsInBank += amount; | |||
// be nice, say thanks | |||
llInstantMessage(id, "Thanks a bunch!"); | |||
update_floattext(); | |||
} | |||
transaction_result(key id, integer success, string data) | |||
{ | |||
integer index = llListFindList(listOfTransactionRecords, [id]); | |||
//if the ID was found in our list | |||
if (~index) | |||
{ | |||
// if payment failed, give notice | |||
if (!success) | |||
{ | |||
key targetUUID = llList2Key(listOfTransactionRecords, index + 1); | |||
integer amountNotPayed = llList2Integer(listOfTransactionRecords, index + 2); | |||
llSay(PUBLIC_CHANNEL, "\n \nSorry, somehow the transaction has failed!" | |||
+ "\ntransaction ID: " + (string)id | |||
+ "\ntarget UUID: " + (string)targetUUID | |||
+ "\namount not payed: " + (string)amountNotPayed); | |||
// if the amount that wasn't payed is more than 0 L$, put the money back into the bank | |||
if (amountNotPayed) | |||
totalLindenDollarsInBank += amountNotPayed; | |||
} | |||
// remove the entry again [transaction ID, target UUID, L$ amount] | |||
listOfTransactionRecords = llDeleteSubList(listOfTransactionRecords, index, index + 2); | |||
} | |||
// total amount could have changed again... | |||
update_floattext(); | |||
} | |||
run_time_permissions (integer perm) | |||
{ | |||
// when owner granted debit perms, enable piggy bank functionality | |||
if(perm & PERMISSION_DEBIT) | |||
hasBeenGrantedDebitPerms = TRUE; | |||
update_floattext(); | |||
} | |||
} | |||
</lsl> | |||
|helpers | |helpers | ||
|also_header | |also_header |
Revision as of 11:48, 5 October 2012
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Description
Event: transaction_result( key id, integer success, string data ){ ; }34 | Event ID |
Triggered when task receives asynchronous data
• key | id | – | matches the return of the llTransfer* function | |
• integer | success | – | TRUE if the transfer succeeded otherwise FALSE. | |
• string | data | – | On successful transactions this will contain a CSV of information pertaining to the transaction. In failure, a string will be returned matching one of the error tags below. |
llTransfer* Function
data CSV Contents |
Error Tag (Returned from data) | Error Tag Description |
---|---|---|
key llTransferLindenDollars( key destination, integer amount )
|
LINDENDOLLAR_INSUFFICIENTFUNDS | The source agent does not have enough L$ for the transfer |
LINDENDOLLAR_ENTITYDOESNOTEXIST | The destination UUID is not a valid agent. | |
LINDENDOLLAR_BADCLOCKSKEW | There is bad clock skew between the sim host and the L$ service | |
INVALID_AGENT | Destination agent is not a valid UUID | |
INVALID_AMOUNT | Amount is <= 0 | |
THROTTLED | The scripted L$ throttle was hit for this object owner. | |
MISSING_PERMISSION_DEBIT | The script does not have debit permission | |
GROUP_OWNED | The object is group owned and thus can't give money | |
TRANSFERS_DISABLED | L$ transfers are disabled in the region | |
EXPIRED | The simulator timed out waiting for a response from the back-end service. | |
SERVICE_ERROR | There was an error connecting to the back-end service |
Caveats
Examples
<lsl> /*
- A simple piggy bank, anyone can pay in money and anyone can click it to get money out.
- TO DO:
- - handle different errors differently based upon CSV output
- original by Strife Onizuka
- modified by Kireji Haiku:
- - because weird things happen in LSL when using more than one state
- - one should say thanks when being payed
- - added 0 L$ payment when bank is empty, to show failed payment notifications
- - added target UUID and L$ amount into transaction history, too
- Note from Traven Sachs (VWR-28201):
- In testing this script using an account with no funds - it has been noted that when the INSUFFICIENT FUNDS
- error occurs on Transaction Results that the Display of L$ on the account attempting to transfer funds will
- read as -1 on some viewers, even if the account has funds less than the transaction amount available to it.
- (i.e. if account has 7L and attempts to pay 10L the viewer display will read -1 L until the next L$ transaction
- occurs that is actually valid. Don't know if this is a viewer glitch or back end glitch but felt it should
- be mentioned.)
- /
integer hasBeenGrantedDebitPerms;
integer amountGivenAwayOnClick; integer totalLindenDollarsInBank;
list listOfTransactionRecords;
update_floattext() {
string floattext = "I have no L$ to give away :("; if (amountGivenAwayOnClick <= totalLindenDollarsInBank && hasBeenGrantedDebitPerms) { floattext = "I have L$ "+ (string)totalLindenDollarsInBank + " to give away!"; } llSetText(floattext, <1.0, 1.0, 1.0>, (float)TRUE);
}
default {
on_rez(integer start_param) { llResetScript(); } changed(integer change) { if (change & CHANGED_OWNER) llResetScript(); } state_entry() { // how much money to give away each time? amountGivenAwayOnClick = 10; // how much money do we initially "have" in the bank? totalLindenDollarsInBank = 50; update_floattext(); // request permissions to give away money, otherwise this won't work key owner = llGetOwner(); llRequestPermissions(owner, PERMISSION_DEBIT); } touch_start(integer num_detected) { // if the script has been granted debit permissions if (hasBeenGrantedDebitPerms) { key id = llDetectedKey(0); // if we have at least as much money in the bank as we would be giving away if (amountGivenAwayOnClick <= totalLindenDollarsInBank) { // we add the transaction ID, the target avatar UUID and the L$ amount to a list listOfTransactionRecords += [llTransferLindenDollars(id, amountGivenAwayOnClick), id, amountGivenAwayOnClick]; // we take the money from the bank totalLindenDollarsInBank -= amountGivenAwayOnClick; } else { // will not work, cause paying 0 L$! // will send a "failed payment" notification! // only for DEMO purposes, usually you should do something like: // llSay(PUBLIC_CHANNEL, "Sorry, no money in the bank!"); // instead !!! listOfTransactionRecords += [llTransferLindenDollars(id, 0), id, 0]; } } update_floattext(); } money(key id, integer amount) { // someone payed the bank! totalLindenDollarsInBank += amount; // be nice, say thanks llInstantMessage(id, "Thanks a bunch!"); update_floattext(); } transaction_result(key id, integer success, string data) { integer index = llListFindList(listOfTransactionRecords, [id]); //if the ID was found in our list if (~index) { // if payment failed, give notice if (!success) { key targetUUID = llList2Key(listOfTransactionRecords, index + 1); integer amountNotPayed = llList2Integer(listOfTransactionRecords, index + 2); llSay(PUBLIC_CHANNEL, "\n \nSorry, somehow the transaction has failed!" + "\ntransaction ID: " + (string)id + "\ntarget UUID: " + (string)targetUUID + "\namount not payed: " + (string)amountNotPayed); // if the amount that wasn't payed is more than 0 L$, put the money back into the bank if (amountNotPayed) totalLindenDollarsInBank += amountNotPayed; } // remove the entry again [transaction ID, target UUID, L$ amount] listOfTransactionRecords = llDeleteSubList(listOfTransactionRecords, index, index + 2); } // total amount could have changed again... update_floattext(); } run_time_permissions (integer perm) { // when owner granted debit perms, enable piggy bank functionality if(perm & PERMISSION_DEBIT) hasBeenGrantedDebitPerms = TRUE; update_floattext(); }
} </lsl>