From a2a99a8dcca0d1269bd945a0094059fb6293cca3 Mon Sep 17 00:00:00 2001 From: trafficlunar Date: Sat, 28 Jun 2025 14:12:32 +0100 Subject: [PATCH] feat: roblox likes route --- .env.example | 5 ++++- internal/handler/roblox.go | 12 ++++++++++++ internal/model/roblox.go | 9 +++++++++ internal/server/router.go | 1 + internal/service/roblox.go | 36 ++++++++++++++++++++++++++++++++++++ internal/worker/roblox.go | 18 ++++++++++++++++++ internal/worker/worker.go | 1 + 7 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 internal/handler/roblox.go create mode 100644 internal/model/roblox.go create mode 100644 internal/service/roblox.go create mode 100644 internal/worker/roblox.go diff --git a/.env.example b/.env.example index 7f7b90a..a27f2d9 100644 --- a/.env.example +++ b/.env.example @@ -14,4 +14,7 @@ GITHUB_PROJECTS="trafficlunar/options-profiles,trafficlunar/blockmatic" GITHUB_TOKEN="API_KEY_GOES_HERE" # The password for the computer WebSocket -WEBSOCKET_PASSWORD="PASSWORD_GOES_HERE" \ No newline at end of file +WEBSOCKET_PASSWORD="PASSWORD_GOES_HERE" + +# Roblox +GROWAROBLOXIAN_UNIVERSE_ID=7778892933 \ No newline at end of file diff --git a/internal/handler/roblox.go b/internal/handler/roblox.go new file mode 100644 index 0000000..c1460bf --- /dev/null +++ b/internal/handler/roblox.go @@ -0,0 +1,12 @@ +package handler + +import ( + "api/internal/worker" + "encoding/json" + "net/http" +) + +func HandleGetGrowARobloxianLikesCount(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(worker.GrowARobloxianLikes) +} diff --git a/internal/model/roblox.go b/internal/model/roblox.go new file mode 100644 index 0000000..f1084fb --- /dev/null +++ b/internal/model/roblox.go @@ -0,0 +1,9 @@ +package model + +type RobloxGameVotesAPI struct { + Data []struct { + Id int `json:"id"` + Upvotes int `json:"upVotes"` + Downvotes int `json:"downVotes"` + } `json:"data"` +} diff --git a/internal/server/router.go b/internal/server/router.go index 635ef51..82304fe 100644 --- a/internal/server/router.go +++ b/internal/server/router.go @@ -57,6 +57,7 @@ func NewRouter() { r.Get("/projects", handler.HandleGetProjects) r.Get("/computer", handler.HandleComputerGraphData) r.Get("/computer/ws", handler.HandleComputerWebSocket) + r.Get("/roblox/grow-a-robloxian/likes", handler.HandleGetGrowARobloxianLikesCount) port := os.Getenv("PORT") if len(port) == 0 { diff --git a/internal/service/roblox.go b/internal/service/roblox.go new file mode 100644 index 0000000..ec19aed --- /dev/null +++ b/internal/service/roblox.go @@ -0,0 +1,36 @@ +package service + +import ( + "api/internal/model" + "encoding/json" + "fmt" + "io" + "log/slog" + "net/http" + "os" +) + +func GetRobloxGrowARobloxianLikesCount() int { + url := fmt.Sprintf("https://games.roblox.com/v1/games/votes?universeIds=%s", os.Getenv("GROWAROBLOXIAN_UNIVERSE_ID")) + res, err := http.Get(url) + if err != nil { + slog.Error("Error requesting Roblox votes API", slog.Any("error", err)) + return 0 + } + + body, err := io.ReadAll(res.Body) + if err != nil { + slog.Error("Error reading body", slog.Any("error", err)) + return 0 + } + + var apiData model.RobloxGameVotesAPI + + err = json.Unmarshal(body, &apiData) + if err != nil { + slog.Error("Error unmarshalling JSON", slog.Any("error", err)) + return 0 + } + + return apiData.Data[0].Upvotes +} diff --git a/internal/worker/roblox.go b/internal/worker/roblox.go new file mode 100644 index 0000000..35f321f --- /dev/null +++ b/internal/worker/roblox.go @@ -0,0 +1,18 @@ +package worker + +import ( + "api/internal/service" + "log/slog" + "time" +) + +var GrowARobloxianLikes int + +func StartRobloxWorker() { + slog.Info("Starting Roblox worker...") + GrowARobloxianLikes = service.GetRobloxGrowARobloxianLikesCount() + + for range time.Tick(1 * time.Minute) { + GrowARobloxianLikes = service.GetRobloxGrowARobloxianLikesCount() + } +} diff --git a/internal/worker/worker.go b/internal/worker/worker.go index 232988a..3c0d707 100644 --- a/internal/worker/worker.go +++ b/internal/worker/worker.go @@ -5,4 +5,5 @@ func StartWorkers() { go StartLastFMWorker() go StartGitHubWorker() go StartComputerWorker() + go StartRobloxWorker() }