1
1
package main
2
2
3
- ////// THIS CODE IS RELEASED INTO THE PUBLIC DOMAIN. SEE "UNLICENSE" FOR MORE INFORMATION. http://unlicense.org //////
4
-
5
3
import (
6
4
"fmt"
7
- "github.com/Axxim/Minotar"
8
5
"github.com/gorilla/mux"
6
+ "github.com/minotar/minecraft"
9
7
"image"
10
8
"io"
11
9
"log"
@@ -18,21 +16,22 @@ import (
18
16
)
19
17
20
18
const (
21
- DEFAULT_SIZE = uint (180 )
22
- MAX_SIZE = uint (300 )
23
- MIN_SIZE = uint (8 )
19
+ DefaultSize = uint (180 )
20
+ MaxSize = uint (300 )
21
+ MinSize = uint (8 )
24
22
25
- STATIC_LOCATION = "static"
23
+ StaticLocation = "www"
24
+ SkinCache
26
25
27
- LISTEN_ON = ":9999"
26
+ ListenOn = ":9999"
28
27
29
- MINUTES uint = 60
30
- HOURS = 60 * MINUTES
31
- DAYS = 24 * HOURS
32
- TIMEOUT_ACTUAL_SKIN = 2 * DAYS
33
- TIMEOUT_FAILED_FETCH = 15 * MINUTES
28
+ Minutes uint = 60
29
+ Hours = 60 * Minutes
30
+ Days = 24 * Hours
31
+ TimeoutActualSkin = 2 * Days
32
+ TimeoutFailedFetch = 15 * Minutes
34
33
35
- SERVICE_VERSION = "0.3 "
34
+ MinotarVersion = "1.0 "
36
35
)
37
36
38
37
func serveStatic (w http.ResponseWriter , r * http.Request , inpath string ) error {
@@ -43,7 +42,7 @@ func serveStatic(w http.ResponseWriter, r *http.Request, inpath string) error {
43
42
inpath = "/" + inpath
44
43
r .URL .Path = inpath
45
44
}
46
- path := STATIC_LOCATION + inpath
45
+ path := StaticLocation + inpath
47
46
48
47
f , err := os .Open (path )
49
48
if err != nil {
@@ -102,11 +101,11 @@ func rationalizeSize(inp string) uint {
102
101
out64 , err := strconv .ParseUint (inp , 10 , 0 )
103
102
out := uint (out64 )
104
103
if err != nil {
105
- return DEFAULT_SIZE
106
- } else if out > MAX_SIZE {
107
- return MAX_SIZE
108
- } else if out < MIN_SIZE {
109
- return MIN_SIZE
104
+ return DefaultSize
105
+ } else if out > MaxSize {
106
+ return MaxSize
107
+ } else if out < MinSize {
108
+ return MinSize
110
109
}
111
110
return out
112
111
}
@@ -124,7 +123,7 @@ func timeBetween(timeA time.Time, timeB time.Time) int64 {
124
123
return timeB .Sub (timeA ).Nanoseconds () / 1000000
125
124
}
126
125
127
- func fetchImageProcessThen (callback func (minotar .Skin ) (image.Image , error )) func (w http.ResponseWriter , r * http.Request ) {
126
+ func fetchImageProcessThen (callback func (minecraft .Skin ) (image.Image , error )) func (w http.ResponseWriter , r * http.Request ) {
128
127
return func (w http.ResponseWriter , r * http.Request ) {
129
128
timeReqStart := time .Now ()
130
129
@@ -134,22 +133,25 @@ func fetchImageProcessThen(callback func(minotar.Skin) (image.Image, error)) fun
134
133
size := rationalizeSize (vars ["size" ])
135
134
ok := true
136
135
137
- var skin minotar .Skin
136
+ var skin minecraft .Skin
138
137
var err error
139
- if username == "char" {
140
- if skin , err = minotar .FetchSkinForSteve (); err != nil {
141
- serverErrorPage (w , r )
142
- return
143
- }
144
- } else {
145
- if skin , err = minotar .FetchSkinForUser (username ); err != nil {
146
- ok = false
147
- if skin , err = minotar .FetchSkinForSteve (); err != nil {
148
- serverErrorPage (w , r )
149
- return
150
- }
138
+
139
+ // Fetch image using username
140
+ skin , err = minecraft .GetSkin (minecraft.User {Name : username })
141
+ if err != nil {
142
+ // Problem with the returned image, probably means we have an incorrect username
143
+ // Hit the accounts api
144
+ user , err := minecraft .GetUser (username )
145
+
146
+ if err != nil {
147
+ // There's no account for this person, serve char
148
+ skin , _ = minecraft .GetSkin (minecraft.User {Name : "char" })
149
+ } else {
150
+ // Get valid skin
151
+ skin , _ = minecraft .GetSkin (user )
151
152
}
152
153
}
154
+
153
155
timeFetch := time .Now ()
154
156
155
157
img , err := callback (skin )
@@ -159,41 +161,52 @@ func fetchImageProcessThen(callback func(minotar.Skin) (image.Image, error)) fun
159
161
}
160
162
timeProcess := time .Now ()
161
163
162
- imgResized := minotar . Resize (size , size , img )
164
+ imgResized := Resize (size , size , img )
163
165
timeResize := time .Now ()
164
166
165
167
w .Header ().Add ("Content-Type" , "image/png" )
166
168
w .Header ().Add ("X-Requested" , "processed" )
167
169
var timeout uint
168
170
if ok {
169
171
w .Header ().Add ("X-Result" , "ok" )
170
- timeout = TIMEOUT_ACTUAL_SKIN
172
+ timeout = TimeoutActualSkin
171
173
} else {
172
174
w .Header ().Add ("X-Result" , "failed" )
173
- timeout = TIMEOUT_FAILED_FETCH
175
+ timeout = TimeoutFailedFetch
174
176
}
175
- w .Header ().Add ("X-Timing" , fmt .Sprintf ("%d+%d+%d=%d " , timeBetween (timeReqStart , timeFetch ), timeBetween (timeFetch , timeProcess ), timeBetween (timeProcess , timeResize ), timeBetween (timeReqStart , timeResize )))
177
+ w .Header ().Add ("X-Timing" , fmt .Sprintf ("%d+%d+%d=%dms " , timeBetween (timeReqStart , timeFetch ), timeBetween (timeFetch , timeProcess ), timeBetween (timeProcess , timeResize ), timeBetween (timeReqStart , timeResize )))
176
178
addCacheTimeoutHeader (w , timeout )
177
- minotar . WritePNG (w , imgResized )
179
+ WritePNG (w , imgResized )
178
180
}
179
181
}
180
182
func skinPage (w http.ResponseWriter , r * http.Request ) {
181
183
vars := mux .Vars (r )
182
184
183
185
username := vars ["username" ]
184
186
185
- userSkinURL := minotar .URLForUser (username )
186
- resp , err := http .Get (userSkinURL )
187
- if err != nil {
188
- notFoundPage (w , r )
189
- return
190
- }
187
+ user , _ := minecraft .GetUser (username )
188
+ skin , _ := minecraft .GetSkin (user )
189
+
191
190
w .Header ().Add ("Content-Type" , "image/png" )
192
191
w .Header ().Add ("X-Requested" , "skin" )
193
192
w .Header ().Add ("X-Result" , "ok" )
194
- addCacheTimeoutHeader (w , TIMEOUT_ACTUAL_SKIN )
195
- defer resp .Body .Close ()
196
- io .Copy (w , resp .Body )
193
+
194
+ WritePNG (w , skin .Image )
195
+
196
+ /*
197
+ userSkinURL := minotar.URLForUser(username)
198
+ resp, err := http.Get(userSkinURL)
199
+ if err != nil {
200
+ notFoundPage(w, r)
201
+ return
202
+ }
203
+ w.Header().Add("Content-Type", "image/png")
204
+ w.Header().Add("X-Requested", "skin")
205
+ w.Header().Add("X-Result", "ok")
206
+ addCacheTimeoutHeader(w, TIMEOUT_ACTUAL_SKIN)
207
+ defer resp.Body.Close()
208
+ io.Copy(w, resp.Body)
209
+ */
197
210
}
198
211
func downloadPage (w http.ResponseWriter , r * http.Request ) {
199
212
headers := w .Header ()
@@ -202,33 +215,33 @@ func downloadPage(w http.ResponseWriter, r *http.Request) {
202
215
}
203
216
204
217
func main () {
205
- avatarPage := fetchImageProcessThen (func (skin minotar .Skin ) (image.Image , error ) {
206
- return skin . Head ( )
218
+ avatarPage := fetchImageProcessThen (func (skin minecraft .Skin ) (image.Image , error ) {
219
+ return GetHead ( skin )
207
220
})
208
- helmPage := fetchImageProcessThen (func (skin minotar .Skin ) (image.Image , error ) {
209
- return skin . Helm ( )
221
+ helmPage := fetchImageProcessThen (func (skin minecraft .Skin ) (image.Image , error ) {
222
+ return GetHelm ( skin )
210
223
})
211
224
212
225
r := mux .NewRouter ()
213
226
r .NotFoundHandler = NotFoundHandler {}
214
227
215
- r .HandleFunc ("/avatar/{username:" + minotar . VALID_USERNAME_REGEX + "}{extension:(.png)?}" , avatarPage )
216
- r .HandleFunc ("/avatar/{username:" + minotar . VALID_USERNAME_REGEX + "}/{size:[0-9]+}{extension:(.png)?}" , avatarPage )
228
+ r .HandleFunc ("/avatar/{username:" + minecraft . ValidUsernameRegex + "}{extension:(.png)?}" , avatarPage )
229
+ r .HandleFunc ("/avatar/{username:" + minecraft . ValidUsernameRegex + "}/{size:[0-9]+}{extension:(.png)?}" , avatarPage )
217
230
218
- r .HandleFunc ("/helm/{username:" + minotar . VALID_USERNAME_REGEX + "}{extension:(.png)?}" , helmPage )
219
- r .HandleFunc ("/helm/{username:" + minotar . VALID_USERNAME_REGEX + "}/{size:[0-9]+}{extension:(.png)?}" , helmPage )
231
+ r .HandleFunc ("/helm/{username:" + minecraft . ValidUsernameRegex + "}{extension:(.png)?}" , helmPage )
232
+ r .HandleFunc ("/helm/{username:" + minecraft . ValidUsernameRegex + "}/{size:[0-9]+}{extension:(.png)?}" , helmPage )
220
233
221
- r .HandleFunc ("/download/{username:" + minotar . VALID_USERNAME_REGEX + "}{extension:(.png)?}" , downloadPage )
234
+ r .HandleFunc ("/download/{username:" + minecraft . ValidUsernameRegex + "}{extension:(.png)?}" , downloadPage )
222
235
223
- r .HandleFunc ("/skin/{username:" + minotar . VALID_USERNAME_REGEX + "}{extension:(.png)?}" , skinPage )
236
+ r .HandleFunc ("/skin/{username:" + minecraft . ValidUsernameRegex + "}{extension:(.png)?}" , skinPage )
224
237
225
238
r .HandleFunc ("/version" , func (w http.ResponseWriter , r * http.Request ) {
226
- fmt .Fprintf (w , "%s" , SERVICE_VERSION )
239
+ fmt .Fprintf (w , "%s" , MinotarVersion )
227
240
})
228
241
229
242
r .HandleFunc ("/" , indexPage )
230
243
231
244
http .Handle ("/" , r )
232
245
http .HandleFunc ("/assets/" , serveAssetPage )
233
- log .Fatalln (http .ListenAndServe (LISTEN_ON , nil ))
246
+ log .Fatalln (http .ListenAndServe (ListenOn , nil ))
234
247
}
0 commit comments