@file:UseSerializers(DashlessUUIDSerializer::class, InstantAsLongSerializer::class) package moe.nea.firmament.apis import io.github.moulberry.repo.constants.Leveling import io.github.moulberry.repo.data.Rarity import java.util.UUID import kotlinx.datetime.Instant import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers import kotlin.reflect.KProperty1 import net.minecraft.util.DyeColor import net.minecraft.util.Formatting import moe.nea.firmament.repo.RepoManager import moe.nea.firmament.util.LegacyFormattingCode import moe.nea.firmament.util.SkyblockId import moe.nea.firmament.util.json.DashlessUUIDSerializer import moe.nea.firmament.util.json.InstantAsLongSerializer @Serializable data class CollectionSkillData( val items: Map ) @Serializable data class CollectionResponse( val success: Boolean, val collections: Map ) @Serializable data class CollectionInfo( val name: String, val maxTiers: Int, val tiers: List ) @Serializable data class CollectionTier( val tier: Int, val amountRequired: Long, val unlocks: List, ) @Serializable data class Profiles( val success: Boolean, val profiles: List? ) @Serializable data class Profile( @SerialName("profile_id") val profileId: UUID, @SerialName("cute_name") val cuteName: String, val selected: Boolean = false, val members: Map, ) enum class Skill(val accessor: KProperty1, val color: DyeColor, val icon: SkyblockId) { FARMING(Member::experienceSkillFarming, DyeColor.YELLOW, SkyblockId("ROOKIE_HOE")), FORAGING(Member::experienceSkillForaging, DyeColor.BROWN, SkyblockId("TREECAPITATOR_AXE")), MINING(Member::experienceSkillMining, DyeColor.LIGHT_GRAY, SkyblockId("DIAMOND_PICKAXE")), ALCHEMY(Member::experienceSkillAlchemy, DyeColor.PURPLE, SkyblockId("BREWING_STAND")), TAMING(Member::experienceSkillTaming, DyeColor.GREEN, SkyblockId("SUPER_EGG")), FISHING(Member::experienceSkillFishing, DyeColor.BLUE, SkyblockId("FARMER_ROD")), RUNECRAFTING(Member::experienceSkillRunecrafting, DyeColor.PINK, SkyblockId("MUSIC_RUNE;1")), CARPENTRY(Member::experienceSkillCarpentry, DyeColor.ORANGE, SkyblockId("WORKBENCH")), COMBAT(Member::experienceSkillCombat, DyeColor.RED, SkyblockId("UNDEAD_SWORD")), SOCIAL(Member::experienceSkillSocial, DyeColor.WHITE, SkyblockId("EGG_HUNT")), ENCHANTING(Member::experienceSkillEnchanting, DyeColor.MAGENTA, SkyblockId("ENCHANTMENT_TABLE")), ; fun getMaximumLevel(leveling: Leveling) = leveling.maximumLevels[name.lowercase()] ?: TODO("Repo error") fun getLadder(leveling: Leveling): List { if (this == SOCIAL) return leveling.socialExperienceRequiredPerLevel if (this == RUNECRAFTING) return leveling.runecraftingExperienceRequiredPerLevel return leveling.skillExperienceRequiredPerLevel } } @Serializable @JvmInline value class CollectionType(val string: String) { val skyblockId get() = SkyblockId(string.replace(":", "-").replace("MUSHROOM_COLLECTION", "HUGE_MUSHROOM_2")) } @Serializable data class Member( val pets: List = listOf(), @SerialName("coop_invitation") val coopInvitation: CoopInvitation? = null, @SerialName("experience_skill_farming") val experienceSkillFarming: Double = 0.0, @SerialName("experience_skill_alchemy") val experienceSkillAlchemy: Double = 0.0, @SerialName("experience_skill_combat") val experienceSkillCombat: Double = 0.0, @SerialName("experience_skill_taming") val experienceSkillTaming: Double = 0.0, @SerialName("experience_skill_social2") val experienceSkillSocial: Double = 0.0, @SerialName("experience_skill_enchanting") val experienceSkillEnchanting: Double = 0.0, @SerialName("experience_skill_fishing") val experienceSkillFishing: Double = 0.0, @SerialName("experience_skill_foraging") val experienceSkillForaging: Double = 0.0, @SerialName("experience_skill_mining") val experienceSkillMining: Double = 0.0, @SerialName("experience_skill_runecrafting") val experienceSkillRunecrafting: Double = 0.0, @SerialName("experience_skill_carpentry") val experienceSkillCarpentry: Double = 0.0, val collection: Map = mapOf() ) @Serializable data class CoopInvitation( val timestamp: Instant, @SerialName("invited_by") val invitedBy: UUID? = null, val confirmed: Boolean, ) @JvmInline @Serializable value class PetType(val name: String) @Serializable data class Pet( val uuid: UUID?, val type: PetType, val exp: Double, val active: Boolean, val tier: Rarity, val candyUsed: Int, val heldItem: String?, val skin: String?, ) { val itemId get() = SkyblockId("${type.name};${tier.ordinal}") } @Serializable data class PlayerResponse( val success: Boolean, val player: PlayerData, ) @Serializable data class PlayerData( val uuid: UUID, val firstLogin: Instant, val lastLogin: Instant? = null, @SerialName("playername") val playerName: String, val achievementsOneTime: List = listOf(), @SerialName("newPackageRank") val packageRank: String? = null, val monthlyPackageRank: String? = null, val rankPlusColor: String = "GOLD" ) { val rankPlusDyeColor = LegacyFormattingCode.values().find { it.name == rankPlusColor } ?: LegacyFormattingCode.GOLD val rankData get() = RepoManager.neuRepo.constants.misc.ranks[if (monthlyPackageRank == "NONE" || monthlyPackageRank == null) packageRank else monthlyPackageRank] fun getDisplayName(name: String = playerName) = rankData?.let { ("§${it.color}[${it.tag}${rankPlusDyeColor.modern}" + "${it.plus ?: ""}§${it.color}] $name") } ?: "${Formatting.GRAY}$name" } @Serializable data class AshconNameLookup( val username: String, val uuid: UUID, )