mii-fetch/services/mii_handler.go
2026-05-07 08:30:07 +02:00

67 lines
1.5 KiB
Go

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
}