/// /// import Feature from "../../featureClass/class"; import ButtonSetting from "../settings/settingThings/button"; import TextSetting from "../settings/settingThings/textSetting"; import ToggleSetting from "../settings/settingThings/toggle"; import firstLoadPages from "./firstLoadPages"; import GuiPage from "../soopyGui/GuiPage" import SoopyTextElement from "../../../guimanager/GuiElement/SoopyTextElement"; import Notification from "../../../guimanager/Notification"; import logger from "../../logger"; import soopyV2Server from "../../socketConnection"; import { numberWithCommas } from "../../utils/numberUtils"; import { firstLetterCapital } from "../../utils/stringUtils"; import { fetch } from "../../utils/networkUtils"; const Files = Java.type("java.nio.file.Files") const Paths = Java.type("java.nio.file.Paths") const JavaString = Java.type("java.lang.String") const JavaLong = Java.type("java.lang.Long") class Hud extends Feature { constructor() { super() this.initVariables() } initVariables() { this.apiKeySetting = undefined this.GuiPage = undefined } onEnable() { this.apiKeySetting = new TextSetting("Api Key", "Your hypixel api key", "", "api_key", this, "Run /api new to load", true) this.verifyApiKey = new ButtonSetting("Verify api key", "Click this to make sure the api key is working", "verify_key", this, "Click!", this.verifyKey2, undefined) this.newApiKey = new ButtonSetting("Run /api new", "This is here so u dont need to exit and re-enter", "api_new_command", this, "Click!", this.apiNewCommand, undefined) this.findApiKey = new ButtonSetting("Attempt to load api key from other mods", "This will scan other mods configs to attempt to find your key", "find_key", this, "Click!", () => { this.findKey() }, undefined) this.fixNeuNetworth = new ToggleSetting("Change networth in NEU pv to soopynw", "This should make it a lot more accurate", true, "neu_nw_override", this) this.reportErrorsSetting = new ToggleSetting("Send module errors to soopy server", "This will allow me to more effectivly fix them", false, "privacy_send_errors", this) this.privacySettings = [this.reportErrorsSetting] this.firstLoadPageData = JSON.parse(FileLib.read("soopyAddonsData", "soopyv2firstloaddata.json") || "{}") || {} this.GuiPage = new FirstLoadingPage(this) soopyV2Server.reportErrorsSetting = this.reportErrorsSetting this.registerChat("&aYour new API key is &r&b${key}&r", this.newKey) this.ranFirstLoadThing = false if (!this.firstLoadPageData.shown) { new Thread(() => { while (!World.isLoaded() || !this.FeatureManager.finishedLoading) { Thread.sleep(100) } Thread.sleep(500) this.showFirstLoadPage.call(this) }).start() } if (net.minecraftforge.fml.common.Loader.isModLoaded("notenoughupdates")) { this.GuiProfileViewer = Java.type("io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer") this.currentPlayerOpen = undefined this.currentPlayerNetworth = {} this.registerEvent("tick", this.fixNEU) } this.registerCommand("soopyweight", (user = Player.getName()) => { this.soopyWeight(user) }) this.registerCommand("sweight", (user = Player.getName()) => { this.soopyWeight(user) }) } fixNEU() { if (Client.currentGui.get() instanceof (this.GuiProfileViewer) && this.fixNeuNetworth.getValue()) { let guiProfileViewer = Client.currentGui.get() if (!guiProfileViewer.profile || !guiProfileViewer.profile.getHypixelProfile()) return let uuid = guiProfileViewer.profile.getHypixelProfile().get("uuid").getAsString().replace(/-/g, "") if (this.currentPlayerOpen != uuid) { this.currentPlayerOpen = uuid this.currentPlayerNetworth = {} fetch("http://soopymc.my.to/api/v2/player_skyblock/" + uuid).json(data => { if (!data.success) return if (this.currentPlayerOpen === data.data.uuid) { Object.keys(data.data.profiles).forEach(profileId => { if (!data.data.profiles[profileId].members[uuid].soopyNetworth.networth) return this.currentPlayerNetworth[data.data.profiles[profileId].stats.cute_name] = JavaLong.valueOf(data.data.profiles[profileId].members[uuid].soopyNetworth.networth) }) } }) } let map = this.getField(guiProfileViewer.profile, "networth") Object.keys(this.currentPlayerNetworth).forEach(key => { map.put(new JavaString(key), new JavaLong(this.currentPlayerNetworth[key])) }) } } getField(e, field) { let field2 = e.class.getDeclaredField(field); field2.setAccessible(true) return field2.get(e) } soopyWeight(user) { ChatLib.chat(this.FeatureManager.messagePrefix + "Finding senither weight for " + user) fetch("http://soopymc.my.to/api/v2/player/" + user).json(userData => { if (!userData.success) { ChatLib.chat(this.FeatureManager.messagePrefix + "&cError loading data: " + userData.error.description) return } fetch("http://soopymc.my.to/api/v2/player_skyblock/" + userData.data.uuid).json(sbData => { if (!sbData.success) { ChatLib.chat(this.FeatureManager.messagePrefix + "&cError loading data: " + sbData.error.description) return } ChatLib.chat("&c" + ChatLib.getChatBreak("-")) ChatLib.chat(userData.data.stats.nameWithPrefix + "'s senither weight (best profile):") ChatLib.chat("&aTotal: &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.total))) new Message(new TextComponent("&aSkills: &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.skill.total))) .setHover("show_text", Object.keys(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.skill).map(skill => { if (skill === "total") { return null } return "&a" + firstLetterCapital(skill) + ": &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.skill[skill].total)) + " &7(" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.skill[skill].weight)) + " | " + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.skill[skill].overflow)) + ")" }).filter(a => a).join("\n"))).chat() new Message(new TextComponent("&aSlayer: &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.slayer.total))) .setHover("show_text", Object.keys(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.slayer).map(slayer => { if (slayer === "total") { return null } return "&a" + firstLetterCapital(slayer) + ": &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.slayer[slayer].total)) + " &7(" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.slayer[slayer].weight)) + " | " + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.slayer[slayer].overflow)) + ")" }).filter(a => a).join("\n"))).chat() new Message(new TextComponent("&aDungeon: &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.dungeons.total))) .setHover("show_text", Object.keys(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.dungeons).map(dungeons => { if (dungeons === "total") { return null } return "&a" + firstLetterCapital(dungeons) + ": &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.dungeons[dungeons].total)) + " &7(" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.dungeons[dungeons].weight)) + " | " + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.bestProfileId].members[userData.data.uuid].weight.dungeons[dungeons].overflow)) + ")" }).filter(a => a).join("\n"))).chat() if (sbData.data.stats.bestProfileId !== sbData.data.stats.currentProfileId) { ChatLib.chat(userData.data.stats.nameWithPrefix + "'s senither weight (current profile):") ChatLib.chat("&aTotal: &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.total))) new Message(new TextComponent("&aSkills: &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.skill.total))) .setHover("show_text", Object.keys(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.skill).map(skill => { if (skill === "total") { return null } return "&a" + firstLetterCapital(skill) + ": &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.skill[skill].total)) + " &7(" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.skill[skill].weight)) + " | " + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.skill[skill].overflow)) + ")" }).filter(a => a).join("\n"))).chat() new Message(new TextComponent("&aSlayer: &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.slayer.total))) .setHover("show_text", Object.keys(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.slayer).map(slayer => { if (slayer === "total") { return null } return "&a" + firstLetterCapital(slayer) + ": &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.slayer[slayer].total)) + " &7(" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.slayer[slayer].weight)) + " | " + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.slayer[slayer].overflow)) + ")" }).filter(a => a).join("\n"))).chat() new Message(new TextComponent("&aDungeon: &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.dungeons.total))) .setHover("show_text", Object.keys(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.dungeons).map(dungeons => { if (dungeons === "total") { return null } return "&a" + firstLetterCapital(dungeons) + ": &b" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.dungeons[dungeons].total)) + " &7(" + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.dungeons[dungeons].weight)) + " | " + numberWithCommas(Math.round(sbData.data.profiles[sbData.data.stats.currentProfileId].members[userData.data.uuid].weight.dungeons[dungeons].overflow)) + ")" }).filter(a => a).join("\n"))).chat() } ChatLib.chat("&c" + ChatLib.getChatBreak("-")) }) }) } showFirstLoadPage() { if (!this.ranFirstLoadThing && World.isLoaded() && !this.firstLoadPageData.shown) { ChatLib.chat(this.FeatureManager.messagePrefix + "Opening first load page, if you accidentally close it run /soopyv2 and click the button") ChatLib.command("soopyv2 first_load_thing", true) this.ranFirstLoadThing = true this.firstLoadPageData.shown = true this.firstLoadPageData.version = 1 FileLib.write("soopyAddonsData", "soopyv2firstloaddata.json", JSON.stringify(this.firstLoadPageData)) } } verifyKey(key) { // console.log(key) if (key) { try { var url = "https://api.hypixel.net/key?key=" + key let data = fetch(url).json() // console.log(data) if (data.success) { return true } else { return false } } catch (e) { return false } } else { return false } } findKey() { new Notification("Finding key...", []) new Thread(() => { // NEU try { let testKey = JSON.parse(new JavaString(Files.readAllBytes(Paths.get("./config/notenoughupdates/configNew.json")))).apiKey.apiKey if (testKey) { if (this.verifyKey(testKey)) { this.apiKeySetting.setValue(testKey) new Notification("§aSuccess!", ["Found api key in NotEnoughUpdates!"]) return; } else { logger.logMessage("Found invalid key in NotEnoughUpdates", 3) } } } catch (_) { } // SBE try { let testKey = JSON.parse(new JavaString(Files.readAllBytes(Paths.get("./config/SkyblockExtras.cfg")))).values.apiKey if (testKey) { if (this.verifyKey(testKey)) { this.apiKeySetting.setValue(testKey) new Notification("§aSuccess!", ["Found api key in SkyblockExtras!"]) return; } else { logger.logMessage("Found invalid key in SkyblockExtras", 3) } } } catch (_) { } // SKYTILS try { let testKey2 = new JavaString(Files.readAllBytes(Paths.get("./config/skytils/config.toml"))) let testKey = undefined testKey2.split("\n").forEach(line => { if (line.startsWith(" hypixel_api_key = \"")) { testKey = line.split("\"")[1] } }) if (testKey) { if (this.verifyKey(testKey)) { this.apiKeySetting.setValue(testKey) new Notification("§aSuccess!", ["Found api key in Skytils!"]) return; } else { logger.logMessage("Found invalid key in Skytils", 3) } } } catch (_) { } // SOOPYADDONS DATA try { let testKey = FileLib.read("soopyAddonsData", "apikey.txt") if (testKey) { if (this.verifyKey(testKey)) { this.apiKeySetting.setValue(testKey) new Notification("§aSuccess!", ["Found api key in old soopyaddons version!"]) return; } else { logger.logMessage("Found invalid key in soopyaddonsData", 3) } } } catch (_) { } // HypixelApiKeyManager try { let testKey = JSON.parse(FileLib.read("HypixelApiKeyManager", "localdata.json")).key if (testKey) { if (this.verifyKey(testKey)) { this.apiKeySetting.setValue(testKey) new Notification("§aSuccess!", ["Found api key in HypixelApiKeyManager!"]) return; } else { logger.logMessage("Found invalid key in HypixelApiKeyManager", 3) } } } catch (_) { } new Notification("§cUnable to find api key", []) }).start() } apiNewCommand() { ChatLib.command("api new") } verifyKey2(key) { if (key) { try { var url = "https://api.hypixel.net/key?key=" + key let data = fetch(url).json() if (data.success) { return true } else { return false } } catch (e) { return false } } if (this.module.apiKeySetting.getValue() == "") { new Notification("§cError!", ["You need to set an api key first!"]) return } new Thread(() => { try { var url = "https://api.hypixel.net/key?key=" + this.module.apiKeySetting.getValue() let data = fetch(url).json() if (data.success) { new Notification("§aSuccess!", ["Your api key is valid!"]) return } else { new Notification("§cError!", ["Your api key is invalid!"]) return } } catch (e) { new Notification("§cError!", ["Your api key is invalid!"]) return } }).start() } newKey(key, event) { ChatLib.chat(this.FeatureManager.messagePrefix + "Copied api key!") this.apiKeySetting.setValue(key) } onDisable() { this.initVariables() } } class FirstLoadingPage extends GuiPage { constructor(mainThing) { super(-10) this.showBackButton = false this.name = "First load thing" this.mainThing = mainThing this.pageThings = [] firstLoadPages.forEach((page, i) => { let newPage = this.newPage() newPage.addChild(page) page.setLoc(i !== 0, i !== firstLoadPages.length - 1) page.guiPage = this this.pageThings.push(newPage) }) this.pageNum = 0 this.finaliseLoading() } nextPage() { this.pageNum++ this.goToPage(this.pageNum) } prevPage() { this.pageNum-- this.goToPage(this.pageNum) } onOpen() { this.pageNum = 0 firstLoadPages.forEach((page, i) => { page.load() }) } } module.exports = { class: new Hud() }