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-renderer.spfn.net/miis/image.png?data=%s&resourceType=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 }