mirror of
https://github.com/elyby/chrly.git
synced 2024-08-26 06:40:02 +05:30
84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
package http
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/gorilla/mux"
|
|
"github.com/mono83/slf/wd"
|
|
|
|
"github.com/elyby/chrly/api/mojang"
|
|
"github.com/elyby/chrly/mojangtextures"
|
|
)
|
|
|
|
type UuidsProvider interface {
|
|
GetUuid(username string) (*mojang.ProfileInfo, error)
|
|
}
|
|
|
|
type UUIDsWorker struct {
|
|
ListenSpec string
|
|
|
|
UUIDsProvider mojangtextures.UUIDsProvider
|
|
Logger wd.Watchdog
|
|
}
|
|
|
|
func (ctx *UUIDsWorker) Run() error {
|
|
ctx.Logger.Info(fmt.Sprintf("Starting the worker, HTTP on: %s\n", ctx.ListenSpec))
|
|
|
|
listener, err := net.Listen("tcp", ctx.ListenSpec)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
server := &http.Server{
|
|
ReadTimeout: 60 * time.Second,
|
|
WriteTimeout: 60 * time.Second, // TODO: should I adjust this values?
|
|
MaxHeaderBytes: 1 << 16,
|
|
Handler: ctx.CreateHandler(),
|
|
}
|
|
|
|
return server.Serve(listener)
|
|
}
|
|
|
|
func (ctx *UUIDsWorker) CreateHandler() http.Handler {
|
|
router := mux.NewRouter().StrictSlash(true)
|
|
router.NotFoundHandler = http.HandlerFunc(NotFound)
|
|
|
|
router.Handle("/api/worker/mojang-uuid/{username}", http.HandlerFunc(ctx.GetUUID)).Methods("GET")
|
|
|
|
return router
|
|
}
|
|
|
|
func (ctx *UUIDsWorker) GetUUID(response http.ResponseWriter, request *http.Request) {
|
|
username := parseUsername(mux.Vars(request)["username"])
|
|
profile, err := ctx.UUIDsProvider.GetUuid(username)
|
|
if err != nil {
|
|
if _, ok := err.(*mojang.TooManyRequestsError); ok {
|
|
ctx.Logger.Warning("Got 429 Too Many Requests")
|
|
response.WriteHeader(http.StatusTooManyRequests)
|
|
return
|
|
}
|
|
|
|
ctx.Logger.Warning("Got non success response: :err", wd.ErrParam(err))
|
|
response.Header().Set("Content-Type", "application/json")
|
|
response.WriteHeader(http.StatusInternalServerError)
|
|
result, _ := json.Marshal(map[string]interface{}{
|
|
"provider": err.Error(),
|
|
})
|
|
_, _ = response.Write(result)
|
|
return
|
|
}
|
|
|
|
if profile == nil {
|
|
response.WriteHeader(http.StatusNoContent)
|
|
return
|
|
}
|
|
|
|
response.Header().Set("Content-Type", "application/json")
|
|
responseData, _ := json.Marshal(profile)
|
|
_, _ = response.Write(responseData)
|
|
}
|