aboutsummaryrefslogtreecommitdiff
path: root/src/features/friendsGUI/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/features/friendsGUI/index.js')
-rw-r--r--src/features/friendsGUI/index.js363
1 files changed, 363 insertions, 0 deletions
diff --git a/src/features/friendsGUI/index.js b/src/features/friendsGUI/index.js
new file mode 100644
index 0000000..d4ac2f4
--- /dev/null
+++ b/src/features/friendsGUI/index.js
@@ -0,0 +1,363 @@
+/// <reference types="../../../../CTAutocomplete" />
+/// <reference lib="es2015" />
+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 SoopyMouseClickEvent from "../../../guimanager/EventListener/SoopyMouseClickEvent";
+import ButtonWithArrow from "../../../guimanager/GuiElement/ButtonWithArrow";
+import ProgressBar from "../../../guimanager/GuiElement/ProgressBar";
+import logger from "../../logger";
+import SoopyMarkdownElement from "../../../guimanager/GuiElement/SoopyMarkdownElement";
+
+class FriendsGui extends Feature {
+ constructor() {
+ super()
+ }
+
+ onEnable() {
+ this.initVariables()
+
+ this.GuiPage = new SettingPage()
+
+ 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, 1, () => { this.GuiPage.runComm.call(this.GuiPage) })
+ }
+
+ initVariables() {
+ this.GuiPage = undefined
+ }
+
+ onDisable() {
+ this.initVariables()
+ }
+}
+
+
+class SettingPage extends GuiPage {
+ constructor() {
+ super(7)
+
+ this.name = "Friends"
+
+ this.pages = [this.newPage()]
+
+ this.lastRender = 0
+
+ this.pages[0].addEvent(new SoopyRenderEvent().setHandler(() => { this.lastRender = Date.now() }))
+
+
+ let friendsTitle = new SoopyTextElement().setText("§0Friends").setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.1)
+ this.pages[0].addChild(friendsTitle)
+
+ this.friendsArea = new SoopyGuiElement().setLocation(0.1, 0.2, 0.8, 0.8).setScrollable(true)
+ this.pages[0].addChild(this.friendsArea)
+
+ this.loadedFriends = {}
+
+ this.loadedPages = new Set()
+
+ this.selectedFriends = new Set()
+
+ this.allFriendsLoaded = false
+
+ this.pageCount = undefined
+
+ this.sidebar = new SoopyGuiElement()
+
+ this.sidebarCustomPage = undefined
+
+ this.sidebarMainPage = new SoopyGuiElement().setLocation(0, 0, 1, 1)
+
+ this.heightPerFriend = 0.15
+ this.loadingElement = new BoxWithLoading().setLocation(0, 0, 1, 0.175)
+ this.lastLoadedPage = 0
+ this.maxLoadedPage = 0
+
+ this.unfriendMode = false
+
+ this.loadingElement.addEvent(new SoopyRenderEvent().setHandler(() => {
+ if (Date.now() - this.lastLoadedPage > 1000) {
+ this.loadFriendPage(this.maxLoadedPage + 1)
+ }
+ }))
+
+ this.commandQueue = []
+
+ this.updateSidebar()
+
+ this.finaliseLoading()
+ }
+
+ loadAllFriends() {
+ let commands = []
+ for (let i = this.maxLoadedPage + 1; i < this.pageCount + 1; i++) {
+ commands.push("/friend list " + i)
+ }
+
+ this.runCommandsArray(commands)
+ }
+
+ runCommandsArray(commands, callback) {
+ this.sidebarCustomPage = new SoopyGuiElement().setLocation(0, 0, 1, 1)
+
+
+ this.sidebarCustomPage.addChild(
+ new ButtonWithArrow().setText("§0CANCEL!").setLocation(0.1, 0.20, 0.8, 0.1)
+ .addEvent(new SoopyMouseClickEvent().setHandler(() => {
+ this.commandQueue = []
+ this.sidebarCustomPage = undefined
+
+ this.updateSidebar()
+
+ if (callback) callback()
+ })))
+
+ this.sidebarCustomPage.addChild(new SoopyTextElement().setText("§0Running commands...").setLocation(0.2, 0.1, 0.6, 0.1).setMaxTextScale(10))
+
+
+ let progressBar = new ProgressBar().setProgress(0).setLocation(0.2, 0.3, 0.6, 0.1)
+
+ let elements = []
+
+ this.sidebarCustomPage.addChild(progressBar)
+ for (let i = 0; i < commands.length; i++) {
+ let i2 = i
+
+ elements.push(new SoopyTextElement().setText("§0" + commands[i]).setLocation(0.2, 0.4 + i * 0.025, 0.6, 0.025))
+
+ this.runCommand(commands[i], () => {
+ progressBar.setProgress((i2 + 1) / (commands.length), 1000)
+
+ let e = elements.shift()
+ this.sidebarCustomPage.removeChild(e)
+
+ elements.forEach((e, i) => {
+ e.location.location.y.set(0.4 + i * 0.025, 500)
+ })
+
+ if (i2 === commands.length - 1) {
+ this.sidebarCustomPage = undefined
+
+ this.updateSidebar()
+
+ if (callback) callback()
+ }
+ })
+ }
+
+ for (let e of elements) {
+ this.sidebarCustomPage.addChild(e)
+ }
+ }
+
+ updateSidebar() {
+ this.sidebar.clearChildren()
+ if (this.sidebarCustomPage) {
+ this.sidebar.addChild(this.sidebarCustomPage)
+ return
+ }
+
+ this.sidebarMainPage.clearChildren()
+ if (this.selectedFriends.size > 0) {
+ this.sidebarMainPage.addChild(
+ new SoopyTextElement().setText("§0" + this.selectedFriends.size + " friends selected").setMaxTextScale(2).setLocation(0.1, 0.05, 0.8, 0.1))
+
+ this.sidebarMainPage.addChild(
+ new ButtonWithArrow().setText("§0Deselect all").setLocation(0.1, 0.15, 0.8, 0.1)
+ .addEvent(new SoopyMouseClickEvent().setHandler(() => {
+ this.selectedFriends.clear()
+
+ this.regenGuiElements()
+ this.updateSidebar()
+ })))
+ this.sidebarMainPage.addChild(
+ new ButtonWithArrow().setText("§0Unfriend all").setLocation(0.1, 0.25, 0.8, 0.1)
+ .addEvent(new SoopyMouseClickEvent().setHandler(() => {
+ let commands = []
+
+ for (let f of this.selectedFriends) {
+ this.loadedFriends[f].exists = false
+ commands.push("/friend remove " + f)
+ }
+ this.selectedFriends.clear()
+
+ this.runCommandsArray(commands)
+ this.updateSidebar()
+ })))
+
+
+ } else {
+ if (!this.allFriendsLoaded) {
+ this.sidebarMainPage.addChild(
+ new ButtonWithArrow().setText("§0Load all friends").setLocation(0.1, 0.1, 0.8, 0.15)
+ .addEvent(new SoopyMouseClickEvent().setHandler(() => {
+ this.loadAllFriends()
+
+ this.updateSidebar()
+ })))
+ } else {
+ this.sidebarMainPage.addChild(
+ new ButtonWithArrow().setText("§0Select all").setLocation(0.1, 0.1, 0.8, 0.15)
+ .addEvent(new SoopyMouseClickEvent().setHandler(() => {
+
+ Object.keys(this.loadedFriends).forEach((ign, i) => {
+ if (this.loadedFriends[ign].exists) {
+ this.selectedFriends.add(ign)
+ }
+ })
+
+ this.regenGuiElements()
+ this.updateSidebar()
+ })))
+ }
+ }
+
+ this.sidebar.addChild(this.sidebarMainPage)
+ }
+
+ runCommand(command, callback) {
+ this.commandQueue.push([command, callback])
+ }
+
+ runComm() {
+ if (this.commandQueue.length > 0 && this.isOpen()) {
+ let [c, callback] = this.commandQueue.shift()
+ ChatLib.say(c)
+ logger.logMessage("running command " + c, 3)
+ callback()
+ }
+ }
+
+ friendListMessageEvent(pagenum, maxpages, friendslist, event) {
+ if (Date.now() - this.lastLoadedPage < 3000 || this.isOpen()) {
+ cancel(event)
+ // console.log("Canceling")
+ } else {
+ return
+ }
+
+ this.maxLoadedPage = parseInt(pagenum)
+
+ this.pageCount = parseInt(maxpages)
+
+ this.allFriendsLoaded = this.maxLoadedPage === this.pageCount
+
+ friendslist = friendslist.replace(/\-\>newLine\<\-/g, "\n").split("\n")
+ friendslist.shift()
+
+ friendslist.pop()
+
+ friendslist.forEach((line, i) => {
+ let [name, location] = line.split(" is ")
+
+ if (location) {
+ if (this.loadedFriends[ChatLib.removeFormatting(name)]) {
+ this.loadedFriends[ChatLib.removeFormatting(name)].nameWithFormatting = name
+ this.loadedFriends[ChatLib.removeFormatting(name)].exists = true
+ this.loadedFriends[ChatLib.removeFormatting(name)].currentGame = location.replace("in ", "").replace("currently offline", "&cCurrently offline")
+ this.loadedFriends[ChatLib.removeFormatting(name)].element.setText(name).setDesc("&7" + location.replace("in ", "").replace("currently offline", "&cCurrently offline"))
+ } else {
+ this.loadedFriends[ChatLib.removeFormatting(name)] = {
+ nameWithFormatting: name,
+ exists: true,
+ currentGame: location.replace("in ", "").replace("currently offline", "&cCurrently offline"),
+ element: new ButtonWithArrowAndDescription().setLocation(0, this.heightPerFriend * Object.keys(this.loadedFriends).length + 1, 1, this.heightPerFriend * 0.875).setText(name).setDesc("&7" + location.replace("in ", "").replace("currently offline", "&cCurrently offline")).addEvent(new SoopyMouseClickEvent().setHandler(() => {
+ this.clickedOn(ChatLib.removeFormatting(name))
+ }))
+ }
+ this.loadedFriends[ChatLib.removeFormatting(name)].element.location.location.y.set(this.heightPerFriend * Object.keys(this.loadedFriends).length - this.heightPerFriend, 500 + 100 * i)
+ }
+ }
+ });
+
+ this.regenGuiElements()
+ }
+
+ clickedOn(name) {
+ if (this.selectedFriends.has(name)) {
+ this.selectedFriends.delete(name)
+ } else {
+ this.selectedFriends.add(name)
+ }
+ // this.commandQueue.push("/friend remove " + ChatLib.removeFormatting(name))
+
+ // this.loadedFriends[ChatLib.removeFormatting(name)].exists = false
+
+ this.regenGuiElements()
+ this.updateSidebar()
+ }
+
+ regenGuiElements() {
+ if (Date.now() - this.lastRender < 1000) {
+ this.friendsArea.children = []
+
+ let scroll = this.friendsArea.location.scroll.y.get() / this.friendsArea.location.getHeightExact()
+
+ let minY = -scroll - this.heightPerFriend * 0.875 - 0.5
+
+ let maxY = -scroll + 1.5
+
+ Object.keys(this.loadedFriends).forEach((ign, i) => {
+ /**@type {ButtonWithArrowAndDescription} */
+ let e = this.loadedFriends[ign].element
+
+ if (this.loadedFriends[ign].exists && e.location.location.y.get() > minY && e.location.location.y.get() < maxY) {
+ this.friendsArea.addChild(e)
+
+ if (this.selectedFriends.has(ign)) {
+ e.setColor(100, 255, 100)
+ } else {
+ e.setColor(253, 255, 227)
+ }
+ }
+ })
+
+ this.loadingElement.location.location.y.set(this.heightPerFriend * Object.keys(this.loadedFriends).length, 500)
+ this.friendsArea.addChild(this.loadingElement)
+
+ if (this.maxLoadedPage !== this.pageCount) {
+ this.loadingElement.visable = true
+ } else {
+ this.loadingElement.visable = false
+ }
+ }
+ }
+
+ loadFriendPage(page, callback) {
+ if (this.loadedPages.has(page)) return
+
+ this.loadedPages.add(page)
+ this.runCommand("/friends list " + page, () => {
+ this.lastLoadedPage = Date.now()
+ if (callback) callback()
+ })
+ }
+
+ onOpen() {
+ this.loadedFriends = {}
+ this.pageCount = undefined
+ this.lastLoadedPage = 0
+ this.maxLoadedPage = 0
+
+ this.sidebarCustomPage = undefined
+ this.commandQueue = []
+
+ this.loadedPages.clear()
+
+ this.regenGuiElements()
+
+ this.loadFriendPage(1)
+ this.openSidebarPage(this.sidebar)
+ this.updateSidebar()
+ }
+}
+
+module.exports = {
+ class: new FriendsGui()
+} \ No newline at end of file