Display rank alongside name

This commit is contained in:
nea
2023-06-02 02:32:02 +02:00
parent b61476608e
commit 3d76538cef
7 changed files with 135 additions and 25 deletions

View File

@@ -9,7 +9,7 @@ plugins {
id("dev.architectury.loom") version "1.1.336" id("dev.architectury.loom") version "1.1.336"
id("com.github.johnrengelman.shadow") version "7.1.2" id("com.github.johnrengelman.shadow") version "7.1.2"
id("moe.nea.licenseextractificator") id("moe.nea.licenseextractificator")
id("io.github.juuxel.loom-quiltflower") version "1.7.3" id("io.github.juuxel.loom-quiltflower") version "1.10.0"
} }
java { java {

View File

@@ -11,7 +11,7 @@ modmenu = "6.2.1"
ktor = "2.3.0" ktor = "2.3.0"
dbus_java = "4.2.1" dbus_java = "4.2.1"
architectury = "8.1.79" architectury = "8.1.79"
neurepoparser = "1.1.0" neurepoparser = "1.2.0"
qolify = "1.2.2-1.19.4" qolify = "1.2.2-1.19.4"
citresewn = "1.1.3+1.19.4" citresewn = "1.1.3+1.19.4"
lib39 = "1.4.2" lib39 = "1.4.2"

View File

@@ -11,6 +11,8 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.UseSerializers import kotlinx.serialization.UseSerializers
import kotlin.reflect.KProperty1 import kotlin.reflect.KProperty1
import net.minecraft.util.DyeColor import net.minecraft.util.DyeColor
import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.LegacyFormattingCode
import moe.nea.firmament.util.json.DashlessUUIDSerializer import moe.nea.firmament.util.json.DashlessUUIDSerializer
import moe.nea.firmament.util.json.InstantAsLongSerializer import moe.nea.firmament.util.json.InstantAsLongSerializer
@@ -105,5 +107,33 @@ data class Pet(
val candyUsed: Int, val candyUsed: Int,
val heldItem: String?, val heldItem: String?,
val skin: String?, val skin: String?,
)
) @Serializable
data class PlayerResponse(
val success: Boolean,
val player: PlayerData,
)
@Serializable
data class PlayerData(
val uuid: UUID,
val firstLogin: Instant,
val lastLogin: Instant,
@SerialName("playername")
val playerName: String,
val achievementsOneTime: List<String> = listOf(),
@SerialName("newPackageRank")
val packageRank: String?,
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[monthlyPackageRank ?: packageRank]
}
@Serializable
data class AshconNameLookup(
val username: String,
val uuid: UUID,
)

View File

@@ -66,27 +66,7 @@ fun firmamentCommand() = literal("firmament") {
} }
thenLiteral("pv") { thenLiteral("pv") {
thenExecute { thenExecute {
val me = MC.player!!.uuid ProfileViewer.onCommand(source, MC.player!!.name.unformattedString)
val name = MC.player!!.name.unformattedString
val names = mapOf(me to name)
source.sendFeedback(Text.translatable("firmament.pv.lookingup", name))
Firmament.coroutineScope.launch {
val profiles = Firmament.httpClient.get {
url {
protocol = URLProtocol.HTTPS
host = "api.hypixel.net"
path("skyblock", "profiles")
parameter("key", "06b68418-71eb-4c2a-bb8a-65ed8bd4d5aa")
parameter("uuid", me.toString())
}
}.body<Profiles>()
val profile = profiles.profiles.find { it.selected }
if (profile == null) {
source.sendFeedback(Text.translatable("firmament.pv.noprofile", name))
return@launch
}
ScreenUtil.setScreenLater(CottonClientScreen(ProfileViewer(me, names, profile)))
}
} }
} }
thenLiteral("price") { thenLiteral("price") {

View File

@@ -1,19 +1,36 @@
package moe.nea.firmament.gui.profileviewer package moe.nea.firmament.gui.profileviewer
import io.github.cottonmc.cotton.gui.client.CottonClientScreen
import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription
import io.github.cottonmc.cotton.gui.widget.WTabPanel import io.github.cottonmc.cotton.gui.widget.WTabPanel
import io.ktor.client.call.body
import io.ktor.client.request.get
import io.ktor.client.request.parameter
import io.ktor.http.URLProtocol
import io.ktor.http.path
import java.util.UUID import java.util.UUID
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource
import kotlinx.coroutines.launch
import net.minecraft.text.Text
import moe.nea.firmament.Firmament
import moe.nea.firmament.apis.AshconNameLookup
import moe.nea.firmament.apis.Member import moe.nea.firmament.apis.Member
import moe.nea.firmament.apis.PlayerData
import moe.nea.firmament.apis.PlayerResponse
import moe.nea.firmament.apis.Profile import moe.nea.firmament.apis.Profile
import moe.nea.firmament.apis.Profiles
import moe.nea.firmament.util.ScreenUtil
class ProfileViewer( class ProfileViewer(
val primaryPlayer: UUID, val primaryPlayer: UUID,
val playerNames: Map<UUID, String>, val playerNames: Map<UUID, String>,
val accountData: Map<UUID, PlayerData>,
val profile: Profile, val profile: Profile,
) : LightweightGuiDescription() { ) : LightweightGuiDescription() {
val member: Member = profile.members[primaryPlayer] ?: error("Primary player not in profile") val member: Member = profile.members[primaryPlayer] ?: error("Primary player not in profile")
val primaryName: String = playerNames[primaryPlayer] ?: error("Primary player has no name") val primaryName: String = playerNames[primaryPlayer] ?: error("Primary player has no name")
val account: PlayerData = accountData[primaryPlayer] ?: error("Primary player has no data")
init { init {
val panel = WTabPanel().also { rootPanel = it } val panel = WTabPanel().also { rootPanel = it }
@@ -26,6 +43,48 @@ class ProfileViewer(
} }
} }
} }
companion object {
fun onCommand(source: FabricClientCommandSource, name: String) {
source.sendFeedback(Text.translatable("firmament.pv.lookingup", name))
Firmament.coroutineScope.launch {
val nameData = Firmament.httpClient.get("https://api.ashcon.app/mojang/v2/user/$name").body<AshconNameLookup>()
val names = mapOf(nameData.uuid to nameData.username)
val data = Firmament.httpClient.get {
url {
protocol = URLProtocol.HTTPS
host = "api.hypixel.net"
path("player")
parameter("key", "e721a103-96e0-400f-af2a-73b2a91007b1")
parameter("uuid", nameData.uuid)
}
}.body<PlayerResponse>()
val accountData = mapOf(data.player.uuid to data.player)
val playerUuid = data.player.uuid
val profiles = Firmament.httpClient.get {
url {
protocol = URLProtocol.HTTPS
host = "api.hypixel.net"
path("skyblock", "profiles")
parameter("key", "e721a103-96e0-400f-af2a-73b2a91007b1")
parameter("uuid", playerUuid)
}
}.body<Profiles>()
val profile = profiles.profiles.find { it.selected }
if (profile == null) {
source.sendFeedback(Text.translatable("firmament.pv.noprofile", name))
return@launch
}
ScreenUtil.setScreenLater(
CottonClientScreen(
ProfileViewer(
playerUuid, names, accountData, profile
)
)
)
}
}
}
} }

