Advertisement
Earthcomputer

storage.js

Jul 12th, 2018 (edited)
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var debug = false;
  2.  
  3. function logStr(message) {
  4.     if (debug)
  5.         channel.message(message);
  6. }
  7. function log(message, obj) {
  8.     logStr(message + ": " + JSON.stringify(obj));
  9. }
  10.  
  11. function outputRawData(strVal) {
  12.     if (strVal.length > 1980)
  13.         strVal = strVal.substring(0, 1980) + "\n...";
  14.     channel.message("```\n" + strVal + "\n```");
  15. }
  16.  
  17. function getData(arg) {
  18.     logStr("Getting data");
  19.     var ret = parseName(arg);
  20.     log("Initial split", ret);
  21.     arg = ret[1];
  22.     var obj = storage.get(ret[0]);
  23.     log("obj before parsing", obj);
  24.     log("of type", typeof obj);
  25.     if (!arg) {
  26.         outputRawData(obj);
  27.         return;
  28.     }
  29.     try {
  30.         obj = JSON.parse(obj);
  31.     } catch (e) {
  32.         channel.message("Data was not in json format");
  33.         return;
  34.     }
  35.     log("obj after parsing", obj);
  36.     while (arg) {
  37.         logStr("===========");
  38.         log("arg", arg);
  39.         ret = parseName(arg);
  40.         log("split", ret);
  41.         arg = ret[1];
  42.         var name = ret[0];
  43.         if (obj === null) {
  44.             channel.message("Data not found, noob");
  45.             return;
  46.         }
  47.         if (name in obj)
  48.             obj = obj[name];
  49.         else
  50.             obj = null;
  51.         log("obj", obj);
  52.     }
  53.     outputRawData(JSON.stringify(obj));
  54. }
  55.  
  56. function setData(arg) {
  57.     logStr("Setting data");
  58.     var ret = parseName(arg);
  59.     log("Initial split", ret);
  60.     var varSlot = ret[0];
  61.     arg = ret[1];
  62.     if (!arg || arg.startsWith("=")) {
  63.         if (arg.startsWith("=")) {
  64.             arg = arg.substring(1);
  65.             arg = skipWhitespace(arg);
  66.         }
  67.         logStr("No path, setting \"" + ret[0] + "\" to \"" + arg + "\"");
  68.         storage.set(varSlot, arg);
  69.         channel.message("Data stored");
  70.         return;
  71.     }
  72.     var lastObj = null;
  73.     var name = null;
  74.     var obj = storage.get(varSlot);
  75.     log("obj before parsing", obj);
  76.     log("of type", typeof obj);
  77.     try {
  78.         obj = JSON.parse(obj);
  79.     } catch (e) {
  80.         channel.message("Data was not in json format");
  81.         return;
  82.     }
  83.     log("obj after parsing", obj);
  84.     var topLevelObj = obj;
  85.     log("topLevelObj", topLevelObj);
  86.     while (arg && !arg.startsWith("=")) {
  87.         logStr("===========");
  88.         log("arg", arg);
  89.         if (obj === null) {
  90.             obj = {};
  91.             if (lastObj !== null)
  92.                 lastObj[name] = obj;
  93.             if (topLevelObj === null)
  94.                 topLevelObj = obj;
  95.         }
  96.         lastObj = obj;
  97.         ret = parseName(arg);
  98.         log("split", ret);
  99.         arg = ret[1];
  100.         name = ret[0];
  101.         if (name in obj)
  102.             obj = obj[name];
  103.         else
  104.             obj = null;
  105.         log("obj", obj);
  106.     }
  107.     if (arg.startsWith("="))
  108.         arg = arg.substring(1);
  109.     arg = skipWhitespace(arg);
  110.     log("value before parsing", arg);
  111.     log("lastObj before set", lastObj);
  112.     log("topLevelObj before set", topLevelObj);
  113.     try {
  114.         lastObj[name] = JSON.parse(arg);
  115.     } catch (e) {
  116.         channel.message("json parse error:\n" + e.message);
  117.         return;
  118.     }
  119.     log("value after parsing", lastObj[name]);
  120.     log("lastObj after set", lastObj);
  121.     log("topLevelObj after set", topLevelObj);
  122.     storage.set(varSlot, JSON.stringify(topLevelObj));
  123.     channel.message("Data stored");
  124. }
  125.  
  126. function deleteData(arg) {
  127.     logStr("Deleting data");
  128.     var ret = parseName(arg);
  129.     log("Initial split", ret);
  130.     var varSlot = ret[0];
  131.     arg = ret[1];
  132.     if (!arg) {
  133.         logStr("No path");
  134.         storage.delete(varSlot);
  135.     } else {
  136.         var obj = storage.get(varSlot);
  137.         log("obj before parsing", obj);
  138.         log("of type", typeof obj);
  139.         try {
  140.             obj = JSON.parse(obj);
  141.         } catch (e) {
  142.             channel.message("Data was not in json format");
  143.             return;
  144.         }
  145.         log("obj after parsing", obj);
  146.         var topLevelObj = obj;
  147.         var name = null;
  148.         var lastObj;
  149.         while (arg) {
  150.             logStr("=============");
  151.             log("arg", arg);
  152.             lastObj = obj;
  153.             ret = parseName(arg);
  154.             log("split", ret);
  155.             arg = ret[1];
  156.             name = ret[0];
  157.             if (obj == null) {
  158.                 channel.message("Data not found, noob");
  159.                 return;
  160.             }
  161.             if (name in obj)
  162.                 obj = obj[name];
  163.             else
  164.                 obj = null;
  165.             log("obj", obj);
  166.         }
  167.         if (obj === null) {
  168.             channel.message("Data not found, noob");
  169.             return;
  170.         }
  171.         log("lastObj before delete", lastObj);
  172.         log("topLevelObj before delete", topLevelObj);
  173.         delete lastObj[name];
  174.         log("lastObj after delete", lastObj);
  175.         log("topLevelObj after delete", topLevelObj);
  176.         storage.set(varSlot, JSON.stringify(topLevelObj));
  177.     }
  178.     channel.message("Data deleted");
  179. }
  180.  
  181. function spliceData(arg) {
  182.     logStr("Splicing data");
  183.     var ret = parseName(arg);
  184.     log("Initial split", ret);
  185.     var varSlot = ret[0];
  186.     arg = ret[1];
  187.     if (!arg) {
  188.         logStr("No path");
  189.         storage.delete(varSlot);
  190.     } else {
  191.         var obj = storage.get(varSlot);
  192.         log("obj before parsing", obj);
  193.         log("of type", typeof obj);
  194.         try {
  195.             obj = JSON.parse(obj);
  196.         } catch (e) {
  197.             channel.message("Data was not in json format");
  198.             return;
  199.         }
  200.         log("obj after parsing", obj);
  201.         var topLevelObj = obj;
  202.         var name = null;
  203.         var lastObj;
  204.         while (arg) {
  205.             logStr("=============");
  206.             log("arg", arg);
  207.             lastObj = obj;
  208.             ret = parseName(arg);
  209.             log("split", ret);
  210.             arg = ret[1];
  211.             name = ret[0];
  212.             if (obj == null) {
  213.                 channel.message("Data not found, noob");
  214.                 return;
  215.             }
  216.             if (name in obj)
  217.                 obj = obj[name];
  218.             else
  219.                 obj = null;
  220.             log("obj", obj);
  221.         }
  222.         if (obj === null) {
  223.             channel.message("Data not found, noob");
  224.             return;
  225.         }
  226.         log("lastObj before delete", lastObj);
  227.         log("topLevelObj before delete", topLevelObj);
  228.         try {
  229.             lastObj.splice(parseInt(name), 1);
  230.         } catch (e) {
  231.             channel.message("Can only splice from array");
  232.         }
  233.         log("lastObj after delete", lastObj);
  234.         log("topLevelObj after delete", topLevelObj);
  235.         storage.set(varSlot, JSON.stringify(topLevelObj));
  236.     }
  237.     channel.message("Data spliced");
  238. }
  239.  
  240. function listData() {
  241.     javaKeys = storage.getKeys();
  242.     keys = [];
  243.     for (var i = 0; i < javaKeys.length; i++)
  244.         keys.push(javaKeys[i]);
  245.     keys.sort();
  246.     if (keys.length) {
  247.         var msg = "There are " + keys.length + " storage keys in this guild:";
  248.         for (var i = 0; i < keys.length; i++) {
  249.             var line = "\n";
  250.             line += "- " + keys[i];
  251.             if (msg.length + line.length > 2000) {
  252.                 channel.message(msg);
  253.                 msg = "";
  254.             }
  255.             msg += line;
  256.         }
  257.         channel.message(msg);
  258.     } else {
  259.         channel.message("There are no storage keys in this guild");
  260.     }
  261. }
  262.  
  263. function parseName(arg) {
  264.     arg = skipWhitespace(arg);
  265.     var name = "";
  266.     if (arg.startsWith("\"")) {
  267.         var escaped = false;
  268.         arg = arg.substring(1);
  269.         while (arg) {
  270.             var c = arg.charAt(0);
  271.             arg = arg.substring(1);
  272.             if (c == "\\") {
  273.                 if (!escaped) {
  274.                     escaped = true;
  275.                 } else {
  276.                     escaped = false;
  277.                     name += "\\";
  278.                 }
  279.             } else {
  280.                 if (c == "\"" && !escaped)
  281.                     break;
  282.                 name += c;
  283.                 escaped = false;
  284.             }
  285.         }
  286.         arg = skipWhitespace(arg);
  287.         if (arg.startsWith("."))
  288.             arg = arg.substring(1);
  289.         arg = skipWhitespace(arg);
  290.         return [name, arg];
  291.     } else {
  292.         while (arg && !arg.startsWith("=") && !arg.startsWith(".") && !(/^\s.+$/.test(arg))) {
  293.             name += arg.charAt(0);
  294.             arg = arg.substring(1);
  295.         }
  296.         arg = skipWhitespace(arg);
  297.         if (arg.startsWith("."))
  298.             arg = arg.substring(1);
  299.         arg = skipWhitespace(arg);
  300.         return [name, arg];
  301.     }
  302. }
  303. function skipWhitespace(arg) {
  304.     while (/^\s.+$/.test(arg))
  305.         arg = arg.substring(1);
  306.     return arg;
  307. }
  308.  
  309.  
  310. var arg = message.getContent();
  311. if (arg.startsWith("//storage "))
  312.     arg = arg.substring(10);
  313. if (arg.startsWith("--debug ")) {
  314.     arg = arg.substring(8);
  315.     debug = true;
  316. }
  317. if (arg.startsWith("get ")) {
  318.     getData(arg.substring(4));
  319. } else if (arg.startsWith("set ")) {
  320.     setData(arg.substring(4));
  321. } else if (arg.startsWith("delete ")) {
  322.     deleteData(arg.substring(7));
  323. } else if (arg.startsWith("splice ")) {
  324.     spliceData(arg.substring(7));
  325. } else if (arg == "list" || arg.startsWith("list ")) {
  326.     listData();
  327. } else {
  328.     channel.message("```\nUsage:\n$storage get path.to.data\n$storage set path.to.data=newValue\n$storage delete path.to.data\n$storage splice path.to.data\n$storage list\n```");
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement