Personal ATM Machine

From Second Life Wiki
Revision as of 03:57, 11 January 2011 by Jessikiti Nikitin (talk | contribs)
Jump to navigation Jump to search

I made this script to allow me to store my Lindens in another account, in order to stop me from spending them so carelessly. Others may find it useful.

<lsl> // ATM Machine script, Jessikiti Nikitin 2010 // // Brief instructions for use: // // Give this script to your alt, ensuring their balance is L$0 (or setting the balance in the variable below), // put it in an object and 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.

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, "");
   llSetTimerEvent(60);
   llDialog(managerKey, "Balance: L$"+(string)balance+"\n \nChoose amount 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);

}

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>