diff options
Diffstat (limited to 'src/features/dataLoader')
-rw-r--r-- | src/features/dataLoader/index.js | 280 | ||||
-rw-r--r-- | src/features/dataLoader/metadata.json | 8 |
2 files changed, 288 insertions, 0 deletions
diff --git a/src/features/dataLoader/index.js b/src/features/dataLoader/index.js new file mode 100644 index 0000000..eccafb4 --- /dev/null +++ b/src/features/dataLoader/index.js @@ -0,0 +1,280 @@ +/// <reference types="../../../../CTAutocomplete" /> +/// <reference lib="es2015" /> +import Feature from "../../featureClass/class"; +import socketConnection from "../../socketConnection"; +import { fetch } from "../../utils/networkUtils"; + +class DataLoader extends Feature { + constructor() { + super() + } + + onEnable() { + this.initVariables() + + this.stats = {} + + this.area = undefined + this.areaFine = undefined + + this.isInSkyblock = false + + this.dungeonPercentCleared = 0 + + this.registerStep(true, 2, this.step) + + this.registerStep(false, 170, this.loadApiStepThing) + this.registerStep(false, 60 * 5, this.step_5min) + + this.registerEvent("worldLoad", this.worldLoad) + + this.api_loaded_event = this.createCustomEvent("apiLoad") + + this.checkingPing = false; + this.lastPingCheck = 0; + this.lastPings = [undefined, undefined, undefined]; + this.ping = 0; + this.pingI = 0; + + this.registerChat("&b&bYou are currently connected to server &6${*}&r", (e) => { + if (this.checkingPing) { + this.lastPings[this.pingI % 3] = Date.now() - this.lastPingCheck; + cancel(e); + this.checkingPing = false; + + if (this.lastPings.includes(undefined)) { + this.ping = this.lastPings[this.pingI % 3]; + } else { + this.ping = [...this.lastPings].sort((a, b) => a - b)[1]; + } + this.pingI++; + } + }); + + this.lastServer = undefined + this.lastSentServer = 0 + + this.currentMayorPerks = new Set() + + this.loadedApiDatas = {} + + this.partyMembers = new Set() + this.partyMembers.add(Player.getName()) + + this.lastApiData = { + "skyblock": undefined, + "player": undefined, + "skyblock_raw": undefined, //the _raw is loaded from hypixel api instead of soopy api + "player_raw": undefined + } + + this.worldLoaded = true + + this.loadApi() + + this.step_5min() + + this.firstLoaded = false; + + ["You are not currently in a party.", "You have been kicked from the party by ${*}", "You left the party.", "The party was disbanded because all invites expired and the party was empty", "${*} &r&ehas disbanded the party!&r"].forEach(m => this.registerChat(m, () => { + this.partyMembers.clear() + this.partyMembers.add(Player.getName()) + })); + + ["${mem} &r&ejoined the party.&r", "${mem} &r&einvited &r${*} &r&eto the party! They have &r&c60 &r&eseconds to accept.&r", "&dDungeon Finder &r&f> &r${mem} &r&ejoined the dungeon group! (&r&b${*}&r&e)&r"].forEach(m => this.registerChat(m, (mem) => { + this.partyMembers.add(ChatLib.removeFormatting(mem.trim().split(" ").pop().trim())) + })); + ["${mem} &r&ehas been removed from the party.&r", "${mem} &r&ehas left the party.&r", "${mem} &r&ewas removed from your party because they disconnected&r", "Kicked ${mem} because they were offline."].forEach(m => this.registerChat(m, (mem) => { + this.partyMembers.delete(ChatLib.removeFormatting(mem.trim().split(" ").pop().trim())) + })) + this.registerChat("&eYou have joined &r${mem}'s &r&eparty!&r", (mem) => { + this.partyMembers.clear() + this.partyMembers.add(Player.getName()) + this.partyMembers.add(ChatLib.removeFormatting(p = mem.trim().split(" ").pop().trim())) + }) + this.registerChat("&eYou have joined &r${mem}' &r&eparty!&r", (mem) => { + this.partyMembers.clear() + this.partyMembers.add(Player.getName()) + this.partyMembers.add(ChatLib.removeFormatting(mem).trim()) + }) + this.registerChat("&eYou'll be partying with: ${mem}", (mem) => { + mem.split(",").forEach(p => { + this.partyMembers.add(ChatLib.removeFormatting(p.trim().split(" ").pop().trim())) + }) + }) + this.registerChat("&eParty ${type}: ${mem}", (type, mem) => { + if (type.toLowerCase().includes("leader")) this.partyMembers.clear() + ChatLib.removeFormatting(mem).split("●").forEach(p => { + if (!p.trim()) return + this.partyMembers.add(p.trim().split(" ").pop().trim()) + }) + }) + this.registerCommand("pmembdebug", () => { + ChatLib.chat([...this.partyMembers].join(" | ")) + }) + } + + getPing() { + if (Date.now() - this.lastPingCheck > 60000 * 30 || (Date.now() - this.lastPingCheck > 60000 && this.lastPings.includes(undefined) && this.bloodX !== -1)) { + this.lastPingCheck = Date.now(); + ChatLib.command("whereami"); + this.checkingPing = true; + } + return this.ping || 0 + } + + async step_5min() { + let data = await fetch("http://soopy.dev/api/v2/mayor").json() + + if (!data.success) return + this.mayorData = data.data + this.currentMayorPerks = new Set(data.data.mayor.perks.map(a => a.name)) + } + + worldLoad() { + this.area = undefined + this.areaFine = undefined + this.dungeonFloor = undefined + this.loadApiData("skyblock", false) + } + + loadApiStepThing() { + this.loadApiData("skyblock", false) + } + async loadApi() { + let data = await fetch("http://soopy.dev/api/v2/player_skyblock/" + Player.getUUID().replace(/-/g, "")).json() + + if (!data.success) return + + this.api_loaded_event.trigger(data, "skyblock", true, true) + this.lastApiData.skyblock = data + } + + loadApiData(type, soopyServer) { + if (this.FeatureManager.features["globalSettings"] === undefined || this.FeatureManager.features["globalSettings"].class.apiKeySetting === undefined) { + return + } + let key = this.FeatureManager.features["globalSettings"].class.apiKeySetting.getValue() + if (!key) return + + if (this.loadedApiDatas[type] !== undefined) { + if (Date.now() - this.loadedApiDatas[type] < 5000) return + } + + this.loadedApiDatas[type] = Date.now() + + if (soopyServer) { + + } else { + if (type === "skyblock") { + fetch("https://api.hypixel.net/skyblock/profiles?key=" + key + "&uuid=" + Player.getUUID().replace(/-/g, "")).json().then(data => { + if (!data.success) return + + this.api_loaded_event.trigger(data, "skyblock", false, true) + this.lastApiData.skyblock_raw = data + }) + } + } + } + + step() { //2fps + if (!this.firstLoaded) { + if (!(this.FeatureManager.features["globalSettings"] === undefined || this.FeatureManager.features["globalSettings"].class.apiKeySetting === undefined)) { + this.loadApiData("skyblock", false) + this.firstLoaded = true + } + } + this.isInSkyblock = Scoreboard.getTitle()?.removeFormatting().includes("SKYBLOCK") + + if (!this.isInSkyblock) { + this.stats = {} + this.isInDungeon = false + this.dungeonFloor = undefined + return + } + + this.stats["Area"] = undefined + this.stats["Dungeon"] = undefined + + if (World.isLoaded() && TabList.getNames()) { + TabList.getNames().forEach(n => { + n = ChatLib.removeFormatting(n) + if (n.includes(": ")) { + if (n.includes('Secrets Found')) { + if (n.includes('%')) { + this.stats["Secrets Found%"] = n.split(": ")[1] + } else { + this.stats["Secrets Found"] = n.split(": ")[1] + } + } else { + this.stats[n.split(": ")[0].trim()] = n.split(": ")[1].trim() + } + } + }) + } + + if (this.stats["Dungeon"]) { + this.stats["Area"] = this.stats["Dungeon"] + this.isInDungeon = true + } else { + this.isInDungeon = false + } + + this.slayerXpToSpawn = undefined + Scoreboard.getLines().forEach(line => { + let name = ChatLib.removeFormatting(line.getName()).replace(/[^A-z0-9 \:\(\)\.]/g, "") + if (this.isInDungeon) { + if (name.includes("The Catacombs (")) { + this.dungeonFloor = name.split("(")[1].split(")")[0].toUpperCase() + } + } + if (ChatLib.removeFormatting(line).startsWith(" ⏣ ")) { + this.areaFine = ChatLib.removeFormatting(line).split(" ⏣ ")[1].replace(/[^A-z0-9 \:\(\)\.\-]/g, "") + } + if (name.startsWith("Purse: ")) { + this.purse = parseInt(name.split("Purse: ")[1].split(" ")[0]) + } + if (name.startsWith("Bits: ")) { + this.bits = parseInt(name.split("Bits: ")[1].split(" ")[0]) + } + if (name.startsWith("Cleared: ")) { + this.dungeonPercentCleared = parseInt(name.split(" ")[1]) / 100 + } + + if (name.endsWith("Combat XP")) { + this.slayerXpToSpawn = ChatLib.removeFormatting(name).split("(")[1].split(")")[0].split("/").map(parseInt) + } + }) + + this.area = this.stats["Area"] + + + if (this.lastServer !== this.stats.Server || Date.now() - this.lastSentServer > 60000 * 5) { + this.lastServer = this.stats.Server; + this.lastSentServer = Date.now() + + socketConnection.setServer(this.stats.Server, this.area, this.areaFine); + } + } + + initVariables() { + this.stats = undefined + this.isInDungeon = false + + this.dungeonFloor = undefined + this.area = undefined + this.areaFine = undefined + this.bits = undefined + this.purse = undefined + this.lastApiData = undefined + this.isInSkyblock = undefined + } + + onDisable() { + this.initVariables() + } +} + +module.exports = { + class: new DataLoader() +}
\ No newline at end of file diff --git a/src/features/dataLoader/metadata.json b/src/features/dataLoader/metadata.json new file mode 100644 index 0000000..4953f99 --- /dev/null +++ b/src/features/dataLoader/metadata.json @@ -0,0 +1,8 @@ +{ + "name": "Data loader", + "description": "Loads data", + "isHidden": true, + "isTogglable": false, + "defaultEnabled": true, + "sortA": 0 +}
\ No newline at end of file |