///
///
import { SoopyRenderEvent } from "../../../guimanager";
import ButtonWithArrowAndDescription from "../../../guimanager/GuiElement/ButtonWithArrowAndDescription";
import SoopyGuiElement from "../../../guimanager/GuiElement/SoopyGuiElement";
import SoopyTextElement from "../../../guimanager/GuiElement/SoopyTextElement";
import BoxWithLoading from "../../../guimanager/GuiElement/BoxWithLoading";
import Feature from "../../featureClass/class";
import GuiPage from "../soopyGui/GuiPage";
import { numberWithCommas, timeSince } from "../../utils/numberUtils";
import SoopyBoxElement from "../../../guimanager/GuiElement/SoopyBoxElement";
import SoopyMouseClickEvent from "../../../guimanager/EventListener/SoopyMouseClickEvent";
import TextBox from "../../../guimanager/GuiElement/TextBox";
import SoopyContentChangeEvent from "../../../guimanager/EventListener/SoopyContentChangeEvent";
import SoopyHoverChangeEvent from "../../../guimanager/EventListener/SoopyHoverChangeEvent";
import Dropdown from "../../../guimanager/GuiElement/Dropdown";
import SoopyMarkdownElement from "../../../guimanager/GuiElement/SoopyMarkdownElement"
import ButtonWithArrow from "../../../guimanager/GuiElement/ButtonWithArrow";
import SoopyRenderUpdateEvent from "../../../guimanager/EventListener/SoopyRenderUpdateEvent";
import { fetch } from "../../utils/networkUtils";
class SenitherGui extends Feature {
constructor() {
super()
}
onEnable() {
this.initVariables()
this.GuiPage = new SettingPage()
this.registerStep(true, 5, () => {
this.GuiPage.step.call(this.GuiPage)
})
}
initVariables() {
this.GuiPage = undefined
}
onDisable() {
this.GuiPage.delete()
this.initVariables()
}
}
class SettingPage extends GuiPage {
constructor() {
super(7)
this.name = "Senither Leaderboard"
this.pages = [this.newPage(), this.newPage()]
this.pages[0].addEvent(new SoopyRenderUpdateEvent().setHandler(() => { this.lastRender = Date.now() }))
let senitherTitle = new SoopyTextElement().setText("§0Senither Leaderboard").setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.1)
this.pages[0].addChild(senitherTitle)
this.guildButton = new ButtonWithArrowAndDescription().setText("§0Guild Leaderboard").setLocation(0.1, 0.2, 0.35, 0.2)
this.guildButton.addEvent(new SoopyMouseClickEvent().setHandler(() => {
this.clickedGuildButton()
}))
this.pages[0].addChild(this.guildButton)
this.playerButton = new ButtonWithArrowAndDescription().setText("§0Player Leaderboard").setLocation(0.55, 0.2, 0.35, 0.2)
this.playerButton.addEvent(new SoopyMouseClickEvent().setHandler(() => {
this.clickedPlayerButton()
}))
this.pages[0].addChild(this.playerButton)
this.guildButton.setDesc("§0Guilds tracked: &7Loading...")
this.playerButton.setDesc("§0Players tracked: &7Loading...")
let leaveAndJoins = new SoopyTextElement().setText("§0Leave and joins").setMaxTextScale(2).setLocation(0.1, 0.45, 0.8, 0.1)
this.pages[0].addChild(leaveAndJoins)
this.leaveAndJoinsBox = new SoopyBoxElement().setLocation(0.1, 0.55, 0.8, 0.4)
this.pages[0].addChild(this.leaveAndJoinsBox)
this.leaveAndJoinsBox.addChild(new BoxWithLoading().setLocation(0.2, 0.2, 0.6, 0.6))
this.playerPage = new SoopyGuiElement().setLocation(0, 0, 1, 1)
let playerTitle = new SoopyTextElement().setText("§0Player Leaderboard").setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.1)
this.playerPage.addChild(playerTitle)
this.playerSearchBox = new TextBox().setPlaceholder("Click to search").setLocation(0.2, 0.15, 0.6, 0.1)
this.playerPage.addChild(this.playerSearchBox)
this.playerPage.addChild(new SoopyTextElement().setText("§7Pos").setLocation(0.1, 0.3, 0.075 * 0.8, 0.1))
this.playerPage.addChild(new SoopyTextElement().setText("§7Name").setLocation(0.1 + 0.1 * 0.8, 0.3, 0.2 * 0.8, 0.1))
this.playerPage.addChild(new SoopyTextElement().setText("§7Guild").setLocation(0.1 + 0.325 * 0.8, 0.3, 0.2 * 0.8, 0.1))
let weight = new SoopyTextElement().setText("§0Weight").setLocation(0.1 + 0.55 * 0.8, 0.3, 0.2 * 0.8, 0.1).setLore(["Click to set sorting to weight"])
this.playerPage.addChild(weight)
weight.addEvent(new SoopyMouseClickEvent().setHandler(() => {
this.playerSortThing = "weight"
this.playerInformationUpdated = false
this.playersBox.location.scroll.y.set(0, 100)
this.playersBox._scrollAmount = 0
dropdown.setColorPrefix("&7")
weight.setText("§0Weight")
}))
let dropdown = new Dropdown().setOptions({
"average_skill": "Average Skill",
"average_skill_progress": "Average Skill Progress",
"catacomb": "Catacomb",
"catacomb_xp": "Catacomb Xp",
"secrets_found": "Secrets Found",
"healer": "Healer Level",
"healer_xp": "Healer Xp",
"mage": "Mage Level",
"mage_xp": "Mage Xp",
"berserk": "Berserk Level",
"berserk_xp": "Berserk Xp",
"archer": "Archer Level",
"archer_xp": "Archer Xp",
"tank": "Tank Level",
"tank_xp": "Tank Xp",
"total_slayer": "Total Slayer",
"revenant_xp": "Revenant Xp",
"tarantula_xp": "Tarantula Xp",
"sven_xp": "Sven Xp",
"enderman_xp": "Enderman Xp",
"mining": "Mining Level",
"mining_xp": "Mining Xp",
"foraging": "Foraging Level",
"foraging_xp": "Foraging Xp",
"enchanting": "Enchanting Level",
"enchanting_xp": "Enchanting Xp",
"farming": "Farming Level",
"farming_xp": "Farming Xp",
"combat": "Combat Level",
"combat_xp": "Combat Xp",
"fishing": "Fishing Level",
"fishing_xp": "Fishing Xp",
"alchemy": "Alchemy Level",
"alchemy_xp": "Alchemy Xp",
"taming": "Taming Level",
"taming_xp": "Taming Xp",
"carpentry": "Carpentry Level",
"carpentry_xp": "Carpentry Xp",
"runecrafting": "Runecrafting Level",
"runecrafting_xp": "Runecrafting Xp",
}).setSelectedOption("average_skill_progress").setLocation(0.1 + 0.75 * 0.8, 0.3, 0.25 * 0.8, 0.1).renderBox(false).setColorPrefix("&7")
this.playerPage.addChild(dropdown)
dropdown.text.setMaxTextScale(1)
this.playerSortThing = "weight"
dropdown.addEvent(new SoopyContentChangeEvent().setHandler(newVal => {
this.playerSortThing = newVal
this.selectedPlayerVal = newVal
this.playerInformationUpdated = false
this.playersBox.location.scroll.y.set(0, 100)
this.playersBox._scrollAmount = 0
dropdown.setColorPrefix("&0")
weight.setText("§7Weight")
}))
// element.addChild(new SoopyTextElement().setText("§0#"+(i+1)).setLocation(0,0,0.075,1))
// element.addChild(new SoopyTextElement().setText("§0"+p.username).setLocation(0.1,0,0.2,1))
// element.addChild(new SoopyTextElement().setText("§0"+p.guild_name).setLocation(0.325,0,0.2,1))
// element.addChild(new SoopyTextElement().setText("§0"+numberWithCommas(p.weight)).setLocation(0.55,0,0.2,1))
// element.addChild(new SoopyTextElement().setText("§0"+numberWithCommas(p[this.selectedPlayerVal])).setLocation(0.75,0,0.2,1))
this.playersBox = new SoopyGuiElement().setLocation(0.1, 0.4, 0.8, 0.6).setScrollable(true)
this.playerPage.addChild(this.playersBox)
this.playerSearch = ""
this.playerInformationUpdated = true
this.playerSearchBox.text.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun) => {
if (newVal.includes("&")) {
resetFun()
return;
}
this.playerSearch = newVal
this.playersBox.location.scroll.y.set(0, 100)
this.playersBox._scrollAmount = 0
this.playerInformationUpdated = false
}))
this.updatingPlayerInfo = false
this.selectedPlayerVal = "average_skill_progress"
this.guildData = undefined
this.guildPage = new SoopyGuiElement().setLocation(0, 0, 1, 1)
let guildTitle = new SoopyTextElement().setText("§0Guild Leaderboard").setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.1)
this.guildPage.addChild(guildTitle)
this.guildSearchBox = new TextBox().setPlaceholder("Click to search").setLocation(0.2, 0.15, 0.6, 0.1)
this.guildPage.addChild(this.guildSearchBox)
this.guildSearch = ""
this.guildSearchBox.text.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun) => {
this.guildSearch = newVal
this.guildsBox.location.scroll.y.set(0, 100)
this.guildsBox._scrollAmount = 0
this.regenGuildElements()
}))
this.guildSortThing = "weight.total"
this.oldSortElm = undefined
sortify = (sort, name, elm) => {
elm.addEvent(new SoopyMouseClickEvent().setHandler(() => {
if (this.oldSortElm) {
this.oldSortElm[0].setText("&7" + this.oldSortElm[1])
}
this.oldSortElm = [elm, name]
this.guildSortThing = sort
elm.setText("&0" + name)
this.regenGuildElements()
}))
elm.setLore(["Click to sort by " + name.toLowerCase()])
if (sort === this.guildSortThing) {
this.oldSortElm = [elm, name]
elm.setText("&0" + name)
} else {
elm.setText("&7" + name)
}
return elm
}
this.guildPage.addChild(new SoopyTextElement().setText("§7Pos").setLocation(0.1, 0.3, 0.075 * 0.8, 0.1))
this.guildPage.addChild(new SoopyTextElement().setText("§7Name").setLocation(0.1 + 0.1 * 0.8, 0.3, 0.2 * 0.8, 0.1))
this.guildPage.addChild(sortify("weight.total", "Weight", new SoopyTextElement().setLocation(0.1 + 0.325 * 0.8, 0.3, 0.15 * 0.8, 0.1)))
this.guildPage.addChild(sortify("members", "Members", new SoopyTextElement().setLocation(0.1 + 0.475 * 0.8, 0.3, (0.1 + 0.05 / 4) * 0.8, 0.1)))
this.guildPage.addChild(sortify("average_skill_progress", "Skill", new SoopyTextElement().setLocation(0.1 + 0.5875 * 0.8, 0.3, (0.1 + 0.05 / 4) * 0.8, 0.1)))
this.guildPage.addChild(sortify("average_slayer", "Slayer", new SoopyTextElement().setLocation(0.1 + 0.7 * 0.8, 0.3, (0.15 + 0.05 / 4) * 0.8, 0.1)))
this.guildPage.addChild(sortify("average_catacomb", "Catacombs", new SoopyTextElement().setLocation(0.1 + 0.8625 * 0.8, 0.3, (0.1 + 0.05 / 4) * 0.8, 0.1)))
this.guildsBox = new SoopyGuiElement().setLocation(0.1, 0.4, 0.8, 0.6).setScrollable(true)
this.guildPage.addChild(this.guildsBox)
this.finaliseLoading()
}
step() {
if (!this.playerInformationUpdated && !this.updatingPlayerInfo) {
this.loadPlayerInformation()
}
let pbHeight = this.playersBox.location.getHeightExact()
let pbY = this.playersBox.location.getYExact()
this.playersBox.children.forEach(b => {
b.visable = true
// console.log(this.playersBox._scrollAmount)
if (b.location.getYExact() + 0.3 * pbHeight < pbY) {
// console.log(2)
b.visable = false
}
if (b.location.getYExact() - 0.1 * pbHeight > pbHeight + pbY) {
// console.log(3)
b.visable = false
}
})
let gbHeight = this.guildsBox.location.getHeightExact()
let gbY = this.guildsBox.location.getYExact()
this.guildsBox.children.forEach(b => {
b.visable = true
// console.log(this.playersBox._scrollAmount)
if (b.location.getYExact() + 0.3 * gbHeight < gbY) {
// console.log(2)
b.visable = false
}
if (b.location.getYExact() - 0.1 * gbHeight > gbHeight + gbY) {
// console.log(3)
b.visable = false
}
})
}
clickedGuildButton() {
this.pages[1].clearChildren()
this.pages[1].addChild(this.guildPage)
this.guildSearchBox.setText("")
this.guildSearch = ""
// this.playersBox.location.scroll.y.set(0, 0)
// this.playersBox._scrollAmount = 0
this.goToPage(2)
this.loadGuildInformation()
}
async loadGuildInformation() {
let data = awaitfetch("https://hypixel-app-api.senither.com/leaderboard/").json()
this.guildData = data.data
this.regenGuildElements()
}
regenGuildElements() {
this.guildsBox.clearChildren()
let yPosThing = 0
this.guildData.sort((a, b) => {
return getThing(b, this.guildSortThing.split(".")) - getThing(a, this.guildSortThing.split("."))
}).forEach((g, i) => {
if (g.name.toLowerCase().includes(this.guildSearch.toLowerCase())) {
let element = new SoopyBoxElement().setLocation(0, yPosThing * 0.175, 1, 0.15)
element.addEvent(new SoopyHoverChangeEvent().setHandler(() => {
if (element.hovered) {
if (element.color[0] + element.color[1] + element.color[2] < 0.5 * (255 + 255 + 255)) {
element.setColorOffset(10, 10, 10, 100)
} else {
element.setColorOffset(-10, -10, -10, 100)
}
} else {
element.setColorOffset(0, 0, 0, 100)
}
}))
element.addChild(new SoopyTextElement().setText("§0#" + (i + 1)).setLocation(0, 0, 0.075, 1))
element.addChild(new SoopyTextElement().setText("§0" + g.name).setLocation(0.1, 0, 0.2, 1))
element.addChild(new SoopyTextElement().setText("§0" + numberWithCommas(Math.floor(g.weight.total))).setLocation(0.325, 0, 0.15, 1).setLore(["§6" + numberWithCommas(g.weight.skill) + " §7skill weight", "§6" + numberWithCommas(g.weight.slayer) + " §7slayer weight", "§6" + numberWithCommas(g.weight.catacomb) + " §7dungeons weight", "§6" + g.weight.multiplier + " §7multiplier"]))
element.addChild(new SoopyTextElement().setText("§0" + numberWithCommas(g.members)).setLocation(0.475, 0, 0.1, 1))
element.addChild(new SoopyTextElement().setText("§0" + numberWithCommas(g.average_skill_progress)).setLocation(0.5875, 0, 0.1, 1))
element.addChild(new SoopyTextElement().setText("§0" + numberWithCommas(Math.floor(g.average_slayer))).setLocation(0.7, 0, 0.15, 1))
element.addChild(new SoopyTextElement().setText("§0" + numberWithCommas(g.average_catacomb)).setLocation(0.8625, 0, 0.1, 1))
// element.addChild(new SoopyTextElement().setText("§0"+numberWithCommas(g.members)).setLocation(0.75,0,0.2,1))
this.guildsBox.addChild(element)
yPosThing++
}
// this.guildPage.addChild(new SoopyTextElement().setText("§0Pos").setLocation(0.1,0.3,0.075*0.8,0.1))
// this.guildPage.addChild(new SoopyTextElement().setText("§0Name").setLocation(0.1+0.1*0.8,0.3,0.2*0.8,0.1))
// this.guildPage.addChild(new SoopyTextElement().setText("§0Weight").setLocation(0.1+0.325*0.8,0.3,0.15*0.8,0.1))
// this.guildPage.addChild(new SoopyTextElement().setText("§0Members").setLocation(0.1+0.475*0.8,0.3,(0.1+0.05/4)*0.8,0.1))
// this.guildPage.addChild(new SoopyTextElement().setText("§0Skill").setLocation(0.1+0.5875*0.8,0.3,(0.1+0.05/4)*0.8,0.1))
// this.guildPage.addChild(new SoopyTextElement().setText("§0Slayer").setLocation(0.1+0.7*0.8,0.3,(0.15+0.05/4)*0.8,0.1))
// this.guildPage.addChild(new SoopyTextElement().setText("§0Catacombs").setLocation(0.1+0.8625*0.8,0.3,(0.1+0.05/4)*0.8,0.1))
})
}
clickedPlayerButton() {
this.pages[1].clearChildren()
this.pages[1].addChild(this.playerPage)
this.playerSearchBox.setText("")
this.playerSearch = ""
this.playersBox.location.scroll.y.set(0, 0)
this.playersBox._scrollAmount = 0
this.goToPage(2)
this.playerInformationUpdated = false
}
async loadPlayerInformation() {
if (this.updatingPlayerInfo) return
this.updatingPlayerInfo = true
this.playerInformationUpdated = true
let players = await fetch("https://hypixel-app-api.senither.com/leaderboard/players?perPage=100&page=1&sort=" + this.playerSortThing + (this.playerSearch ? "&username=" + this.playerSearch : "")).json()
this.playersBox.clearChildren()
players.data.forEach((p, i) => {
let element = new SoopyBoxElement().setLocation(0, i * 0.175, 1, 0.15)
element.addEvent(new SoopyHoverChangeEvent().setHandler(() => {
if (element.hovered) {
if (element.color[0] + element.color[1] + element.color[2] < 0.5 * (255 + 255 + 255)) {
element.setColorOffset(10, 10, 10, 100)
} else {
element.setColorOffset(-10, -10, -10, 100)
}
} else {
element.setColorOffset(0, 0, 0, 100)
}
}))
element.addChild(new SoopyTextElement().setText("§0#" + (i + 1)).setLocation(0, 0, 0.075, 1))
element.addChild(new SoopyTextElement().setText("§0" + p.username).setLocation(0.1, 0, 0.2, 1))
element.addChild(new SoopyTextElement().setText("§0" + p.guild_name).setLocation(0.325, 0, 0.2, 1))
element.addChild(new SoopyTextElement().setText("§0" + numberWithCommas(p.weight)).setLocation(0.55, 0, 0.2, 1))
element.addChild(new SoopyTextElement().setText("§0" + numberWithCommas(p[this.selectedPlayerVal])).setLocation(0.75, 0, 0.2, 1))
this.playersBox.addChild(element)
})
this.updatingPlayerInfo = false
}
async loadFirstPageInformation() {
let stats = await fetch("https://hypixel-app-api.senither.com/leaderboard/stats").json()
this.guildButton.setDesc("§0Guilds tracked: " + numberWithCommas(stats.data.guilds))
this.playerButton.setDesc("§0Players tracked: " + numberWithCommas(stats.data.players))
let leaveAndJoins = await fetch("https://hypixel-app-api.senither.com/leaderboard/history?perPage=10&page=1").json()
this.leaveAndJoinsBox.clearChildren()
let y = 0
leaveAndJoins.data.forEach(elm => {
this.leaveAndJoinsBox.addChild(new SoopyTextElement().setText(`§1${elm.username} §7${elm.type === 0 ? "joined" : "left"} §1${elm.guild_name}`).setLocation(0.05, y, 0.8, 0.1))
this.leaveAndJoinsBox.addChild(new SoopyTextElement().setText(`§7${timeSince(elm.created_at)} ago`).setLocation(0.8125, y, 0.175, 0.1))
y += 0.1
})
}
onOpen() {
this.loadFirstPageInformation()
let sidebar = new SoopyGuiElement().setLocation(0.1, 0.1, 0.8, 0.8).setScrollable(true).enableFrameBuffer()
this.openSidebarPage(sidebar)
let markdown = new SoopyMarkdownElement().setText("# NOTE: \nAll credit for the idea, design of this gui, and loading of data goes to Senither who made the original leaderboard (https://hypixel-leaderboard.senither.com/)\n\nThis is just a recode of that to allow for checking the leaderboard from in-game")
sidebar.addChild(markdown)
sidebar.addChild(new ButtonWithArrow().setText("§0Open Leaderboard Website").setLocation(0.1, markdown.getHeight() + 0.05, 0.8, 0.2).addEvent(new SoopyMouseClickEvent().setHandler(() => {
java.awt.Desktop.getDesktop().browse(new java.net.URI("https://hypixel-leaderboard.senither.com/"));
})))
sidebar.setScrollable(true)
sidebar.dirtyFrameBuffer(1000)
}
}
module.exports = {
class: new SenitherGui()
}
function getThing(obj, stack) {
while (stack.length > 0) {
obj = obj[stack.shift()]
}
return obj
}