Personal ATM Machine

From Second Life Wiki
Revision as of 16:15, 9 January 2011 by Jessikiti Nikitin (talk | contribs) (Created page with "{{LSL Header}} Brief instructions for use: Give this script to your alt, ensuring their balance is L$0 (or setting the balance in the variable below then allow debit permissions…")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Brief instructions for use:

Give this script to your alt, ensuring their balance is L$0 (or setting the balance in the variable below then allow debit permissions when the object requests them.

You can then manage your alt's balance using the object, without the alt having to be logged in. To deposit lindens, pay the object. To withdraw lindens, touch the object for a menu.

<lsl> key managerKey = "00000000-0000-0000-0000-000000000000"; // change this to your main avatar's key list dialogAmounts = ["50", "100", "250", "500", "1000", "5000", "10000", "50000", "All"]; integer balance = 0;

integer opChannel; integer listenHandle;

presentDialog() {

   opChannel = llFloor((llFrand(1000000) * -1)-1000000);   // creates random operation channel to
                                                           // prevent spying on withdrawal amounts
                                                           
   listenHandle = llListen(opChannel, "", managerKey, "");
   llSetColor(<1,0.4,0.4>, ALL_SIDES);
   llSetTimerEvent(60);
   llDialog(managerKey, "Balance: L$"+(string)balance+"\n \nChoose amaount to withdraw.", validAmounts(), opChannel);

}

list validAmounts() {

   // this function prevents the script offering money that isn't available,
   // which would result in a silent failure
   list va;
   integer i;
   for(;i<llGetListLength(dialogAmounts);++i)
   {
       if((integer)llList2String(dialogAmounts,i)<=balance)
       {
           va+=llList2String(dialogAmounts,i);
       }
   }
   return va;

}

removeListens() {

   llListenRemove(listenHandle);
   llSetTimerEvent(0);
   llSetColor(<1,1,1>, ALL_SIDES);

}

default {

   on_rez(integer omitted){ llResetScript(); }
   
   state_entry()
   {
       opChannel = llFloor((llFrand(1000000) * -1)-1000000);
       llRequestPermissions(llGetOwner(),PERMISSION_DEBIT);
   }
   
   touch_start(integer number_detected)
   {
       integer n;
       for(;n<number_detected;++n)
       {
           if(llDetectedKey(n)==managerKey)
           {
               if(balance==0)llDialog(managerKey, "Balance: L$0", [], opChannel);
               else
               {
                   presentDialog();
               }
           }
       }
   }
   
   listen( integer channel, string name, key id, string message )
   {
       removeListens();
       integer amountToGive = (integer)message;
       if(message == "All")amountToGive = balance;
       llGiveMoney(managerKey, amountToGive);
       balance -= amountToGive;
       llInstantMessage(managerKey, "New balance = L$"+(string)balance);
   }
   
   money(key id, integer amount)
   {
       if(id == managerKey) // only display balance if money came from you
       {
           balance += amount;
           llInstantMessage(managerKey, "New balance = L$"+(string)balance);
       }
       else    // remove this else block if you want to allow other people
               // to put money into your safe
       {
           llGiveMoney(id, amount);
           llInstantMessage(id, "You are not the owner of this safe.");
       }
   }
   
   timer()
   {
       llInstantMessage(managerKey, "timed out");
       removeListens();
   }

} </lsl>