View File

@@ -10,6 +10,7 @@ import io.github.cottonmc.cotton.gui.widget.icon.ItemIcon
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.item.Items import net.minecraft.item.Items
import net.minecraft.text.Text import net.minecraft.text.Text
import net.minecraft.util.Formatting
import moe.nea.firmament.apis.Skill import moe.nea.firmament.apis.Skill
import moe.nea.firmament.gui.WBar import moe.nea.firmament.gui.WBar
import moe.nea.firmament.repo.RepoManager import moe.nea.firmament.repo.RepoManager
@@ -19,7 +20,16 @@ object SkillPage : ProfilePage {
override fun getElements(profileViewer: ProfileViewer): WWidget { override fun getElements(profileViewer: ProfileViewer): WWidget {
return WGridPanel().also { return WGridPanel().also {
it.insets = Insets.ROOT_PANEL it.insets = Insets.ROOT_PANEL
it.add(WText(Text.literal(profileViewer.primaryName /* with rank? */)), 0, 0, 6, 1) it.add(
WText(
Text.literal(
profileViewer.account.rankData?.let {
("§${it.color}[${it.tag}${profileViewer.account.rankPlusDyeColor.modern}" +
"${it.plus ?: ""}§${it.color}] ${profileViewer.primaryName}")
} ?: "§${Formatting.GRAY}${profileViewer.primaryName}"
)
), 0, 0, 6, 1
)
for ((i, skill) in Skill.values().withIndex()) { for ((i, skill) in Skill.values().withIndex()) {
val leveling = RepoManager.neuRepo.constants.leveling val leveling = RepoManager.neuRepo.constants.leveling
val exp = skill.accessor.get(profileViewer.member) val exp = skill.accessor.get(profileViewer.member)

View File

@@ -0,0 +1,31 @@
package moe.nea.firmament.util
import net.minecraft.util.Formatting
enum class LegacyFormattingCode(val label: String, val char: Char, val index: Int) {
BLACK("BLACK", '0', 0),
DARK_BLUE("DARK_BLUE", '1', 1),
DARK_GREEN("DARK_GREEN", '2', 2),
DARK_AQUA("DARK_AQUA", '3', 3),
DARK_RED("DARK_RED", '4', 4),
DARK_PURPLE("DARK_PURPLE", '5', 5),
GOLD("GOLD", '6', 6),
GRAY("GRAY", '7', 7),
DARK_GRAY("DARK_GRAY", '8', 8),
BLUE("BLUE", '9', 9),
GREEN("GREEN", 'a', 10),
AQUA("AQUA", 'b', 11),
RED("RED", 'c', 12),
LIGHT_PURPLE("LIGHT_PURPLE", 'd', 13),
YELLOW("YELLOW", 'e', 14),
WHITE("WHITE", 'f', 15),
OBFUSCATED("OBFUSCATED", 'k', -1),
BOLD("BOLD", 'l', -1),
STRIKETHROUGH("STRIKETHROUGH", 'm', -1),
UNDERLINE("UNDERLINE", 'n', -1),
ITALIC("ITALIC", 'o', -1),
RESET("RESET", 'r', -1);
val modern = Formatting.byCode(char)!!
}