diff --git a/.gitignore b/.gitignore index 7a69ae4..9fa1115 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,6 @@ go.work.sum # env file .env -testconfig.json \ No newline at end of file +testconfig.json +go.sum +main \ No newline at end of file diff --git a/miku/go.mod b/miku/go.mod new file mode 100644 index 0000000..3efb0e9 --- /dev/null +++ b/miku/go.mod @@ -0,0 +1,9 @@ +module main + +go 1.24.2 + +replace miku/users => ../users/ + +require miku/users v0.0.0-00010101000000-000000000000 + +require github.com/google/uuid v1.6.0 // indirect diff --git a/miku/main.go b/miku/main.go new file mode 100644 index 0000000..7257d90 --- /dev/null +++ b/miku/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "encoding/json" + "fmt" + "log" + "miku/users" + "os" +) + +func main() { + var confFile map[string]interface{} + file, err := os.ReadFile("../testconfig.json") + if err != nil { + fmt.Println(err) + } + err = json.Unmarshal(file, &confFile) + if err != nil { + fmt.Println(err) + } + vlessUsers := users.MapToStruct(confFile) + newUsers := vlessUsers.Add("test") + newConfFile, err := users.StructToConfig(newUsers, confFile) + if err != nil { + log.Println(err) + } + log.Println(newConfFile) +} diff --git a/users/go.mod b/users/go.mod new file mode 100644 index 0000000..f799f58 --- /dev/null +++ b/users/go.mod @@ -0,0 +1,5 @@ +module users + +go 1.24.2 + +require github.com/google/uuid v1.6.0 diff --git a/users/users.go b/users/users.go new file mode 100644 index 0000000..3256c26 --- /dev/null +++ b/users/users.go @@ -0,0 +1,73 @@ +package users + +import ( + "encoding/json" + "log" + + "github.com/google/uuid" +) + +type VLESSUsers []struct { + Name string `json:"name"` + UUID uuid.UUID `json:"uuid"` +} + +func (u VLESSUsers) Del(user string) VLESSUsers { + var newU VLESSUsers + for _, v := range u { + if v.Name != user { + newU = append(newU, v) + } + } + return newU +} + +func (u VLESSUsers) Add(user string) VLESSUsers { + var userStruct struct { + Name string + UUID uuid.UUID + } + userStruct.Name = user + randUUID, err := uuid.NewUUID() + if err != nil { + log.Println(err) + } + userStruct.UUID = randUUID + + newU := append(u, struct { + Name string "json:\"name\"" + UUID uuid.UUID "json:\"uuid\"" + }(userStruct)) + return newU +} + +func MapToStruct(toStructMap map[string]interface{}) VLESSUsers { + var vlessUsers VLESSUsers + usedMap := toStructMap["inbounds"].([]interface{})[0].(map[string]interface{})["users"].([]interface{}) + for _, curretMap := range usedMap { + userMap := curretMap.(map[string]interface{}) + vlessUsers = append(vlessUsers, struct { + Name string "json:\"name\"" + UUID uuid.UUID "json:\"uuid\"" + }{ + Name: userMap["name"].(string), + UUID: uuid.MustParse(userMap["uuid"].(string)), + }) + } + return vlessUsers +} + +func StructToConfig(vlessUsers VLESSUsers, configMap map[string]interface{}) (map[string]interface{}, error) { + var toInterface []map[string]interface{} + newConfigMap := configMap + structJson, err := json.Marshal(vlessUsers) + if err != nil { + return map[string]interface{}{}, err + } + err = json.Unmarshal(structJson, &toInterface) + if err != nil { + return map[string]interface{}{}, err + } + newConfigMap["inbounds"].([]interface{})[0].(map[string]interface{})["users"] = toInterface + return newConfigMap, nil +}