/* WebChunk, web server for block game maps Copyright (C) 2022 Maxim Zhuchkov This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Contact me via mail: q3.max.2011@yandex.ru or Discord: MaX#6717 */ package main import ( "net/http" "regexp" "time" "github.com/maxsupermanhd/WebChunk/chunkStorage" ) var ( worldNameRegexp = regexp.MustCompile(`[\-a-zA-Z0-9.]+`) worldIPRegexp = regexp.MustCompile(`[\-a-zA-Z0-9.]+`) ) func apiAddWorld(w http.ResponseWriter, r *http.Request) (int, string) { if r.ParseMultipartForm(0) != nil { return 400, "Unable to parse form parameters" } name := r.FormValue("name") if !worldNameRegexp.Match([]byte(name)) { return 400, "Invalid world name" } ip := r.FormValue("ip") if !worldIPRegexp.Match([]byte(ip)) { return 400, "Invalid world ip" } sname := r.FormValue("storage") var driver chunkStorage.ChunkStorage driver = nil storagesLock.Lock() defer storagesLock.Unlock() for sn, s := range storages { if sname == sn { driver = s.Driver } } if driver == nil { return 400, "Storage not found or not initialized" } world := chunkStorage.SWorld{ Name: name, Alias: name, IP: ip, CreatedAt: time.Now(), ModifiedAt: time.Now(), Data: chunkStorage.CreateDefaultLevelData(name), } err := driver.AddWorld(world) if err != nil { return 500, "Failed to add world: " + err.Error() } setContentTypeJson(w) return marshalOrFail(200, world) } func apiListWorlds(w http.ResponseWriter, _ *http.Request) (int, string) { worlds := chunkStorage.ListWorlds(storages) setContentTypeJson(w) return marshalOrFail(200, worlds) }
  NODES