diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/Splatoon3Api.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/Splatoon3Api.kt
new file mode 100644
index 0000000..b0192e5
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/Splatoon3Api.kt
@@ -0,0 +1,117 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api
+
+import net.moonleay.lilJudd.data.api.entry.schedule.ModeData
+import net.moonleay.lilJudd.util.TimeUtil
+
+object Splatoon3Api {
+ private fun getRegularMode(timestamp: Long): ModeData {
+ Splatoon3ApiCache.cachedRegularModeData.map { modeData ->
+ val startTime = TimeUtil.deformatJSONTime(modeData.startTime, "UTC")
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ if (timestamp in startTime..endTime) {
+ return modeData
+ }
+ }
+ throw Exception("No current mode found")
+ }
+
+ private fun getOpenMode(timestamp: Long): ModeData {
+ Splatoon3ApiCache.cachedCompetitiveOpenModeData.map { modeData ->
+ val startTime = TimeUtil.deformatJSONTime(modeData.startTime, "UTC")
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ if (timestamp in startTime..endTime) {
+ return modeData
+ }
+ }
+ throw Exception("No current mode found")
+ }
+
+ private fun getXMode(timestamp: Long): ModeData {
+ Splatoon3ApiCache.cachedXModeData.map { modeData ->
+ val startTime = TimeUtil.deformatJSONTime(modeData.startTime, "UTC")
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ if (timestamp in startTime..endTime) {
+ return modeData
+ }
+ }
+ throw Exception("No current mode found")
+ }
+
+ private fun getSeriesMode(timestamp: Long): ModeData {
+ Splatoon3ApiCache.cachedCompetitiveSeriesModeData.map { modeData ->
+ val startTime = TimeUtil.deformatJSONTime(modeData.startTime, "UTC")
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ if (timestamp in startTime..endTime) {
+ return modeData
+ }
+ }
+ throw Exception("No current mode found")
+ }
+
+ fun getRegularMapsFormatted(timestamp: Long): String {
+ val modeData = getRegularMode(timestamp)
+ val map1 = modeData.map1!!.name.split(" ")[0]
+ val map2 = modeData.map2!!.name.split(" ")[0]
+ return "R: $map1 & $map2"
+ }
+
+ fun getOpenModeFormatted(timestamp: Long): String {
+ val modeData = getOpenMode(timestamp)
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ val diffStamp = TimeUtil.getTimeDifferenceFormatted(System.currentTimeMillis(), endTime)
+ return "O: ${modeData.ruleSetName} $diffStamp left"
+ }
+
+ fun getOpenMapFormatted(timestamp: Long): String {
+ val modeData = getOpenMode(timestamp)
+ val map1 = modeData.map1!!.name.split(" ")[0]
+ val map2 = modeData.map2!!.name.split(" ")[0]
+ return "O: $map1 & $map2"
+ }
+
+ fun getSeriesModeFormatted(timestamp: Long): String {
+ val modeData = getSeriesMode(timestamp)
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ val diffStamp = TimeUtil.getTimeDifferenceFormatted(System.currentTimeMillis(), endTime)
+ return "S: ${modeData.ruleSetName} $diffStamp left"
+ }
+
+ fun getSeriesMapsFormatted(timestamp: Long): String {
+ val modeData = getSeriesMode(timestamp)
+ val map1 = modeData.map1!!.name.split(" ")[0]
+ val map2 = modeData.map2!!.name.split(" ")[0]
+ return "S: $map1 & $map2"
+ }
+
+ fun getXModeFormatted(timestamp: Long): String {
+ val modeData = getXMode(timestamp)
+ val endTime = TimeUtil.deformatJSONTime(modeData.endTime, "UTC")
+ val diffStamp = TimeUtil.getTimeDifferenceFormatted(System.currentTimeMillis(), endTime)
+ return "X: ${modeData.ruleSetName} $diffStamp left"
+ }
+
+ fun getXMapFormatted(timestamp: Long): String {
+ val modeData = getXMode(timestamp)
+ val map1 = modeData.map1!!.name.split(" ")[0]
+ val map2 = modeData.map2!!.name.split(" ")[0]
+ return "X: $map1 & $map2"
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/Splatoon3ApiCache.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/Splatoon3ApiCache.kt
new file mode 100644
index 0000000..42ff01c
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/Splatoon3ApiCache.kt
@@ -0,0 +1,535 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api
+
+import io.ktor.http.*
+import kotlinx.serialization.json.*
+import net.moonleay.botendo.build.BuildConstants
+import net.moonleay.lilJudd.data.api.entry.coop.CoopGearData
+import net.moonleay.lilJudd.data.api.entry.schedule.*
+import net.moonleay.lilJudd.data.api.entry.splatfest.SplatfestColor
+import net.moonleay.lilJudd.data.api.entry.splatfest.SplatfestData
+import net.moonleay.lilJudd.data.api.entry.splatfest.SplatfestTeamData
+import net.moonleay.lilJudd.data.api.entry.splatfest.SplatfestTeamResults
+import net.moonleay.lilJudd.data.api.entry.splatnet.BrandData
+import net.moonleay.lilJudd.data.api.entry.splatnet.GearAbilityData
+import net.moonleay.lilJudd.data.api.entry.splatnet.SplatnetItemData
+import net.moonleay.lilJudd.data.api.type.ApiDataType
+import net.moonleay.lilJudd.data.api.type.ApiRequestType
+import net.moonleay.lilJudd.util.Logger
+import net.moonleay.lilJudd.util.NetUtil
+
+object Splatoon3ApiCache {
+ private val user_agent =
+ "lilJudd/${BuildConstants.version} (${System.getProperty("os.name")}/${System.getProperty("os.version")}) [contact@moonleay.net]"
+ private val base_url = "https://splatoon3.ink/data/" // Thank god there is an API
+
+ internal var cachedSplatfestData = mutableListOf()
+ internal var cachedMapData = mutableMapOf()
+ internal var cachedRegularModeData = mutableListOf()
+ internal var cachedCompetitiveSeriesModeData = mutableListOf()
+ internal var cachedCompetitiveOpenModeData = mutableListOf()
+ internal var cachedXModeData = mutableListOf()
+ internal var cachedChallengesData = mutableListOf()
+ internal var cachedShiftData = mutableListOf()
+ internal var cachedBigRunShiftData = mutableListOf()
+ internal var cachedCoopRewardsData = mutableListOf()
+ internal var cachedSplatnetItemData = mutableListOf()
+ internal var cachedSplatnetLimitedItemData = mutableListOf()
+ internal lateinit var splatnetShopBrandData: BrandData
+ internal lateinit var splatnetShopNextBrandData: BrandData
+ fun updateData(dataType: ApiDataType, requestType: ApiRequestType) {
+ Logger.out("Updating data for $dataType with USER-AGENT: $user_agent")
+ Logger.out("Reason for update: $requestType")
+ when (dataType) {
+ ApiDataType.SCHEDULES -> {
+ updateScheduleCache(user_agent)
+ }
+
+ ApiDataType.SPLATNETGEAR -> {
+ updateSplatnetGearCache(user_agent)
+ }
+
+ ApiDataType.COOP -> {
+ updateCOOPCache(user_agent)
+ }
+
+ ApiDataType.SPLATFESTS -> {
+ updateSplatfestCache(user_agent)
+ }
+
+ ApiDataType.ALL -> {
+ updateScheduleCache(user_agent)
+ updateSplatnetGearCache(user_agent)
+ updateSplatfestCache(user_agent)
+ updateCOOPCache(user_agent)
+ }
+ }
+ Logger.out("Finished updating data for $dataType")
+ }
+
+ private fun updateSplatnetGearCache(uag: String) {
+ val apiResponse = NetUtil.GETJsonData("${base_url}gear.json", uag)
+ if (apiResponse.startsWith("Error")) {
+ Logger.out("Error getting splatnet data: $apiResponse")
+ return
+ }
+ val json = Json.parseToJsonElement(apiResponse)
+ val pickupBrandData = json.jsonObject["data"]!!.jsonObject["gesotown"]!!.jsonObject["pickupBrand"]!!.jsonObject
+
+ val brand = pickupBrandData["brand"]!!.jsonObject
+ splatnetShopBrandData =
+ BrandData(
+ brand["name"]!!.jsonPrimitive.content,
+ Url(pickupBrandData["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
+ GearAbilityData(
+ brand["usualGearPower"]!!.jsonObject["name"]!!.jsonPrimitive.content,
+ brand["usualGearPower"]!!.jsonObject["desc"]!!.jsonPrimitive.content,
+ Url(brand["usualGearPower"]!!.jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ ),
+ pickupBrandData["saleEndTime"]!!.jsonPrimitive.content
+ )
+ val nextBrand = pickupBrandData["nextBrand"]!!.jsonObject
+ splatnetShopNextBrandData =
+ BrandData(
+ nextBrand["name"]!!.jsonPrimitive.content,
+ Url(pickupBrandData["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
+ null,
+ null
+ )
+ cachedSplatnetItemData = mutableListOf()
+ val items = pickupBrandData["brandGears"]!!.jsonArray
+ items.forEach {
+ val obj = it as JsonObject
+ val gear = it["gear"]!!.jsonObject
+ val primaryGearPower = gear["primaryGearPower"]!!.jsonObject
+ val additionalGearPowers = gear["additionalGearPowers"]!!.jsonArray
+ val additionalGearPowersList = mutableListOf()
+ additionalGearPowers.forEach {
+ val ob = it as JsonObject
+ additionalGearPowersList.add(
+ GearAbilityData(
+ ob["name"]!!.jsonPrimitive.content,
+ null,
+ Url(ob["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ )
+ )
+ }
+ cachedSplatnetItemData.add(
+ SplatnetItemData(
+ obj["saleEndTime"]!!.jsonPrimitive.content,
+ obj["price"]!!.jsonPrimitive.int,
+ gear["__typename"]!!.jsonPrimitive.content,
+ gear["name"]!!.jsonPrimitive.content,
+ GearAbilityData(
+ primaryGearPower["name"]!!.jsonPrimitive.content,
+ null,
+ Url(primaryGearPower["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ ),
+ additionalGearPowersList,
+ Url(gear["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
+ splatnetShopBrandData
+ )
+ )
+ }
+ Logger.out("Updated gear data")
+
+ val limitedItemData = json.jsonObject["data"]!!.jsonObject["gesotown"]!!.jsonObject["limitedGears"]!!.jsonArray
+ cachedSplatnetLimitedItemData = mutableListOf()
+ limitedItemData.forEach {
+ val obj = it as JsonObject
+ val gear = obj["gear"]!!.jsonObject
+ val additionalGearPowers = gear["additionalGearPowers"]!!.jsonArray
+ val additionalGearPowersList = mutableListOf()
+ additionalGearPowers.forEach {
+ val ob = it as JsonObject
+ additionalGearPowersList.add(
+ GearAbilityData(
+ ob["name"]!!.jsonPrimitive.content,
+ null,
+ Url(ob["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ )
+ )
+ }
+ cachedSplatnetLimitedItemData.add(
+ SplatnetItemData(
+ obj["saleEndTime"]!!.jsonPrimitive.content,
+ obj["price"]!!.jsonPrimitive.int,
+ gear["__typename"]!!.jsonPrimitive.content,
+ gear["name"]!!.jsonPrimitive.content,
+ GearAbilityData(
+ gear["primaryGearPower"]!!.jsonObject["name"]!!.jsonPrimitive.content,
+ null,
+ Url(gear["primaryGearPower"]!!.jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ ),
+ additionalGearPowersList,
+ Url(gear["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
+ splatnetShopBrandData
+ )
+ )
+ }
+ }
+
+ private fun updateCOOPCache(uag: String) {
+ val apiResponse = NetUtil.GETJsonData("${base_url}coop.json", uag)
+ if (apiResponse.startsWith("Error")) {
+ Logger.out("Error getting coop data: $apiResponse")
+ return
+ }
+ val json = Json.parseToJsonElement(apiResponse)
+ val data = json.jsonObject["data"]!!.jsonObject["coopResult"]!!.jsonObject["monthlyGear"]!!.jsonObject
+ cachedCoopRewardsData = mutableListOf()
+ cachedCoopRewardsData.add(
+ CoopGearData(
+ data["name"]!!.jsonPrimitive.content,
+ Url(data["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
+ data["__typename"]!!.jsonPrimitive.content
+ )
+ )
+ Logger.out("Updated COOP data")
+ }
+
+ private fun updateScheduleCache(uag: String) {
+ val apiResponse = NetUtil.GETJsonData("${base_url}schedules.json", uag)
+ if (apiResponse.startsWith("Error")) {
+ Logger.out("Error getting schedule data: $apiResponse")
+ return
+ }
+ val json = Json.decodeFromString(apiResponse) as JsonObject
+ val data = json["data"]!!.jsonObject
+
+ val mapList = data["vsStages"]!!.jsonObject["nodes"]!!.jsonArray
+ cachedMapData = mutableMapOf()
+ mapList.forEach {
+ val obj = it as JsonObject
+ val imageURL = Url(obj.jsonObject["originalImage"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ val id = obj.jsonObject["vsStageId"]!!.jsonPrimitive.int
+ cachedMapData[id] = MapData(
+ id,
+ imageURL,
+ it.jsonObject["name"]!!.jsonPrimitive.content
+ )
+ }
+ Logger.out("Updated maplist data")
+
+ val regularMatches = data["regularSchedules"]!!.jsonObject["nodes"]!!.jsonArray
+ cachedRegularModeData = mutableListOf()
+ regularMatches.forEach {
+ val obj = it as JsonObject
+ val setting = obj["regularMatchSetting"]!!.jsonObject
+ cachedRegularModeData.add(
+ ModeData(
+ obj["startTime"]!!.jsonPrimitive.content,
+ obj["endTime"]!!.jsonPrimitive.content,
+ setting["__typename"]!!.jsonPrimitive.content,
+ cachedMapData[setting["vsStages"]!!.jsonArray[0].jsonObject["vsStageId"]!!.jsonPrimitive.int],
+ cachedMapData[setting["vsStages"]!!.jsonArray[1].jsonObject["vsStageId"]!!.jsonPrimitive.int],
+ setting["vsRule"]!!.jsonObject["name"]!!.jsonPrimitive.content,
+ setting["vsRule"]!!.jsonObject["rule"]!!.jsonPrimitive.content,
+ "TURF_WAR"
+ )
+ )
+ }
+ Logger.out("Updated Regular match data")
+
+ val compMatches = data["bankaraSchedules"]!!.jsonObject["nodes"]!!.jsonArray
+ cachedCompetitiveSeriesModeData = mutableListOf()
+ cachedCompetitiveOpenModeData = mutableListOf()
+ compMatches.forEach {
+ val obj = it as JsonObject
+ val setting = obj["bankaraMatchSettings"]!!.jsonArray
+ setting.forEach {
+ val ob = it as JsonObject
+ val mode = ob["bankaraMode"]!!.jsonPrimitive.content
+ if (mode == "CHALLENGE") {
+ cachedCompetitiveSeriesModeData.add(
+ ModeData(
+ obj["startTime"]!!.jsonPrimitive.content,
+ obj["endTime"]!!.jsonPrimitive.content,
+ ob["__typename"]!!.jsonPrimitive.content,
+ cachedMapData[ob["vsStages"]!!.jsonArray[0].jsonObject["vsStageId"]!!.jsonPrimitive.int],
+ cachedMapData[ob["vsStages"]!!.jsonArray[1].jsonObject["vsStageId"]!!.jsonPrimitive.int],
+ ob["vsRule"]!!.jsonObject["name"]!!.jsonPrimitive.content,
+ ob["vsRule"]!!.jsonObject["rule"]!!.jsonPrimitive.content,
+ mode
+ )
+ )
+ } else if (mode == "OPEN") {
+ cachedCompetitiveOpenModeData.add(
+ ModeData(
+ obj["startTime"]!!.jsonPrimitive.content,
+ obj["endTime"]!!.jsonPrimitive.content,
+ ob["__typename"]!!.jsonPrimitive.content,
+ cachedMapData[ob["vsStages"]!!.jsonArray[0].jsonObject["vsStageId"]!!.jsonPrimitive.int],
+ cachedMapData[ob["vsStages"]!!.jsonArray[1].jsonObject["vsStageId"]!!.jsonPrimitive.int],
+ ob["vsRule"]!!.jsonObject["name"]!!.jsonPrimitive.content,
+ ob["vsRule"]!!.jsonObject["rule"]!!.jsonPrimitive.content,
+ mode
+ )
+ )
+ }
+ }
+ }
+ Logger.out("Updated Competitive match data")
+
+ val xMatches = data["xSchedules"]!!.jsonObject["nodes"]!!.jsonArray
+ cachedXModeData = mutableListOf()
+ xMatches.forEach {
+ val obj = it as JsonObject
+ val setting = obj["xMatchSetting"]!!.jsonObject
+ cachedXModeData.add(
+ ModeData(
+ obj["startTime"]!!.jsonPrimitive.content,
+ obj["endTime"]!!.jsonPrimitive.content,
+ setting["__typename"]!!.jsonPrimitive.content,
+ cachedMapData[setting["vsStages"]!!.jsonArray[0].jsonObject["vsStageId"]!!.jsonPrimitive.int],
+ cachedMapData[setting["vsStages"]!!.jsonArray[1].jsonObject["vsStageId"]!!.jsonPrimitive.int],
+ setting["vsRule"]!!.jsonObject["name"]!!.jsonPrimitive.content,
+ setting["vsRule"]!!.jsonObject["rule"]!!.jsonPrimitive.content,
+ "X"
+ )
+ )
+ }
+ Logger.out("Updated X match data")
+
+ val challengeData = data["eventSchedules"]!!.jsonObject["nodes"]!!.jsonArray
+ cachedChallengesData = mutableListOf()
+ challengeData.forEach {
+ val obj = it as JsonObject
+ val tpd = obj["timePeriods"]!!.jsonArray
+ val setting = obj["leagueMatchSetting"]!!.jsonObject
+ val event = setting["leagueMatchEvent"]!!.jsonObject
+ cachedChallengesData.add(
+ ChallengeModeData(
+ event["leagueMatchEventId"]!!.jsonPrimitive.content,
+ event["name"]!!.jsonPrimitive.content,
+ event["desc"]!!.jsonPrimitive.content,
+ event["regulation"]!!.jsonPrimitive.content,
+ cachedMapData[setting["vsStages"]!!.jsonArray[0].jsonObject["vsStageId"]!!.jsonPrimitive.int],
+ cachedMapData[setting["vsStages"]!!.jsonArray[1].jsonObject["vsStageId"]!!.jsonPrimitive.int],
+ setting["__typename"]!!.jsonPrimitive.content,
+ setting["vsRule"]!!.jsonObject["rule"]!!.jsonPrimitive.content,
+ setting["vsRule"]!!.jsonObject["name"]!!.jsonPrimitive.content,
+ TimePeriodData(
+ tpd[0].jsonObject["startTime"]!!.jsonPrimitive.content,
+ tpd[0].jsonObject["endTime"]!!.jsonPrimitive.content
+ ),
+ TimePeriodData(
+ tpd[1].jsonObject["startTime"]!!.jsonPrimitive.content,
+ tpd[1].jsonObject["endTime"]!!.jsonPrimitive.content
+ ),
+ TimePeriodData(
+ tpd[2].jsonObject["startTime"]!!.jsonPrimitive.content,
+ tpd[2].jsonObject["endTime"]!!.jsonPrimitive.content
+ )
+ )
+ )
+ }
+ Logger.out("Updated Challenge data")
+
+ val shiftData = data["coopGroupingSchedule"]!!.jsonObject["regularSchedules"]!!.jsonObject["nodes"]!!.jsonArray
+ cachedShiftData = mutableListOf()
+ shiftData.forEach {
+ val obj = it as JsonObject
+ val setting = obj["setting"]!!.jsonObject
+ val stage = setting["coopStage"]!!.jsonObject
+ val weapons = setting["weapons"]!!.jsonArray
+ cachedShiftData.add(
+ ShiftData(
+ obj["startTime"]!!.jsonPrimitive.content,
+ obj["endTime"]!!.jsonPrimitive.content,
+ obj["__splatoon3ink_king_salmonid_guess"]!!.jsonPrimitive.content,
+ setting["__typename"]!!.jsonPrimitive.content,
+ stage["name"]!!.jsonPrimitive.content,
+ Url(stage["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
+ WeaponData(
+ weapons[0].jsonObject["name"]!!.jsonPrimitive.content,
+ Url(weapons[0].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ ),
+ WeaponData(
+ weapons[1].jsonObject["name"]!!.jsonPrimitive.content,
+ Url(weapons[1].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ ),
+ WeaponData(
+ weapons[2].jsonObject["name"]!!.jsonPrimitive.content,
+ Url(weapons[2].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ ),
+ WeaponData(
+ weapons[3].jsonObject["name"]!!.jsonPrimitive.content,
+ Url(weapons[3].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ )
+ )
+ )
+ }
+
+ val bigRunData = data["coopGroupingSchedule"]!!.jsonObject["bigRunSchedules"]!!.jsonObject["nodes"]!!.jsonArray
+ cachedBigRunShiftData = mutableListOf()
+ bigRunData.forEach {
+ val obj = it as JsonObject
+ val setting = obj["setting"]!!.jsonObject
+ val stage = setting["coopStage"]!!.jsonObject
+ val weapons = setting["weapons"]!!.jsonArray
+ cachedBigRunShiftData.add(
+ ShiftData(
+ obj["startTime"]!!.jsonPrimitive.content,
+ obj["endTime"]!!.jsonPrimitive.content,
+ obj["__splatoon3ink_king_salmonid_guess"]!!.jsonPrimitive.content,
+ setting["__typename"]!!.jsonPrimitive.content,
+ stage["name"]!!.jsonPrimitive.content,
+ Url(stage["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
+ WeaponData(
+ weapons[0].jsonObject["name"]!!.jsonPrimitive.content,
+ Url(weapons[0].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ ),
+ WeaponData(
+ weapons[1].jsonObject["name"]!!.jsonPrimitive.content,
+ Url(weapons[1].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ ),
+ WeaponData(
+ weapons[2].jsonObject["name"]!!.jsonPrimitive.content,
+ Url(weapons[2].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ ),
+ WeaponData(
+ weapons[3].jsonObject["name"]!!.jsonPrimitive.content,
+ Url(weapons[3].jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content)
+ )
+ )
+ )
+ }
+ Logger.out("Updated big run data")
+
+ Logger.out("Updated all Schedules")
+ }
+
+ private fun updateSplatfestCache(uag: String) {
+ val apiResponse = NetUtil.GETJsonData("${base_url}festivals.json", uag)
+ if (apiResponse.startsWith("Error")) {
+ Logger.out("Error getting splatfest data: $apiResponse")
+ return
+ }
+ val json = Json.decodeFromString(apiResponse) as JsonObject
+ val festivals = json["US"]!!.jsonObject["data"]!!.jsonObject["festRecords"]!!.jsonObject["nodes"]!!.jsonArray
+ cachedSplatfestData = mutableListOf()
+ festivals.forEach {
+ val fest = it as JsonObject
+ val teams = fest.jsonObject["teams"]!!.jsonArray
+ val team1 = teams[0].jsonObject
+ val team1Color = team1["color"]!!.jsonObject
+ var team1Result: JsonObject? = null
+ if (team1["result"] !is JsonNull) {
+ team1Result = team1["result"]!!.jsonObject
+ }
+ val team2 = teams[1].jsonObject
+ val team2Color = team2["color"]!!.jsonObject
+ var team2Result: JsonObject? = null
+ if (team2["result"] !is JsonNull) {
+ team2Result = team2["result"]!!.jsonObject
+ }
+ val team3 = teams[2].jsonObject
+ val team3Color = team3["color"]!!.jsonObject
+ var team3Result: JsonObject? = null
+ if (team3["result"] !is JsonNull) {
+ team3Result = team3["result"]!!.jsonObject
+ }
+ cachedSplatfestData.add(
+ SplatfestData(
+ fest.jsonObject["id"]!!.jsonPrimitive.content,
+ fest.jsonObject["state"]!!.jsonPrimitive.content,
+ fest.jsonObject["startTime"]!!.jsonPrimitive.content,
+ fest.jsonObject["endTime"]!!.jsonPrimitive.content,
+ fest.jsonObject["title"]!!.jsonPrimitive.content,
+ Url(fest.jsonObject["image"]!!.jsonObject["url"]!!.jsonPrimitive.content),
+ SplatfestTeamData(
+ team1["teamName"]!!.jsonPrimitive.content,
+ SplatfestColor(
+ team1Color["a"]!!.jsonPrimitive.int,
+ team1Color["b"]!!.jsonPrimitive.double,
+ team1Color["g"]!!.jsonPrimitive.double,
+ team1Color["r"]!!.jsonPrimitive.double
+ ),
+ if (team1Result.isNullOrEmpty() || team1Result["tricolorContributionRatio"]!!.jsonPrimitive.doubleOrNull == null)
+ null
+ else SplatfestTeamResults(
+ team1Result["isWinner"]!!.jsonPrimitive.boolean,
+ team1Result["horagaiRatio"]!!.jsonPrimitive.double,
+ team1Result["isHoragaiRatioTop"]!!.jsonPrimitive.boolean,
+ team1Result["voteRatio"]!!.jsonPrimitive.double,
+ team1Result["isVoteRatioTop"]!!.jsonPrimitive.boolean,
+ team1Result["regularContributionRatio"]!!.jsonPrimitive.double,
+ team1Result["isRegularContributionRatioTop"]!!.jsonPrimitive.boolean,
+ team1Result["challengeContributionRatio"]!!.jsonPrimitive.double,
+ team1Result["isChallengeContributionRatioTop"]!!.jsonPrimitive.boolean,
+ team1Result["tricolorContributionRatio"]!!.jsonPrimitive.double,
+ team1Result["isTricolorContributionRatioTop"]!!.jsonPrimitive.boolean,
+ )
+ ),
+ SplatfestTeamData(
+ team2["teamName"]!!.jsonPrimitive.content,
+ SplatfestColor(
+ team2Color["a"]!!.jsonPrimitive.int,
+ team2Color["b"]!!.jsonPrimitive.double,
+ team2Color["g"]!!.jsonPrimitive.double,
+ team2Color["r"]!!.jsonPrimitive.double
+ ),
+ if (team2Result.isNullOrEmpty() || team2Result["tricolorContributionRatio"]!!.jsonPrimitive.doubleOrNull == null)
+ null
+ else SplatfestTeamResults(
+ team2Result["isWinner"]!!.jsonPrimitive.boolean,
+ team2Result["horagaiRatio"]!!.jsonPrimitive.double,
+ team2Result["isHoragaiRatioTop"]!!.jsonPrimitive.boolean,
+ team2Result["voteRatio"]!!.jsonPrimitive.double,
+ team2Result["isVoteRatioTop"]!!.jsonPrimitive.boolean,
+ team2Result["regularContributionRatio"]!!.jsonPrimitive.double,
+ team2Result["isRegularContributionRatioTop"]!!.jsonPrimitive.boolean,
+ team2Result["challengeContributionRatio"]!!.jsonPrimitive.double,
+ team2Result["isChallengeContributionRatioTop"]!!.jsonPrimitive.boolean,
+ team2Result["tricolorContributionRatio"]!!.jsonPrimitive.double,
+ team2Result["isTricolorContributionRatioTop"]!!.jsonPrimitive.boolean,
+ )
+ ),
+ SplatfestTeamData(
+ team3["teamName"]!!.jsonPrimitive.content,
+ SplatfestColor(
+ team3Color["a"]!!.jsonPrimitive.int,
+ team3Color["b"]!!.jsonPrimitive.double,
+ team3Color["g"]!!.jsonPrimitive.double,
+ team3Color["r"]!!.jsonPrimitive.double
+ ),
+ if (team3Result.isNullOrEmpty() || team3Result["tricolorContributionRatio"]!!.jsonPrimitive.doubleOrNull == null)
+ null
+ else SplatfestTeamResults(
+ team3Result["isWinner"]!!.jsonPrimitive.boolean,
+ team3Result["horagaiRatio"]!!.jsonPrimitive.double,
+ team3Result["isHoragaiRatioTop"]!!.jsonPrimitive.boolean,
+ team3Result["voteRatio"]!!.jsonPrimitive.double,
+ team3Result["isVoteRatioTop"]!!.jsonPrimitive.boolean,
+ team3Result["regularContributionRatio"]!!.jsonPrimitive.double,
+ team3Result["isRegularContributionRatioTop"]!!.jsonPrimitive.boolean,
+ team3Result["challengeContributionRatio"]!!.jsonPrimitive.double,
+ team3Result["isChallengeContributionRatioTop"]!!.jsonPrimitive.boolean,
+ team3Result["tricolorContributionRatio"]!!.jsonPrimitive.double,
+ team3Result["isTricolorContributionRatioTop"]!!.jsonPrimitive.boolean,
+ )
+ ),
+ )
+ )
+ }
+ Logger.out("Updated Splatfest data")
+ }
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/coop/CoopGearData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/coop/CoopGearData.kt
new file mode 100644
index 0000000..4f46642
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/coop/CoopGearData.kt
@@ -0,0 +1,28 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.coop
+
+import io.ktor.http.*
+
+data class CoopGearData(
+ val name: String,
+ val image: Url,
+ val __typename: String,
+
+ )
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/ChallengeModeData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/ChallengeModeData.kt
new file mode 100644
index 0000000..c288fe9
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/ChallengeModeData.kt
@@ -0,0 +1,34 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.schedule
+
+data class ChallengeModeData(
+ val leagueMatchEventId: String,
+ val name: String,
+ val description: String,
+ val regulation: String,
+ val map1: MapData?,
+ val map2: MapData?,
+ val __typename: String,
+ val ruleSet: String,
+ val ruleSetName: String,
+ val timePeriod1: TimePeriodData,
+ val timePeriod2: TimePeriodData,
+ val timePeriod3: TimePeriodData,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/MapData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/MapData.kt
new file mode 100644
index 0000000..422783c
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/MapData.kt
@@ -0,0 +1,27 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.schedule
+
+import io.ktor.http.*
+
+data class MapData(
+ val stageID: Int,
+ val image: Url,
+ val name: String,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/ModeData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/ModeData.kt
new file mode 100644
index 0000000..8295a1a
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/ModeData.kt
@@ -0,0 +1,30 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.schedule
+
+data class ModeData(
+ val startTime: String,
+ val endTime: String,
+ val matchType: String,
+ val map1: MapData?,
+ val map2: MapData?,
+ val ruleSetName: String,
+ val ruleSet: String,
+ val mode: String,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/ShiftData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/ShiftData.kt
new file mode 100644
index 0000000..a4d28ae
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/ShiftData.kt
@@ -0,0 +1,34 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.schedule
+
+import io.ktor.http.*
+
+data class ShiftData(
+ val startTime: String,
+ val endTime: String,
+ val __splatoon3ink_king_salmonid_guess: String,
+ val __typename: String,
+ val stageName: String,
+ val image: Url,
+ val weapon1: WeaponData,
+ val weapon2: WeaponData,
+ val weapon3: WeaponData,
+ val weapon4: WeaponData,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/TimePeriodData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/TimePeriodData.kt
new file mode 100644
index 0000000..53edb96
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/TimePeriodData.kt
@@ -0,0 +1,24 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.schedule
+
+data class TimePeriodData(
+ val startTime: String,
+ val endTime: String,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/WeaponData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/WeaponData.kt
new file mode 100644
index 0000000..997a24b
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/schedule/WeaponData.kt
@@ -0,0 +1,26 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.schedule
+
+import io.ktor.http.*
+
+data class WeaponData(
+ val name: String,
+ val image: Url,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestColor.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestColor.kt
new file mode 100644
index 0000000..391ccb3
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestColor.kt
@@ -0,0 +1,26 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.splatfest
+
+data class SplatfestColor(
+ val a: Int,
+ val b: Double,
+ val g: Double,
+ val r: Double,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestData.kt
new file mode 100644
index 0000000..f52b9b4
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestData.kt
@@ -0,0 +1,33 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.splatfest
+
+import io.ktor.http.*
+
+data class SplatfestData(
+ val id: String,
+ val state: String,
+ val startTime: String,
+ val endTime: String,
+ val title: String,
+ val image: Url,
+ val team1: SplatfestTeamData,
+ val team2: SplatfestTeamData,
+ val team3: SplatfestTeamData,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestTeamData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestTeamData.kt
new file mode 100644
index 0000000..9ea2e72
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestTeamData.kt
@@ -0,0 +1,25 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.splatfest
+
+data class SplatfestTeamData(
+ val teamName: String,
+ val color: SplatfestColor,
+ val results: SplatfestTeamResults?,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestTeamResults.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestTeamResults.kt
new file mode 100644
index 0000000..4888adc
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatfest/SplatfestTeamResults.kt
@@ -0,0 +1,33 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.splatfest
+
+data class SplatfestTeamResults(
+ val isWinner: Boolean,
+ val horagaiRatio: Double,
+ val horagaiRatioTop: Boolean,
+ val voteRatio: Double,
+ val voteRatioTop: Boolean,
+ val regularRatio: Double,
+ val regularRatioTop: Boolean,
+ val challengeRatio: Double,
+ val challengeRatioTop: Boolean,
+ val tricolorRatio: Double,
+ val tricolorRatioTop: Boolean,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatnet/BrandData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatnet/BrandData.kt
new file mode 100644
index 0000000..6781172
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatnet/BrandData.kt
@@ -0,0 +1,28 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.splatnet
+
+import io.ktor.http.*
+
+data class BrandData(
+ val name: String,
+ val image: Url,
+ val usualGearPower: GearAbilityData?,
+ val saleEndTime: String?,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatnet/GearAbilityData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatnet/GearAbilityData.kt
new file mode 100644
index 0000000..713d946
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatnet/GearAbilityData.kt
@@ -0,0 +1,27 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.splatnet
+
+import io.ktor.http.*
+
+data class GearAbilityData(
+ val name: String,
+ val description: String?,
+ val image: Url,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatnet/SplatnetItemData.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatnet/SplatnetItemData.kt
new file mode 100644
index 0000000..43df20b
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/entry/splatnet/SplatnetItemData.kt
@@ -0,0 +1,32 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.entry.splatnet
+
+import io.ktor.http.*
+
+data class SplatnetItemData(
+ val saleEndTime: String,
+ val price: Int,
+ val typeName: String,
+ val name: String,
+ val primaryGearPower: GearAbilityData,
+ val additionalGearPowers: List,
+ val image: Url,
+ val brand: BrandData,
+)
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/type/ApiDataType.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/type/ApiDataType.kt
new file mode 100644
index 0000000..7123b0d
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/type/ApiDataType.kt
@@ -0,0 +1,27 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.type
+
+enum class ApiDataType {
+ SCHEDULES,
+ SPLATNETGEAR,
+ COOP,
+ SPLATFESTS,
+ ALL
+}
diff --git a/src/main/kotlin/net/moonleay/lilJudd/data/api/type/ApiRequestType.kt b/src/main/kotlin/net/moonleay/lilJudd/data/api/type/ApiRequestType.kt
new file mode 100644
index 0000000..da20371
--- /dev/null
+++ b/src/main/kotlin/net/moonleay/lilJudd/data/api/type/ApiRequestType.kt
@@ -0,0 +1,26 @@
+/*
+ * lilJudd
+ * Copyright (C) 2023 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.lilJudd.data.api.type
+
+enum class ApiRequestType(val nameToDisplay: String) {
+ AUTOMATIC_CACHE_UPDATE("automatic request to update the cache"),
+ AUTOMATIC_CACHE_CREATION_AT_STARTUP("automatic request to create cache at startup"),
+ MANUAL("manual request"),
+ DEBUG("debug request")
+}