diff options
| author | Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> | 2022-09-17 19:39:05 +0800 | 
|---|---|---|
| committer | Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> | 2022-09-17 19:39:05 +0800 | 
| commit | 431e4fc9d1657a50ebc34b8ac24f9bfaea06417f (patch) | |
| tree | 5987bb14f38d2999c682970429f34b41eb3e5826 /src/features/friendsGUI | |
| parent | e73f2efdf0f50aa775c540317394d46428e9704f (diff) | |
| download | SoopyV2-431e4fc9d1657a50ebc34b8ac24f9bfaea06417f.tar.gz SoopyV2-431e4fc9d1657a50ebc34b8ac24f9bfaea06417f.tar.bz2 SoopyV2-431e4fc9d1657a50ebc34b8ac24f9bfaea06417f.zip | |
Initial move to babel + change fetch to use async/await
Diffstat (limited to 'src/features/friendsGUI')
| -rw-r--r-- | src/features/friendsGUI/index.js | 363 | ||||
| -rw-r--r-- | src/features/friendsGUI/metadata.json | 8 | 
2 files changed, 371 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 diff --git a/src/features/friendsGUI/metadata.json b/src/features/friendsGUI/metadata.json new file mode 100644 index 0000000..b7b1f6f --- /dev/null +++ b/src/features/friendsGUI/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 | 
