Transaction result

From Second Life Wiki
Revision as of 12:50, 25 June 2013 by Miranda Umino (talk | contribs) (added date of release)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Description

Event: transaction_result( key id, integer success, string data ){ ; }

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 llTransferLindenDollarskey destination, integer amount )

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

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
                   + "\nfailure reason: " + data);

               // 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>

Deep Notes

History

Date of Release 03/12/2011

Signature

event void transaction_result( key id, integer success, string data );