Soron

hackmud sample script: ledger (using #db)

May 16th, 2016
7,253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // call the script as script_name{type:"<action type>", user:"<target_user>", amount:<number, or GC string>}
  2. // some actions do not require amount, and some do not require user
  3. // current character count, as measured by hackmud: 1312 characters
  4. function(context, args)
  5. {
  6.     var l = #s.scripts.lib();
  7.     // we set a ledger_type:"demo" value in each document, so that we can later filter/update/delete *just* entries from this ledger
  8.     var ledger_name = 'demo';
  9.    
  10.     // preprocess the amount
  11.     if (args.amount) {
  12.         args.amount = amountAsNumber(args.amount);
  13.     }
  14.  
  15.     function hasAccount(user_name) {
  16.         return #db.f({user:user_name}).count > 1;
  17.     }
  18.  
  19.     function getBalance(user_name) {
  20.         return l.to_gc_str(#db.f({ledger_type: ledger_name, user:user_name}).first.balance);
  21.     }
  22.  
  23.     // $inc is used for both increment and decrement, so pass in negative amount for decrement
  24.     function addBalance(user_name, amount) {
  25.         #db.u({ledger_type: ledger_name, user:user_name}, {"$inc": { balance: amount }});
  26.     }
  27.  
  28.     function amountAsNumber(amount) {
  29.         return (typeof amount == 'number') ? amount : l.to_gc_num(amount);
  30.     }
  31.  
  32.     switch(args.type) {
  33.         case 'open':
  34.             if (!hasAccount(args.user)) {
  35.                 #db.i({ledger_type: ledger_name, user:args.user, balance:0});
  36.                 return { ok: true };
  37.             } else {
  38.                 return { ok: false, msg: "That user already has an account" };
  39.             }
  40.             break;
  41.         case 'check':
  42.             return getBalance(args.user);
  43.         case 'sub':
  44.             args.amount = -args.amount;
  45.             //deliberate fall-through to the 'add' case
  46.         case 'add':
  47.             addBalance(args.user, amountAsNumber(args.amount));
  48.             return { ok: true, msg: "New balance for user " + args.user + ": " + getBalance(args.user) };
  49.         case 'close':
  50.             if (hasAccount(args.user)) {
  51.                 #db.r({ledger_type: ledger_name, user:args.user});
  52.                 return { ok: true };
  53.             } else {
  54.                 return { ok: false, msg: "That user does not have an account" };
  55.             }
  56.             break;
  57.         case 'list':
  58.             // use .map() to remove the not-very-useful _id field from all these documents
  59.             return #db.f({ledger_type: ledger_name}).array.map(function(doc) { delete doc._id; return doc; });
  60.         case 'bankrupt':
  61.             // well, we're done. Close everything, burn all the books!
  62.             #db.r({ledger_type: ledger_name});
  63.             return "Ledger deleted.";
  64.         default:
  65.             return { ok: false, msg:"unrecognized transaction type" };
  66.     }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment