///
///
import SoopyTextElement from "../../../guimanager/GuiElement/SoopyTextElement";
import Feature from "../../featureClass/class";
import GuiPage from "../soopyGui/GuiPage";
import BoxWithLoading from "../../../guimanager/GuiElement/BoxWithLoading";
import BoxWithTextAndDescription from "../../../guimanager/GuiElement/BoxWithTextAndDescription";
import SoopyGuiElement from "../../../guimanager/GuiElement/SoopyGuiElement";
import TextBox from "../../../guimanager/GuiElement/TextBox";
import SoopyKeyPressEvent from "../../../guimanager/EventListener/SoopyKeyPressEvent";
import { firstLetterWordCapital } from "../../utils/stringUtils";
import SoopyMouseClickEvent from "../../../guimanager/EventListener/SoopyMouseClickEvent";
import ButtonWithArrow from "../../../guimanager/GuiElement/ButtonWithArrow";
import SoopyImageElement from "../../../guimanager/GuiElement/SoopyImageElement";
import renderLibs from "../../../guimanager/renderLibs";
import SoopyBoxElement from "../../../guimanager/GuiElement/SoopyBoxElement";
import Dropdown from "../../../guimanager/GuiElement/Dropdown";
import SoopyContentChangeEvent from "../../../guimanager/EventListener/SoopyContentChangeEvent";
class StatHistoryGUI extends Feature {
constructor() {
super()
}
onEnable() {
this.initVariables()
this.GuiPage = new StatGraphPage()
}
initVariables() {
this.GuiPage = undefined
}
onDisable() {
this.initVariables()
}
}
class StatGraphPage extends GuiPage {
constructor() {
super(7)
this.name = "Stat Graphs"
this.pages = [this.newPage()]
this.pages[0].addChild(new SoopyTextElement().setText("§0Stat Graphs").setMaxTextScale(3).setLocation(0.1, 0.05, 0.6, 0.1))
let button = new ButtonWithArrow().setText("§0Open in browser").setLocation(0.7, 0.05, 0.2, 0.1)
this.pages[0].addChild(button)
button.addEvent(new SoopyMouseClickEvent().setHandler(() => {
java.awt.Desktop.getDesktop().browse(
new java.net.URI("https://soopy.dev/stathistory")
);
}))
this.nameInput = new TextBox().setPlaceholder("Click to search").setLocation(0.1, 0.225, 0.8, 0.1)
this.pages[0].addChild(this.nameInput)
this.nameInput.addEvent(new SoopyKeyPressEvent().setHandler((key, keyId) => {
if (this.nameInput.text.selected && keyId === 28) {
this.playerLoad = this.nameInput.text.text
this.nameInput.setText("")
this.updateData(this.playerLoad)
}
}))
this.statArea = new SoopyGuiElement().setLocation(0.05, 0.325, 0.9, 0.675).setScrollable(true)
this.pages[0].addChild(this.statArea)
this.loadingElm = new BoxWithLoading().setLocation(0.35, 0.4, 0.3, 0.2)
this.errorElm = new BoxWithTextAndDescription().setLocation(0.2, 0.3, 0.6, 0.4).setText("Error!").setDesc("An error occured while loading the data!")
this.statArea.addChild(this.loadingElm)
this.playerLoad = undefined
this.finaliseLoading()
}
async updateData(player, profIn) {
this.closeSidebarPage()
this.playerLoad = player
this.statArea._scrollAmount = 0
this.statArea.location.scroll.y.set(0, 100)
this.statArea.clearChildren()
this.statArea.addChild(this.loadingElm)
let playerData = await fetch("https://soopy.dev/api/v2/player/" + player).json()
if (player !== this.playerLoad) return
if (!playerData.success) {
this.statArea.clearChildren()
this.statArea.addChild(this.errorElm)
this.errorElm.setText("§0" + playerData.error.name)
this.errorElm.setDesc("§0" + playerData.error.description)
return
}
this.statArea.clearChildren()
let nameElm = new SoopyTextElement().setText(playerData.data.stats.nameWithPrefix.replace(/§f/g, "§7")).setMaxTextScale(2).setLocation(0.1, 0.05, 0.5, 0.1)
this.statArea.addChild(nameElm)
this.statArea.addChild(this.loadingElm)
let skyblockData = await fetch("https://soopy.dev/api/v2/player_skyblock/" + playerData.data.uuid).json()
if (player !== this.playerLoad) return
if (!skyblockData.success) {
this.statArea.clearChildren()
this.statArea.addChild(this.errorElm)
this.errorElm.setText("§0" + skyblockData.error.name)
this.errorElm.setDesc("§0" + skyblockData.error.description)
return
}
let selectedProf = profIn || skyblockData.data.stats.bestProfileId
let profOptions = {}
Object.keys(skyblockData.data.profiles).forEach(p => {
profOptions[p] = skyblockData.data.profiles[p].stats.cute_name
})
let profileSelect = new Dropdown().setOptions(profOptions).setSelectedOption(selectedProf).setLocation(0.6, 0.05, 0.3, 0.1).addEvent(new SoopyContentChangeEvent().setHandler(newval => {
this.updateData(player, newval)
}))
this.statArea.addChild(profileSelect)
fetch("https://soopy.dev/statgraphgenerations/" + playerData.data.uuid + "/" + selectedProf).json().then(graphData => {
if (player !== this.playerLoad) return
new Thread(() => {
let y = 0.2
Object.keys(graphData).forEach(type => {
let typeElm = new SoopyTextElement().setText("§0" + firstLetterWordCapital(type.replace("total", ""))).setMaxTextScale(2).setLocation(0.1, y, 0.8, 0.1)
this.statArea.addChild(typeElm)
y += 0.15
let graph = Object.keys(graphData[type])[0]
renderLibs.getImage(graphData[type][graph], true) //load image synchronously into cache so it knows the height
let graphElm = new SoopyImageElement()
this.statArea.addChild(graphElm)
graphElm.setImage(graphData[type][graph])
graphElm.setLocation(0.1, y, 0.8, 0.25)
graphElm.loadHeightFromImage()
y += graphElm.location.size.y.get() + 0.05
if (Object.keys(graphData[type]).length > 1) {
graphElm.setLore(["Click to show more graphs"])
graphElm.addEvent(new SoopyMouseClickEvent().setHandler(() => {
let sideBarElm = new SoopyGuiElement().setLocation(0, 0, 1, 1)
sideBarElm.scrollable = true
this.openSidebarPage(sideBarElm)
let y2 = 0.05
new Thread(() => {
Object.keys(graphData[type]).forEach((graph, i) => {
if (i === 0) return
renderLibs.getImage(graphData[type][graph], true) //load image synchronously into cache so it knows the height
let graphElm = new SoopyImageElement()
sideBarElm.addChild(graphElm)
graphElm.setImage(graphData[type][graph])
graphElm.setLocation(0.1, y2, 0.8, 0.25)
graphElm.loadHeightFromImage()
y2 += graphElm.location.size.y.get() + 0.05
})
}).start()
}))
}
})
}).start()
})
}
onOpen() {
this.playerLoad = Player.getName()
this.updateData(Player.getName())
}
}
module.exports = {
class: new StatHistoryGUI()
}