1+ package com.thoo.api
2+
3+ import com.thoo.api.endpoints.AESEndpoint
4+ import com.thoo.api.endpoints.CosmeticEndpoint
5+ import com.thoo.api.endpoints.CreatorCodeEndpoint
6+ import com.thoo.api.endpoints.NewsEndpoint
7+ import com.thoo.api.enums.Language
8+ import okhttp3.Interceptor
9+ import okhttp3.OkHttpClient
10+ import okhttp3.Response
11+ import org.jetbrains.annotations.NotNull
12+ import retrofit2.Retrofit
13+ import retrofit2.converter.gson.GsonConverterFactory
14+ import java.security.SecureRandom
15+ import java.security.cert.X509Certificate
16+ import javax.net.ssl.*
17+
18+ class FortniteAPI private constructor(
19+ private val key : String ,
20+ private val language : Language ,
21+ private val client : OkHttpClient ,
22+ private val debug : Boolean
23+ ) {
24+
25+ init {
26+ val clientBuilder = client.newBuilder()
27+ if (key == " None" ) clientBuilder.addInterceptor(KeyInterceptor (key))
28+ clientBuilder.addInterceptor(LanguageInterceptor (language))
29+ if (debug){
30+ val trustManager = arrayOf<TrustManager >(
31+ object : X509TrustManager {
32+ override fun checkClientTrusted (chain : Array <X509Certificate ?>? , authType : String? ) {}
33+ override fun checkServerTrusted (chain : Array <X509Certificate ?>? , authType : String? ) {}
34+ override fun getAcceptedIssuers (): Array <X509Certificate > = arrayOf()
35+ }
36+ )
37+ val context = SSLContext .getInstance(" SSL" )
38+ context.init (null , trustManager, SecureRandom ())
39+ val factory = context.socketFactory
40+ clientBuilder.sslSocketFactory(factory, trustManager[0 ] as X509TrustManager )
41+ clientBuilder.hostnameVerifier(HostnameVerifier { _, _ -> true })
42+ }
43+ }
44+
45+ private val retrofit = Retrofit .Builder ()
46+ .addConverterFactory(GsonConverterFactory .create())
47+ .baseUrl(" https://fortnite-api.com" )
48+ .client(client).build()
49+
50+ private val aesEndpoint = AESEndpoint (retrofit)
51+ private val cosmeticEndpoint = CosmeticEndpoint (retrofit, language)
52+ private val newsEndpoint = NewsEndpoint (retrofit, language)
53+ private val createCodeEndpoint = CreatorCodeEndpoint (retrofit)
54+
55+ fun getAESEndpoint (): AESEndpoint = aesEndpoint
56+ fun getCosmeticEndpoint (): CosmeticEndpoint = cosmeticEndpoint
57+ fun getNewsEndpoint (): NewsEndpoint = newsEndpoint
58+ fun getCreatorEndpoint (): CreatorCodeEndpoint = createCodeEndpoint
59+
60+ private inner class LanguageInterceptor (
61+ private val language : Language
62+ ) : Interceptor {
63+
64+ override fun intercept (chain : Interceptor .Chain ): Response {
65+ val request = chain.request().newBuilder()
66+ if (chain.request().header(" language" ) != null ) request.header(" language" , language.code)
67+ return chain.proceed(request.build())
68+ }
69+
70+ }
71+
72+ private inner class KeyInterceptor (
73+ private val key : String
74+ ) : Interceptor {
75+
76+ override fun intercept (chain : Interceptor .Chain ): Response {
77+ val request = chain.request().newBuilder().header(" x-api-key" , key).build()
78+ return chain.proceed(request)
79+ }
80+
81+ }
82+
83+ class Builder {
84+
85+ private var key: String = " None"
86+ private var language: Language = Language .EN
87+ private var client: OkHttpClient = OkHttpClient ()
88+ private var debug: Boolean = false
89+
90+ fun setKey (@NotNull key : String ): Builder {
91+ this .key = key
92+ return this
93+ }
94+
95+ fun setLanguage (@NotNull language : Language ): Builder {
96+ this .language = language
97+ return this
98+ }
99+
100+ fun setClient (@NotNull client : OkHttpClient ): Builder {
101+ this .client = client
102+ return this
103+ }
104+
105+ fun setDebug (@NotNull debug : Boolean ): Builder {
106+ this .debug = debug
107+ return this
108+ }
109+
110+ fun build (): FortniteAPI {
111+ return FortniteAPI (
112+ key = key,
113+ language = language,
114+ client = client,
115+ debug = debug
116+ )
117+ }
118+
119+ }
120+
121+ }
0 commit comments