package main import ( "encoding/json" "fmt" "net/http" "strings" ) func SettingsSaveEndpoint(w http.ResponseWriter, r *http.Request) { var req struct { Plec struct { UploadUrl string `json:"uploadUrl"` OriginUrl string `json:"originUrl"` PreviewBase string `json:"previewBase"` SkipExistsCheck bool `json:"skipExistsCheck"` WpUsername string `json:"wpUsername"` WpPassword string `json:"wpPassword"` } `json:"plec"` Applovin struct { Cookie string `json:"cookie"` DelayMs int `json:"delayMs"` RandomizeUserAgent *bool `json:"randomizeUserAgent"` } `json:"applovin"` SendToMobile struct { Port int `json:"port"` } `json:"sendToMobile"` DeviceSimulator struct { DevicesURL string `json:"devicesUrl"` LanguagesURL string `json:"languagesUrl"` } `json:"deviceSimulator"` ProjectInitManifestURL string `json:"projectInitManifestUrl"` } if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeJSON(w, map[string]any{"ok": false, "error": err.Error()}) return } cfg := LoadConfig() cfg.Plec.UploadUrl = strings.TrimSpace(req.Plec.UploadUrl) cfg.Plec.OriginUrl = strings.TrimSpace(req.Plec.OriginUrl) cfg.Plec.PreviewBase = strings.TrimSpace(req.Plec.PreviewBase) cfg.Plec.SkipExistsCheck = req.Plec.SkipExistsCheck cfg.Plec.WpUsername = strings.TrimSpace(req.Plec.WpUsername) cfg.Plec.WpPassword = req.Plec.WpPassword cfg.Applovin.Cookie = strings.TrimSpace(req.Applovin.Cookie) cfg.Applovin.DelayMs = req.Applovin.DelayMs cfg.Applovin.RandomizeUserAgent = req.Applovin.RandomizeUserAgent cfg.SendToMobile.Port = req.SendToMobile.Port cfg.DeviceSimulator.DevicesURL = strings.TrimSpace(req.DeviceSimulator.DevicesURL) cfg.DeviceSimulator.LanguagesURL = strings.TrimSpace(req.DeviceSimulator.LanguagesURL) if req.ProjectInitManifestURL != "" { cfg.ProjectInitManifestURL = strings.TrimSpace(req.ProjectInitManifestURL) } // Invalidate remote cache when URLs change simCache.mu.Lock() if simCache.devURL != cfg.DeviceSimulator.DevicesURL { simCache.devURL = "" simCache.devices = "" } if simCache.langURL != cfg.DeviceSimulator.LanguagesURL { simCache.langURL = "" simCache.languages = "" } simCache.mu.Unlock() if err := SaveConfig(cfg); err != nil { writeJSON(w, map[string]any{"ok": false, "error": err.Error()}) return } writeJSON(w, map[string]any{"ok": true}) } func htmlEsc(s string) string { s = strings.ReplaceAll(s, "&", "&") s = strings.ReplaceAll(s, "<", "<") s = strings.ReplaceAll(s, ">", ">") s = strings.ReplaceAll(s, `"`, """) return s } func checkedAttr(v bool) string { if v { return "checked" } return "" } func intStr(n int) string { return fmt.Sprintf("%d", n) }