@@ -12,11 +12,42 @@ import { StatisticsResponse } from "./types/response/statistics-response";
1212import { Skin } from "./types/player/skin/skin" ;
1313import { Page } from "./types/pagination/pagination" ;
1414
15+ type RequestOptions = RequestInit & { responseType ?: "json" | "arrayBuffer" } ;
16+
1517export class McUtilsAPI {
1618 private readonly endpoint : string ;
19+ private readonly fetchOptions ?: RequestInit ;
1720
18- constructor ( endpoint : string = "https://mc.fascinated.cc/api" ) {
21+ constructor (
22+ endpoint : string = "https://mc.fascinated.cc/api" ,
23+ fetchOptions ?: RequestInit
24+ ) {
1925 this . endpoint = endpoint ;
26+ this . fetchOptions = fetchOptions ;
27+ }
28+
29+ /**
30+ * Requests data from the API.
31+ *
32+ * @param path the path to the API endpoint
33+ * @param options the options for the request
34+ * @returns the data or the error (if one occurred)
35+ */
36+ private async request < T > (
37+ path : string ,
38+ options ?: RequestOptions
39+ ) : Promise < { data ?: T ; error ?: ErrorResponse } > {
40+ const { responseType = "json" , ...init } = options ?? { } ;
41+ const url = path . startsWith ( "http" ) ? path : `${ this . endpoint } ${ path } ` ;
42+ const response = await fetch ( url , { ...this . fetchOptions , ...init } ) ;
43+
44+ if ( ! response . ok ) {
45+ return { error : ( await response . json ( ) ) as ErrorResponse } ;
46+ }
47+
48+ const data =
49+ responseType === "arrayBuffer" ? await response . arrayBuffer ( ) : await response . json ( ) ;
50+ return { data : data as T } ;
2051 }
2152
2253 /**
@@ -41,15 +72,10 @@ export class McUtilsAPI {
4172 host : string ,
4273 type : ServerPlatform
4374 ) : Promise < { server ?: JavaServer | BedrockServer ; error ?: ErrorResponse } > {
44- const response = await fetch ( `${ this . endpoint } /servers/${ type } /${ host } ` ) ;
45- if ( response . ok ) {
46- return {
47- server : ( await response . json ( ) ) as JavaServer | BedrockServer ,
48- } ;
49- }
50- return {
51- error : ( await response . json ( ) ) as ErrorResponse ,
52- } ;
75+ const { data, error } = await this . request < JavaServer | BedrockServer > (
76+ `/servers/${ type } /${ host } `
77+ ) ;
78+ return error ? { error } : { server : data } ;
5379 }
5480
5581 /**
@@ -61,15 +87,8 @@ export class McUtilsAPI {
6187 async fetchJavaServer (
6288 host : string
6389 ) : Promise < { server ?: JavaServer ; error ?: ErrorResponse } > {
64- const response = await fetch ( `${ this . endpoint } /servers/java/${ host } ` ) ;
65- if ( response . ok ) {
66- return {
67- server : ( await response . json ( ) ) as JavaServer ,
68- } ;
69- }
70- return {
71- error : ( await response . json ( ) ) as ErrorResponse ,
72- } ;
90+ const { data, error } = await this . request < JavaServer > ( `/servers/java/${ host } ` ) ;
91+ return error ? { error } : { server : data } ;
7392 }
7493
7594 /**
@@ -81,15 +100,10 @@ export class McUtilsAPI {
81100 async fetchBedrockServer (
82101 host : string
83102 ) : Promise < { server ?: BedrockServer ; error ?: ErrorResponse } > {
84- const response = await fetch ( `${ this . endpoint } /servers/bedrock/${ host } ` ) ;
85- if ( response . ok ) {
86- return {
87- server : ( await response . json ( ) ) as BedrockServer ,
88- } ;
89- }
90- return {
91- error : ( await response . json ( ) ) as ErrorResponse ,
92- } ;
103+ const { data, error } = await this . request < BedrockServer > (
104+ `/servers/bedrock/${ host } `
105+ ) ;
106+ return error ? { error } : { server : data } ;
93107 }
94108
95109 /**
@@ -101,14 +115,11 @@ export class McUtilsAPI {
101115 async fetchServerBlocked (
102116 host : string
103117 ) : Promise < { blocked ?: boolean ; error ?: ErrorResponse } > {
104- const response = await fetch ( `${ this . endpoint } /servers/blocked/${ host } ` ) ;
105- if ( response . ok ) {
106- const json = ( await response . json ( ) ) as ServerBlockedResponse ;
107- return { blocked : json . blocked } ;
108- }
109- return {
110- error : ( await response . json ( ) ) as ErrorResponse ,
111- } ;
118+ const { data, error } = await this . request < ServerBlockedResponse > (
119+ `/servers/blocked/${ host } `
120+ ) ;
121+ if ( error ) return { error } ;
122+ return { blocked : data ! . blocked } ;
112123 }
113124
114125 /**
@@ -120,13 +131,7 @@ export class McUtilsAPI {
120131 async fetchIpLookup (
121132 query : string
122133 ) : Promise < { data ?: IpLookup ; error ?: ErrorResponse } > {
123- const response = await fetch ( `${ this . endpoint } /ips/${ query } ` ) ;
124- if ( response . ok ) {
125- return { data : ( await response . json ( ) ) as IpLookup } ;
126- }
127- return {
128- error : ( await response . json ( ) ) as ErrorResponse ,
129- } ;
134+ return this . request < IpLookup > ( `/ips/${ query } ` ) ;
130135 }
131136
132137 /**
@@ -138,15 +143,8 @@ export class McUtilsAPI {
138143 async fetchPlayer (
139144 id : string
140145 ) : Promise < { player ?: Player ; error ?: ErrorResponse } > {
141- const response = await fetch ( `${ this . endpoint } /players/${ id } ` ) ;
142- if ( response . ok ) {
143- return {
144- player : ( await response . json ( ) ) as Player ,
145- } ;
146- }
147- return {
148- error : ( await response . json ( ) ) as ErrorResponse ,
149- } ;
146+ const { data, error } = await this . request < Player > ( `/players/${ id } ` ) ;
147+ return error ? { error } : { player : data } ;
150148 }
151149
152150 /**
@@ -158,15 +156,10 @@ export class McUtilsAPI {
158156 async fetchPlayerUuid (
159157 id : string
160158 ) : Promise < { playerName ?: CachedPlayerName ; error ?: ErrorResponse } > {
161- const response = await fetch ( `${ this . endpoint } /players/uuid/${ id } ` ) ;
162- if ( response . ok ) {
163- return {
164- playerName : ( await response . json ( ) ) as CachedPlayerName ,
165- } ;
166- }
167- return {
168- error : ( await response . json ( ) ) as ErrorResponse ,
169- } ;
159+ const { data, error } = await this . request < CachedPlayerName > (
160+ `/players/uuid/${ id } `
161+ ) ;
162+ return error ? { error } : { playerName : data } ;
170163 }
171164
172165 /**
@@ -178,13 +171,11 @@ export class McUtilsAPI {
178171 async fetchServerIcon (
179172 host : string
180173 ) : Promise < { image ?: ArrayBuffer ; error ?: ErrorResponse } > {
181- const response = await fetch ( `${ this . endpoint } /servers/icon/${ host } ` ) ;
182- if ( response . ok ) {
183- return { image : await response . arrayBuffer ( ) } ;
184- }
185- return {
186- error : ( await response . json ( ) ) as ErrorResponse ,
187- } ;
174+ const { data, error } = await this . request < ArrayBuffer > (
175+ `/servers/icon/${ host } ` ,
176+ { responseType : "arrayBuffer" }
177+ ) ;
178+ return error ? { error } : { image : data } ;
188179 }
189180
190181 /**
@@ -200,15 +191,11 @@ export class McUtilsAPI {
200191 host : string ,
201192 size = 768
202193 ) : Promise < { image ?: ArrayBuffer ; error ?: ErrorResponse } > {
203- const response = await fetch (
204- `${ this . endpoint } /servers/${ platform } /preview/${ host } ${ this . buildParams ( { size : String ( size ) } ) } `
194+ const { data, error } = await this . request < ArrayBuffer > (
195+ `/servers/${ platform } /preview/${ host } ${ this . buildParams ( { size : String ( size ) } ) } ` ,
196+ { responseType : "arrayBuffer" }
205197 ) ;
206- if ( response . ok ) {
207- return { image : await response . arrayBuffer ( ) } ;
208- }
209- return {
210- error : ( await response . json ( ) ) as ErrorResponse ,
211- } ;
198+ return error ? { error } : { image : data } ;
212199 }
213200
214201 /**
@@ -220,13 +207,11 @@ export class McUtilsAPI {
220207 async fetchPlayerSkinTexture (
221208 id : string
222209 ) : Promise < { image ?: ArrayBuffer ; error ?: ErrorResponse } > {
223- const response = await fetch ( `${ this . endpoint } /skins/${ id } /texture.png` ) ;
224- if ( response . ok ) {
225- return { image : await response . arrayBuffer ( ) } ;
226- }
227- return {
228- error : ( await response . json ( ) ) as ErrorResponse ,
229- } ;
210+ const { data, error } = await this . request < ArrayBuffer > (
211+ `/skins/${ id } /texture.png` ,
212+ { responseType : "arrayBuffer" }
213+ ) ;
214+ return error ? { error } : { image : data } ;
230215 }
231216
232217 /**
@@ -244,15 +229,11 @@ export class McUtilsAPI {
244229 size = 768 ,
245230 overlays = true
246231 ) : Promise < { image ?: ArrayBuffer ; error ?: ErrorResponse } > {
247- const response = await fetch (
248- `${ this . endpoint } /skins/${ id } /${ part } .png${ this . buildParams ( { size : String ( size ) , overlays : String ( overlays ) } ) } `
232+ const { data, error } = await this . request < ArrayBuffer > (
233+ `/skins/${ id } /${ part } .png${ this . buildParams ( { size : String ( size ) , overlays : String ( overlays ) } ) } ` ,
234+ { responseType : "arrayBuffer" }
249235 ) ;
250- if ( response . ok ) {
251- return { image : await response . arrayBuffer ( ) } ;
252- }
253- return {
254- error : ( await response . json ( ) ) as ErrorResponse ,
255- } ;
236+ return error ? { error } : { image : data } ;
256237 }
257238
258239 /**
@@ -264,13 +245,8 @@ export class McUtilsAPI {
264245 capes ?: Cape [ ] ;
265246 error ?: ErrorResponse ;
266247 } > {
267- const response = await fetch ( `${ this . endpoint } /capes` ) ;
268- if ( response . ok ) {
269- return { capes : ( await response . json ( ) ) as Cape [ ] } ;
270- }
271- return {
272- error : ( await response . json ( ) ) as ErrorResponse ,
273- } ;
248+ const { data, error } = await this . request < Cape [ ] > ( `/capes` ) ;
249+ return error ? { error } : { capes : data } ;
274250 }
275251
276252 /**
@@ -282,13 +258,11 @@ export class McUtilsAPI {
282258 async fetchCapeTexture (
283259 query : string
284260 ) : Promise < { image ?: ArrayBuffer ; error ?: ErrorResponse } > {
285- const response = await fetch ( `${ this . endpoint } /capes/${ query } /texture.png` ) ;
286- if ( response . ok ) {
287- return { image : await response . arrayBuffer ( ) } ;
288- }
289- return {
290- error : ( await response . json ( ) ) as ErrorResponse ,
291- } ;
261+ const { data, error } = await this . request < ArrayBuffer > (
262+ `/capes/${ query } /texture.png` ,
263+ { responseType : "arrayBuffer" }
264+ ) ;
265+ return error ? { error } : { image : data } ;
292266 }
293267
294268 /**
@@ -304,15 +278,11 @@ export class McUtilsAPI {
304278 type : string ,
305279 size = 768
306280 ) : Promise < { image ?: ArrayBuffer ; error ?: ErrorResponse } > {
307- const response = await fetch (
308- `${ this . endpoint } /capes/${ query } /${ type } .png${ this . buildParams ( { size : String ( size ) } ) } `
281+ const { data, error } = await this . request < ArrayBuffer > (
282+ `/capes/${ query } /${ type } .png${ this . buildParams ( { size : String ( size ) } ) } ` ,
283+ { responseType : "arrayBuffer" }
309284 ) ;
310- if ( response . ok ) {
311- return { image : await response . arrayBuffer ( ) } ;
312- }
313- return {
314- error : ( await response . json ( ) ) as ErrorResponse ,
315- } ;
285+ return error ? { error } : { image : data } ;
316286 }
317287
318288 /**
@@ -322,13 +292,10 @@ export class McUtilsAPI {
322292 * @returns the list of server registry entries or the error (if one occurred)
323293 */
324294 async fetchServerRegistryEntries ( query : string ) : Promise < { entries ?: ServerRegistryEntry [ ] ; error ?: ErrorResponse } > {
325- const response = await fetch ( `${ this . endpoint } /servers${ this . buildParams ( { query : query } ) } ` ) ;
326- if ( response . ok ) {
327- return { entries : ( await response . json ( ) ) as ServerRegistryEntry [ ] } ;
328- }
329- return {
330- error : ( await response . json ( ) ) as ErrorResponse ,
331- } ;
295+ const { data, error } = await this . request < ServerRegistryEntry [ ] > (
296+ `/servers${ this . buildParams ( { query : query } ) } `
297+ ) ;
298+ return error ? { error } : { entries : data } ;
332299 }
333300
334301 /**
@@ -337,13 +304,8 @@ export class McUtilsAPI {
337304 * @returns the statistics or the error (if one occurred)
338305 */
339306 async fetchStatistics ( ) : Promise < { statistics ?: StatisticsResponse ; error ?: ErrorResponse } > {
340- const response = await fetch ( `${ this . endpoint } /statistics` ) ;
341- if ( response . ok ) {
342- return { statistics : ( await response . json ( ) ) as StatisticsResponse } ;
343- }
344- return {
345- error : ( await response . json ( ) ) as ErrorResponse ,
346- } ;
307+ const { data, error } = await this . request < StatisticsResponse > ( `/statistics` ) ;
308+ return error ? { error } : { statistics : data } ;
347309 }
348310
349311 /**
@@ -353,13 +315,10 @@ export class McUtilsAPI {
353315 * @returns the list of skins or the error (if one occurred)
354316 */
355317 async fetchSkins ( page : number = 1 ) : Promise < { skins ?: Page < Skin > ; error ?: ErrorResponse } > {
356- const response = await fetch ( `${ this . endpoint } /skins${ this . buildParams ( { page : String ( page ) } ) } ` ) ;
357- if ( response . ok ) {
358- return { skins : ( await response . json ( ) ) as Page < Skin > } ;
359- }
360- return {
361- error : ( await response . json ( ) ) as ErrorResponse ,
362- } ;
318+ const { data, error } = await this . request < Page < Skin > > (
319+ `/skins${ this . buildParams ( { page : String ( page ) } ) } `
320+ ) ;
321+ return error ? { error } : { skins : data } ;
363322 }
364323}
365324
0 commit comments