package app import ( "encoding/base64" "log" "net/http" "strconv" "strings" "github.com/go-chi/chi/v5" ) var hosts = []string{ "185.231.245.25", "46.243.6.125", } func AddNode(w http.ResponseWriter, r *http.Request) { type AddNodeReq struct { Token string `json:"token"` URL string `json:"url"` } req, err := ReadBody[AddNodeReq](r.Body) if err != nil { log.Println(err) } rep := NewNodeRepository(db) node, err := rep.Create(req.Token, req.URL) WriteResponseOrError(w, node, err) } func GetNodes(w http.ResponseWriter, r *http.Request) { rep := NewNodeRepository(db) nodes, err := rep.All() WriteResponseOrError(w, nodes, err) } func GetNodeById(w http.ResponseWriter, r *http.Request) { id := chi.URLParam(r, "id") nodeId, err := strconv.Atoi(id) if err != nil { WriteError(w, err) return } rep := NewNodeRepository(db) node, err := rep.Find(nodeId) WriteResponseOrError(w, node, err) } func AddUser(w http.ResponseWriter, r *http.Request) { rep := NewNodeRepository(db) nodes, err := rep.All() if err != nil { WriteError(w, err) return } type AddUserReq struct { Username string `json:"username"` Password string `json:"password"` } req, err := ReadBody[AddUserReq](r.Body) if err != nil { WriteError(w, err) return } var user User for _, node := range nodes { manager := NewNodeManager(node) user, err = manager.AddUser(req.Username, req.Password) if err != nil { WriteError(w, err) return } } WriteResponseOrError(w, user, err) } func Sub(w http.ResponseWriter, r *http.Request) { idS := chi.URLParam(r, "id") userId, err := strconv.ParseUint(idS, 10, 32) if err != nil { log.Println(err) return } rep := NewNodeRepository(db) nodes, err := rep.All() if err != nil { WriteError(w, err) return } subs := make([]string, 0) for _, node := range nodes { manager := NewNodeManager(node) conf, hystConf, err := manager.LoadConfig() if err != nil { WriteError(w, err) continue } key, err := manager.GetUserKey(userId) if err != nil { WriteError(w, err) return } user, err := manager.GetUser(userId) if err != nil { WriteError(w, err) return } hystUrl := buildSubUrl(conf, hystConf, key, user) subs = append(subs, hystUrl) } sub := []byte(base64.StdEncoding.EncodeToString([]byte(strings.Join(subs, "\n")))) w.Header().Set("Content-Type", "text/plain; charset=utf-8") w.Header().Set("Content-Length", strconv.Itoa(len(sub))) w.Header().Set("Content-Disposition", `attachment; filename="ScuroNeko"`) w.Header().Set("profile-web-page-url", "http://185.231.245.25:9997/sub/1") w.Header().Set("support-url", "https://t.me/scuroneko") w.Header().Set("profile-title", "base64:YmFuLm5peDEzLnB3") w.Header().Set("profile-update-interval", "12") w.Header().Set("subscription-userinfo", "upload=0; download=197782510450; total=0; expire=0") w.WriteHeader(200) w.Write(sub) }