126 lines
2.9 KiB
Go
126 lines
2.9 KiB
Go
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)
|
|
}
|