diff options
author | NetheriteMiner <88792142+NetheriteMiner@users.noreply.github.com> | 2023-07-04 05:45:26 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-04 11:45:26 +0200 |
commit | a8b5f0c4aaa918e4264beaa2c3295d25ef3b71ec (patch) | |
tree | 7d8df3c479bed0e13c512459887ff2786eae4007 | |
parent | d63fc58efb2622abeeeb09c3006f4243cb560500 (diff) | |
download | skyhanni-a8b5f0c4aaa918e4264beaa2c3295d25ef3b71ec.tar.gz skyhanni-a8b5f0c4aaa918e4264beaa2c3295d25ef3b71ec.tar.bz2 skyhanni-a8b5f0c4aaa918e4264beaa2c3295d25ef3b71ec.zip |
Update Rich Presence to support The Rift (#277)
Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com>
5 files changed, 234 insertions, 74 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 73d28f45e..dfaa3c34f 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -131,7 +131,7 @@ class SkyHanniMod { loadModule(CropAccessoryData()) loadModule(MayorElection()) loadModule(GardenComposterUpgradesData()) - loadModule(ActionBarStatsData()) + loadModule(ActionBarStatsData) loadModule(GardenCropMilestoneAverage()) loadModule(GardenCropSpeed) loadModule(ProfileStorageData) diff --git a/src/main/java/at/hannibal2/skyhanni/data/ActionBarStatsData.kt b/src/main/java/at/hannibal2/skyhanni/data/ActionBarStatsData.kt index 7e6c7f21e..e15190864 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/ActionBarStatsData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/ActionBarStatsData.kt @@ -2,34 +2,27 @@ package at.hannibal2.skyhanni.data import at.hannibal2.skyhanni.events.LorenzActionBarEvent import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import java.util.regex.Pattern -class ActionBarStatsData { - private val pattern = - Pattern.compile("..((?:\\d|,)*)\\/(?:\\d|,)*(.) *..((?:\\d|,)*)..(. \\w*) *..((?:\\d|,)*)\\/(?:\\d|,)*(✎).*") -// Sample input: §c2,817/2,817❤ §a703§a❈ Defense §b3,479/3,479✎ Mana -// Returns the following groups: 1 = 2,817; 2 = ❤; 3 = 703; 4 = ❈ Defense; 5 = 3,479; 6 = ✎ Mana +object ActionBarStatsData { + private val patterns = mapOf( + "health" to "§c(?<health>[\\d,]+)/[\\d,]+❤.*".toPattern(), + "defense" to ".*§a(?<defense>[\\d,]+)§a❈.*".toPattern(), + "mana" to ".*§b(?<mana>[\\d,]+)/[\\d,]+✎.*".toPattern(), + "riftTime" to "§[a7](?<riftTime>[\\dms ]+)ф.*".toPattern(), + ) - companion object { - var groups = listOf<String>() - } + var groups = mutableMapOf("health" to "", "riftTime" to "", "defense" to "", "mana" to "") @SubscribeEvent fun onActionBar(event: LorenzActionBarEvent) { - groups = readGroups(event.message) - } - - private fun readGroups(message: String): List<String> { - if (!LorenzUtils.inSkyBlock) return emptyList() - - val matcher = pattern.matcher(message) - if (!matcher.matches()) return emptyList() + if (!LorenzUtils.inSkyBlock) return - val list = mutableListOf<String>() - for (i in 1..matcher.groupCount()) { - list.add(matcher.group(i)) + for ((groupName, pattern) in patterns) { + pattern.matchMatcher(event.message) { + groups[groupName] = group(groupName) + } } - return list } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordLocationKey.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordLocationKey.kt index 8fbfadbd0..1dac3f130 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordLocationKey.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordLocationKey.kt @@ -1,5 +1,8 @@ package at.hannibal2.skyhanni.features.misc.discordrpc +import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.utils.LorenzUtils + class DiscordLocationKey { private val normalRPC = setOf( @@ -7,7 +10,6 @@ class DiscordLocationKey { "bank", "canvas-room", "coal-mine", - "colosseum", "farm", "fashion-shop", "flower-house", @@ -19,36 +21,75 @@ class DiscordLocationKey { "tavern", "village", "wilderness", - "wizard-tower", "birch-park", "spruce-woods", "savanna-woodland", "dark-thicket", "jungle-island", "gold-mine", - "slimehill", - "diamond-reserve", - "obsidian-sanctuary", + "slime-hill", "the-barn", "mushroom-desert", - "the-end" + "the-end", + "around-colosseum", + "barrier-street", + "dreadfarm", + "empty-bank", + "lagoon-hut", + "living-cave", + "rift-gallery", + "the-rift", + "village-plaza", + "wyld-woods" ) // list of tokens where the name can just be lowercased and spaces can be replaced with dashes private val specialRPC = mapOf( - "Fisherman's Hut" to "fishermans-hut", "Unincorporated" to "high-level", - "Dragon's Nest" to "dragons-nest", "Void Sepulture" to "the-end", "Void Slate" to "the-end", - "Zealot Bruiser Hideout" to "the-end", "Desert Settlement" to "mushroom-desert", - "Oasis" to "mushroom-desert", "Desert Mountain" to "mushroom-desert", "Jake's House" to "mushroom-desert", - "Trapper's Den" to "mushroom-desert", "Mushroom Gorge" to "mushroom-desert", - "Glowing Mushroom Cave" to "mushroom-desert", "Overgrown Mushroom Cave" to "mushroom-desert", - "Shepherd's Keep" to "mushroom-desert", "Treasure Hunter Camp" to "mushroom-desert", - "Windmill" to "the-barn", "Spider's Den" to "spiders-den", "Arachne's Burrow" to "spiders-den", - "Arachne's Sanctuary" to "spiders-den", "Archaeologist's Camp" to "spiders-den", - "Grandma's House" to "spiders-den", "Gravel Mines" to "spiders-den", "Spider Mound" to "spiders-den", - "Melody's Plateau" to "forest", "Viking Longhouse" to "forest", "Lonely Island" to "forest", - "Howling Cave" to "forest" - ) // maps locations that do have a token, but have parentheses or a legacy key + "Fisherman's Hut" to "fishermans-hut", + "Farmhouse" to "farm", + "Dragon's Nest" to "dragons-nest", + "Windmill" to "the-barn", + "Dark Auction" to "wilderness", + "Catacombs Entrance" to "coal-mine", + "Colosseum Arena" to "colosseum", + "Museum" to "unincorporated", + "Mines of Divan" to "gold-mine", + + "Archery Range" to "village", + "Bazaar Alley" to "village", + "Blacksmith" to "village", + "Election Room" to "village", + "Hexatorum" to "village", + "Thaumaturgist" to "village", + + "Void Sepulture" to "the-end", + "Void Slate" to "the-end", + "Zealot Bruiser Hideout" to "dragons-nest", + + "Desert Settlement" to "mushroom-desert", + "Oasis" to "mushroom-desert", + "Desert Mountain" to "mushroom-desert", + "Jake's House" to "mushroom-desert", + "Trapper's Den" to "mushroom-desert", + "Mushroom Gorge" to "mushroom-desert", + "Glowing Mushroom Cave" to "mushroom-desert", + "Overgrown Mushroom Cave" to "mushroom-desert", + "Shepherd's Keep" to "mushroom-desert", + "Treasure Hunter Camp" to "mushroom-desert", + + "Spider's Den" to "spiders-den", + "Arachne's Burrow" to "spiders-den", + "Arachne's Sanctuary" to "spiders-den", + "Archaeologist's Camp" to "spiders-den", + "Grandma's House" to "spiders-den", + "Gravel Mines" to "spiders-den", + "Spider Mound" to "spiders-den", + + "Melody's Plateau" to "savanna-woodland", + "Viking Longhouse" to "spruce-woods", + "Lonely Island" to "spruce-woods", + "Howling Cave" to "birch-park" + ) // maps sublocations to their broader image private val specialNetherRPC = arrayOf( "Aura's Lab", @@ -60,7 +101,6 @@ class DiscordLocationKey { "Chief's Hut", "Courtyard", "Crimson Fields", - "Crimson Isle", "Dojo", "Dragontail Auction House", "Dragontail Bank", @@ -71,6 +111,7 @@ class DiscordLocationKey { "Forgotten Skull", "Igrupan's Chicken Coop", "Igrupan's House", + "Kuudra's Hollow", "Mage Council", "Mage Outpost", "Magma Chamber", @@ -89,13 +130,137 @@ class DiscordLocationKey { "Scarleton", "Smoldering Tomb", "Stronghold", - "The Bastion", "The Dukedom", "The Wasteland", "Throne Room" ) // list of nether locations because there are sooo many (truncated some according to scoreboard) + private val specialMiningRPC = arrayOf( + "Diamond Reserve", + "Gunpowder Mines", + "Lapis Quarry", + "Obsidian Sanctuary", + "Pigmen's Den", + + "Aristocrat Passage", + "Barracks of Heroes", + "C&C Minecarts Co.", + "Cliffside Veins", + "Divan's Gateway", + "Dwarven Tavern", + "Dwarven Village", + "Far Reserve", + "Forge Basin", + "Gates to the Mines", + "Goblin Burrows", + "Grand Library", + "Great Ice Wall", + "Hanging Court", + "Lava Springs", + "Miner's Guild", + "Palace Bridge", + "Rampart's Quarry", + "Royal Mines", + "Royal Palace", + "Royal Quarters", + "The Forge", + "The Lift", + "The Mist", + "Upper Mines", + + "Crystal Nucleus", + "Dragon's Lair", + "Fairy Grotto", + "Goblin Holdout", + "Goblin Queen's Den", + "Jungle Temple", + "Jungle", + "Khazad-dûm", + "Lost Precursor City", + "Magma Fields", + "Mithril Deposits", + "Precursor Remnants" + ) // using coal-mine because i may as well, except for mines of divan which gets gold mine. also, slimehill actually has an image for some reason. + + private val specialRiftRPC = mapOf( + "Enigma's Crib" to "wyld-woods", + "Broken Cage" to "wyld-woods", + "Shifted Tavern" to "wyld-woods", + "Pumpgrotto" to "wyld-woods", + "Otherside" to "wyld-woods", + + "Black Lagoon" to "the-rift", + "Lagoon Cave" to "the-rift", + "Leeches Lair" to "the-rift", + "Dolphin Trainer" to "the-rift", + "Mirrorverse" to "the-rift", + "Book In A Book" to "the-rift", + "\"Your\" Island" to "the-rift", + + "Lagoon Hut" to "lagoon-hut", + "Around Colosseum" to "around-colosseum", + "Rift Gallery Entrance" to "rift-gallery", + "Great Beanstalk" to "dreadfarm", + "Taylor's" to "taylors", + "Lonely Terrace" to "taylors", + "Half-Eaten Cave" to "half-cave", + "Déjà Vu Alley" to "living-cave", + "Living Stillness" to "living-cave", + + "West Village" to "village-plaza", + "Cake House" to "village-plaza", + "Infested House" to "village-plaza", + "Murder House" to "village-plaza", + "Barry Center" to "village-plaza", + "Barry HQ" to "village-plaza", + + "Photon Pathway" to "stillgore-chateau", + "Stillgore Château" to "stillgore-chateau", + "Oubliette" to "stillgore-chateau", + "Fairylosopher Tower" to "stillgore-chateau" + ) + + private fun getAmbiguousKey(location: String): String { + val island = LorenzUtils.skyBlockIsland + + return when (location) { + "Wizard Tower" -> { + when (island) { + IslandType.THE_RIFT -> "rift-tower" + IslandType.HUB -> "wizard-tower" + else -> "skyblock-logo" + } + } + + "The Bastion" -> { + when (island) { + IslandType.THE_RIFT -> "wyld-woods" + IslandType.CRIMSON_ISLE -> "crimson-isle" + else -> "skyblock-logo" + } + } + + "Community Center" -> { + when (island) { + IslandType.HUB -> "village" + IslandType.CRIMSON_ISLE -> "crimson-isle" + else -> "skyblock-logo" + } + } + + "Colosseum" -> { + when (island) { + IslandType.HUB -> "colosseum" + IslandType.THE_RIFT -> "around-colosseum" + else -> "skyblock-logo" + } + } + + else -> "skyblock-logo" + } + } + fun getDiscordIconKey(location: String): String { val keyIfNormal = location.lowercase().replace(' ', '-') @@ -104,9 +269,13 @@ class DiscordLocationKey { } else if (specialRPC.containsKey(location)) { specialRPC[location]!! } else if (specialNetherRPC.contains(location)) { - "blazing-fortress" + "crimson-isle" + } else if (specialMiningRPC.contains(location)) { + "coal-mine" + } else if (specialRiftRPC.containsKey(location)) { + specialRiftRPC[location]!! } else { - "skyblock" // future proofing since we can't update the images anymore :( + getAmbiguousKey(location) // will return skyblock-logo if not found } } }
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordRPCManager.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordRPCManager.kt index a709b59d4..06ca27355 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordRPCManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordRPCManager.kt @@ -23,8 +23,8 @@ import java.util.concurrent.ScheduledExecutorService import java.util.concurrent.TimeUnit object DiscordRPCManager : IPCListener { - private val applicationID = 653443797182578707L - private val updatePeriod = 4200L + private const val applicationID = 1093298182735282176L + private const val updatePeriod = 4200L private val config get() = feature.misc.discordRPC diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordStatus.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordStatus.kt index d114913bb..c77776d5d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordStatus.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/discordrpc/DiscordStatus.kt @@ -3,20 +3,15 @@ package at.hannibal2.skyhanni.features.misc.discordrpc // SkyblockAddons code, adapted for SkyHanni import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.data.ActionBarStatsData +import at.hannibal2.skyhanni.data.* import at.hannibal2.skyhanni.data.GardenCropMilestones.Companion.getCounter import at.hannibal2.skyhanni.data.GardenCropMilestones.Companion.getTierForCrops import at.hannibal2.skyhanni.data.GardenCropMilestones.Companion.progressToNextLevel -import at.hannibal2.skyhanni.data.HypixelData -import at.hannibal2.skyhanni.data.ProfileStorageData -import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.features.garden.GardenAPI.getCropType +import at.hannibal2.skyhanni.features.rift.RiftAPI import at.hannibal2.skyhanni.utils.InventoryUtils -import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName -import at.hannibal2.skyhanni.utils.ItemUtils.name import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.colorCodeToRarity -import at.hannibal2.skyhanni.utils.NEUItems import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.TabListData.Companion.getTabList @@ -77,27 +72,33 @@ val stackingEnchants = mapOf( ) ) // nbtNum is the id of the enchantment in the nbt data +private fun getVisitingName(): String { + val tabData = getTabList() + val ownerRegex = Pattern.compile(".*Owner: (?<username>\\w+).*") + for (line in tabData) { + val colorlessLine = line.removeColor() + val ownerMatcher = ownerRegex.matcher(colorlessLine) + if (ownerMatcher.matches()) { + return ownerMatcher.group("username") + } + } + return "Someone" +} + enum class DiscordStatus(private val displayMessageSupplier: Supplier<String>?) { NONE(null), LOCATION({ var location = LorenzUtils.skyBlockArea + val island = LorenzUtils.skyBlockIsland if (location == "Your Island") location = "Private Island" - if (location != "None" && location != "invalid") { + if (island == IslandType.PRIVATE_ISLAND_GUEST) lastKnownDisplayStrings[LOCATION] = + "${getVisitingName()}'s Island" + else if (location != "None" && location != "invalid") { lastKnownDisplayStrings[LOCATION] = location } lastKnownDisplayStrings[LOCATION] ?: "None"// only display None if we don't have a last known area - /** - * looks slightly weird if visiting someone else's island, - * I was thinking of using LorenzUtils.skyblockIsland to determine if they're visiting, - * but it takes too long to load, so we 'd have to put in some sort of artificial delay - * like what I did in DiscordRPCManager.onWorldChange. - * after that, use the tab-list "Owner:" line to get the person we're visiting, but I don't know - * if that'll work with coops, and you'd have to deal with color codes as well - * anyway, I'm pretty sure sba had "'s Island" without the name filled in this entire time, - * so I'd rather have [RANK] NameThatGetsCutOff for example than 's Island - */ }), PURSE({ @@ -129,15 +130,12 @@ enum class DiscordStatus(private val displayMessageSupplier: Supplier<String>?) STATS({ val groups = ActionBarStatsData.groups - var statString = "" - for (item in groups.indices) { - when (groups[item]) { - "❤" -> statString = "❤${groups[item - 1]} " - "❈ Defense" -> statString = "$statString❈${groups[item - 1]} " - "✎" -> statString = "$statString✎${groups[item - 1]} " - } + val statString = if (!RiftAPI.inRift()) { + "❤${groups["health"]} ❈${groups["defense"]} ✎${groups["mana"]}" + } else { + "${groups["riftTime"]}ф ✎${groups["mana"]}" } - if (groups.isNotEmpty()) { + if (groups["mana"] != "") { lastKnownDisplayStrings[STATS] = statString } lastKnownDisplayStrings[STATS] ?: "" @@ -281,7 +279,7 @@ enum class DiscordStatus(private val displayMessageSupplier: Supplier<String>?) } val itemInHand = Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem() - val itemName = itemInHand?.let { NEUItems.getItemStack(it.getInternalName()).name?.removeColor() ?: "" } ?: "" + val itemName = itemInHand?.displayName?.removeColor() ?: "" val extraAttributes = getExtraAttributes(itemInHand) |