initial commit

This commit is contained in:
2026-03-05 12:21:18 +03:00
commit 992db80ea3
16 changed files with 623 additions and 0 deletions

125
app/routes.go Normal file
View File

@@ -0,0 +1,125 @@
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)
}