Skip to content
This repository was archived by the owner on Apr 9, 2024. It is now read-only.

Commit a994194

Browse files
committed
Finished cosmetic endpoints
1 parent f1f42d4 commit a994194

File tree

8 files changed

+103
-16
lines changed

8 files changed

+103
-16
lines changed

build.gradle.kts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
plugins {
22
kotlin("jvm") version "1.4.10"
3+
id("com.github.johnrengelman.shadow") version "6.1.0"
4+
id("maven")
35
}
46

57
group = "com.thoo.api"
@@ -14,4 +16,4 @@ dependencies {
1416
implementation("com.squareup.retrofit2:retrofit:2.9.0")
1517
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
1618
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9")
17-
}
19+
}

src/main/kotlin/com/thoo/api/FortniteAPI.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import retrofit2.converter.gson.GsonConverterFactory
1212
class FortniteAPI private constructor(
1313
private val apiKey: String?,
1414
language: Language,
15-
httpClient: OkHttpClient
15+
private val httpClient: OkHttpClient
1616
) {
1717

1818
// The `/v2/` is a bug fix but won't actually get applied
@@ -27,7 +27,7 @@ class FortniteAPI private constructor(
2727
@JvmField val playlist = PlaylistEndpoints(retrofit, PlaylistService::class.java, language)
2828
@JvmField val banner = BannerEndpoints(retrofit, BannerService::class.java, language)
2929
@JvmField val creator = CreatorEndpoints(retrofit, CreatorService::class.java)
30-
@JvmField val cosmetic = CosmeticEndpoints(retrofit, CosmeticService::class.java, language)
30+
@JvmField val cosmetic = CosmeticEndpoints(retrofit, CosmeticService::class.java, language, httpClient)
3131

3232
companion object {
3333

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
package com.thoo.api.endpoints
22

3+
import com.google.gson.Gson
4+
import com.thoo.api.FortniteAPI
35
import com.thoo.api.enums.Language
6+
import com.thoo.api.models.BaseModel
7+
import com.thoo.api.models.Cosmetic
48
import com.thoo.api.models.CosmeticSearchProperties
59
import com.thoo.api.services.CosmeticService
610
import com.thoo.api.utils.send
11+
import com.thoo.api.utils.sendOkHttp
12+
import okhttp3.HttpUrl
13+
import okhttp3.OkHttpClient
14+
import okhttp3.Request
715
import retrofit2.Retrofit
816

917
@SuppressWarnings("unused")
1018
class CosmeticEndpoints(
1119
retrofit: Retrofit,
1220
clazz: Class<out CosmeticService>,
13-
private val language: Language
21+
private val language: Language,
22+
private val httpClient: OkHttpClient
1423
): EndpointBase<CosmeticService>(retrofit, clazz) {
1524

1625
@JvmOverloads fun getCosmetics(language: Language = this.language) =
@@ -20,15 +29,53 @@ class CosmeticEndpoints(
2029
service.getNewCosmetics(language.code).send()
2130

2231
@JvmOverloads
23-
fun searchCosmetic(language: Language = this.language, propertiesReceiver: CosmeticSearchProperties.() -> Unit) {
32+
fun searchCosmetic(language: Language = this.language, propertiesReceiver: CosmeticSearchProperties.() -> Unit): BaseModel<Cosmetic> {
2433
val properties = CosmeticSearchProperties()
2534
propertiesReceiver.invoke(properties)
2635
val clazz = properties.javaClass
36+
val queries = hashMapOf<String, Any>()
2737
clazz.declaredFields.forEach {
2838
it.isAccessible = true
2939
val value = it.get(properties) ?: return@forEach
30-
println(it.name + " : " + value)
40+
queries[it.name] = value
3141
}
42+
val urlBuilder = HttpUrl.Builder()
43+
.scheme("https")
44+
.host("fortnite-api.com")
45+
.addPathSegments("v2/cosmetics/br/search")
46+
.addEncodedQueryParameter("language", language.code)
47+
queries.forEach { (k, v) ->
48+
urlBuilder.addEncodedQueryParameter(k, v.toString())
49+
}
50+
val request = Request.Builder()
51+
.url(urlBuilder.build())
52+
.build()
53+
return request.sendOkHttp(httpClient)
54+
}
55+
56+
@JvmOverloads
57+
fun searchCosmetics(language: Language = this.language, propertiesReceiver: CosmeticSearchProperties.() -> Unit): BaseModel<List<Cosmetic>> {
58+
val properties = CosmeticSearchProperties()
59+
propertiesReceiver.invoke(properties)
60+
val clazz = properties.javaClass
61+
val queries = hashMapOf<String, Any>()
62+
clazz.declaredFields.forEach {
63+
it.isAccessible = true
64+
val value = it.get(properties) ?: return@forEach
65+
queries[it.name] = value
66+
}
67+
val urlBuilder = HttpUrl.Builder()
68+
.scheme("https")
69+
.host("fortnite-api.com")
70+
.addPathSegments("v2/cosmetics/br/search/all")
71+
.addEncodedQueryParameter("language", language.code)
72+
queries.forEach { (k, v) ->
73+
urlBuilder.addEncodedQueryParameter(k, v.toString())
74+
}
75+
val request = Request.Builder()
76+
.url(urlBuilder.build())
77+
.build()
78+
return request.sendOkHttp(httpClient)
3279
}
3380

3481
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.thoo.api.models
22

33
data class BaseModel<T>(
4-
val code: Int,
4+
val status: Int,
55
val data: T
66
)

src/main/kotlin/com/thoo/api/services/CosmeticService.kt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,36 @@ interface CosmeticService: EndpointService {
1717
@Query("language") language: String
1818
): FCall<List<Cosmetic>>
1919

20+
@GET("/v2/cosmetics/br/search/all")
21+
fun searchCosmetic(
22+
@Query("language") language: String,
23+
@Query("searchLanguage") searchLanguage: String,
24+
@Query("matchMethod") matchMethod: String,
25+
@Query("id") id: String?,
26+
@Query("name") name: String?,
27+
@Query("description") description: String?,
28+
@Query("type") type: String?,
29+
@Query("displayType") displayType: String?,
30+
@Query("backendType") backendType: String?,
31+
@Query("rarity") rarity: String?,
32+
@Query("displayRarity") displayRarity: String?,
33+
@Query("backendRarity") backendRarity: String?,
34+
@Query("hasSeries") hasSeries: Boolean?,
35+
@Query("hasSet") hasSet: Boolean?,
36+
@Query("set") set: String?,
37+
@Query("setText") setText: String?,
38+
@Query("backendSet") backendSet: String?,
39+
@Query("hasIntroduction") hasIntroduction: Boolean?,
40+
@Query("introductionChapter") introductionChapter: String?,
41+
@Query("introductionSeason") introductionSeason: String?,
42+
@Query("hasFeaturedImage") hasFeaturedImage: Boolean?,
43+
@Query("hasVariants") hasVariants: Boolean?,
44+
@Query("hasGameplayTags") hasGameplayTags: Boolean?,
45+
@Query("gameplayTag") gameplayTag: String?,
46+
@Query("added") added: Long?,
47+
@Query("addedSince") addedSince: Long?,
48+
@Query("unseenFor") unseenFor: Long?,
49+
@Query("lastAppearance") lastAppearance: Long?,
50+
): FCall<Cosmetic>
51+
2052
}

src/main/kotlin/com/thoo/api/utils/Utils.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package com.thoo.api.utils
33
import com.google.gson.Gson
44
import com.thoo.api.exceptions.FortniteApiException
55
import com.thoo.api.models.BaseModel
6+
import okhttp3.OkHttpClient
7+
import okhttp3.Request
68
import retrofit2.Call
79
import retrofit2.Response
810
import java.io.File
@@ -15,18 +17,25 @@ typealias FCall<T> = Call<BaseModel<T>>
1517
val gson = Gson()
1618

1719
@Throws(FortniteApiException::class)
18-
inline fun <reified T> Call<BaseModel<T>>.send(): BaseModel<T> {
20+
internal inline fun <reified T> Call<BaseModel<T>>.send(): BaseModel<T> {
1921
val response = this.execute()
2022
if(!response.isSuccessful) throw response.parseApiError()
2123
return response.body()!!
2224
}
2325

24-
fun Response<*>.parseApiError(): FortniteApiException {
26+
@Throws(FortniteApiException::class)
27+
internal inline fun <reified T> Request.sendOkHttp(client: OkHttpClient): BaseModel<T> {
28+
val response = client.newCall(this).execute()
29+
if(!response.isSuccessful) throw gson.fromJson(response.body()?.string() ?: "{}", FortniteApiException::class.java)
30+
return gson.fromJson<BaseModel<T>>(response.body()?.string() ?: "{}", BaseModel::class.java)
31+
}
32+
33+
internal fun Response<*>.parseApiError(): FortniteApiException {
2534
val json = this.errorBody()?.string() ?: "{}"
2635
return gson.fromJson(json, FortniteApiException::class.java)
2736
}
2837

29-
fun download(byteStream: InputStream, file: File): Int {
38+
internal fun download(byteStream: InputStream, file: File): Int {
3039
val reader = ByteArray(4096)
3140
var fileSizeDownloaded = 0
3241
val output = FileOutputStream(file)

src/test/java/TestJava.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@ public final class TestJava {
55

66
public static void main(String[] args) {
77
FortniteAPI api = FortniteAPI.create();
8-
api.cosmetic.searchCosmetic(cosmetic -> {
9-
cosmetic.name = "Test";
10-
return Unit.INSTANCE;
11-
});
128
}
139

1410
}

src/test/kotlin/TestKotlin.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ object TestKotlin {
88
val api = FortniteAPI.create(
99
language = Language.DE
1010
)
11-
api.cosmetic.searchCosmetic {
12-
name = "Test"
11+
val cosmetic = api.cosmetic.searchCosmetic {
12+
name = "aura"
1313
}
14+
println(cosmetic.data.id)
1415
}
1516

1617
}

0 commit comments

Comments
 (0)