///
///
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()
}