diff --git a/server/go.mod b/server/go.mod index 5ae9cc0..ea0c822 100644 --- a/server/go.mod +++ b/server/go.mod @@ -5,6 +5,7 @@ go 1.22.0 toolchain go1.22.2 require ( + github.com/deckarep/golang-set/v2 v2.6.0 github.com/gin-gonic/gin v1.9.1 github.com/mattn/go-colorable v0.1.13 github.com/sirupsen/logrus v1.9.3 diff --git a/server/go.sum b/server/go.sum index 23d667d..875f59b 100644 --- a/server/go.sum +++ b/server/go.sum @@ -11,6 +11,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/gin-contrib/cors v1.7.1 h1:s9SIppU/rk8enVvkzwiC2VK3UZ/0NNGsWfUKvV55rqs= diff --git a/server/utils/minecraft.go b/server/utils/minecraft.go new file mode 100644 index 0000000..c69ad4e --- /dev/null +++ b/server/utils/minecraft.go @@ -0,0 +1,148 @@ +package utils + +import ( + "bytes" + "encoding/json" + "errors" + "io" + "net/http" +) + +type OnlineUUIDStruct struct { + ID string `json:"id"` + Name string `json:"name"` +} + +func GetMinecraftInfoFromName(name string) (*OnlineUUIDStruct, error) { + resp, err := http.Get("https://api.mojang.com/users/profiles/minecraft/" + name) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + onlineUUID := OnlineUUIDStruct{} + if err = json.Unmarshal(body, &onlineUUID); err != nil { + return nil, err + } + + return &onlineUUID, nil +} + +func getMinecraftInfosFrom10Names(names []string) (*[]OnlineUUIDStruct, error) { + size := len(names) + if size > 10 { + return nil, errors.New("Too many names") + } + + if size == 0 { + return &[]OnlineUUIDStruct{}, nil + } + + nameString, err := json.Marshal(names) + if err != nil { + return nil, err + } + + resp, err := http.Post("https://api.mojang.com/profiles/minecraft", "application/json", bytes.NewBuffer(nameString)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + result := []OnlineUUIDStruct{} + if err = json.Unmarshal(body, &result); err != nil { + return nil, err + } + + return &result, nil +} + +func GetMinecraftInfosFromNames(names ...string) ([]*OnlineUUIDStruct, error) { + results := []OnlineUUIDStruct{} + max := len(names) + for i := 0; i < max; i += 10 { + end := i + 10 + if end > max { + end = max + } + + sliceNames := names[i:end] + result, err := getMinecraftInfosFrom10Names(sliceNames) + if err != nil { + continue + } + + results = append(results, *result...) + } + // if err != nil { + // getOnes(sliceNames...) + // return + // } + // defer resp.Body.Close() + + // body, err := io.ReadAll(resp.Body) + // if err != nil { + // getOnes(sliceNames...) + // return + // } + + // onlineUUID := []OnlineUUIDStruct{} + // if err := json.Unmarshal(body, &onlineUUID); err != nil { + // getOnes(sliceNames...) + // return + // } + return nil, nil + + // go func(start, end int) { + // defer wg.Done() + + // sliceNames := names[start:end] + // nameString, err := json.Marshal(sliceNames) + // if err != nil { + // getOnes(sliceNames...) + // return + // } + + // resp, err := http.Post("https://api.mojang.com/profiles/minecraft", "application/json", bytes.NewBuffer(nameString)) + // if err != nil { + // getOnes(sliceNames...) + // return + // } + // defer resp.Body.Close() + + // body, err := io.ReadAll(resp.Body) + // if err != nil { + // getOnes(sliceNames...) + // return + // } + + // onlineUUID := []OnlineUUIDStruct{} + // if err := json.Unmarshal(body, &onlineUUID); err != nil { + // getOnes(sliceNames...) + // return + // } + + // // Check if the length is equal + // if len(onlineUUID) != len(sliceNames) { + // getOnes(sliceNames...) + // return + // } + + // mu.Lock() + // defer mu.Unlock() + // for _, u := range onlineUUID { + // result[u.Name] = u.ID + // } + // }(i, end) + +} diff --git a/server/utils/minecraft_test.go b/server/utils/minecraft_test.go new file mode 100644 index 0000000..76f1ab4 --- /dev/null +++ b/server/utils/minecraft_test.go @@ -0,0 +1,68 @@ +package utils + +import ( + "fmt" + "testing" + + mapset "github.com/deckarep/golang-set/v2" +) + +func TestGetMinecraftInfoFromName(t *testing.T) { + for _, name := range []string{"Steve", "StevE"} { + info, err := GetMinecraftInfoFromName(name) + if err != nil { + t.Error(err) + continue + } + + if info == nil { + t.Errorf("Expected info, got nil") + continue + } + + if info.Name != "Steve" { + t.Errorf("Expected name Steve, got %s", info.Name) + } else if info.ID != "8667ba71b85a4004af54457a9734eed7" { + t.Errorf("Expected 8667ba71b85a4004af54457a9734eed7, got %s", info.ID) + } + } +} + +func TestGetMinecraftInfosFrom10Names(t *testing.T) { + names := []string{ + "Steve", "Alex", "Noor", "Sunny", "Ari", + "Zuri", "Makena", "Kai", "Efe", + } + + infos, err := getMinecraftInfosFrom10Names(names) + if err != nil { + t.Error(err) + return + } + + players := mapset.NewSet( + OnlineUUIDStruct{ID: "ec561538f3fd461daff5086b22154bce", Name: "Alex"}, + OnlineUUIDStruct{ID: "938e960d50ab489b9b2aaf3751942989", Name: "Ari"}, + OnlineUUIDStruct{ID: "20bf454f34e34010a378613546e3d0f9", Name: "efe"}, + OnlineUUIDStruct{ID: "cf9858b6ed4946538e47f0e4214539f7", Name: "Kai"}, + OnlineUUIDStruct{ID: "6c4bc87ce82944efa1ad63d45e2b9545", Name: "Makena"}, + OnlineUUIDStruct{ID: "2d9f2227592b481d8433d13b69473ccc", Name: "noor"}, + OnlineUUIDStruct{ID: "8667ba71b85a4004af54457a9734eed7", Name: "Steve"}, + OnlineUUIDStruct{ID: "bafbe1cb77b348099fa3c89604bda644", Name: "Sunny"}, + OnlineUUIDStruct{ID: "f5e039b93b8a45109ee8e7552e098c55", Name: "Zuri"}, + ) + fmt.Println(players.Difference(mapset.NewSet(*infos...))) + + // waitMatchData := mapset.NewSet(*infos...) + // waitMatchData.Difference() + // for _, player := range players { + // if waitMatchData.Contains(player) { + // waitMatchData.Remove(player) + // } else { + // t.Errorf("Expected %v, got nil", player) + // } + // } + // if waitMatchData.Cardinality() != 0 { + // t.Errorf("Expected 0, got %d", waitMatchData.Cardinality()) + // } +}