diff options
Diffstat (limited to 'src/features/eventsGUI')
-rw-r--r-- | src/features/eventsGUI/index.js | 287 | ||||
-rw-r--r-- | src/features/eventsGUI/metadata.json | 8 |
2 files changed, 295 insertions, 0 deletions
diff --git a/src/features/eventsGUI/index.js b/src/features/eventsGUI/index.js new file mode 100644 index 0000000..90e6993 --- /dev/null +++ b/src/features/eventsGUI/index.js @@ -0,0 +1,287 @@ +/// <reference types="../../../../CTAutocomplete" /> +/// <reference lib="es2015" /> +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, 10, () => { 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)) + + if (Player.getUUID().toString().replace(/-/g, "") === data.admin) { + sideBarElm.addChild(new ButtonWithArrow().setText("§0Change").setMaxTextScale(3).setLocation(0.1, 0.2, 0.8, 0.2).addEvent(new SoopyMouseClickEvent().setHandler(() => { + + }))) + } + + 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() +}
\ No newline at end of file diff --git a/src/features/eventsGUI/metadata.json b/src/features/eventsGUI/metadata.json new file mode 100644 index 0000000..b7b1f6f --- /dev/null +++ b/src/features/eventsGUI/metadata.json @@ -0,0 +1,8 @@ +{ + "name": "Friends gui", + "description": "Gui for friends", + "isHidden": true, + "isTogglable": false, + "defaultEnabled": true, + "sortA": 0 +}
\ No newline at end of file |