Advertisement
Earthcomputer

storage.js

Jul 12th, 2018
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var debug = false;
  2.  
  3. function log(message) {
  4.     if (debug)
  5.         channel.message(message);
  6. }
  7. function log(message, obj) {
  8.     log(message + ": " + JSON.stringify(obj));
  9. }
  10.  
  11. function getData(arg) {
  12.     var ret = parseName(arg);
  13.     log("Initial split", ret);
  14.     arg = ret[1];
  15.     var obj = storage.get(ret[0]);
  16.     log("obj before parsing", obj);
  17.     if (!arg) {
  18.         channel.message(obj);
  19.         return;
  20.     }
  21.     try {
  22.         obj = JSON.parse(obj);
  23.     } catch (e) {
  24.         channel.message("Data was not in json format");
  25.         return;
  26.     }
  27.     log("obj after parsing", obj);
  28.     while (arg) {
  29.         log("===========");
  30.         log("arg", arg);
  31.         ret = parseName(arg);
  32.         log("split", ret);
  33.         arg = ret[1];
  34.         var name = ret[0];
  35.         if (obj === null) {
  36.             channel.message("Data not found, noob");
  37.             return;
  38.         }
  39.         if (name in obj)
  40.             obj = obj[name];
  41.         else
  42.             obj = null;
  43.         log("obj", obj);
  44.     }
  45.     channel.message(JSON.stringify(obj));
  46. }
  47.  
  48. function setData(arg) {
  49.     var ret = parseName(arg);
  50.     log("Initial split", ret);
  51.     arg = ret[1];
  52.     if (!arg || arg.startsWith("=")) {
  53.         if (arg.startsWith("=")) {
  54.             arg = arg.substring(1);
  55.             arg = skipWhitespace(arg);
  56.         }
  57.         log("No path, setting \"" + ret[0] + "\" to \"" + arg + "\"");
  58.         storage.set(ret[0], arg);
  59.         channel.message("Data successfully stored");
  60.         return;
  61.     }
  62.     var lastObj;
  63.     var name = null;
  64.     var obj = storage.get(ret[0]);
  65.     log("obj before parsing", obj);
  66.     try {
  67.         obj = JSON.parse(obj);
  68.     } catch (e) {
  69.         channel.message("Data was not in json format");
  70.         return;
  71.     }
  72.     log("obj after parsing", obj);
  73.     var topLevelObj = obj;
  74.     log("topLevelObj", topLevelObj);
  75.     while (arg && !arg.startsWith("=")) {
  76.         log("===========");
  77.         log("arg", arg);
  78.         lastObj = obj;
  79.         ret = parseName(arg);
  80.         log("split", ret);
  81.         arg = ret[1];
  82.         name = ret[0];
  83.         if (obj === null)
  84.             obj = {};
  85.         if (name in obj)
  86.             obj = obj[name];
  87.         else
  88.             obj = null;
  89.         log("obj", obj);
  90.     }
  91.     if (arg.startsWith("="))
  92.         arg = arg.substring(1);
  93.     arg = skipWhitespace(arg);
  94.     log("value before parsing", arg);
  95.     log("lastObj before set", lastObj);
  96.     log("topLevelObj before set", topLevelObj);
  97.     try {
  98.         lastObj[name] = JSON.parse(arg);
  99.     } catch (e) {
  100.         channel.message("json parse error:\n" + e.message);
  101.         return;
  102.     }
  103.     log("value after parsing", lastObj[name]);
  104.     log("lastObj after set", lastObj);
  105.     log("topLevelObj after set", topLevelObj);
  106.     storage.set(ret[0], JSON.stringify(topLevelObj));
  107.     channel.message("Data stored");
  108. }
  109.  
  110. function deleteData(arg) {
  111.     var ret = parseName(arg);
  112.     log("Initial split", ret);
  113.     arg = ret[1];
  114.     if (!arg) {
  115.         log("No path");
  116.         storage.delete(ret[0]);
  117.     } else {
  118.         var obj = storage.get(ret[0]);
  119.         log("obj before parsing", obj);
  120.         try {
  121.             obj = JSON.parse(obj);
  122.         } catch (e) {
  123.             channel.message("Data was not in json format");
  124.             return;
  125.         }
  126.         log("obj after parsing", obj);
  127.         var topLevelObj = obj;
  128.         var name = null;
  129.         var lastObj;
  130.         while (arg) {
  131.             log("=============");
  132.             log("arg", arg);
  133.             lastObj = obj;
  134.             ret = parseName(arg);
  135.             log("split", ret);
  136.             arg = ret[1];
  137.             name = ret[0];
  138.             if (obj == null) {
  139.                 channel.message("Data not found, noob");
  140.                 return;
  141.             }
  142.             if (name in obj)
  143.                 obj = obj[name];
  144.             else
  145.                 obj = null;
  146.             log("obj", obj);
  147.         }
  148.         if (obj === null) {
  149.             channel.message("Data not found, noob");
  150.             return;
  151.         }
  152.         log("lastObj before delete", lastObj);
  153.         log("topLevelObj before delete", topLevelObj);
  154.         delete lastObj[name];
  155.         log("lastObj after delete", lastObj);
  156.         log("topLevelObj after delete", topLevelObj);
  157.         storage.set(ret[0], JSON.stringify(topLevelObj));
  158.     }
  159.     channel.message("Data deleted");
  160. }
  161.  
  162. function parseName(arg) {
  163.     arg = skipWhitespace(arg);
  164.     var name = "";
  165.     if (arg.startsWith("\"")) {
  166.         var escaped = false;
  167.         arg = arg.substring(1);
  168.         while (arg) {
  169.             var c = arg.charAt(0);
  170.             arg = arg.substring(1);
  171.             if (c == "\\") {
  172.                 if (!escaped) {
  173.                     escaped = true;
  174.                 } else {
  175.                     escaped = false;
  176.                     name += "\\";
  177.                 }
  178.             } else {
  179.                 if (c == "\"" && !escaped)
  180.                     break;
  181.                 name += c;
  182.                 escaped = false;
  183.             }
  184.         }
  185.         arg = skipWhitespace(arg);
  186.         if (arg.startsWith("."))
  187.             arg = arg.substring(1);
  188.         arg = skipWhitespace(arg);
  189.         return [name, arg];
  190.     } else {
  191.         while (arg && !arg.startsWith("=") && !arg.startsWith(".") && !(/^\s.+$/.test(arg))) {
  192.             name += arg.charAt(0);
  193.             arg = arg.substring(1);
  194.         }
  195.         arg = skipWhitespace(arg);
  196.         if (arg.startsWith("."))
  197.             arg = arg.substring(1);
  198.         arg = skipWhitespace(arg);
  199.         return [name, arg];
  200.     }
  201. }
  202. function skipWhitespace(arg) {
  203.     while (/^\s.+$/.test(arg))
  204.         arg = arg.substring(1);
  205.     return arg;
  206. }
  207.  
  208.  
  209. var arg = message.getContent();
  210. if (arg.startsWith("//storage "))
  211.     arg = arg.substring(10);
  212. if (arg.startsWith("--debug ")) {
  213.     arg = arg.substring(8);
  214.     debug = true;
  215. }
  216. if (arg.startsWith("get ")) {
  217.     getData(arg.substring(4));
  218. } else if (arg.startsWith("set ")) {
  219.     setData(arg.substring(4));
  220. } else if (arg.startsWith("delete ")) {
  221.     deleteData(arg.substring(7));
  222. } else {
  223.     channel.message("```\nUsage:\n//storage get path.to.data\n//storage set path.to.data=newValue\n//storage delete path.to.data\n```");
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement