/// /// 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 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"; import socketConnection from "../../socketConnection"; import renderLibs from "../../../guimanager/renderLibs"; import { f } from "../../../mappings/mappings"; 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 GlobalSettings 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.alertAllUpdates = new ToggleSetting("Send chat update avalible for all updates", "If disabled itll notify for new updates less", false, "alert_all_updates", this) 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.darkTheme = new ToggleSetting("Dark theme", "This might be scuffed because guis are still made in light theme", false, "dark_theme", this) // this.linkPreview = new ToggleSetting("Link preview", "Shows a preview of where a link will take you", true, "link_preview", 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.hideFallingBlocks = new ToggleSetting("Hide falling blocks", "NOTE: this may cause more lag because of render entity event", false, "hide_falling_sand", this) this.twitchCommands = new ToggleSetting("Ingame twitch bot commands", "Allows u to use twitch bot commands ingame (eg -sa)", true, "twitch_commands_ingame", 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) const EntityFallingBlock = Java.type("net.minecraft.entity.item.EntityFallingBlock"); this.registerEvent('renderEntity', (entity, posVec, partialTicks, event) => { if (entity.getEntity() instanceof EntityFallingBlock) { cancel(event); } }).registeredWhen(() => this.hideFallingBlocks.getValue()) 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) } try { //This enables links from soopymc.my.to to be shown in patcher image preview let hasHost = false for (let host of Java.type("gg.essential.util.TrustedHostsUtil").INSTANCE.getTrustedHosts()) { if (host.getName() === "soopymc") { hasHost = true } } if (!hasHost) { let TrustedHost = Java.type("gg.essential.api.utils.TrustedHostsUtil").TrustedHost let TreeSet = Java.type("java.util.TreeSet") let hosts = new TreeSet() hosts.add("soopymc.my.to") let host = new TrustedHost(124123, "soopymc", hosts) Java.type("gg.essential.util.TrustedHostsUtil").INSTANCE.addTrustedHost(host) } } catch (e) { } this.registerCommand("soopyweight", (user = Player.getName()) => { this.soopyWeight(user) }) this.registerCommand("sweight", (user = Player.getName()) => { this.soopyWeight(user) }) this.registerCommand("lobbyday", () => { ChatLib.chat(this.FeatureManager.messagePrefix + "Current lobby is day " + (World.getTime() / 20 / 60 / 20).toFixed(2)) }) this.lastCookies = 0 this.registerEvent("postGuiRender", () => { if (Player.getContainer() && Player.getContainer().getName() === "Cookie Clicker v0.01" && Player.getContainer().getStackInSlot(13)) this.renderCookie() // if (this.linkPreview.getValue() && Client.currentGui && Client.currentGui.get() && Client.currentGui.get().toString().startsWith("net.minecraft.client.gui.GuiConfirmOpenLink")) this.renderWebpage() }) this.registerStep(false, 1, () => { if (Player.getContainer() && Player.getContainer().getName() === "Cookie Clicker v0.01" && Player.getContainer().getStackInSlot(13)) this.tickCookie() global.guiManagerSoopyGuisSetDarkThemeEnabled(this.darkTheme.getValue()) }) this.registerEvent("guiMouseClick", this.guiClicked) this.partyChatEnabled = true this.registerChat("&r&9Party &8> ${*}", (e) => { if (!this.partyChatEnabled) { cancel(e) } }) this.registerEvent("messageSent", (message, event) => { if (!this.twitchCommands.getValue()) return if (message.startsWith("-")) { cancel(event) fetch("http://soopymc.my.to/api/soopyv2/botcommand?m=" + encodeURIComponent(message.replace("-", "")) + "&u=" + Player.getName()).text(text => { ChatLib.chat(this.FeatureManager.messagePrefix + "&7" + message) let sendMessage = text sendMessage = sendMessage.split(" ").map(a => { if (a.match(/(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/igm)) { return new TextComponent("&f&n" + a + ' ').setHover("show_text", "Click to open " + a).setClick("open_url", a) } else { return new TextComponent("&f" + a + ' ') } }) sendMessage.reduce((c, curr) => c.addTextComponent(curr), new Message().addTextComponent(new TextComponent(this.FeatureManager.messagePrefix))).chat() }) } }) } // renderWebpage() { // let url = this.getField(Client.currentGui.get(), f.linkText) // let image = renderLibs.getImage("https://soopymc.my.to/api/soopyv2/webpage?webpage=" + url) // if (image) { // let scale = Renderer.screen.getHeight() * 0.5 / image.getTextureHeight() // image.draw(Renderer.screen.getWidth() / 2 - image.getTextureWidth() * scale / 2, Renderer.screen.getHeight() / 2, scale * image.getTextureWidth(), scale * image.getTextureHeight()) // } else { // Renderer.drawString("Loading website preview...", Renderer.screen.getWidth() / 2 - Renderer.getStringWidth("Loading website preview...") / 2, Renderer.screen.getHeight() * 3 / 4) // } // } guiClicked(mouseX, mouseY, button, gui, event) { if (gui.class.toString() === "class net.minecraft.client.gui.inventory.GuiChest" && Player.getContainer().getName() === "Cookie Clicker v0.01") { let hoveredSlot = gui.getSlotUnderMouse() if (!hoveredSlot) return let hoveredSlotId = hoveredSlot[f.slotNumber] // logger.logMessage(hoveredSlotId, 4) Player.getContainer().click(hoveredSlotId, false, "MIDDLE") cancel(event) } } tickCookie() { let cookies = parseInt(ChatLib.removeFormatting(Player.getContainer().getStackInSlot(13).getName().split(" ")[0])) let cookiesGained = cookies - this.lastCookies this.lastCookies = cookies if (cookiesGained > 50) cookiesGained = 0 if (cookiesGained < 1) cookiesGained = 0 if (!cookiesGained) cookiesGained = 0 socketConnection.cookiesGained(cookiesGained) } renderCookie() { let cookies = parseInt(ChatLib.removeFormatting(Player.getContainer().getStackInSlot(13).getName().split(" ")[0])) let cookiesGained = cookies - this.lastCookies let cookieCount = socketConnection.cookieCount + ((cookiesGained < 50 && cookiesGained > 0) ? cookiesGained : 0) renderLibs.drawString("Lifetime Cookies: " + numberWithCommas(cookieCount), 10, 10, 1) if (socketConnection.cookieData) { // this.cookieData = { // cookieLeaderboard: data.cookieLeaderboard, // clickingNow: data.clickingNow // } let linesOfText = [] linesOfText.push("---- CURRENTLY CLICKING ----") for (let data of socketConnection.cookieData.clickingNow) { linesOfText.push(data[0] + ": " + numberWithCommas(data[1])) if (linesOfText.length * 10 > Renderer.screen.getHeight() / 2) break } linesOfText.push("------- LEADERBOARD -------") let i = 0 for (let data of socketConnection.cookieData.cookieLeaderboard) { i++ linesOfText.push("#" + i + " " + data[0] + ": " + numberWithCommas(data[1])) if (linesOfText.length * 10 > Renderer.screen.getHeight() - 50) break } for (let i = 0; i < linesOfText.length; i++) { renderLibs.drawString(linesOfText[i], 10, 20 + 10 * i, 1) } } } fixNEU() { if (Client.currentGui && 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 GlobalSettings() }