Advertisement
Earthcomputer

storage.js

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