|  | @@ -23,7 +23,7 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        this.helpers = new Helpers;
 | 
	
		
			
				|  |  |        this.initUser();
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |        //client routes
 | 
	
		
			
				|  |  |        page('/', this.HandleIndex);
 | 
	
		
			
				|  |  |        page('/setup', this.HandleSetupIndex);
 | 
	
	
		
			
				|  | @@ -188,7 +188,7 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    async loadWorldsDefaults(replace) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   //load to DB default worlds
 | 
	
		
			
				|  |  | +    //load to DB default worlds
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      let worldsResponse = await fetch('/world-files', { method: 'get' });
 | 
	
		
			
				|  |  |      let worldFiles = await worldsResponse.json();
 | 
	
	
		
			
				|  | @@ -239,31 +239,31 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      console.log(worldsObj);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if(replace){
 | 
	
		
			
				|  |  | +    if (replace) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    Object.entries(worldsObj).forEach(el => {
 | 
	
		
			
				|  |  | +      Object.entries(worldsObj).forEach(el => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      let worldName = el[0];
 | 
	
		
			
				|  |  | -      let files = el[1];
 | 
	
		
			
				|  |  | -      Object.entries(files).forEach(file => {
 | 
	
		
			
				|  |  | +        let worldName = el[0];
 | 
	
		
			
				|  |  | +        let files = el[1];
 | 
	
		
			
				|  |  | +        Object.entries(files).forEach(file => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        _LCSDB.user().get('worlds').get(worldName).get(file[0]).put(file[1]);
 | 
	
		
			
				|  |  | +          _LCSDB.user().get('worlds').get(worldName).get(file[0]).put(file[1]);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  |        })
 | 
	
		
			
				|  |  | -    })
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    //force replace all default worlds
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      //force replace all default worlds
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        Object.entries(worldsObj).forEach(el => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          let worldName = el[0];
 | 
	
		
			
				|  |  |          let files = el[1];
 | 
	
		
			
				|  |  |          Object.entries(files).forEach(file => {
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | -          _LCSDB.user().get('worlds').get(worldName).get(file[0]).not(res=>{
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          _LCSDB.user().get('worlds').get(worldName).get(file[0]).not(res => {
 | 
	
		
			
				|  |  |              _LCSDB.user().get('worlds').get(worldName).get(file[0]).put(file[1]);
 | 
	
		
			
				|  |  |            })
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          })
 | 
	
		
			
				|  |  |        })
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -273,10 +273,10 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    async loadEmptyDefaultProto() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -     //empty proto world
 | 
	
		
			
				|  |  | -     let userPub = _LCSUSER.is.pub;
 | 
	
		
			
				|  |  | -     let worldsObj = {};
 | 
	
		
			
				|  |  | -     let emptyWorld = {
 | 
	
		
			
				|  |  | +    //empty proto world
 | 
	
		
			
				|  |  | +    let userPub = _LCSUSER.is.pub;
 | 
	
		
			
				|  |  | +    let worldsObj = {};
 | 
	
		
			
				|  |  | +    let emptyWorld = {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        "index_vwf_yaml": YAML.stringify(
 | 
	
		
			
				|  |  |          {
 | 
	
	
		
			
				|  | @@ -285,33 +285,33 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        "index_vwf_config_yaml": YAML.stringify(
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | +          "info": {
 | 
	
		
			
				|  |  | +            "title": "Empty World"
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          "model": {
 | 
	
		
			
				|  |  | +            "vwf/model/aframe": null
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          "view": {
 | 
	
		
			
				|  |  | +            "vwf/view/aframe": null,
 | 
	
		
			
				|  |  | +            "vwf/view/editor-new": null
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }, 4),
 | 
	
		
			
				|  |  | +      "assets_json": JSON.stringify({}),
 | 
	
		
			
				|  |  | +      "index_vwf_html": JSON.stringify("<!-- DEFAULT HTML -->"),
 | 
	
		
			
				|  |  | +      "appui_js": JSON.stringify("//appui in JS"),
 | 
	
		
			
				|  |  | +      "info_json": JSON.stringify({
 | 
	
		
			
				|  |  |          "info": {
 | 
	
		
			
				|  |  | -          "title": "Empty World"
 | 
	
		
			
				|  |  | -        },
 | 
	
		
			
				|  |  | -        "model": {
 | 
	
		
			
				|  |  | -          "vwf/model/aframe": null
 | 
	
		
			
				|  |  | -        },
 | 
	
		
			
				|  |  | -        "view": {
 | 
	
		
			
				|  |  | -          "vwf/view/aframe": null,
 | 
	
		
			
				|  |  | -          "vwf/view/editor-new": null
 | 
	
		
			
				|  |  | -        } 
 | 
	
		
			
				|  |  | -      }, 4),
 | 
	
		
			
				|  |  | -      "assets_json": JSON.stringify ({}),
 | 
	
		
			
				|  |  | -      "index_vwf_html": JSON.stringify ("<!-- DEFAULT HTML -->"),
 | 
	
		
			
				|  |  | -      "appui_js": JSON.stringify ("//appui in JS"),
 | 
	
		
			
				|  |  | -      "info_json": JSON.stringify ({ 
 | 
	
		
			
				|  |  | -        "info": { 
 | 
	
		
			
				|  |  |            "en": {
 | 
	
		
			
				|  |  | -              "title": "Empty World",
 | 
	
		
			
				|  |  | -              "imgUrl": "",
 | 
	
		
			
				|  |  | -              "text": "Empty World"
 | 
	
		
			
				|  |  | +            "title": "Empty World",
 | 
	
		
			
				|  |  | +            "imgUrl": "",
 | 
	
		
			
				|  |  | +            "text": "Empty World"
 | 
	
		
			
				|  |  |            },
 | 
	
		
			
				|  |  |            "ru": {
 | 
	
		
			
				|  |  | -              "title": "Новый Мир",
 | 
	
		
			
				|  |  | -              "imgUrl": "",
 | 
	
		
			
				|  |  | -              "text": "Новый Мир"
 | 
	
		
			
				|  |  | +            "title": "Новый Мир",
 | 
	
		
			
				|  |  | +            "imgUrl": "",
 | 
	
		
			
				|  |  | +            "text": "Новый Мир"
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |        }, null, 4)
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -322,7 +322,7 @@ class App {
 | 
	
		
			
				|  |  |        'published': true
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    Object.keys(emptyWorld).forEach(el=>{
 | 
	
		
			
				|  |  | +    Object.keys(emptyWorld).forEach(el => {
 | 
	
		
			
				|  |  |        //let modified = new Date().valueOf();
 | 
	
		
			
				|  |  |        let created = new Date().valueOf();
 | 
	
		
			
				|  |  |        let obj = {
 | 
	
	
		
			
				|  | @@ -331,7 +331,7 @@ class App {
 | 
	
		
			
				|  |  |          'created': created
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        worldsObj['empty'][el] = obj;
 | 
	
		
			
				|  |  | -    }) 
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      console.log(worldsObj);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -363,13 +363,13 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  HandleWorldAbout(ctx){
 | 
	
		
			
				|  |  | +  HandleWorldAbout(ctx) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      console.log("about world");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      let userAlias = ctx.params.user;
 | 
	
		
			
				|  |  |      let worldName = ctx.params.space;
 | 
	
		
			
				|  |  | -    let saveName =  ctx.params.savename;
 | 
	
		
			
				|  |  | +    let saveName = ctx.params.savename;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      window._app.hideProgressBar();
 | 
	
		
			
				|  |  |      window._app.hideUIControl();
 | 
	
	
		
			
				|  | @@ -378,7 +378,7 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      let worldApp = new WorldApp(userAlias, worldName, saveName);
 | 
	
		
			
				|  |  |      worldApp.initWorldGUI();
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    HandleSetupIndex() {
 | 
	
	
		
			
				|  | @@ -390,7 +390,7 @@ class App {
 | 
	
		
			
				|  |  |      el.setAttribute("id", "admin");
 | 
	
		
			
				|  |  |      document.body.appendChild(el);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      _LCSDB.on('auth',
 | 
	
		
			
				|  |  |        async function (ack) {
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -404,7 +404,7 @@ class App {
 | 
	
		
			
				|  |  |                  $type: "p",
 | 
	
		
			
				|  |  |                  class: "mdc-typography--headline5",
 | 
	
		
			
				|  |  |                  $text: "1. Set app system user PUB key"
 | 
	
		
			
				|  |  | -            },
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  |                {
 | 
	
		
			
				|  |  |                  $type: "button",
 | 
	
		
			
				|  |  |                  class: "mdc-button mdc-button--raised",
 | 
	
	
		
			
				|  | @@ -415,11 +415,11 @@ class App {
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                }
 | 
	
		
			
				|  |  |              ]
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |            let adminComponents = [];
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |            let defaultPub = await _LCSDB.get('lcs/app').get('pub').once().then();
 | 
	
		
			
				|  |  |            if (!defaultPub) {
 | 
	
	
		
			
				|  | @@ -435,7 +435,7 @@ class App {
 | 
	
		
			
				|  |  |                    $type: "p",
 | 
	
		
			
				|  |  |                    class: "mdc-typography--headline5",
 | 
	
		
			
				|  |  |                    $text: "3. Initialize empty World proto"
 | 
	
		
			
				|  |  | -              },
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                    $type: "button",
 | 
	
		
			
				|  |  |                    id: "loadDefaults",
 | 
	
	
		
			
				|  | @@ -448,7 +448,7 @@ class App {
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                ]
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              let loadDefaults = {
 | 
	
		
			
				|  |  |                $cell: true,
 | 
	
	
		
			
				|  | @@ -458,7 +458,7 @@ class App {
 | 
	
		
			
				|  |  |                    $type: "p",
 | 
	
		
			
				|  |  |                    class: "mdc-typography--headline5",
 | 
	
		
			
				|  |  |                    $text: "4. Load Sample Worlds protos from server (optional)"
 | 
	
		
			
				|  |  | -              },
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                    $type: "button",
 | 
	
		
			
				|  |  |                    id: "loadDefaults",
 | 
	
	
		
			
				|  | @@ -477,17 +477,17 @@ class App {
 | 
	
		
			
				|  |  |                  _cellWidgets.switch({
 | 
	
		
			
				|  |  |                    'id': 'forceReplace',
 | 
	
		
			
				|  |  |                    'init': function () {
 | 
	
		
			
				|  |  | -                      this._switch = new mdc.switchControl.MDCSwitch(this);
 | 
	
		
			
				|  |  | -                      this._replaceSwitch = this._switch;
 | 
	
		
			
				|  |  | -                      this._switch.checked = false;
 | 
	
		
			
				|  |  | +                    this._switch = new mdc.switchControl.MDCSwitch(this);
 | 
	
		
			
				|  |  | +                    this._replaceSwitch = this._switch;
 | 
	
		
			
				|  |  | +                    this._switch.checked = false;
 | 
	
		
			
				|  |  |                    }
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -              ),
 | 
	
		
			
				|  |  | -              {
 | 
	
		
			
				|  |  | -                $type: 'label',
 | 
	
		
			
				|  |  | -                for: 'input-forceReplace',
 | 
	
		
			
				|  |  | -                $text: 'Force replace'
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                ),
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                  $type: 'label',
 | 
	
		
			
				|  |  | +                  for: 'input-forceReplace',
 | 
	
		
			
				|  |  | +                  $text: 'Force replace'
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                ]
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -499,7 +499,7 @@ class App {
 | 
	
		
			
				|  |  |                    $type: "p",
 | 
	
		
			
				|  |  |                    class: "mdc-typography--headline5",
 | 
	
		
			
				|  |  |                    $text: "3. Load VWF & A-Frame default components"
 | 
	
		
			
				|  |  | -              },
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                    $type: "button",
 | 
	
		
			
				|  |  |                    class: "mdc-button mdc-button--raised",
 | 
	
	
		
			
				|  | @@ -535,39 +535,39 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      _LCSDB.on('auth',
 | 
	
		
			
				|  |  |        async function (ack) {
 | 
	
		
			
				|  |  | -        if(ack.pub){
 | 
	
		
			
				|  |  | +        if (ack.pub) {
 | 
	
		
			
				|  |  |            document.querySelector("#profile")._status = "User: " + _LCSUSER.is.alias //+' pub: ' + _LCSUSER.is.pub;
 | 
	
		
			
				|  |  |            document.querySelector("#profile").$update();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      let el = document.createElement("div");
 | 
	
		
			
				|  |  | -      el.setAttribute("id", "userProfile");
 | 
	
		
			
				|  |  | -      document.body.appendChild(el);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      let userProfile = {
 | 
	
		
			
				|  |  | -        $type: 'div',
 | 
	
		
			
				|  |  | -        id: "profile",
 | 
	
		
			
				|  |  | -        _status: "",
 | 
	
		
			
				|  |  | -        $init: function(){
 | 
	
		
			
				|  |  | -          this._status = "user is not signed in..."
 | 
	
		
			
				|  |  | -        },
 | 
	
		
			
				|  |  | -        $update: function(){
 | 
	
		
			
				|  |  | -          this.$components = [
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                $type: "h1",
 | 
	
		
			
				|  |  | -                class: "mdc-typography--headline4",
 | 
	
		
			
				|  |  | -                $text: this._status //"Profile for: " + _LCSUSER.is.alias
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -          ]
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    let el = document.createElement("div");
 | 
	
		
			
				|  |  | +    el.setAttribute("id", "userProfile");
 | 
	
		
			
				|  |  | +    document.body.appendChild(el);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let userProfile = {
 | 
	
		
			
				|  |  | +      $type: 'div',
 | 
	
		
			
				|  |  | +      id: "profile",
 | 
	
		
			
				|  |  | +      _status: "",
 | 
	
		
			
				|  |  | +      $init: function () {
 | 
	
		
			
				|  |  | +        this._status = "user is not signed in..."
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      $update: function () {
 | 
	
		
			
				|  |  | +        this.$components = [
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            $type: "h1",
 | 
	
		
			
				|  |  | +            class: "mdc-typography--headline4",
 | 
	
		
			
				|  |  | +            $text: this._status //"Profile for: " + _LCSUSER.is.alias
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        ]
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      document.querySelector("#userProfile").$cell({
 | 
	
		
			
				|  |  | -        $cell: true,
 | 
	
		
			
				|  |  | -        $type: "div",
 | 
	
		
			
				|  |  | -        $components: [userProfile]
 | 
	
		
			
				|  |  | -      })
 | 
	
		
			
				|  |  | +    document.querySelector("#userProfile").$cell({
 | 
	
		
			
				|  |  | +      $cell: true,
 | 
	
		
			
				|  |  | +      $type: "div",
 | 
	
		
			
				|  |  | +      $components: [userProfile]
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -640,7 +640,7 @@ class App {
 | 
	
		
			
				|  |  |                        editor.getSession().setMode(mode);
 | 
	
		
			
				|  |  |                        editor.setOptions({
 | 
	
		
			
				|  |  |                          maxLines: Infinity
 | 
	
		
			
				|  |  | -                    });
 | 
	
		
			
				|  |  | +                      });
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                    },
 | 
	
		
			
				|  |  |                    {
 | 
	
	
		
			
				|  | @@ -803,7 +803,7 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    async HandleParsableRequestWithID(ctx) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      let app = window._app;
 | 
	
	
		
			
				|  | @@ -819,7 +819,7 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      let pathToParse = pathname.replace('/' + user, "");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    app.helpers.Process(pathToParse).then(async function(parsedRequest) {
 | 
	
		
			
				|  |  | +    app.helpers.Process(pathToParse).then(async function (parsedRequest) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        localStorage.setItem('lcs_app', JSON.stringify({ path: parsedRequest }));
 | 
	
		
			
				|  |  |        console.log(parsedRequest);
 | 
	
	
		
			
				|  | @@ -849,7 +849,7 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        // Redirect if the url request does not include an application/file && a default 'index.vwf.yaml' exists
 | 
	
		
			
				|  |  |        // page.redirect(pathname + '/' + app.helpers.GenerateInstanceID());
 | 
	
		
			
				|  |  | -      window.location.pathname = pathname + '/' + app.helpers.GenerateInstanceID() 
 | 
	
		
			
				|  |  | +      window.location.pathname = pathname + '/' + app.helpers.GenerateInstanceID()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        //return true;
 | 
	
		
			
				|  |  |      } else {
 | 
	
	
		
			
				|  | @@ -974,8 +974,8 @@ class App {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      //let objName = loadInfo[ 'save_name' ] +'/'+ "savestate_" + loadInfo[ 'save_revision' ];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if(!loadInfo.save_name){
 | 
	
		
			
				|  |  | -        return undefined
 | 
	
		
			
				|  |  | +    if (!loadInfo.save_name) {
 | 
	
		
			
				|  |  | +      return undefined
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      let objName = "savestate_" + loadInfo['application_path'] + '/' + loadInfo['save_name'] + '_vwf_json';
 | 
	
	
		
			
				|  | @@ -1461,19 +1461,19 @@ class App {
 | 
	
		
			
				|  |  |          for (const el of Object.keys(worldFiles)) {
 | 
	
		
			
				|  |  |            if (el !== '_') {
 | 
	
		
			
				|  |  |              let doc = await _LCSUSER.get('worlds').get(worldName).get(el).once().then();
 | 
	
		
			
				|  |  | -            if(doc) {
 | 
	
		
			
				|  |  | -            if (doc.file) {
 | 
	
		
			
				|  |  | -              for (const fEl of Object.keys(doc)) {
 | 
	
		
			
				|  |  | -                if (fEl !== '_') {
 | 
	
		
			
				|  |  | -                  await _LCSUSER.get('worlds').get(worldName).get(el).get(fEl).put(null).then();
 | 
	
		
			
				|  |  | +            if (doc) {
 | 
	
		
			
				|  |  | +              if (doc.file) {
 | 
	
		
			
				|  |  | +                for (const fEl of Object.keys(doc)) {
 | 
	
		
			
				|  |  | +                  if (fEl !== '_') {
 | 
	
		
			
				|  |  | +                    await _LCSUSER.get('worlds').get(worldName).get(el).get(fEl).put(null).then();
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +                await _LCSUSER.get('worlds').get(worldName).get(el).put(null).then();
 | 
	
		
			
				|  |  | +              } else {
 | 
	
		
			
				|  |  | +                await _LCSUSER.get('worlds').get(worldName).get(el).put(null).then()
 | 
	
		
			
				|  |  |                }
 | 
	
		
			
				|  |  | -              await _LCSUSER.get('worlds').get(worldName).get(el).put(null).then();
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | -              await _LCSUSER.get('worlds').get(worldName).get(el).put(null).then()
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1504,6 +1504,16 @@ class App {
 | 
	
		
			
				|  |  |        await this.deleteWorldState(worldName, stateEntryInfo);
 | 
	
		
			
				|  |  |        await this.deleteWorldState(worldName, stateEntry);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let noty = new Noty({
 | 
	
		
			
				|  |  | +      text: "World Deleted!",
 | 
	
		
			
				|  |  | +      timeout: 2000,
 | 
	
		
			
				|  |  | +      theme: 'mint',
 | 
	
		
			
				|  |  | +      layout: 'bottomRight',
 | 
	
		
			
				|  |  | +      type: 'success'
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    noty.show();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1514,50 +1524,230 @@ class App {
 | 
	
		
			
				|  |  |      let listData = {};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      for (var prop in jsonObj) {
 | 
	
		
			
				|  |  | -        var name = prop.split('/')[1];
 | 
	
		
			
				|  |  | -        if (parsed[name]) {
 | 
	
		
			
				|  |  | -            parsed[name][prop] = jsonObj[prop];
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -            parsed[name] = {};
 | 
	
		
			
				|  |  | -            parsed[name][prop] = jsonObj[prop];
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +      var name = prop.split('/')[1];
 | 
	
		
			
				|  |  | +      if (parsed[name]) {
 | 
	
		
			
				|  |  | +        parsed[name][prop] = jsonObj[prop];
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        parsed[name] = {};
 | 
	
		
			
				|  |  | +        parsed[name][prop] = jsonObj[prop];
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      //console.log(parsed);
 | 
	
		
			
				|  |  |      for (var prop in parsed) {
 | 
	
		
			
				|  |  | -        var name = prop;
 | 
	
		
			
				|  |  | -        let obj = Object.entries(parsed[prop]);
 | 
	
		
			
				|  |  | -        var lists = {};
 | 
	
		
			
				|  |  | -        obj.forEach(el => {
 | 
	
		
			
				|  |  | -            if (el[1].loadInfo['save_name']) {
 | 
	
		
			
				|  |  | -                let saveName = prop + '/load/' + el[1].loadInfo.save_name;
 | 
	
		
			
				|  |  | -                if (!lists[saveName])
 | 
	
		
			
				|  |  | -                    lists[saveName] = {};
 | 
	
		
			
				|  |  | -                lists[saveName][el[0]] = el[1]
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | -                if (!lists[name])
 | 
	
		
			
				|  |  | -                    lists[name] = {};
 | 
	
		
			
				|  |  | -                lists[name][el[0]] = el[1]
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | +      var name = prop;
 | 
	
		
			
				|  |  | +      let obj = Object.entries(parsed[prop]);
 | 
	
		
			
				|  |  | +      var lists = {};
 | 
	
		
			
				|  |  | +      obj.forEach(el => {
 | 
	
		
			
				|  |  | +        if (el[1].loadInfo['save_name']) {
 | 
	
		
			
				|  |  | +          let saveName = prop + '/load/' + el[1].loadInfo.save_name;
 | 
	
		
			
				|  |  | +          if (!lists[saveName])
 | 
	
		
			
				|  |  | +            lists[saveName] = {};
 | 
	
		
			
				|  |  | +          lists[saveName][el[0]] = el[1]
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          if (!lists[name])
 | 
	
		
			
				|  |  | +            lists[name] = {};
 | 
	
		
			
				|  |  | +          lists[name][el[0]] = el[1]
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        // console.log(lists);
 | 
	
		
			
				|  |  | +      // console.log(lists);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        Object.entries(lists).forEach(list => {
 | 
	
		
			
				|  |  | +      Object.entries(lists).forEach(list => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -          listData[list[0]] = list[1];
 | 
	
		
			
				|  |  | +        listData[list[0]] = list[1];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            // let element = document.getElementById(list[0] + 'List');
 | 
	
		
			
				|  |  | -            // if (element) {
 | 
	
		
			
				|  |  | -            //     element._setListData(list[1]);
 | 
	
		
			
				|  |  | -            // }
 | 
	
		
			
				|  |  | -        })
 | 
	
		
			
				|  |  | +        // let element = document.getElementById(list[0] + 'List');
 | 
	
		
			
				|  |  | +        // if (element) {
 | 
	
		
			
				|  |  | +        //     element._setListData(list[1]);
 | 
	
		
			
				|  |  | +        // }
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      return listData
 | 
	
		
			
				|  |  |      // console.log(data)
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async getAllProtoWorldsInfoForUser(userAlias) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let userPub = await _LCSDB.get('users').get(userAlias).get('pub').once().then();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var db = _LCSDB.user(userPub);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (_LCSUSER.is) {
 | 
	
		
			
				|  |  | +      if (_LCSUSER.is.alias == userAlias)
 | 
	
		
			
				|  |  | +        db = _LCSUSER;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var worlds = {};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let worldDocs = await db.get('worlds').once().then();
 | 
	
		
			
				|  |  | +    if(worldDocs) {
 | 
	
		
			
				|  |  | +      let protos = Object.keys(worldDocs).filter(el => el !== '_');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      if (protos) {
 | 
	
		
			
				|  |  | +        for (const el of protos) {
 | 
	
		
			
				|  |  | +          let info = await this.getWorldInfo(userAlias, el);
 | 
	
		
			
				|  |  | +         if (Object.keys(info).length !== 0)
 | 
	
		
			
				|  |  | +                worlds[el] = info;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return worlds
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // await db.get('worlds').once(async (proto, index) => {
 | 
	
		
			
				|  |  | +    //   let protos = Object.keys(proto).filter(el => el !== '_');
 | 
	
		
			
				|  |  | +    //  // console.log(protos);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    //   if (protos) {
 | 
	
		
			
				|  |  | +    //     for (const el of protos) {
 | 
	
		
			
				|  |  | +    //       let info = await this.getWorldInfo(userAlias, el);
 | 
	
		
			
				|  |  | +    //       worlds[el] = info;
 | 
	
		
			
				|  |  | +    //     }
 | 
	
		
			
				|  |  | +    //   }
 | 
	
		
			
				|  |  | +    // }).then();
 | 
	
		
			
				|  |  | +    // return worlds
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async getSaveStates(userAlias, worldName) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let userPub = await _LCSDB.get('users').get(userAlias).get('pub').once().then();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var db = _LCSDB.user(userPub);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (_LCSUSER.is) {
 | 
	
		
			
				|  |  | +      if (_LCSUSER.is.alias == userAlias)
 | 
	
		
			
				|  |  | +        db = _LCSUSER;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var states = {};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let docs = await db.get('documents').get(worldName).once().then();
 | 
	
		
			
				|  |  | +    if(docs){
 | 
	
		
			
				|  |  | +    let saves = Object.keys(docs).filter(el => el.includes('_info_vwf_json'));
 | 
	
		
			
				|  |  | +    if (saves) {
 | 
	
		
			
				|  |  | +      for (const el of saves) {
 | 
	
		
			
				|  |  | +        let stateName = el.split('/')[2].replace('_info_vwf_json', "");
 | 
	
		
			
				|  |  | +        let info = await this.getStateInfo(userAlias, worldName, stateName);
 | 
	
		
			
				|  |  | +        if (Object.keys(info).length !== 0)
 | 
	
		
			
				|  |  | +          states[stateName] = info;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +      return states
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  //  return await db.get('documents').get(worldName).once(async (save, index) => {
 | 
	
		
			
				|  |  | +  //     let saves = Object.keys(save).filter(el => el.includes('_info_vwf_json'));
 | 
	
		
			
				|  |  | +  //     //console.log(saves);
 | 
	
		
			
				|  |  | +  //     if (saves) {
 | 
	
		
			
				|  |  | +  //       for (const el of saves) {
 | 
	
		
			
				|  |  | +  //         let stateName = el.split('/')[2].replace('_info_vwf_json', "");
 | 
	
		
			
				|  |  | +  //         let info = await this.getStateInfo(userAlias, worldName, stateName);
 | 
	
		
			
				|  |  | +  //         states[stateName] = info;
 | 
	
		
			
				|  |  | +  //       }
 | 
	
		
			
				|  |  | +  //     }
 | 
	
		
			
				|  |  | +  //     return states
 | 
	
		
			
				|  |  | +  //   }).then();
 | 
	
		
			
				|  |  | +  //   //return states
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async getStateInfo(user, space, saveName) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let userPub = await _LCSDB.get('users').get(user).get('pub').once().then();
 | 
	
		
			
				|  |  | +    var db = _LCSDB.user(userPub);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (_LCSUSER.is) {
 | 
	
		
			
				|  |  | +      if (_LCSUSER.is.alias == user)
 | 
	
		
			
				|  |  | +        db = _LCSUSER;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    var info = {};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let docName = 'savestate_/' + space + '/' + saveName + '_info_vwf_json';
 | 
	
		
			
				|  |  | +    let world = await db.get('documents').get(space).get(docName).once().then();
 | 
	
		
			
				|  |  | +    if (world) {
 | 
	
		
			
				|  |  | +      let doc = await db.get('documents').get(space).get(docName).once((res) => {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (res && res !== 'null') {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          if (res.file && res.file !== 'null') {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            let worldDesc = JSON.parse(res.file);
 | 
	
		
			
				|  |  | +            let root = Object.keys(worldDesc)[0];
 | 
	
		
			
				|  |  | +            var appInfo = worldDesc[root]['en'];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            let langID = localStorage.getItem('krestianstvo_locale');
 | 
	
		
			
				|  |  | +            if (langID) {
 | 
	
		
			
				|  |  | +              appInfo = worldDesc[root][langID]
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            info = {
 | 
	
		
			
				|  |  | +              'worldName': space + '/load/' + saveName,
 | 
	
		
			
				|  |  | +              'created': res.created ? res.created : res.modified,
 | 
	
		
			
				|  |  | +              'modified': res.modified,
 | 
	
		
			
				|  |  | +              'type': 'saveState',
 | 
	
		
			
				|  |  | +              'userAlias': user,
 | 
	
		
			
				|  |  | +              'info': appInfo
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }).then();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return info
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async getWorldInfo(user, space) {
 | 
	
		
			
				|  |  | +    //get space for user
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let userPub = await _LCSDB.get('users').get(user).get('pub').once().then();
 | 
	
		
			
				|  |  | +    var db = _LCSDB.user(userPub);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (_LCSUSER.is) {
 | 
	
		
			
				|  |  | +      if (_LCSUSER.is.alias == user)
 | 
	
		
			
				|  |  | +        db = _LCSUSER;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var info = {};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let world = await db.get('worlds').get(space).once().then();
 | 
	
		
			
				|  |  | +    if (world) {
 | 
	
		
			
				|  |  | +      let doc = await db.get('worlds').get(space).get('info_json').once((res) => {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (res && res !== 'null') {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          if (res.file && res.file !== 'null') {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            let worldDesc = JSON.parse(res.file);
 | 
	
		
			
				|  |  | +            let root = Object.keys(worldDesc)[0];
 | 
	
		
			
				|  |  | +            var appInfo = worldDesc[root]['en'];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            let langID = localStorage.getItem('krestianstvo_locale');
 | 
	
		
			
				|  |  | +            if (langID) {
 | 
	
		
			
				|  |  | +              appInfo = worldDesc[root][langID]
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            info = {
 | 
	
		
			
				|  |  | +              'worldName': space,
 | 
	
		
			
				|  |  | +              'created': res.created ? res.created : res.modified,
 | 
	
		
			
				|  |  | +              'modified': res.modified,
 | 
	
		
			
				|  |  | +              'type': 'proto',
 | 
	
		
			
				|  |  | +              'userAlias': user,
 | 
	
		
			
				|  |  | +              'info': appInfo
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }).then();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return info
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 |