commit 376dc2591d6fd3ede21981b88fa491d0a09f69bb Author: KittenTM Date: Fri Mar 27 02:43:32 2026 +0100 Initial Commit diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..0fee156 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module mii-fetch + +go 1.22 diff --git a/handlers/mii.go b/handlers/mii.go new file mode 100644 index 0000000..7f998e4 --- /dev/null +++ b/handlers/mii.go @@ -0,0 +1,36 @@ +package handlers + +import ( + "net/http" + "strings" + + "mii-fetch/services" +) + +func MiiHandler(w http.ResponseWriter, r *http.Request) { + path := strings.TrimPrefix(r.URL.Path, "/") + parts := strings.Split(path, "/") + + if len(parts) < 2 { + http.Error(w, "Invalid request", http.StatusBadRequest) + return + } + + pid := parts[0] + filename := parts[1] + + // block favicon cuz fuck u + if strings.Contains(pid, "favicon") || strings.Contains(filename, "favicon") { + w.WriteHeader(http.StatusNoContent) + return + } + + imgBytes, err := services.FetchMii(pid) + if err != nil { + http.Error(w, err.Message, err.Code) + return + } + + w.Header().Set("Content-Type", "image/png") + w.Write(imgBytes) +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..5ffce76 --- /dev/null +++ b/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "log" + "net/http" + + "mii-fetch/handlers" +) + +func main() { + mux := http.NewServeMux() + mux.HandleFunc("/", handlers.MiiHandler) + + log.Println("server running on :80") + err := http.ListenAndServe(":80", mux) + if err != nil { + log.Fatal(err) + } +} diff --git a/services/mii_handler.go b/services/mii_handler.go new file mode 100644 index 0000000..1609ede --- /dev/null +++ b/services/mii_handler.go @@ -0,0 +1,67 @@ +package services + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" + "time" +) + +type ServiceError struct { + Message string + Code int +} + +func FetchMii(pid string) ([]byte, *ServiceError) { + client := &http.Client{Timeout: 10 * time.Second} + + spfnURL := fmt.Sprintf("https://account.spfn.net/api/v2/users/%s/mii", pid) + + req, _ := http.NewRequest("GET", spfnURL, nil) + req.Header.Set("Accept", "application/json") + req.Header.Set("User-Agent", "what we think about v/s 6.0?") + + resp, err := client.Do(req) + if err != nil { + return nil, &ServiceError{"internal server error", 500} + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + return nil, &ServiceError{"user not found", 404} + } + + body, _ := io.ReadAll(resp.Body) + + var miiData string + if err := json.Unmarshal(body, &miiData); err != nil { + return nil, &ServiceError{"invalid response", 500} + } + + miiData = strings.TrimSpace(miiData) + miiData = strings.ReplaceAll(miiData, "\r", "") + miiData = strings.ReplaceAll(miiData, "\n", "") + + encoded := url.QueryEscape(miiData) + + renderURL := fmt.Sprintf( + "https://mii-unsecure.ariankordi.net/miis/image.png?data=%s&resourceType=very_high&type=face&width=256", + encoded, + ) + + imgResp, err := client.Get(renderURL) + if err != nil { + return nil, &ServiceError{"renderer failed", 502} + } + defer imgResp.Body.Close() + + if imgResp.StatusCode != 200 { + return nil, &ServiceError{"mii renderer failed", 502} + } + + imgBytes, _ := io.ReadAll(imgResp.Body) + return imgBytes, nil +} diff --git a/utils/http.go b/utils/http.go new file mode 100644 index 0000000..d4b585b --- /dev/null +++ b/utils/http.go @@ -0,0 +1 @@ +package utils