Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // call the script as script_name{type:"<action type>", user:"<target_user>", amount:<number, or GC string>}
- // some actions do not require amount, and some do not require user
- // current character count, as measured by hackmud: 1312 characters
- function(context, args)
- {
- var l = #s.scripts.lib();
- // we set a ledger_type:"demo" value in each document, so that we can later filter/update/delete *just* entries from this ledger
- var ledger_name = 'demo';
- // preprocess the amount
- if (args.amount) {
- args.amount = amountAsNumber(args.amount);
- }
- function hasAccount(user_name) {
- return #db.f({user:user_name}).count > 1;
- }
- function getBalance(user_name) {
- return l.to_gc_str(#db.f({ledger_type: ledger_name, user:user_name}).first.balance);
- }
- // $inc is used for both increment and decrement, so pass in negative amount for decrement
- function addBalance(user_name, amount) {
- #db.u({ledger_type: ledger_name, user:user_name}, {"$inc": { balance: amount }});
- }
- function amountAsNumber(amount) {
- return (typeof amount == 'number') ? amount : l.to_gc_num(amount);
- }
- switch(args.type) {
- case 'open':
- if (!hasAccount(args.user)) {
- #db.i({ledger_type: ledger_name, user:args.user, balance:0});
- return { ok: true };
- } else {
- return { ok: false, msg: "That user already has an account" };
- }
- break;
- case 'check':
- return getBalance(args.user);
- case 'sub':
- args.amount = -args.amount;
- //deliberate fall-through to the 'add' case
- case 'add':
- addBalance(args.user, amountAsNumber(args.amount));
- return { ok: true, msg: "New balance for user " + args.user + ": " + getBalance(args.user) };
- case 'close':
- if (hasAccount(args.user)) {
- #db.r({ledger_type: ledger_name, user:args.user});
- return { ok: true };
- } else {
- return { ok: false, msg: "That user does not have an account" };
- }
- break;
- case 'list':
- // use .map() to remove the not-very-useful _id field from all these documents
- return #db.f({ledger_type: ledger_name}).array.map(function(doc) { delete doc._id; return doc; });
- case 'bankrupt':
- // well, we're done. Close everything, burn all the books!
- #db.r({ledger_type: ledger_name});
- return "Ledger deleted.";
- default:
- return { ok: false, msg:"unrecognized transaction type" };
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment