///
///
import Enum from "../../../guimanager/Enum";
import SoopyMouseClickEvent from "../../../guimanager/EventListener/SoopyMouseClickEvent";
import BoxWithLoading from "../../../guimanager/GuiElement/BoxWithLoading";
import ButtonWithArrow from "../../../guimanager/GuiElement/ButtonWithArrow";
import SoopyGuiElement from "../../../guimanager/GuiElement/SoopyGuiElement";
import SoopyMarkdownElement from "../../../guimanager/GuiElement/SoopyMarkdownElement";
import SoopyTextElement from "../../../guimanager/GuiElement/SoopyTextElement";
import TextBox from "../../../guimanager/GuiElement/TextBox";
import Feature from "../../featureClass/class";
import socketConnection from "../../socketConnection";
import { numberWithCommas, timeSince } from "../../utils/numberUtils";
import { firstLetterCapital, firstLetterWordCapital } from "../../utils/stringUtils";
import GuiPage from "../soopyGui/GuiPage";
class EventsGui extends Feature {
constructor() {
super()
}
onEnable() {
this.initVariables()
this.GuiPage = new EventsPage()
// this.registerChat("&9&m-----------------------------------------------------&r&9${*}&r&9 ${*} &6Friends (Page ${pagenum} of ${maxpages})${friendslist}&r&9&m-----------------------------------------------------&r", (...args) => { this.GuiPage.friendListMessageEvent.call(this.GuiPage, ...args) })
this.registerStep(true, 5, () => { this.GuiPage.regenGuiElements.call(this.GuiPage) })
this.registerStep(false, 60, () => { this.GuiPage.pollData.call(this.GuiPage) })
}
eventsDataUpdated(data) {
this.GuiPage.eventsDataUpdated(data)
}
joinEventResult(data) {
this.GuiPage.joinEventResult(data)
}
pollEventData(admin) {
this.GuiPage.pollEventData(admin)
}
initVariables() {
this.GuiPage = undefined
}
onDisable() {
this.initVariables()
}
}
class EventsPage extends GuiPage {
constructor() {
super(8)
this.name = "Events"
this.pages = [this.newPage()]
this.leaderboardElm = undefined
this.memberData = undefined
this.lastScroll = 1
this.leaderboardChildren = []
this.code = undefined
this.finaliseLoading()
}
updateNotInEvent() {
this.pages[0].clearChildren()
this.pages[0].addChild(new SoopyTextElement().setText("§0You are not currently in any events").setMaxTextScale(3).setLocation(0.2, 0.1, 0.6, 0.2))
this.pages[0].addChild(new SoopyTextElement().setText("§0If you have a join code enter it here").setMaxTextScale(1).setLocation(0.3, 0.4, 0.4, 0.1))
let joinBox = new TextBox().setPlaceholder("Code here").setLocation(0.3, 0.5, 0.4, 0.1)
this.pages[0].addChild(joinBox)
this.pages[0].addChild(new ButtonWithArrow().setLocation(0.35, 0.6, 0.3, 0.1).setText("§0Join Event").addEvent(new SoopyMouseClickEvent().setHandler(() => {
let code = joinBox.getText()
this.pages[0].clearChildren()
this.pages[0].addChild(new BoxWithLoading().setLocation(0.3, 0.3, 0.4, 0.4))
socketConnection.pollEventCode(code)
this.code = code
})))
}
updateInEvent(data) {
//MAIN PAGE
this.pages[0].clearChildren()
this.pages[0].addChild(new SoopyTextElement().setText("§0You are curently in an event managed by §6" + data.admin).setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.2))
if (!data.members[Player.getUUID().toString().replace(/-/g, "")]) {
this.pages[0].addChild(new ButtonWithArrow().setText("§0Join").setLocation(0.2, 0.2, 0.6, 0.1).addEvent(new SoopyMouseClickEvent().setHandler(() => {
this.pages[0].clearChildren()
this.pages[0].addChild(new BoxWithLoading().setLocation(0.3, 0.3, 0.4, 0.4))
socketConnection.pollEventCode(data.code)
this.code = data.code
})))
}
let leaderboard = new SoopyGuiElement().setLocation(0.1, 0.3, 0.8, 0.7).setScrollable(true)
this.pages[0].addChild(leaderboard)
let playerPosition = -1
if (this.leaderboardElm) {
let scroll = this.leaderboardElm._scrollAmount
leaderboard._scrollAmount = scroll
leaderboard.location.scroll.y.set(scroll, 0)
}
this.leaderboardElm = leaderboard
Object.values(data.members).sort((a, b) => b.progress - a.progress).forEach((m, i) => {
let isPlayer = m.uuid === Player.getUUID().toString().replace(/-/g, "")
if (isPlayer) playerPosition = i + 1
let nameLine = new SoopyTextElement().setText(`${isPlayer ? "§d" : "§0"}#${i + 1} ${m.username}`).setLocation(0, i * 0.05, 0.5, 0.05).setLore(["Last updated " + timeSince(m.timestamp) + " ago", "Currently: " + (m.online ? "§aOnline" : "§cOffline")])
nameLine.timestamp = m.timestamp
nameLine.online = m.online
leaderboard.addChild(nameLine)
let lore = [
`TOTAL: §e${numberWithCommas(Math.floor(m.progress))}`,
` `
]
Object.keys(m.current.weights).map(w => {
let progress = m.current.weights[w] - m.starting.weights[w]
return [w, progress]
}).sort((a, b) => b[1] - a[1]).forEach((l, i) => {
if (i > 10) return
lore.push(firstLetterWordCapital(l[0].replace(/_/g, " ").replace(/^.+? /, "")) + ": §e" + numberWithCommas(Math.floor(l[1])))
})
leaderboard.addChild(new SoopyTextElement().setText(`§0+${numberWithCommas(Math.floor(m.progress))}`).setLocation(0.5, i * 0.05, 0.5, 0.05).setLore(lore))
})
this.leaderboardChildren = [...leaderboard.children]
this.lastScroll = 1
if (playerPosition >= 0) {
this.pages[0].addChild(new SoopyTextElement().setText("§0You are #" + playerPosition + " with +" + Math.floor(data.members[Player.getUUID().toString().replace(/-/g, "")].progress)).setMaxTextScale(2).setLocation(0.2, 0.2, 0.6, 0.1))
}
// SIDEBAR
let sideBarElm = new SoopyGuiElement().setLocation(0, 0, 1, 1).setScrollable(true)
sideBarElm.addChild(new SoopyTextElement().setText("§0Event Settings").setMaxTextScale(3).setLocation(0.1, 0, 0.8, 0.2))
sideBarElm.addChild(new SoopyMarkdownElement().setLocation(0.05, 0.2, 0.9, 1).setText("# Tracking: \n" + data.settings.tracking.map(a => firstLetterCapital(a.replace(/\w+?_/, "").replace(/_/g, " "))).join("\n")))
this.openSidebarPage(sideBarElm)
}
regenGuiElements() {
if (!this.isOpen()) return
if (this.leaderboardElm) {
let scroll = this.leaderboardElm.location.scroll.y.get()
if (this.lastScroll !== scroll) {
this.lastScroll = scroll
this.leaderboardElm.children = []
let min = this.leaderboardElm.location.getYExact() - 100
let max = min + 200 + this.leaderboardElm.location.getHeightExact()
let lastChildNotAdded = undefined
this.leaderboardChildren.forEach(c => {
c.setParent(this.leaderboardElm)
c.triggerEvent(Enum.EVENT.RESET_FRAME_CACHES)
let y = c.location.getYExact()
if (y > min && y < max) {
this.leaderboardElm.children.push(c)
} else {
lastChildNotAdded = c
}
})
if (lastChildNotAdded) {
this.leaderboardElm.children.push(lastChildNotAdded)
}
}
this.leaderboardChildren.forEach(c => {
if (c.timestamp) {
c.setLore(["Last updated " + timeSince(c.timestamp) + " ago", "Currently: " + (c.online ? "§aOnline" : "§cOffline")])
}
})
}
}
eventsDataUpdated(data) {
if (!data.inEvent) {
this.updateNotInEvent()
return
}
this.updateInEvent(data)
}
pollEventData(admin) {
if (!admin) {
this.updateNotInEvent()
this.pages[0].addChild(new SoopyTextElement().setText("§cInvalid code").setMaxTextScale(3).setLocation(0.2, 0.7, 0.6, 0.2))
return
}
this.pages[0].clearChildren()
this.pages[0].addChild(new SoopyTextElement().setText("§0Join §6" + admin + "§0's event?").setMaxTextScale(3).setLocation(0.2, 0.2, 0.6, 0.2))
this.pages[0].addChild(new ButtonWithArrow().setText("§0Join").setLocation(0.4, 0.4, 0.4, 0.3).addEvent(new SoopyMouseClickEvent().setHandler(() => {
socketConnection.joinEvent(this.code)
this.pages[0].clearChildren()
this.pages[0].addChild(new BoxWithLoading().setLocation(0.3, 0.3, 0.4, 0.4))
})))
this.pages[0].addChild(new ButtonWithArrow().setText("§0Cancel").setLocation(0.2, 0.4, 0.2, 0.3).setDirectionRight(false).addEvent(new SoopyMouseClickEvent().setHandler(() => {
this.updateNotInEvent()
})))
}
joinEventResult(data) {
this.pages[0].clearChildren()
if (data.success) {
this.pages[0].addChild(new SoopyTextElement().setText("§0Joined event!").setMaxTextScale(3).setLocation(0.2, 0.2, 0.6, 0.2))
this.pages[0].addChild(new ButtonWithArrow().setText("§0Ok").setLocation(0.3, 0.4, 0.4, 0.4).addEvent(new SoopyMouseClickEvent().setHandler(() => {
this.pages[0].clearChildren()
this.pages[0].addChild(new BoxWithLoading().setLocation(0.3, 0.3, 0.4, 0.4))
socketConnection.pollEventData()
})))
} else {
this.pages[0].addChild(new SoopyTextElement().setText("§0Unable to join event!").setMaxTextScale(3).setLocation(0.2, 0.2, 0.6, 0.1))
this.pages[0].addChild(new SoopyTextElement().setText("§0" + data.reason).setMaxTextScale(3).setLocation(0.2, 0.3, 0.6, 0.1))
this.pages[0].addChild(new ButtonWithArrow().setText("§0Ok").setLocation(0.3, 0.4, 0.4, 0.4).addEvent(new SoopyMouseClickEvent().setHandler(() => {
this.pages[0].clearChildren()
this.pages[0].addChild(new BoxWithLoading().setLocation(0.3, 0.3, 0.4, 0.4))
socketConnection.pollEventData()
})))
}
}
pollData() {
if (!this.isOpen()) return
socketConnection.pollEventData()
}
onOpen() {
this.pages[0].clearChildren()
this.pages[0].addChild(new BoxWithLoading().setLocation(0.3, 0.3, 0.4, 0.4))
this.leaderboardElm = undefined
socketConnection.pollEventData()
}
}
module.exports = {
class: new EventsGui()
}