Personal ATM Machine

From Second Life Wiki
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.

// 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();
    }
}